All pastes #499100 Raw Edit

Untitled

public text v1 · immutable
·published 2007-05-20 21:34 UTC
rendered paste body
/*
 * groupPaintWindow
 *
 */
Bool
groupPaintWindow(CompWindow * w,
		const WindowPaintAttrib * attrib,
		const CompTransform *transform,
		Region region, unsigned int mask)
{
	Bool status;
	Bool doRotate;
	GROUP_SCREEN(w->screen);
	GROUP_WINDOW(w);

	WindowPaintAttrib gAttrib = *attrib;
	CompTransform wTransform = *transform;

	if (gw->inSelection) {
		int opacity = groupGetSelectOpacity(w->screen);
		int saturation = groupGetSelectSaturation(w->screen);
		int brightness = groupGetSelectBrightness(w->screen);

		opacity = OPAQUE * opacity / 100;
		saturation = COLOR * saturation / 100;
		brightness = BRIGHT * brightness / 100;

		gAttrib.opacity = opacity;
		gAttrib.saturation = saturation;
		gAttrib.brightness = brightness;
	} else if (gw->group && gw->group->tabbingState != PaintOff &&
		(gw->animateState & (IS_ANIMATED | FINISHED_ANIMATION))) {
		//fade the window out 
		float opacity;
		
		int origDistanceX = (gw->orgPos.x - gw->destination.x);
		int origDistanceY = (gw->orgPos.y - gw->destination.y);
		float origDistance = sqrt(pow(origDistanceX, 2) + pow(origDistanceY,2));
		
		float distanceX = (WIN_X(w) - gw->destination.x);
		float distanceY = (WIN_Y(w) - gw->destination.y);
		float distance = sqrt(pow(distanceX, 2) + pow(distanceY, 2));
		
		if(distance > origDistance) 
			opacity = 100.0f;
		else {
			if(!origDistanceX && !origDistanceY) {
				if (IS_TOP_TAB(w, gw->group) && (gw->group->tabbingState == PaintFadeIn)) 
					opacity = 100.0f;
				else
					opacity = 0.0f;
			} else 
				opacity = 100.0f * distance / origDistance;

			if (gw->group->tabbingState == PaintFadeOut) 
				opacity = 100.0f - opacity;
		}

		gAttrib.opacity = gAttrib.opacity * opacity / 100; 
	}            
	
	doRotate = gw->group && (gw->group->changeState != PaintOff) &&
		(IS_TOP_TAB(w, gw->group) || IS_PREV_TOP_TAB(w, gw->group));

	if (doRotate)
	{
		float rotateAngle;
		float timeLeft = gw->group->changeAnimationTime;
		float animationProgress;
		float animWidth, animHeight;
		float animScaleX, animScaleY;
		
		if(gw->group->changeState == PaintFadeIn)
			timeLeft += groupGetChangeAnimationTime(w->screen) * 500.0f;
		
		animationProgress = (1 - (timeLeft / (groupGetChangeAnimationTime(w->screen) * 1000.0f))); // 0 at the beginning, 1 at the end.
		
		rotateAngle = animationProgress * 180.0f;
		if (IS_TOP_TAB(w, gw->group))
			rotateAngle += 180.0f;

		if (gw->group->changeAnimationDirection < 0)
			rotateAngle *= -1.0f;
		
		animWidth = (1 - animationProgress) * WIN_WIDTH(PREV_TOP_TAB(gw->group)) + animationProgress * WIN_WIDTH(TOP_TAB(gw->group));
		animHeight = (1 - animationProgress) * WIN_HEIGHT(PREV_TOP_TAB(gw->group)) + animationProgress * WIN_HEIGHT(TOP_TAB(gw->group));
		
		animScaleX = animWidth / WIN_WIDTH(w);
		animScaleY = animHeight / WIN_HEIGHT(w);

		matrixScale(&wTransform, animScaleX, animScaleY, 1.0f / w->screen->width);
		matrixTranslate(&wTransform, animScaleX * (WIN_X(w) + WIN_WIDTH(w) / 2.0f), 0.0f, 0.0f);
		matrixRotate(&wTransform, rotateAngle, 0.0f, 1.0f, 0.0f);
		matrixTranslate(&wTransform, -animScaleX * (WIN_X(w) + WIN_WIDTH(w) / 2.0f), 0.0f, 0.0f);

		glPushMatrix();
		glLoadMatrixf(wTransform.m);
		
		mask |= PAINT_WINDOW_TRANSFORMED_MASK;
	}

	if (gw->windowHideInfo)
		mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;

	UNWRAP(gs, w->screen, paintWindow);
	
	status = (*w->screen->paintWindow) (w, &gAttrib, &wTransform, region, mask);
	
	if (gw->group && gw->group->tabBar) {
		if (HAS_TOP_WIN(gw->group) && IS_TOP_TAB(w, gw->group)) {
			if ((gw->group->changeState == PaintOff) || (gw->group->changeState == PaintFadeOut)) 
				groupPaintTabBar(gw->group, attrib, &wTransform, mask, region);
		} else if (IS_PREV_TOP_TAB(w, gw->group)) {
			if (gw->group->changeState == PaintFadeIn)
				groupPaintTabBar(gw->group, attrib, &wTransform, mask, region);
		}
	}

	WRAP(gs, w->screen, paintWindow, groupPaintWindow);
	
	if(doRotate)
		glPopMatrix();

	return status;
}