Hey Luca,

I forgot one important thing in my review:
When you manipulate global OpenGL states you need to set them back to what they were before after painting - in the ruler-drawing-case you change the glBlendFunc, but also glLineWidth without restoring them - drawGuides () could look something like this (with added only on output with pointer option):

void
ShowmouseScreen::drawGuides (const GLMatrix &transform)
{
    unsigned short       *color       = optionGetGuideColor ();
    const int            x            = mMousePos.x ();
    const int            y            = mMousePos.y ();
    const float          xf           = (float)x;
    const float          yf           = (float)y;
    const int            thickness    = optionGetGuideThickness ();
const float r = (float)optionGetGuideEmptyRadius ();

    CompRect workArea;
const bool restrictGuidesToOutputWithPointer = optionGetRestrictGuidesToOutputWithPointer ();

    if (restrictGuidesToOutputWithPointer)
workArea = screen->getWorkareaForOutput (screen->outputDeviceForPoint (x, y));
    else
    workArea = CompRect (0, 0, screen->width (), screen->height ());

    const int workAreaX           = workArea.x ();
    const int workAreaY           = workArea.y ();
    const int workAreaWidth       = workArea.width ();
    const int workAreaHeight      = workArea.height ();
    const int workAreaXPlusWidth  = workAreaX + workAreaWidth;
    const int workAreaYPlusHeight = workAreaY + workAreaHeight;

    /* If the thickness is zero we don't have to draw, but we should
     * still mark the region where the guides should be as damaged --
     * this is useful when thickness has just been changed.
     */
    if (thickness > 0)
    {
    glLineWidth ((GLfloat)thickness);

    GLboolean glBlendEnabled = glIsEnabled (GL_BLEND);

    /* we push in any case as we are going to change the blend function */
    #ifndef USE_GLES
    glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LINE_BIT);
    #endif

    if (!glBlendEnabled)
        glEnable (GL_BLEND);

    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    if (restrictGuidesToOutputWithPointer)
    {
        if (yf - r >= (GLfloat)workAreaY)
        drawLine (transform, xf, (GLfloat)workAreaY, xf, yf - r, color);

        if (yf + r <= (GLfloat)workAreaYPlusHeight)
drawLine (transform, xf, yf + r, xf, (GLfloat)workAreaYPlusHeight, color);

        if (xf - r >= (GLfloat)workAreaX)
        drawLine (transform, (GLfloat)workAreaX, yf, xf - r, yf, color);

        if (xf + r <= (GLfloat)workAreaXPlusWidth)
drawLine (transform, xf + r, yf, (GLfloat)workAreaXPlusWidth, yf, color);
    }
    else
    {
        drawLine (transform, xf, (GLfloat)workAreaY, xf, yf - r, color);
drawLine (transform, xf, yf + r, xf, (GLfloat)workAreaYPlusHeight, color);
        drawLine (transform, (GLfloat)workAreaX, yf, xf - r, yf, color);
drawLine (transform, xf + r, yf, (GLfloat)workAreaXPlusWidth, yf, color);
    }

    /* we changed the blend function in any way here */
    #ifndef USE_GLES
    glPopAttrib ();    // restore line width and glBlendFunc/GL_BLEND
    #else
    if (!glBlendEnabled)
        glDisable (GL_BLEND);

    glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    glLineWidth (1.0f);
    #endif
    }

    cScreen->damageRegion (CompRegion (workAreaX, y - thickness / 2 - 1,
                       workAreaXPlusWidth, thickness + 1));
    cScreen->damageRegion (CompRegion (x - thickness / 2 - 1, workAreaY,
                       thickness + 1, workAreaYPlusHeight));
}

Maybe this saves you some work.

Greetinx,
MC Return
_______________________________________________
compiz mailing list
compiz@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to