CompRegion CompRegion::xored (const CompRegion &r) const { CompRegion rv; rv.priv->makeReal (); XXorRegion (handle (), r.handle (), rv.handle ()); return rv; }
CompRegion CompRegion::united (const CompRegion &r) const { CompRegion rv; rv.priv->makeReal (); XUnionRegion (handle (), r.handle (), rv.handle ()); return rv; }
CompRegion CompRegion::subtracted (const CompRegion &r) const { CompRegion rv; rv.priv->makeReal (); XSubtractRegion (handle (), r.handle (), rv.handle ()); return rv; }
CompRegion CompRegion::intersected (const CompRect &r) const { CompRegion reg (r); reg.priv->makeReal (); XIntersectRegion (reg.handle (), handle (), reg.handle ()); return reg; }
void GLWindow::glAddGeometry (const GLTexture::MatrixList &matrix, const CompRegion ®ion, const CompRegion &clip, unsigned int maxGridWidth, unsigned int maxGridHeight) { WRAPABLE_HND_FUNCTN (glAddGeometry, matrix, region, clip) BoxRec full; int nMatrix = matrix.size (); full = clip.handle ()->extents; if (region.handle ()->extents.x1 > full.x1) full.x1 = region.handle ()->extents.x1; if (region.handle ()->extents.y1 > full.y1) full.y1 = region.handle ()->extents.y1; if (region.handle ()->extents.x2 < full.x2) full.x2 = region.handle ()->extents.x2; if (region.handle ()->extents.y2 < full.y2) full.y2 = region.handle ()->extents.y2; if (full.x1 < full.x2 && full.y1 < full.y2) { BoxPtr pBox; int nBox; BoxPtr pClip; int nClip; BoxRec cbox; int it, x1, y1, x2, y2; bool rect = true; for (it = 0; it < nMatrix; it++) { if (matrix[it].xy != 0.0f || matrix[it].yx != 0.0f) { rect = false; break; } } pBox = const_cast <Region> (region.handle ())->rects; nBox = const_cast <Region> (region.handle ())->numRects; while (nBox--) { x1 = pBox->x1; y1 = pBox->y1; x2 = pBox->x2; y2 = pBox->y2; pBox++; if (x1 < full.x1) x1 = full.x1; if (y1 < full.y1) y1 = full.y1; if (x2 > full.x2) x2 = full.x2; if (y2 > full.y2) y2 = full.y2; if (x1 < x2 && y1 < y2) { nClip = const_cast <Region> (clip.handle ())->numRects; if (nClip == 1) { addQuads (priv->vertexBuffer, matrix, nMatrix, x1, y1, x2, y2, rect, maxGridWidth, maxGridHeight); } else { pClip = const_cast <Region> (clip.handle ())->rects; while (nClip--) { cbox = *pClip; pClip++; if (cbox.x1 < x1) cbox.x1 = x1; if (cbox.y1 < y1) cbox.y1 = y1; if (cbox.x2 > x2) cbox.x2 = x2; if (cbox.y2 > y2) cbox.y2 = y2; if (cbox.x1 < cbox.x2 && cbox.y1 < cbox.y2) { addQuads (priv->vertexBuffer, matrix, nMatrix, cbox.x1, cbox.y1, cbox.x2, cbox.y2, rect, maxGridWidth, maxGridHeight); } } } } } } }
void PrivateGLScreen::paintBackground (const GLMatrix &transform, const CompRegion ®ion, bool transformed) { GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); GLfloat vertexData[18]; GLushort colorData[4]; BoxPtr pBox = const_cast <Region> (region.handle ())->rects; int n, nBox = const_cast <Region> (region.handle ())->numRects; if (!nBox) return; if (screen->desktopWindowCount ()) { if (!backgroundTextures.empty ()) { backgroundTextures.clear (); } backgroundLoaded = false; return; } else { if (!backgroundLoaded) updateScreenBackground (); backgroundLoaded = true; } if (backgroundTextures.empty ()) { streamingBuffer->begin (GL_TRIANGLES); n = nBox; while (n--) { vertexData[0] = pBox->x1; vertexData[1] = pBox->y1; vertexData[2] = 0.0f; vertexData[3] = pBox->x1; vertexData[4] = pBox->y2; vertexData[5] = 0.0f; vertexData[6] = pBox->x2; vertexData[7] = pBox->y1; vertexData[8] = 0.0f; vertexData[9] = pBox->x1; vertexData[10] = pBox->y2; vertexData[11] = 0.0f; vertexData[12] = pBox->x2; vertexData[13] = pBox->y2; vertexData[14] = 0.0f; vertexData[15] = pBox->x2; vertexData[16] = pBox->y1; vertexData[17] = 0.0f; streamingBuffer->addVertices (6, vertexData); pBox++; } colorData[0] = colorData[1] = colorData[2] = 0; colorData[3] = std::numeric_limits <unsigned short>::max (); streamingBuffer->addColors (1, colorData); streamingBuffer->end (); streamingBuffer->render (transform); } else { n = nBox; for (unsigned int i = 0; i < backgroundTextures.size (); i++) { GLfloat textureData[12]; GLTexture *bg = backgroundTextures[i]; CompRegion r = region & *bg; pBox = const_cast <Region> (r.handle ())->rects; nBox = const_cast <Region> (r.handle ())->numRects; n = nBox; streamingBuffer->begin (GL_TRIANGLES); while (n--) { GLfloat tx1 = COMP_TEX_COORD_X (bg->matrix (), pBox->x1); GLfloat tx2 = COMP_TEX_COORD_X (bg->matrix (), pBox->x2); GLfloat ty1 = COMP_TEX_COORD_Y (bg->matrix (), pBox->y1); GLfloat ty2 = COMP_TEX_COORD_Y (bg->matrix (), pBox->y2); vertexData[0] = pBox->x1; vertexData[1] = pBox->y1; vertexData[2] = 0.0f; vertexData[3] = pBox->x1; vertexData[4] = pBox->y2; vertexData[5] = 0.0f; vertexData[6] = pBox->x2; vertexData[7] = pBox->y1; vertexData[8] = 0.0f; vertexData[9] = pBox->x1; vertexData[10] = pBox->y2; vertexData[11] = 0.0f; vertexData[12] = pBox->x2; vertexData[13] = pBox->y2; vertexData[14] = 0.0f; vertexData[15] = pBox->x2; vertexData[16] = pBox->y1; vertexData[17] = 0.0f; textureData[0] = tx1; textureData[1] = ty1; textureData[2] = tx1; textureData[3] = ty2; textureData[4] = tx2; textureData[5] = ty1; textureData[6] = tx1; textureData[7] = ty2; textureData[8] = tx2; textureData[9] = ty2; textureData[10] = tx2; textureData[11] = ty1; streamingBuffer->addVertices (6, vertexData); streamingBuffer->addTexCoords (0, 6, textureData); pBox++; } streamingBuffer->end (); if (bg->name ()) { if (transformed) bg->enable (GLTexture::Good); else bg->enable (GLTexture::Fast); streamingBuffer->render (transform); bg->disable (); } } } }
void GLScreen::glPaintCompositedOutput (const CompRegion ®ion, GLFramebufferObject *fbo, unsigned int mask) { WRAPABLE_HND_FUNCTN (glPaintCompositedOutput, region, fbo, mask) GLMatrix sTransform; const GLTexture::Matrix & texmatrix = fbo->tex ()->matrix (); GLVertexBuffer *streamingBuffer = GLVertexBuffer::streamingBuffer (); streamingBuffer->begin (GL_TRIANGLES); if (mask & COMPOSITE_SCREEN_DAMAGE_ALL_MASK) { GLfloat tx1 = COMP_TEX_COORD_X (texmatrix, 0.0f); GLfloat tx2 = COMP_TEX_COORD_X (texmatrix, screen->width ()); GLfloat ty1 = 1.0 - COMP_TEX_COORD_Y (texmatrix, 0.0f); GLfloat ty2 = 1.0 - COMP_TEX_COORD_Y (texmatrix, screen->height ()); const GLfloat vertexData[] = { 0.0f, 0.0f, 0.0f, 0.0f, (float)screen->height (), 0.0f, (float)screen->width (), 0.0f, 0.0f, 0.0f, (float)screen->height (), 0.0f, (float)screen->width (), (float)screen->height (), 0.0f, (float)screen->width (), 0.0f, 0.0f, }; const GLfloat textureData[] = { tx1, ty1, tx1, ty2, tx2, ty1, tx1, ty2, tx2, ty2, tx2, ty1, }; streamingBuffer->addVertices (6, &vertexData[0]); streamingBuffer->addTexCoords (0, 6, &textureData[0]); } else { BoxPtr pBox = const_cast <Region> (region.handle ())->rects; int nBox = const_cast <Region> (region.handle ())->numRects; while (nBox--) { GLfloat tx1 = COMP_TEX_COORD_X (texmatrix, pBox->x1); GLfloat tx2 = COMP_TEX_COORD_X (texmatrix, pBox->x2); GLfloat ty1 = 1.0 - COMP_TEX_COORD_Y (texmatrix, pBox->y1); GLfloat ty2 = 1.0 - COMP_TEX_COORD_Y (texmatrix, pBox->y2); const GLfloat vertexData[] = { (float)pBox->x1, (float)pBox->y1, 0.0f, (float)pBox->x1, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y1, 0.0f, (float)pBox->x1, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y2, 0.0f, (float)pBox->x2, (float)pBox->y1, 0.0f, }; const GLfloat textureData[] = { tx1, ty1, tx1, ty2, tx2, ty1, tx1, ty2, tx2, ty2, tx2, ty1, }; streamingBuffer->addVertices (6, &vertexData[0]); streamingBuffer->addTexCoords (0, 6, &textureData[0]); pBox++; } } streamingBuffer->end (); fbo->tex ()->enable (GLTexture::Fast); sTransform.toScreenSpace (&screen->fullscreenOutput (), -DEFAULT_Z_CAMERA); streamingBuffer->render (sTransform); fbo->tex ()->disable (); }
bool CompRegion::operator== (const CompRegion &c) const { return XEqualRegion (handle (), c.handle ()); }