2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
25
#include "cairo-dock-icons.h"
26
#include "cairo-dock-draw.h"
27
#include "cairo-dock-draw-opengl.h"
28
#include "cairo-dock-backends-manager.h"
29
#include "cairo-dock-load.h"
30
#include "cairo-dock-log.h"
31
#include "cairo-dock-emblem.h"
33
extern CairoDockImageBuffer g_pIconBackgroundBuffer;
34
extern gboolean g_bUseOpenGL;
38
//merci a Necropotame et ChAnGFu !
40
CairoEmblem *cairo_dock_make_emblem (const gchar *cImageFile, Icon *pIcon, CairoContainer *pContainer)
42
CairoEmblem *pEmblem = g_new0 (CairoEmblem, 1);
45
//\___________ On calcule les dimensions de l'embleme.
47
cairo_dock_get_icon_extent (pIcon, pContainer, &w, &h);
48
pEmblem->iWidth = f * w;
49
pEmblem->iHeight = f * h;
51
//\___________ On cree la surface/texture a cette taille.
52
cairo_surface_t *pEmblemSurface = cairo_dock_create_surface_from_image_simple (cImageFile, pEmblem->iWidth, pEmblem->iHeight);
54
if (g_bUseOpenGL && pEmblemSurface)
56
pEmblem->iTexture = cairo_dock_create_texture_from_surface (pEmblemSurface);
57
cairo_surface_destroy (pEmblemSurface);
60
pEmblem->pSurface = pEmblemSurface;
65
CairoEmblem *cairo_dock_make_emblem_from_surface (cairo_surface_t *pSurface, int iSurfaceWidth, int iSurfaceHeight, Icon *pIcon, CairoContainer *pContainer)
67
CairoEmblem *pEmblem = g_new0 (CairoEmblem, 1);
71
cairo_dock_get_icon_extent (pIcon, pContainer, &w, &h);
72
pEmblem->iWidth = (iSurfaceWidth > 0 ? iSurfaceWidth : w);
73
pEmblem->iHeight = (iSurfaceHeight > 0 ? iSurfaceHeight : h);
74
pEmblem->pSurface = pSurface;
78
CairoEmblem *cairo_dock_make_emblem_from_texture (GLuint iTexture, Icon *pIcon, CairoContainer *pContainer)
80
CairoEmblem *pEmblem = g_new0 (CairoEmblem, 1);
83
pEmblem->iTexture = iTexture; // inutile de connaitre la taille de la texture.
88
void cairo_dock_free_emblem (CairoEmblem *pEmblem)
93
if (pEmblem->pSurface != NULL)
94
cairo_surface_destroy (pEmblem->pSurface);
95
if (pEmblem->iTexture != 0)
96
_cairo_dock_delete_texture (pEmblem->iTexture);
101
void _cairo_dock_apply_emblem_texture (CairoEmblem *pEmblem, int w, int h)
103
double a = pEmblem->fScale;
105
switch (pEmblem->iPosition)
107
case CAIRO_DOCK_EMBLEM_UPPER_RIGHT:
111
case CAIRO_DOCK_EMBLEM_LOWER_RIGHT:
115
case CAIRO_DOCK_EMBLEM_UPPER_LEFT:
116
x = -(double)w/2 * (1 - a);
117
y = (double)h/2 * (1 - a);
119
case CAIRO_DOCK_EMBLEM_LOWER_LEFT:
124
case CAIRO_DOCK_EMBLEM_MIDDLE:
129
glBindTexture (GL_TEXTURE_2D, pEmblem->iTexture);
130
_cairo_dock_apply_current_texture_at_size_with_offset (a*w, a*h, x, y);
133
void _cairo_dock_apply_emblem_surface (CairoEmblem *pEmblem, int w, int h, cairo_t *pCairoContext)
135
double a = pEmblem->fScale;
136
double zx = (double) a*w / pEmblem->iWidth;
137
double zy = (double) a*h / pEmblem->iHeight;
138
cairo_scale (pCairoContext, zx, zy);
141
switch (pEmblem->iPosition)
143
case CAIRO_DOCK_EMBLEM_UPPER_RIGHT:
147
case CAIRO_DOCK_EMBLEM_LOWER_RIGHT:
151
case CAIRO_DOCK_EMBLEM_UPPER_LEFT:
155
case CAIRO_DOCK_EMBLEM_LOWER_LEFT:
160
case CAIRO_DOCK_EMBLEM_MIDDLE:
165
cairo_set_source_surface (pCairoContext, pEmblem->pSurface, x/zx, y/zy);
166
cairo_paint (pCairoContext);
168
void cairo_dock_draw_emblem_on_icon (CairoEmblem *pEmblem, Icon *pIcon, CairoContainer *pContainer)
170
g_return_if_fail (pEmblem != NULL);
173
cairo_dock_get_icon_extent (pIcon, pContainer, &w, &h);
175
if (pIcon->iIconTexture != 0 && pEmblem->iTexture != 0) // dessin opengl : on dessine sur la texture de l'icone avec le mecanisme habituel.
177
if (! cairo_dock_begin_draw_icon (pIcon, pContainer, 1))
180
_cairo_dock_enable_texture ();
182
_cairo_dock_set_blend_source ();
184
_cairo_dock_apply_texture_at_size (pIcon->iIconTexture, w, h);
186
_cairo_dock_set_blend_alpha ();
188
_cairo_dock_apply_emblem_texture (pEmblem, w, h);
190
_cairo_dock_disable_texture ();
192
cairo_dock_end_draw_icon (pIcon, pContainer);
194
else if (pIcon->pIconBuffer != NULL && pEmblem->pSurface != NULL)
196
cairo_t *pCairoContext = cairo_create (pIcon->pIconBuffer);
197
g_return_if_fail (cairo_status (pCairoContext) == CAIRO_STATUS_SUCCESS);
199
_cairo_dock_apply_emblem_surface (pEmblem, w, h, pCairoContext);
201
cairo_paint (pCairoContext);
203
cairo_destroy (pCairoContext);