292
297
return pGradationPattern;
300
#define _guess_color(i) (((pGraph->fLowColor[i] < pGraph->fHighColor[i] && pGraph->fLowColor[i] > dc) || pGraph->fLowColor[i] > 1-dc) ? pGraph->fLowColor[i] - dc : pGraph->fLowColor[i] + dc)
301
//#define _guess_color(i) (1. - pGraph->fLowColor[i])
302
static void _set_overlay_zones (CairoDockGraph *pGraph)
304
CairoDataRenderer *pRenderer = CAIRO_DATA_RENDERER (pGraph);
305
int iNbValues = cairo_data_renderer_get_nb_values (pRenderer);
306
int iWidth = pRenderer->iWidth, iHeight = pRenderer->iHeight;
309
// on complete le data-renderer.
310
int iNbDrawings = iNbValues / pRenderer->iRank;
311
double fMargin = pGraph->fMargin;
312
double fOneGraphHeight = iHeight - 2*fMargin;
313
fOneGraphHeight /= iNbDrawings;
314
double fOneGraphWidth = iWidth - 2*fMargin;
315
fOneGraphWidth /= iNbDrawings;
316
int iTextWidth = MIN (48, pRenderer->iWidth/2); // on definit une taille pour les zones de texte.
317
int iTextHeight = MIN (16, fOneGraphHeight/1.5);
318
int iLabelWidth = MIN (48, pRenderer->iWidth/2); // on definit une taille pour les zones de texte.
319
int iLabelHeight = MIN (16, fOneGraphHeight/2.);
320
int h = fOneGraphHeight/8; // ecart du texte au-dessus de l'axe Ox.
321
CairoDataRendererTextParam *pValuesText;
322
CairoDataRendererEmblem *pEmblem;
323
CairoDataRendererText *pLabel;
324
for (i = 0; i < iNbValues; i ++)
326
/// rajouter l'alignement gauche/centre/droit ...
327
if (pRenderer->pLabels) // les labels en haut a gauche.
329
pLabel = &pRenderer->pLabels[i];
330
if (iLabelHeight > 8) // sinon trop petit, et empiete sur la valeur.
332
if (pGraph->bMixGraphs)
334
pLabel->param.fX = (double)(fMargin + i * fOneGraphWidth + iLabelWidth/2) / iWidth - .5;
335
pLabel->param.fY = (double)(iHeight - fMargin - iLabelHeight/2) / iHeight - .5;
339
pLabel->param.fX = (double) (fMargin + iLabelWidth/2) / iWidth - .5;
340
pLabel->param.fY = .5 - (double)(fMargin + h + i * fOneGraphHeight + iLabelHeight/2) / iHeight;
342
pLabel->param.fWidth = (double)iLabelWidth / iWidth;
343
pLabel->param.fHeight = (double)iLabelHeight / iHeight;
344
pLabel->param.pColor[0] = myLabels.quickInfoTextDescription.fBackgroundColor[0];
345
pLabel->param.pColor[1] = myLabels.quickInfoTextDescription.fBackgroundColor[1];
346
pLabel->param.pColor[2] = myLabels.quickInfoTextDescription.fBackgroundColor[2];
347
pLabel->param.pColor[3] = 1.; // meme couleur que les axes.
351
pLabel->param.fWidth = pLabel->param.fHeight = 0;
354
if (pRenderer->pValuesText) // les valeurs en bas au milieu.
356
pValuesText = &pRenderer->pValuesText[i];
357
if (pGraph->bMixGraphs)
359
pValuesText->fX = (double)(fMargin + i * fOneGraphWidth + iTextWidth/2) / iWidth - .5;
360
pValuesText->fY = (double)(fMargin + h + iTextHeight/2) / iHeight - .5;
364
pValuesText->fX = (double)0.; // centered.
365
pValuesText->fY = .5 - (double)(fMargin + (i+1) * fOneGraphHeight - iTextHeight/2 - h) / iHeight;
367
pValuesText->fWidth = (double)iTextWidth / iWidth;
368
pValuesText->fHeight = (double)iTextHeight / iHeight;
369
if (pGraph->fBackGroundColor[3] > .2 && pGraph->fBackGroundColor[3] < .7)
371
pValuesText->pColor[0] = pGraph->fBackGroundColor[0];
372
pValuesText->pColor[1] = pGraph->fBackGroundColor[1];
373
pValuesText->pColor[2] = pGraph->fBackGroundColor[2];
374
//g_print ("bg color: %.2f;%.2f;%.2f\n", pGraph->fBackGroundColor[0], pGraph->fBackGroundColor[1], pGraph->fBackGroundColor[2]);
378
pValuesText->pColor[0] = _guess_color (0);
379
pValuesText->pColor[1] = _guess_color (1);
380
pValuesText->pColor[2] = _guess_color (2);
381
//g_print ("line color: %.2f;%.2f;%.2f\n", pGraph->fLowColor[0], pGraph->fLowColor[1], pGraph->fLowColor[2]);
383
//g_print ("text color: %.2f;%.2f;%.2f\n", pValuesText->pColor[0], pValuesText->pColor[1], pValuesText->pColor[2]);
384
pValuesText->pColor[3] = 1.;
294
389
static void cairo_dock_load_graph (CairoDockGraph *pGraph, CairoContainer *pContainer, CairoGraphAttribute *pAttribute)
296
391
CairoDataRenderer *pRenderer = CAIRO_DATA_RENDERER (pGraph);
297
CairoDataToRenderer *pData = cairo_data_renderer_get_data (pRenderer);
299
393
int iWidth = pRenderer->iWidth, iHeight = pRenderer->iHeight;
300
394
if (iWidth == 0 || iHeight == 0)
397
int iNbValues = cairo_data_renderer_get_nb_values (pRenderer);
303
398
pGraph->iType = pAttribute->iType;
304
399
pGraph->bMixGraphs = pAttribute->bMixGraphs;
305
pGraph->dataRenderer.iRank = (pAttribute->bMixGraphs ? pData->iNbValues : 1);
400
pRenderer->iRank = (pAttribute->bMixGraphs ? iNbValues : 1);
307
pGraph->fHighColor = g_new0 (double, 3 * pData->iNbValues);
402
pGraph->fHighColor = g_new0 (double, 3 * iNbValues);
308
403
if (pAttribute->fHighColor != NULL)
309
memcpy (pGraph->fHighColor, pAttribute->fHighColor, 3 * pData->iNbValues * sizeof (double));
310
pGraph->fLowColor = g_new0 (double, 3 * pData->iNbValues);
404
memcpy (pGraph->fHighColor, pAttribute->fHighColor, 3 * iNbValues * sizeof (double));
405
pGraph->fLowColor = g_new0 (double, 3 * iNbValues);
311
406
if (pAttribute->fLowColor != NULL)
312
memcpy (pGraph->fLowColor, pAttribute->fLowColor, 3 * pData->iNbValues * sizeof (double));
407
memcpy (pGraph->fLowColor, pAttribute->fLowColor, 3 * iNbValues * sizeof (double));
315
pGraph->pGradationPatterns = g_new (cairo_pattern_t *, pData->iNbValues);
316
for (i = 0; i < pData->iNbValues; i ++)
410
pGraph->pGradationPatterns = g_new (cairo_pattern_t *, iNbValues);
411
for (i = 0; i < iNbValues; i ++)
318
413
pGraph->pGradationPatterns[i] = _cairo_dock_create_graph_pattern (pGraph,
319
414
&pGraph->fLowColor[3*i],
333
428
pGraph->fBackGroundColor,
335
pData->iNbValues / pRenderer->iRank);
430
iNbValues / pRenderer->iRank);
431
if (g_bUseOpenGL && 0)
337
432
pGraph->iBackgroundTexture = cairo_dock_create_texture_from_surface (pGraph->pBackgroundSurface);
434
// on complete le data-renderer.
435
_set_overlay_zones (pGraph);
341
439
static void cairo_dock_reload_graph (CairoDockGraph *pGraph)
343
441
CairoDataRenderer *pRenderer = CAIRO_DATA_RENDERER (pGraph);
344
CairoDataToRenderer *pData = cairo_data_renderer_get_data (pRenderer);
442
int iNbValues = cairo_data_renderer_get_nb_values (pRenderer);
345
443
int iWidth = pRenderer->iWidth, iHeight = pRenderer->iHeight;
346
444
if (pGraph->pBackgroundSurface != NULL)
347
445
cairo_surface_destroy (pGraph->pBackgroundSurface);
348
pGraph->pBackgroundSurface = _cairo_dock_create_graph_background (iWidth, iHeight, pGraph->iRadius, pGraph->fMargin, pGraph->fBackGroundColor, pGraph->iType, pData->iNbValues / pRenderer->iRank);
446
pGraph->pBackgroundSurface = _cairo_dock_create_graph_background (iWidth, iHeight, pGraph->iRadius, pGraph->fMargin, pGraph->fBackGroundColor, pGraph->iType, iNbValues / pRenderer->iRank);
349
447
if (pGraph->iBackgroundTexture != 0)
350
448
_cairo_dock_delete_texture (pGraph->iBackgroundTexture);
449
if (g_bUseOpenGL && 0)
352
450
pGraph->iBackgroundTexture = cairo_dock_create_texture_from_surface (pGraph->pBackgroundSurface);
354
452
pGraph->iBackgroundTexture = 0;
356
for (i = 0; i < pGraph->dataRenderer.data.iNbValues; i ++)
454
for (i = 0; i < iNbValues; i ++)
358
456
if (pGraph->pGradationPatterns[i] != NULL)
359
457
cairo_pattern_destroy (pGraph->pGradationPatterns[i]);
360
458
pGraph->pGradationPatterns[i] = _cairo_dock_create_graph_pattern (pGraph, &pGraph->fLowColor[3*i], &pGraph->fHighColor[3*i], 0.);
461
// on re-complete le data-renderer.
462
_set_overlay_zones (pGraph);
365
static void cairo_dock_free_graph (CairoDockGraph *pGraph)
466
static void cairo_dock_unload_graph (CairoDockGraph *pGraph)
370
469
if (pGraph->pBackgroundSurface != NULL)
371
470
cairo_surface_destroy (pGraph->pBackgroundSurface);
372
471
if (pGraph->iBackgroundTexture != 0)
373
472
_cairo_dock_delete_texture (pGraph->iBackgroundTexture);
474
CairoDataRenderer *pRenderer = CAIRO_DATA_RENDERER (pGraph);
475
int iNbValues = cairo_data_renderer_get_nb_values (pRenderer);
375
for (i = 0; i < pGraph->dataRenderer.data.iNbValues; i ++)
477
for (i = 0; i < iNbValues; i ++)
377
479
if (pGraph->pGradationPatterns[i] != NULL)
378
480
cairo_pattern_destroy (pGraph->pGradationPatterns[i]);
389
490
//////////////////////////////////////////
390
491
/////////////// RENDERER /////////////////
391
492
//////////////////////////////////////////
392
CairoDockGraph *cairo_dock_new_graph (void)
493
void cairo_dock_register_data_renderer_graph (void)
394
CairoDockGraph *pGraph = g_new0 (CairoDockGraph, 1);
395
pGraph->dataRenderer.interface.new = (CairoDataRendererNewFunc) cairo_dock_new_graph;
396
pGraph->dataRenderer.interface.load = (CairoDataRendererLoadFunc) cairo_dock_load_graph;
397
pGraph->dataRenderer.interface.render = (CairoDataRendererRenderFunc) cairo_dock_render_graph;
398
pGraph->dataRenderer.interface.render_opengl = (CairoDataRendererRenderOpenGLFunc) NULL;
399
pGraph->dataRenderer.interface.reload = (CairoDataRendererReloadFunc) cairo_dock_reload_graph;
400
pGraph->dataRenderer.interface.free = (CairoDataRendererFreeFunc) cairo_dock_free_graph;
495
CairoDockDataRendererRecord *pRecord = g_new0 (CairoDockDataRendererRecord, 1);
496
pRecord->interface.load = (CairoDataRendererLoadFunc) cairo_dock_load_graph;
497
pRecord->interface.render = (CairoDataRendererRenderFunc) cairo_dock_render_graph;
498
pRecord->interface.render_opengl = (CairoDataRendererRenderOpenGLFunc) NULL;
499
pRecord->interface.reload = (CairoDataRendererReloadFunc) cairo_dock_reload_graph;
500
pRecord->interface.unload = (CairoDataRendererUnloadFunc) cairo_dock_unload_graph;
501
pRecord->iStructSize = sizeof (CairoDockGraph);
502
pRecord->cThemeDirName = NULL;
503
pRecord->cDefaultTheme = NULL;
505
cairo_dock_register_data_renderer ("graph", pRecord);