void cd_animations_draw_wobbly_cairo (Icon *pIcon, CairoDock *pDock, CDAnimationData *pData, cairo_t *pCairoContext)
{
	pIcon->fWidthFactor *= pData->fWobblyWidthFactor;
	pIcon->fHeightFactor *= pData->fWobblyHeightFactor;
	cairo_save (pCairoContext);
	
	if (pDock->bHorizontalDock)
		cairo_translate (pCairoContext,
			pIcon->fWidth * pIcon->fScale * (1 - pIcon->fWidthFactor) / 2,
			pIcon->fHeight * pIcon->fScale * (1 - pIcon->fHeightFactor) / 2);
	else
		cairo_translate (pCairoContext,
			pIcon->fHeight * pIcon->fScale * (1 - pIcon->fHeightFactor) / 2,
			pIcon->fWidth * pIcon->fScale * (1 - pIcon->fWidthFactor) / 2);
	
	cairo_dock_draw_icon_cairo (pIcon, pDock, pCairoContext);
	
	cairo_restore (pCairoContext);
	
	pIcon->fWidthFactor /= pData->fWobblyWidthFactor;
	pIcon->fHeightFactor /= pData->fWobblyHeightFactor;
}
static void render (Icon *pIcon, CairoDock *pDock, CDAnimationData *pData, cairo_t *pCairoContext)
{
	if (pCairoContext)
	{
		double fWidthFactor = pData->fRotateWidthFactor;
		pIcon->fWidthFactor *= fWidthFactor;
		cairo_save (pCairoContext);
		
		if (pDock->container.bIsHorizontal)
			cairo_translate (pCairoContext,
				pIcon->fWidth * pIcon->fScale * (1 - fWidthFactor) / 2,
				1.);
		else
			cairo_translate (pCairoContext,
				1.,
				pIcon->fWidth * pIcon->fScale * (1 - fWidthFactor) / 2);
		
		cairo_dock_draw_icon_cairo (pIcon, pDock, pCairoContext);
		
		cairo_restore (pCairoContext);
		
		pIcon->fWidthFactor /= fWidthFactor;
	}
	else
	{
		double fAlpha = pIcon->fAlpha;
		/**if (pData->fPulseAlpha != 0 && myConfig.bPulseSameShape)
		{
			_cairo_dock_set_alpha (pIcon->fAlpha * (1. - .5 * pData->fPulseAlpha));
			///pIcon->fAlpha *= 1. - .5 * pData->fPulseAlpha;
		}
		else*/
			glColor4f(myConfig.pMeshColor[0], myConfig.pMeshColor[1], myConfig.pMeshColor[2], pIcon->fAlpha);  // ici on peut donner une teinte aux reflets chrome.
		if (myConfig.pMeshColor[3] == 1)
			glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
		else
			//glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
			_cairo_dock_set_blend_alpha ();
		_draw_rotating_icon (pIcon, pDock, pData, 1.);
		
		if (pData->fPulseAlpha != 0 && myConfig.bPulseSameShape)
		{
			_cairo_dock_set_alpha (pData->fPulseAlpha);
			double fScaleFactor = (1 - myConfig.fPulseZoom) * pData->fPulseAlpha + myConfig.fPulseZoom;
			glTranslatef (0., 0., -fScaleFactor * pIcon->fHeight * pIcon->fScale/2);
			_cairo_dock_set_blend_alpha ();
			_draw_rotating_icon (pIcon, pDock, pData, fScaleFactor);
			glTranslatef (0., 0., fScaleFactor * pIcon->fHeight * pIcon->fScale/2);
		}
		
		if (pDock->container.bUseReflect)
		{
			glPushMatrix ();
			_cairo_dock_set_alpha (myIconsParam.fAlbedo * sqrt (myIconsParam.fAlbedo) * pIcon->fAlpha);  // reflect's transparency: we try to hide the lack of degrade :p
			double fOffsetY = pIcon->fHeight * pIcon->fScale + (0 + pIcon->fDeltaYReflection) * pDock->container.fRatio;
			if (pDock->container.bIsHorizontal)
			{
				if (pDock->container.bDirectionUp)
				{
					fOffsetY = pIcon->fHeight * pIcon->fScale + pIcon->fDeltaYReflection;
					glTranslatef (0., - fOffsetY, 0.);
					//glScalef (pIcon->fWidth * pIcon->fWidthFactor * pIcon->fScale, - pIcon->fHeight * pIcon->fScale, 1.);  // reflect's size and we reverse it.
				}
				else
				{
					glTranslatef (0., fOffsetY, 0.);
					//glScalef (pIcon->fWidth * pIcon->fWidthFactor * pIcon->fScale, pDock->iIconSize * myIconsParam.fReflectHeightRatio * pDock->container.fRatio, 1.);
				}
				glScalef (1., -1., 1.);
			}
			else
			{
				if (pDock->container.bDirectionUp)
				{
					glTranslatef (fOffsetY, 0., 0.);
					//glScalef (- pDock->iIconSize * myIconsParam.fReflectHeightRatio * pDock->container.fRatio, pIcon->fWidth * pIcon->fWidthFactor * pIcon->fScale, 1.);
				}
				else
				{
					glTranslatef (- fOffsetY, 0., 0.);
					//glScalef (pDock->iIconSize * myIconsParam.fReflectHeightRatio * pDock->container.fRatio, pIcon->fWidth * pIcon->fWidthFactor * pIcon->fScale, 1.);
				}
				glScalef (-1., 1., 1.);
			}
			
			_cairo_dock_set_blend_alpha ();
			_draw_rotating_icon (pIcon, pDock, pData, 1.);
			glPopMatrix ();
		}
		pIcon->fAlpha = fAlpha;
		pData->bHasBeenPulsed = myConfig.bPulseSameShape;
	}
}