~cairo-dock-team/cairo-dock-plug-ins/experimental

« back to all changes in this revision

Viewing changes to clock/src/cd-clock-draw.c

  • Committer: fabounet
  • Date: 2007-07-27 15:26:14 UTC
  • Revision ID: svn-v4:620951bb-bb42-0410-82c3-830e739ed170:trunk/plug-ins:3
upload de tous les fichiers, dans la version 0.9.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include <time.h>
 
3
#include <librsvg/rsvg.h>
 
4
#include <librsvg/rsvg-cairo.h>
 
5
 
 
6
#include "cd-clock-config.h"
 
7
#include "cd-clock-struct.h"
 
8
#include "cd-clock-draw.h"
 
9
 
 
10
 
 
11
extern Icon *my_pIcon;
 
12
extern cairo_t *my_pCairoContext;
 
13
 
 
14
extern gboolean my_bShowDate;
 
15
extern gboolean my_bShowSeconds;
 
16
extern gboolean my_b24Mode;
 
17
extern int my_bOldStyle;
 
18
extern int my_iTheme;
 
19
extern GHashTable *my_pThemeTable;
 
20
 
 
21
extern cairo_surface_t *g_pBackgroundSurface;
 
22
extern cairo_surface_t *g_pForegroundSurface;
 
23
extern RsvgDimensionData my_DimensionData;
 
24
extern RsvgHandle *my_pSvgHandles[CLOCK_ELEMENTS];
 
25
 
 
26
static char cDateBuffer[50];
 
27
 
 
28
 
 
29
gboolean cd_clock_update_with_time (Icon *icon)
 
30
{
 
31
        time_t epoch = (time_t) time (NULL);
 
32
        struct tm epoch_tm;
 
33
        localtime_r (&epoch, &epoch_tm);
 
34
        
 
35
        if (my_bOldStyle)
 
36
                cd_clock_draw_old_fashionned_clock (my_pCairoContext, (int) icon->fWidth, (int) icon->fHeight, (1 + g_fAmplitude), &epoch_tm);
 
37
        else
 
38
                cd_clock_draw_text (my_pCairoContext, &epoch_tm);
 
39
        
 
40
        
 
41
        cairo_dock_redraw_my_icon (icon);
 
42
        
 
43
        return TRUE;
 
44
}
 
45
 
 
46
 
 
47
void cd_clock_draw_text (cairo_t *pSourceContext, struct tm *pTime)
 
48
{
 
49
        GString *sFormat = g_string_new ("");
 
50
        
 
51
        if (my_bShowSeconds)
 
52
                g_string_printf (sFormat, "%T");
 
53
        else
 
54
                g_string_printf (sFormat, "%R");
 
55
        
 
56
        if (my_bShowDate)
 
57
                g_string_append (sFormat, "\n%a%d%b");
 
58
        
 
59
        strftime (cDateBuffer, 50, sFormat->str, pTime);
 
60
        g_string_free (sFormat, TRUE);
 
61
        
 
62
        
 
63
        cairo_save (pSourceContext);
 
64
        
 
65
        cairo_set_tolerance (pSourceContext, 0.1);
 
66
        
 
67
        cairo_set_source_rgba (pSourceContext, 0.0, 0.0, 0.0, 0.0);
 
68
        cairo_set_operator (pSourceContext, CAIRO_OPERATOR_SOURCE);
 
69
        cairo_paint (pSourceContext);
 
70
        
 
71
        
 
72
        PangoLayout *pLayout = pango_cairo_create_layout (pSourceContext);
 
73
        PangoFontDescription *pDesc = pango_font_description_new ();
 
74
        
 
75
        pango_font_description_set_absolute_size (pDesc, g_iLabelSize * PANGO_SCALE);
 
76
        pango_font_description_set_family_static (pDesc, g_cLabelPolice);
 
77
        pango_font_description_set_weight (pDesc, g_iLabelWeight);
 
78
        pango_font_description_set_style (pDesc, g_iLabelStyle);
 
79
        pango_layout_set_font_description (pLayout, pDesc);
 
80
        pango_font_description_free (pDesc);
 
81
        
 
82
        pango_layout_set_text (pLayout, cDateBuffer, -1);
 
83
        //g_print ("%s\n", cDateBuffer);
 
84
        
 
85
        
 
86
        PangoRectangle ink, log;
 
87
        pango_layout_get_pixel_extents (pLayout, &ink, &log);
 
88
        
 
89
        cairo_surface_t *pNewSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
 
90
                CAIRO_CONTENT_COLOR_ALPHA,
 
91
                ink.width + 2,
 
92
                ink.height + 2);
 
93
        cairo_t *pCairoContext = cairo_create (pNewSurface);
 
94
        cairo_set_source_rgb (pCairoContext, 0.0, 0.0, 0.5);
 
95
        cairo_translate (pCairoContext, -ink.x, -ink.y);
 
