124
148
pRenderer->iSmoothAnimationStep = 0;
125
149
pRenderer->format_value = pAttribute->format_value;
126
150
pRenderer->pFormatData = pAttribute->pFormatData;
127
pRenderer->cTitles = pAttribute->cTitles;
128
memcpy (pRenderer->fTextColor, pAttribute->fTextColor, sizeof (pRenderer->fTextColor));
129
pRenderer->cEmblems = pAttribute->cEmblems;
132
static void _cairo_dock_render_to_texture (CairoDataRenderer *pDataRenderer, Icon *pIcon, CairoContainer *pContainer)
154
void cairo_dock_render_overlays_to_texture (CairoDataRenderer *pRenderer, int iNumValue)
156
if (pRenderer->pEmblems != NULL)
158
_cairo_dock_enable_texture ();
159
_cairo_dock_set_blend_over ();
161
CairoDataRendererEmblem *pEmblem;
162
pEmblem = &pRenderer->pEmblems[iNumValue];
163
if (pEmblem->iTexture != 0)
165
glBindTexture (GL_TEXTURE_2D, pEmblem->iTexture);
166
_cairo_dock_set_alpha (pEmblem->param.fAlpha);
167
_cairo_dock_apply_current_texture_at_size_with_offset (
168
pEmblem->param.fWidth * pRenderer->iWidth,
169
pEmblem->param.fHeight * pRenderer->iHeight,
170
pEmblem->param.fX * pRenderer->iWidth,
171
pEmblem->param.fY * pRenderer->iHeight);
173
_cairo_dock_disable_texture ();
176
if (pRenderer->pLabels != NULL)
178
_cairo_dock_enable_texture ();
179
_cairo_dock_set_blend_over ();
181
CairoDataRendererText *pLabel;
183
pLabel = &pRenderer->pLabels[iNumValue];
184
if (pLabel->iTexture != 0)
186
double f = MIN (pLabel->param.fWidth * pRenderer->iWidth / pLabel->iTextWidth, pLabel->param.fHeight * pRenderer->iHeight / pLabel->iTextHeight); // on garde le ratio du texte.
187
w = pLabel->iTextWidth * f;
188
h = pLabel->iTextHeight * f;
192
glBindTexture (GL_TEXTURE_2D, pLabel->iTexture);
193
_cairo_dock_set_alpha (pLabel->param.pColor[3]);
194
_cairo_dock_apply_current_texture_at_size_with_offset (
197
pLabel->param.fX * pRenderer->iWidth,
198
pLabel->param.fY * pRenderer->iHeight);
200
_cairo_dock_disable_texture ();
203
if (pRenderer->bWriteValues && pRenderer->bCanRenderValueAsText)
205
CairoDataRendererTextParam *pText;
207
pText = &pRenderer->pValuesText[iNumValue];
208
if (pText->fWidth != 0 && pText->fHeight != 0)
210
cairo_data_renderer_format_value (pRenderer, iNumValue);
212
CairoDockGLFont *pFont = cairo_dock_get_default_data_renderer_font ();
213
glColor3f (pText->pColor[0], pText->pColor[1], pText->pColor[2]);
216
w = pText->fWidth * pRenderer->iWidth;
217
h = pText->fHeight * pRenderer->iHeight;
220
cairo_dock_draw_gl_text_at_position_in_area (pRenderer->cFormatBuffer,
222
floor (pText->fX * pRenderer->iWidth) + .5*dw,
223
floor (pText->fY * pRenderer->iHeight) + .5*dh,
229
glColor3f (1.0, 1.0, 1.0);
234
static void _cairo_dock_render_to_texture (CairoDataRenderer *pRenderer, Icon *pIcon, CairoContainer *pContainer)
134
236
if (! cairo_dock_begin_draw_icon (pIcon, pContainer, 0))
137
pDataRenderer->interface.render_opengl (pDataRenderer);
239
//\________________ On dessine.
241
if (!pContainer->bIsHorizontal && pRenderer->bRotateWithContainer)
243
glTranslatef (pRenderer->iWidth/2, pRenderer->iHeight/2, 0.);
244
glRotatef (-90., 0., 0., 1.);
245
glTranslatef (-pRenderer->iHeight/2, -pRenderer->iWidth/2, 0.);
249
pRenderer->interface.render_opengl (pRenderer);
252
//\________________ On dessine les overlays.
253
/**int iNbValues = cairo_data_renderer_get_nb_values (pRenderer);
255
for (i = 0; i < iNbValues; i ++)
257
cairo_dock_render_overlays_to_texture (pRenderer, i);
139
261
cairo_dock_end_draw_icon (pIcon, pContainer);
141
static void _cairo_dock_render_to_context (CairoDataRenderer *pDataRenderer, Icon *pIcon, CairoContainer *pContainer, cairo_t *pCairoContext)
264
void cairo_dock_render_overlays_to_context (CairoDataRenderer *pRenderer, int iNumValue, cairo_t *pCairoContext)
266
if (pRenderer->pEmblems != NULL)
268
CairoDataRendererEmblem *pEmblem;
269
pEmblem = &pRenderer->pEmblems[iNumValue];
270
if (pEmblem->pSurface != NULL)
272
cairo_set_source_surface (pCairoContext,
274
(.5 + pEmblem->param.fX - pEmblem->param.fWidth/2) * pRenderer->iWidth,
275
(.5 - pEmblem->param.fY - pEmblem->param.fHeight/2) * pRenderer->iHeight);
276
cairo_paint_with_alpha (pCairoContext, pEmblem->param.fAlpha);
280
if (pRenderer->pLabels != NULL)
282
CairoDataRendererText *pLabel;
283
pLabel = &pRenderer->pLabels[iNumValue];
284
if (pLabel->pSurface != NULL)
286
double f = MIN (pLabel->param.fWidth * pRenderer->iWidth / pLabel->iTextWidth, pLabel->param.fHeight * pRenderer->iHeight / pLabel->iTextHeight); // on garde le ratio du texte.
287
if (pLabel->iTextHeight * f > 7) // sinon illisible
289
cairo_save (pCairoContext);
290
cairo_scale (pCairoContext,
293
cairo_set_source_surface (pCairoContext,
295
(.5 + pLabel->param.fX) * pRenderer->iWidth/f - pLabel->iTextWidth /2,
296
(.5 - pLabel->param.fY) * pRenderer->iHeight/f - pLabel->iTextHeight /2);
297
cairo_paint_with_alpha (pCairoContext, pLabel->param.pColor[3]);
298
cairo_restore (pCairoContext);
303
if (pRenderer->bWriteValues && pRenderer->bCanRenderValueAsText)
305
CairoDataRendererTextParam *pText;
306
pText = &pRenderer->pValuesText[iNumValue];
307
if (pText->fWidth != 0 && pText->fHeight != 0)
309
cairo_data_renderer_format_value (pRenderer, iNumValue);
311
cairo_save (pCairoContext);
312
cairo_set_source_rgb (pCairoContext, pText->pColor[0], pText->pColor[1], pText->pColor[2]);
314
PangoLayout *pLayout = pango_cairo_create_layout (pCairoContext);
315
PangoFontDescription *fd = pango_font_description_from_string ("Monospace 12");
316
pango_layout_set_font_description (pLayout, fd);
318
PangoRectangle ink, log;
319
pango_layout_set_text (pLayout, pRenderer->cFormatBuffer, -1);
320
pango_layout_get_pixel_extents (pLayout, &ink, &log);
321
double fZoom = MIN (pText->fWidth * pRenderer->iWidth / (log.width), pText->fHeight * pRenderer->iHeight / log.height);
323
cairo_move_to (pCairoContext,
324
floor ((.5 + pText->fX) * pRenderer->iWidth - log.width*fZoom/2),
325
floor ((.5 - pText->fY) * pRenderer->iHeight - log.height*fZoom/2));
326
cairo_scale (pCairoContext,
329
pango_cairo_show_layout (pCairoContext, pLayout);
330
g_object_unref (pLayout);
331
cairo_restore (pCairoContext);
336
static void _cairo_dock_render_to_context (CairoDataRenderer *pRenderer, Icon *pIcon, CairoContainer *pContainer, cairo_t *pCairoContext)
143
338
//\________________ On efface tout.
144
339
cairo_set_source_rgba (pCairoContext, 0.0, 0.0, 0.0, 0.0);
183
395
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
398
static void _cairo_dock_finish_load_data_renderer (CairoDataRenderer *pRenderer, gboolean bLoadTextures)
400
int iNbValues = cairo_data_renderer_get_nb_values (pRenderer);
401
//\___________________ On charge les emblemes si l'implementation les a valides.
402
if (pRenderer->pEmblems != NULL)
404
CairoDataRendererEmblem *pEmblem;
405
cairo_surface_t *pSurface;
407
for (i = 0; i < iNbValues; i ++)
409
pEmblem = &pRenderer->pEmblems[i];
410
if (pEmblem->pSurface != NULL)
412
cairo_surface_destroy (pEmblem->pSurface);
413
pEmblem->pSurface = NULL;
415
if (pEmblem->iTexture != 0)
417
_cairo_dock_delete_texture (pEmblem->iTexture);
418
pEmblem->iTexture = 0;
420
if (pEmblem->param.fWidth != 0 && pEmblem->param.fHeight != 0 && pEmblem->cImagePath != NULL)
422
pSurface = cairo_dock_create_surface_from_image_simple (pEmblem->cImagePath,
423
pEmblem->param.fWidth * pRenderer->iWidth,
424
pEmblem->param.fHeight * pRenderer->iHeight);
427
pEmblem->iTexture = cairo_dock_create_texture_from_surface (pSurface);
428
cairo_surface_destroy (pSurface);
431
pEmblem->pSurface = pSurface;
436
//\___________________ On charge les labels si l'implementation les a valides.
437
if (pRenderer->pLabels != NULL)
439
CairoDockLabelDescription textDescription;
440
cairo_dock_copy_label_description (&textDescription, &myLabels.quickInfoTextDescription);
442
CairoDataRendererText *pLabel;
443
cairo_surface_t *pSurface;
445
for (i = 0; i < iNbValues; i ++)
447
pLabel = &pRenderer->pLabels[i];
448
if (pLabel->pSurface != NULL)
450
cairo_surface_destroy (pLabel->pSurface);
451
pLabel->pSurface = NULL;
453
if (pLabel->iTexture != 0)
455
_cairo_dock_delete_texture (pLabel->iTexture);
456
pLabel->iTexture = 0;
458
if (pLabel->param.fWidth != 0 && pLabel->param.fHeight != 0 && pLabel->cText != NULL)
460
textDescription.fBackgroundColor[3] = 0.;
461
textDescription.iMargin = 0;
462
textDescription.bOutlined = TRUE; /// tester avec et sans ...
463
textDescription.fColorStart[0] = pLabel->param.pColor[0];
464
textDescription.fColorStart[1] = pLabel->param.pColor[1];
465
textDescription.fColorStart[2] = pLabel->param.pColor[2];
466
textDescription.fColorStop[0] = pLabel->param.pColor[0];
467
textDescription.fColorStop[1] = pLabel->param.pColor[1];
468
textDescription.fColorStop[2] = pLabel->param.pColor[2];
469
pSurface = cairo_dock_create_surface_from_text (pLabel->cText,
471
&pLabel->iTextWidth, &pLabel->iTextHeight);
474
pLabel->iTexture = cairo_dock_create_texture_from_surface (pSurface);
475
cairo_surface_destroy (pSurface);
478
pLabel->pSurface = pSurface;
483
//\___________________ On regarde si le texte dessine sur l'icone sera suffisamment lisible.
484
if (pRenderer->pValuesText != NULL)
486
CairoDataRendererTextParam *pText = &pRenderer->pValuesText[0];
487
//g_print ("+++++++pText->fWidth * pRenderer->iWidth : %.2f\n", pText->fWidth * pRenderer->iWidth);
488
pRenderer->bCanRenderValueAsText = (pText->fWidth * pRenderer->iWidth >= CD_MIN_TEXT_WITH);
186
492
void cairo_dock_add_new_data_renderer_on_icon (Icon *pIcon, CairoContainer *pContainer, CairoDataRendererAttribute *pAttribute)
494
//\___________________ On affecte un nouveau DataRenderer a l'icone.
188
495
CairoDataRenderer *pRenderer = cairo_dock_new_data_renderer (pAttribute->cModelName);
190
497
cairo_dock_set_data_renderer_on_icon (pIcon, pRenderer);