All pastes #498561 Raw Edit

groupPaintWindow

public c v1 · immutable
·published 2007-05-20 15:00 UTC
rendered paste body
/* * groupPaintWindow * */BoolgroupPaintWindow(CompWindow * w,		const WindowPaintAttrib * attrib,		Region region, unsigned int mask){	Bool status;	Bool doRotate;	GROUP_SCREEN(w->screen);	GROUP_WINDOW(w);	WindowPaintAttrib gAttrib = *attrib;			if (gw->inSelection) {		int opacity = gs->opt[GROUP_SCREEN_OPTION_OPACITY].value.i;		int saturation = gs->opt[GROUP_SCREEN_OPTION_SATURATION].value.i;		int brightness = gs->opt[GROUP_SCREEN_OPTION_BRIGHTNESS].value.i;		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;				if(gw->group->changeState == PaintFadeIn)			timeLeft += gs->opt[GROUP_SCREEN_OPTION_CHANGE_ANIMATION_TIME].value.f * 500.0f;						double angle_factor;		double flop_w, flop_h;		double scale_w, scale_h;				glPushMatrix(); /* i guess this is needed before i do a translating ?? */				rotateAngle = timeLeft * 180.0f / (gs->opt[GROUP_SCREEN_OPTION_CHANGE_ANIMATION_TIME].value.f * 1000.0f);		if (IS_PREV_TOP_TAB(w, gw->group)) {			rotateAngle += 180.0f;						angle_factor = 1.0f - (rotateAngle > 180.0f ?				rotateAngle - 180.0f : rotateAngle) / 180.0f;						flop_w = WIN_WIDTH(gw->group->topTab->window);			flop_h = WIN_HEIGHT(gw->group->topTab->window);			scale_w = 1.0f + (flop_w/WIN_WIDTH(w) - 1.0f)  * angle_factor;			scale_h = 1.0f + (flop_h/WIN_HEIGHT(w) - 1.0f) * angle_factor;		}		else {			angle_factor = 1.0f - (rotateAngle > 180.0f ?				rotateAngle - 180.0f : rotateAngle) / 180.0f;						flop_w = WIN_WIDTH(gw->group->prevTopTab->window);			flop_h = WIN_HEIGHT(gw->group->prevTopTab->window);			scale_w = flop_w/WIN_WIDTH(w) +				(1.0f - flop_w/WIN_WIDTH(w))  * angle_factor;			scale_h = flop_h/WIN_HEIGHT(w) +				(1.0f - flop_h/WIN_HEIGHT(w)) * angle_factor;		}				if (gw->group->changeAnimationDirection < 0)			rotateAngle *= -1.0f;	// 		glPushMatrix();				/* FIXME this isnt exact, there is still a offset between the windows wich should overlap each other completely */		glTranslatef(((WIN_WIDTH(w)+flop_w) * (1.0-scale_w))/2.0,			((WIN_HEIGHT(w)+flop_h) * (1.0-scale_h))/2.0, 0.0f);		//FIXME es wirkt so als wuerde der gesclalte context nochmal translated werden, wenn man hoch scaled hat die textur zu viel offset, und wenn runter dann zu wenig		glScalef(scale_w*1.0f, scale_h*1.0f, 1.0f / w->screen->width);		/*	Why is no horizontal rotating allowed?? i really like it ;) */		glTranslatef(0.0f, WIN_Y(w) + WIN_HEIGHT(w)/2.0f, 0.0f);		glRotatef(rotateAngle, 1.0f, 0.0f, 0.0f);		glTranslatef(0.0f, -WIN_Y(w) - WIN_HEIGHT(w)/2.0f, 0.0f);/*	or even both??  looks great too ;) *//*		glTranslatef(WIN_X(w) + WIN_WIDTH(w)/2.0f,			WIN_Y(w) + WIN_HEIGHT(w)/2.0f, 0.0f);		glRotatef(rotateAngle, 1.0f, 1.0f, 0.0f);		glTranslatef(-WIN_X(w) - WIN_WIDTH(w)/2.0f,			-WIN_Y(w) - WIN_HEIGHT(w)/2.0f, 0.0f);*//*		glTranslatef(WIN_X(w) + WIN_WIDTH(w)/2.0f, 0.0f, 0.0f);		glRotatef(rotateAngle, 0.0f, 1.0f, 0.0f);		glTranslatef(-WIN_X(w) - WIN_WIDTH(w)/2.0f, 0.0f, 0.0f);*/				mask |= PAINT_WINDOW_TRANSFORMED_MASK;	}	UNWRAP(gs, w->screen, paintWindow);		status = (*w->screen->paintWindow) (w, &gAttrib, 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, region);		} else if (IS_PREV_TOP_TAB(w, gw->group)) {			if (gw->group->changeState == PaintFadeIn)				groupPaintTabBar(gw->group, attrib, region);		}	}	WRAP(gs, w->screen, paintWindow, groupPaintWindow);		if(doRotate)		glPopMatrix();	return status;}