96
        
 
97
        pango_cairo_show_layout (pCairoContext, pLayout);
 
98
        
 
99
        //double fTextXOffset = log.width / 2. - ink.x;
 
100
        //double fTextYOffset = log.height     - ink.y;
 
101
        double fMaxScale = 1 + g_fAmplitude;
 
102
        
 
103
        cairo_set_source_rgba (pSourceContext, 0.0, 0.0, 0.0, 0.0);
 
104
        cairo_set_operator (pSourceContext, CAIRO_OPERATOR_OVER);
 
105
        cairo_scale (pSourceContext, my_pIcon->fWidth * fMaxScale / ink.width, my_pIcon->fHeight * fMaxScale / ink.height);
 
106
        cairo_set_source_surface (pSourceContext,
 
107
                pNewSurface,
 
108
                0,
 
109
                0);
 
110
        cairo_paint (pSourceContext);
 
111
        
 
112
        cairo_destroy (pCairoContext);
 
113
        
 
114
        g_object_unref (pLayout);
 
115
        cairo_restore (pSourceContext);
 
116
}
 
117
 
 
118
 
 
119
 
 
120
void draw_background (cairo_t* pDrawingContext, int iWidth, int iHeight)
 
121
{
 
122
        /* clear context */
 
123
        cairo_scale (pDrawingContext,
 
124
                (double) iWidth / (double) my_DimensionData.width,
 
125
                (double) iHeight / (double) my_DimensionData.height);
 
126
        cairo_set_source_rgba (pDrawingContext, 1.0f, 1.0f, 1.0f, 0.0f);
 
127
        cairo_set_operator (pDrawingContext, CAIRO_OPERATOR_OVER);
 
128
        cairo_paint (pDrawingContext);
 
129
        
 
130
        /* draw stuff */
 
131
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_DROP_SHADOW], pDrawingContext);
 
132
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_FACE], pDrawingContext);
 
133
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_MARKS], pDrawingContext);
 
134
}
 
135
 
 
136
void draw_foreground (cairo_t* pDrawingContext, int iWidth, int iHeight)
 
137
{
 
138
        /* clear context */
 
139
        cairo_scale (pDrawingContext,
 
140
                (double) iWidth / (double) my_DimensionData.width,
 
141
                (double) iHeight / (double) my_DimensionData.height);
 
142
        cairo_set_source_rgba (pDrawingContext, 1.0f, 1.0f, 1.0f, 0.0f);
 
143
        cairo_set_operator (pDrawingContext, CAIRO_OPERATOR_OVER);
 
144
        cairo_paint (pDrawingContext);
 
145
        
 
146
        /* draw stuff */
 
147
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_FACE_SHADOW], pDrawingContext);
 
148
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_GLASS], pDrawingContext);
 
149
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_FRAME], pDrawingContext);
 
150
}
 
151
 
 
152
cairo_surface_t* update_surface (cairo_surface_t* pOldSurface,
 
153
                                                                cairo_t* pSourceContext,
 
154
                                                                int iWidth,
 
155
                                                                int iHeight,
 
156
                                                                SurfaceKind kind)
 
157
{
 
158
        cairo_surface_t* pNewSurface = NULL;
 
159
        cairo_t* pDrawingContext = NULL;
 
160
        
 
161
        if (pOldSurface != NULL)
 
162
                cairo_surface_destroy (pOldSurface);
 
163
        pNewSurface = cairo_surface_create_similar (cairo_get_target (pSourceContext),
 
164
                CAIRO_CONTENT_COLOR_ALPHA,
 
165
                iWidth,
 
166
                iHeight);
 
167
        if (cairo_surface_status (pNewSurface) != CAIRO_STATUS_SUCCESS)
 
168
                return NULL;
 
169
        
 
170
        pDrawingContext = cairo_create (pNewSurface);
 
171
        if (cairo_status (pDrawingContext) != CAIRO_STATUS_SUCCESS)
 
172
                return NULL;
 
173
        
 
174
        switch (kind)
 
175
        {
 
176
                case KIND_BACKGROUND :
 
177
                        draw_background (pDrawingContext, iWidth, iHeight);
 
178
                break;
 
179
                
 
180
                case KIND_FOREGROUND :
 
181
                        draw_foreground (pDrawingContext, iWidth, iHeight);
 
182
                break;
 
183
        }
 
184
        
 
185
        cairo_destroy (pDrawingContext);
 
186
        
 
187
        return pNewSurface;
 
188
}
 
189
 
 
190
 
 
191
void cd_clock_draw_old_fashionned_clock (cairo_t *pCairoContext, int width, int height, double fMaxScale, struct tm *pTime)
 
