137
135
int iOrientation = iLoadingModifier & CAIRO_DOCK_ORIENTATION_MASK;
139
//if (iOrientation != 0)
137
cairo_translate (pCairoContext,
140
cairo_scale (pCairoContext,
143
switch (iOrientation)
141
cairo_translate (pCairoContext,
144
cairo_scale (pCairoContext,
147
switch (iOrientation)
149
case CAIRO_DOCK_ORIENTATION_HFLIP :
150
g_print ("orientation : HFLIP\n");
151
cairo_scale (pCairoContext, -1., 1.);
153
case CAIRO_DOCK_ORIENTATION_ROT_180 :
154
g_print ("orientation : ROT_180\n");
155
cairo_rotate (pCairoContext, G_PI);
157
case CAIRO_DOCK_ORIENTATION_VFLIP :
158
g_print ("orientation : VFLIP\n");
159
cairo_scale (pCairoContext, 1., -1.);
161
case CAIRO_DOCK_ORIENTATION_ROT_90_HFLIP :
162
g_print ("orientation : ROT_90_HFLIP\n");
163
cairo_scale (pCairoContext, -1., 1.);
164
cairo_rotate (pCairoContext, + G_PI/2);
166
case CAIRO_DOCK_ORIENTATION_ROT_90 :
167
g_print ("orientation : ROT_90\n");
168
cairo_rotate (pCairoContext, + G_PI/2);
170
case CAIRO_DOCK_ORIENTATION_ROT_90_VFLIP :
171
g_print ("orientation : ROT_90_VFLIP\n");
172
cairo_scale (pCairoContext, 1., -1.);
173
cairo_rotate (pCairoContext, + G_PI/2);
175
case CAIRO_DOCK_ORIENTATION_ROT_270 :
176
g_print ("orientation : ROT_270\n");
177
cairo_rotate (pCairoContext, - G_PI/2);
182
if (iOrientation < CAIRO_DOCK_ORIENTATION_ROT_90_HFLIP)
183
cairo_translate (pCairoContext,
184
- fUsefulWidth/2/fZoomX,
185
- fUsefulheight/2/fZoomY);
187
cairo_translate (pCairoContext,
188
- fUsefulheight/2/fZoomY,
189
- fUsefulWidth/2/fZoomX);
145
case CAIRO_DOCK_ORIENTATION_HFLIP :
146
g_print ("orientation : HFLIP\n");
147
cairo_scale (pCairoContext, -1., 1.);
149
case CAIRO_DOCK_ORIENTATION_ROT_180 :
150
g_print ("orientation : ROT_180\n");
151
cairo_rotate (pCairoContext, G_PI);
153
case CAIRO_DOCK_ORIENTATION_VFLIP :
154
g_print ("orientation : VFLIP\n");
155
cairo_scale (pCairoContext, 1., -1.);
157
case CAIRO_DOCK_ORIENTATION_ROT_90_HFLIP :
158
g_print ("orientation : ROT_90_HFLIP\n");
159
cairo_scale (pCairoContext, -1., 1.);
160
cairo_rotate (pCairoContext, + G_PI/2);
162
case CAIRO_DOCK_ORIENTATION_ROT_90 :
163
g_print ("orientation : ROT_90\n");
164
cairo_rotate (pCairoContext, + G_PI/2);
166
case CAIRO_DOCK_ORIENTATION_ROT_90_VFLIP :
167
g_print ("orientation : ROT_90_VFLIP\n");
168
cairo_scale (pCairoContext, 1., -1.);
169
cairo_rotate (pCairoContext, + G_PI/2);
171
case CAIRO_DOCK_ORIENTATION_ROT_270 :
172
g_print ("orientation : ROT_270\n");
173
cairo_rotate (pCairoContext, - G_PI/2);
193
cairo_scale (pCairoContext,
178
if (iOrientation < CAIRO_DOCK_ORIENTATION_ROT_90_HFLIP)
179
cairo_translate (pCairoContext,
180
- fUsefulWidth/2/fZoomX,
181
- fUsefulheight/2/fZoomY);
183
cairo_translate (pCairoContext,
184
- fUsefulheight/2/fZoomY,
185
- fUsefulWidth/2/fZoomX);
200
cairo_surface_t *cairo_dock_create_surface_from_xicon_buffer (gulong *pXIconBuffer, int iBufferNbElements, cairo_t *pSourceContext, double fMaxScale, double *fWidth, double *fHeight)
189
cairo_surface_t *cairo_dock_create_surface_from_xicon_buffer (gulong *pXIconBuffer, int iBufferNbElements, cairo_t *pSourceContext, double fConstraintWidth, double fConstraintHeight, double fMaxScale, double *fWidth, double *fHeight)
202
191
g_return_val_if_fail (cairo_status (pSourceContext) == CAIRO_STATUS_SUCCESS, NULL);
213
202
//\____________________ On pre-multiplie chaque composante par le alpha (necessaire pour libcairo).
214
203
int w = pXIconBuffer[iBestIndex];
215
204
int h = pXIconBuffer[iBestIndex+1];
206
//g_print ("%s (%dx%d)\n", __func__, w, h);
209
if (iBestIndex + n > iBufferNbElements) // precaution au cas ou le nombre d'elements dans le buffer serait incorrect.
211
cd_warning ("This icon is broken !\nThis means that one of the current applications has sent a buggy icon to X.");
218
214
gint pixel, alpha, red, green, blue;
219
215
float fAlphaFactor;
220
gint *pPixelBuffer = (gint *) &pXIconBuffer[iBestIndex+2]; // on va ecrire le resultat du filtre directement dans le tableau fourni en entree. C'est ok car sizeof(gulong) >= sizeof(gint), donc le tableau de pixels est plus petit que le buffer fourni en entree. merci a Hannemann pour ses tests et ses screenshots ! :-)
221
for (i = 0; i < w * h; i ++)
216
gint *pPixelBuffer = (gint *) &pXIconBuffer[iBestIndex]; // on va ecrire le resultat du filtre directement dans le tableau fourni en entree. C'est ok car sizeof(gulong) >= sizeof(gint), donc le tableau de pixels est plus petit que le buffer fourni en entree. merci a Hannemann pour ses tests et ses screenshots ! :-)
217
for (i = 0; i < n; i ++)
223
pixel = (gint) pXIconBuffer[iBestIndex+2+i];
219
pixel = (gint) pXIconBuffer[iBestIndex+i];
224
220
alpha = (pixel & 0xFF000000) >> 24;
225
221
red = (pixel & 0x00FF0000) >> 16;
226
222
green = (pixel & 0x0000FF00) >> 8;
245
241
double fIconWidthSaturationFactor = 1., fIconHeightSaturationFactor = 1.;
246
242
cairo_dock_calculate_constrainted_size (fWidth,
248
myIcons.tIconAuthorizedWidth[CAIRO_DOCK_APPLI],
249
myIcons.tIconAuthorizedHeight[CAIRO_DOCK_APPLI],
250
246
CAIRO_DOCK_KEEP_RATIO | CAIRO_DOCK_FILL_SPACE,
251
247
&fIconWidthSaturationFactor,
252
248
&fIconHeightSaturationFactor);
254
250
cairo_surface_t *pNewSurface = _cairo_dock_create_blank_surface (pSourceContext,
255
251
ceil (*fWidth * fMaxScale),
256
252
ceil (*fHeight * fMaxScale));
257
253
cairo_t *pCairoContext = cairo_create (pNewSurface);
261
255
double fUsefulWidth = w * fIconWidthSaturationFactor; // a part dans le cas fill && keep ratio, c'est la meme chose que fImageWidth et fImageHeight.
262
256
double fUsefulHeight = h * fIconHeightSaturationFactor;
263
257
_apply_orientation_and_scale (pCairoContext,
558
cairo_surface_t *cairo_dock_create_surface_from_pattern (const gchar *cImageFile, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fAlpha)
560
g_return_val_if_fail (cairo_status (pSourceContext) == CAIRO_STATUS_SUCCESS, NULL);
561
cairo_surface_t *pNewSurface = NULL;
563
if (cImageFile != NULL)
565
gchar *cImagePath = cairo_dock_generate_file_path (cImageFile);
566
double fImageWidth, fImageHeight;
567
cairo_surface_t *pPatternSurface = cairo_dock_create_surface_from_image (cImagePath,
570
0, // pas de contrainte sur
571
0, // la taille du motif initialement.
572
CAIRO_DOCK_FILL_SPACE,
577
if (pPatternSurface == NULL)
580
pNewSurface = _cairo_dock_create_blank_surface (pSourceContext,
583
cairo_t *pCairoContext = cairo_create (pNewSurface);
585
cairo_pattern_t* pPattern = cairo_pattern_create_for_surface (pPatternSurface);
586
g_return_val_if_fail (cairo_pattern_status (pPattern) == CAIRO_STATUS_SUCCESS, NULL);
587
cairo_pattern_set_extend (pPattern, CAIRO_EXTEND_REPEAT);
589
cairo_set_source (pCairoContext, pPattern);
590
cairo_paint_with_alpha (pCairoContext, fAlpha);
591
cairo_destroy (pCairoContext);
592
cairo_pattern_destroy (pPattern);
594
cairo_surface_destroy (pPatternSurface);
567
602
cairo_surface_t * cairo_dock_rotate_surface (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fRotationAngle)
617
static cairo_surface_t * cairo_dock_create_reflection_surface_horizontal (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fMaxScale, gboolean bDirectionUp)
652
static cairo_surface_t * cairo_dock_create_reflection_surface_horizontal (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fReflectSize, double fAlbedo, gboolean bDirectionUp)
619
654
g_return_val_if_fail (pSourceContext != NULL && cairo_status (pSourceContext) == CAIRO_STATUS_SUCCESS, NULL);
620
655
//g_print ("%s (%d)\n", __func__, bDirectionUp);
622
657
//\_______________ On cree la surface d'une fraction hauteur de l'image originale.
623
double fReflectHeight = myIcons.fReflectSize * fMaxScale;
624
if (pSurface == NULL || fReflectHeight == 0 || myIcons.fAlbedo == 0)
658
if (pSurface == NULL || fReflectSize == 0 || fAlbedo == 0)
626
660
cairo_surface_t *pNewSurface = _cairo_dock_create_blank_surface (pSourceContext,
629
663
cairo_t *pCairoContext = cairo_create (pNewSurface);
631
665
cairo_set_operator (pCairoContext, CAIRO_OPERATOR_OVER);
668
702
return pNewSurface;
671
static cairo_surface_t * cairo_dock_create_reflection_surface_vertical (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fMaxScale, gboolean bDirectionUp)
705
static cairo_surface_t * cairo_dock_create_reflection_surface_vertical (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fReflectSize, double fAlbedo, gboolean bDirectionUp)
673
707
g_return_val_if_fail (pSurface != NULL && pSourceContext != NULL && cairo_status (pSourceContext) == CAIRO_STATUS_SUCCESS, NULL);
675
709
//\_______________ On cree la surface d'une fraction hauteur de l'image originale.
676
double fReflectWidth = myIcons.fReflectSize * fMaxScale;
677
if (fReflectWidth == 0 || myIcons.fAlbedo == 0)
710
if (fReflectSize == 0 || fAlbedo == 0)
679
712
cairo_surface_t *pNewSurface = _cairo_dock_create_blank_surface (pSourceContext,
682
715
cairo_t *pCairoContext = cairo_create (pNewSurface);
687
720
//\_______________ On dessine l'image originale inversee.
688
721
cairo_translate (pCairoContext, fImageWidth, 0);
689
722
cairo_scale (pCairoContext, -1., 1.);
690
cairo_set_source_surface (pCairoContext, pSurface, (bDirectionUp ? 0. : fImageHeight - fReflectWidth), 0.);
723
cairo_set_source_surface (pCairoContext, pSurface, (bDirectionUp ? 0. : fImageHeight - fReflectSize), 0.);
692
725
//\_______________ On applique un degrade en transparence.
693
726
cairo_pattern_t *pGradationPattern = cairo_pattern_create_linear (0,
695
fImageHeight-fReflectWidth,
728
fImageHeight - fReflectSize,
696
729
0.); // de gauche a droite.
697
730
g_return_val_if_fail (cairo_pattern_status (pGradationPattern) == CAIRO_STATUS_SUCCESS, NULL);
717
750
return pNewSurface;
720
cairo_surface_t * cairo_dock_create_reflection_surface (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, gboolean bIsHorizontal, double fMaxScale, gboolean bDirectionUp)
753
cairo_surface_t * cairo_dock_create_reflection_surface (cairo_surface_t *pSurface, cairo_t *pSourceContext, double fImageWidth, double fImageHeight, double fReflectSize, double fAlbedo, gboolean bIsHorizontal, gboolean bDirectionUp)
722
755
if (bIsHorizontal)
723
return cairo_dock_create_reflection_surface_horizontal (pSurface, pSourceContext, fImageWidth, fImageHeight, fMaxScale, bDirectionUp);
756
return cairo_dock_create_reflection_surface_horizontal (pSurface, pSourceContext, fImageWidth, fImageHeight, fReflectSize, fAlbedo, bDirectionUp);
725
return cairo_dock_create_reflection_surface_vertical (pSurface, pSourceContext, fImageWidth, fImageHeight, fMaxScale, bDirectionUp);
758
return cairo_dock_create_reflection_surface_vertical (pSurface, pSourceContext, fImageWidth, fImageHeight, fReflectSize, fAlbedo, bDirectionUp);