static Bool
enableFragmentProgramAndDrawGeometry (CompWindow	   *w,
				      CompTexture	   *texture,
				      const FragmentAttrib *attrib,
				      int		   filter,
				      unsigned int	   mask)
{
    FragmentAttrib fa = *attrib;
    CompScreen     *s = w->screen;
    Bool	   blending;

    if (s->canDoSaturated && attrib->saturation != COLOR)
    {
	int param, function;

	param    = allocFragmentParameters (&fa, 1);
	function = getSaturateFragmentFunction (s, texture, param);

	addFragmentFunction (&fa, function);

	(*s->programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param,
				     RED_SATURATION_WEIGHT,
				     GREEN_SATURATION_WEIGHT,
				     BLUE_SATURATION_WEIGHT,
				     attrib->saturation / 65535.0f);
    }

    if (!enableFragmentAttrib (s, &fa, &blending))
	return FALSE;

    enableTexture (s, texture, filter);

    if (mask & PAINT_WINDOW_BLEND_MASK)
    {
	if (blending)
	    glEnable (GL_BLEND);

	if (attrib->opacity != OPAQUE || attrib->brightness != BRIGHT)
	{
	    GLushort color;

	    color = (attrib->opacity * attrib->brightness) >> 16;

	    screenTexEnvMode (s, GL_MODULATE);
	    glColor4us (color, color, color, attrib->opacity);

	    (*w->drawWindowGeometry) (w);

	    glColor4usv (defaultColor);
	    screenTexEnvMode (s, GL_REPLACE);
	}
	else
	{
Example #2
0
File: video.c Project: zmike/compiz
static void
videoDrawWindowTexture(CompWindow *w,
                       CompTexture *texture,
                       const FragmentAttrib *attrib,
                       unsigned int mask)
{
   CompScreen *s = w->screen;

   VIDEO_SCREEN(s);
   VIDEO_WINDOW(w);

   if (vw->context)
     {
        VideoSource *src = vw->context->source;

        if (src->format == IMAGE_FORMAT_YV12 &&
            &src->texture->texture == texture)
          {
             FragmentAttrib fa = *attrib;
             int param, function;

             param = allocFragmentParameters(&fa, 2);

             function = getYV12FragmentFunction(s, texture, param);
             if (function)
               {
                  float minX, minY, maxX, maxY, y1, y2;

                  addFragmentFunction(&fa, function);

                  minX = COMP_TEX_COORD_X(&texture->matrix, 1.0f);
                  maxX = COMP_TEX_COORD_X(&texture->matrix, src->width - 1.0f);

                  y1 = COMP_TEX_COORD_Y(&texture->matrix, 1.0f);
                  y2 = COMP_TEX_COORD_Y(&texture->matrix, src->height - 1.0f);

                  minY = MIN(y1, y2);
                  maxY = MAX(y1, y2);

                  (*s->programEnvParameter4f)(GL_FRAGMENT_PROGRAM_ARB, param,
                                              minX, minY, maxX, maxY);

                  /* need to provide plane offsets when texture coordinates
                     are not normalized */
                  if (texture->target != GL_TEXTURE_2D)
                    {
                       float offsetX, offsetY;

                       offsetX = COMP_TEX_COORD_X(&texture->matrix,
                                                  src->width / 2);

                       if (s->glxPixmapFBConfigs[8].yInverted)
                         offsetY = COMP_TEX_COORD_Y(&texture->matrix,
                                                    src->height);
                       else
                         offsetY = COMP_TEX_COORD_Y(&texture->matrix,
                                                    -src->height / 2);

                       (*s->programEnvParameter4f)(GL_FRAGMENT_PROGRAM_ARB,
                                                   param + 1,
                                                   0.0f, offsetY, offsetX, 0.0f);
                    }
               }

             UNWRAP(vs, s, drawWindowTexture);
             (*s->drawWindowTexture)(w, texture, &fa, mask);
             WRAP(vs, s, drawWindowTexture, videoDrawWindowTexture);
          }
        else
          {
             if (!(mask & PAINT_WINDOW_BLEND_MASK))
               {
                  /* we don't have to draw client window texture when
                     video cover the full window and blending isn't used */
                  if (vw->context->full && texture == w->texture)
                    return;
               }

             UNWRAP(vs, s, drawWindowTexture);
             (*s->drawWindowTexture)(w, texture, attrib, mask);
             WRAP(vs, s, drawWindowTexture, videoDrawWindowTexture);
          }
     }
   else
     {
        UNWRAP(vs, s, drawWindowTexture);
        (*s->drawWindowTexture)(w, texture, attrib, mask);
        WRAP(vs, s, drawWindowTexture, videoDrawWindowTexture);
     }
}
Example #3
0
static void
waterDrawWindowTexture(CompWindow * w,
		       CompTexture * texture,
		       const FragmentAttrib * attrib, unsigned int mask)
{
	WATER_SCREEN(w->screen);

	if (ws->count) {
		FragmentAttrib fa = *attrib;
		Bool lighting = w->screen->lighting;
		int param, function, unit;
		GLfloat plane[4];

		WATER_DISPLAY(w->screen->display);

		param = allocFragmentParameters(&fa, 1);
		unit = allocFragmentTextureUnits(&fa, 1);

		function =
		    getBumpMapFragmentFunction(w->screen, texture, unit, param);
		if (function) {
			addFragmentFunction(&fa, function);

			screenLighting(w->screen, TRUE);

			(*w->screen->activeTexture) (GL_TEXTURE0_ARB + unit);

			glBindTexture(ws->target, ws->texture[TINDEX(ws, 0)]);

			plane[1] = plane[2] = 0.0f;
			plane[0] = ws->tx / (GLfloat) w->screen->width;
			plane[3] = 0.0f;

			glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
			glTexGenfv(GL_S, GL_EYE_PLANE, plane);
			glEnable(GL_TEXTURE_GEN_S);

			plane[0] = plane[2] = 0.0f;
			plane[1] = ws->ty / (GLfloat) w->screen->height;
			plane[3] = 0.0f;

			glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
			glTexGenfv(GL_T, GL_EYE_PLANE, plane);
			glEnable(GL_TEXTURE_GEN_T);

			(*w->screen->activeTexture) (GL_TEXTURE0_ARB);

			(*w->screen->
			 programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param,
						 texture->matrix.yy *
						 wd->offsetScale,
						 -texture->matrix.xx *
						 wd->offsetScale, 0.0f, 0.0f);
		}

		/* to get appropriate filtering of texture */
		mask |= PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK;

		UNWRAP(ws, w->screen, drawWindowTexture);
		(*w->screen->drawWindowTexture) (w, texture, &fa, mask);
		WRAP(ws, w->screen, drawWindowTexture, waterDrawWindowTexture);

		if (function) {
			(*w->screen->activeTexture) (GL_TEXTURE0_ARB + unit);
			glDisable(GL_TEXTURE_GEN_T);
			glDisable(GL_TEXTURE_GEN_S);
			glBindTexture(ws->target, 0);
			(*w->screen->activeTexture) (GL_TEXTURE0_ARB);

			screenLighting(w->screen, lighting);
		}
	} else {
		UNWRAP(ws, w->screen, drawWindowTexture);
		(*w->screen->drawWindowTexture) (w, texture, attrib, mask);
		WRAP(ws, w->screen, drawWindowTexture, waterDrawWindowTexture);
	}
}