192
{
 
193
        //g_print ("%s (%dx%d)\n", __func__, width, height);
 
194
        static double fHalfX;
 
195
        static double fHalfY;
 
196
        static double fShadowOffsetX = -0.75f;
 
197
        static double fShadowOffsetY = 0.75f;
 
198
        static cairo_text_extents_t textExtents;
 
199
        
 
200
        fHalfX = my_DimensionData.width / 2.0f;
 
201
        fHalfY = my_DimensionData.height / 2.0f;
 
202
        
 
203
        int g_iSeconds = pTime->tm_sec;
 
204
        int g_iMinutes = pTime->tm_min;
 
205
        int g_iHours = pTime->tm_hour;
 
206
        
 
207
        cairo_set_operator (my_pCairoContext, CAIRO_OPERATOR_SOURCE);
 
208
        
 
209
        cairo_set_source_surface (my_pCairoContext, g_pBackgroundSurface, 0.0f, 0.0f);
 
210
        cairo_paint (my_pCairoContext);
 
211
        
 
212
        cairo_set_operator (my_pCairoContext, CAIRO_OPERATOR_OVER);
 
213
        
 
214
        cairo_save (my_pCairoContext);
 
215
        cairo_scale (my_pCairoContext,
 
216
                (double) width / (double) my_DimensionData.width * fMaxScale,
 
217
                (double) height / (double) my_DimensionData.height * fMaxScale);
 
218
                
 
219
        cairo_translate (my_pCairoContext, fHalfX, fHalfY);
 
220
        cairo_rotate (my_pCairoContext, -G_PI/2.0f);
 
221
        
 
222
        if (my_bShowDate)
 
223
        {
 
224
                cairo_save (my_pCairoContext);
 
225
                cairo_set_source_rgb (my_pCairoContext, 1.0f, 0.5f, 0.0f);
 
226
                cairo_set_line_width (my_pCairoContext, 5.0f);
 
227
                cairo_text_extents (my_pCairoContext, cDateBuffer, &textExtents);
 
228
                cairo_rotate (my_pCairoContext, (G_PI/180.0f) * 90.0f);
 
229
                cairo_move_to (my_pCairoContext,
 
230
                        -textExtents.width / 2.0f,
 
231
                        2.0f * textExtents.height);
 
232
                
 
233
                strftime (cDateBuffer, 50, "%a%d%b", pTime);
 
234
                cairo_show_text (my_pCairoContext, cDateBuffer);
 
235
                cairo_restore (my_pCairoContext);
 
236
        }
 
237
        
 
238
        cairo_save (my_pCairoContext);
 
239
        cairo_translate (my_pCairoContext, fShadowOffsetX, fShadowOffsetY);
 
240
        cairo_rotate (my_pCairoContext, (G_PI/ 12.0f * g_iHours + (G_PI/ 720.0f) * g_iMinutes));
 
241
 
 
242
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_HOUR_HAND_SHADOW], my_pCairoContext);
 
243
        
 
244
        cairo_restore (my_pCairoContext);
 
245
        
 
246
        cairo_save (my_pCairoContext);
 
247
        cairo_translate (my_pCairoContext, fShadowOffsetX, fShadowOffsetY);
 
248
        cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iMinutes);
 
249
        
 
250
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_MINUTE_HAND_SHADOW], my_pCairoContext);
 
251
        
 
252
        cairo_restore (my_pCairoContext);
 
253
        
 
254
        if (my_bShowSeconds)
 
255
        {
 
256
                cairo_save (my_pCairoContext);
 
257
                cairo_translate (my_pCairoContext, fShadowOffsetX, fShadowOffsetY);
 
258
                cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iSeconds);
 
259
                
 
260
                rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_SECOND_HAND_SHADOW], my_pCairoContext);
 
261
                
 
262
                cairo_restore (my_pCairoContext);
 
263
        }
 
264
        
 
265
        cairo_save (my_pCairoContext);
 
266
        cairo_rotate (my_pCairoContext, (g_iHours % 12) * G_PI/6 + g_iMinutes * G_PI/360.0f);
 
267
        
 
268
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_HOUR_HAND], my_pCairoContext);
 
269
        
 
270
        cairo_restore (my_pCairoContext);
 
271
        
 
272
        cairo_save (my_pCairoContext);
 
273
        cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iMinutes);
 
274
        
 
275
        rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_MINUTE_HAND], my_pCairoContext);
 
276
        
 
277
        cairo_restore (my_pCairoContext);
 
278
        
 
279
        if (my_bShowSeconds)
 
280
        {
 
281
                cairo_save (my_pCairoContext);
 
282
                cairo_rotate (my_pCairoContext, (G_PI/30.0f) * g_iSeconds);
 
283
                
 
284
                rsvg_handle_render_cairo (my_pSvgHandles[CLOCK_SECOND_HAND], my_pCairoContext);
 
285
                cairo_restore (my_pCairoContext);
 
286
        }
 
287
        
 
288
        cairo_restore (my_pCairoContext);
 
289
        
 
290
        cairo_set_source_surface (my_pCairoContext, g_pForegroundSurface, 0.0f, 0.0f);
 
291
        cairo_paint (my_pCairoContext);
 
292
}
 
293