[Libreoffice-commits] core.git: Branch 'feature/fixes22' - 3 commits - vcl/inc vcl/opengl

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Tue May 31 09:12:43 UTC 2016


 vcl/inc/opengl/AccumulatedTextures.hxx |   99 --------------------
 vcl/inc/opengl/RenderList.hxx          |   74 +++++++++++++--
 vcl/inc/openglgdiimpl.hxx              |    2 
 vcl/opengl/RenderList.cxx              |   48 +++++++--
 vcl/opengl/gdiimpl.cxx                 |  162 +++++++++++++--------------------
 5 files changed, 174 insertions(+), 211 deletions(-)

New commits:
commit 3a4a4fb6c63a4a510254159c92cbeb81ff935fab
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue May 31 16:15:21 2016 +0900

    opengl: improve overlap tracking
    
    Instead of tracking the overlap with only one rectangle use more
    rectangles and add elements to the rectangle that increases the
    combined area the least. If a new entry overlaps with at least
    on rectangle then create a new list. Current limit the number of
    rectangles to 30.
    
    Change-Id: I3db619afc1fdd98fe7314c930e909bf2c93d7b2c

diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx
index 32ece73..e63f5dc 100644
--- a/vcl/inc/opengl/RenderList.hxx
+++ b/vcl/inc/opengl/RenderList.hxx
@@ -38,6 +38,8 @@ struct RenderTextureParameters
 
 struct RenderEntry
 {
+    basegfx::B2DRange maOverlapTrackingRectangle;
+
     RenderParameters maTriangleParameters;
     RenderParameters maLineParameters;
     RenderParameters maLineAAParameters;
@@ -68,19 +70,59 @@ struct RenderEntry
 class RenderList
 {
 private:
-    basegfx::B2DRange maOverlapTrackingRectangle;
     std::vector<RenderEntry> maRenderEntries;
+    std::vector<basegfx::B2DRange> maRectangles;
+
+    bool doesOverlap(const basegfx::B2DRange& rDrawRectangle)
+    {
+        if (!maRenderEntries.back().maOverlapTrackingRectangle.overlaps(rDrawRectangle))
+            return false;
+
+        for (const basegfx::B2DRange& rRectangle : maRectangles)
+        {
+            if (rRectangle.overlaps(rDrawRectangle))
+                return true;
+        }
+        return false;
+    }
 
     void checkOverlapping(const basegfx::B2DRange& rDrawRectangle)
     {
-        if (maRenderEntries.empty() || maOverlapTrackingRectangle.overlaps(rDrawRectangle))
+        if (maRenderEntries.empty() || doesOverlap(rDrawRectangle))
         {
             maRenderEntries.resize(maRenderEntries.size() + 1);
-            maOverlapTrackingRectangle = rDrawRectangle;
+            maRenderEntries.back().maOverlapTrackingRectangle = rDrawRectangle;
+
+            maRectangles.clear();
+            maRectangles.reserve(30);
+            maRectangles.push_back(rDrawRectangle);
         }
         else
         {
-            maOverlapTrackingRectangle.expand(rDrawRectangle);
+            maRenderEntries.back().maOverlapTrackingRectangle.expand(rDrawRectangle);
+
+            if (maRectangles.size() < 30)
+            {
+                maRectangles.push_back(rDrawRectangle);
+            }
+            else
+            {
+                basegfx::B2DRange aTempRectangle(maRectangles[0]);
+                aTempRectangle.expand(rDrawRectangle);
+                double minArea = aTempRectangle.getWidth() * aTempRectangle.getHeight();
+                size_t index = 0;
+
+                double area;
+                for (size_t i = 1; i < maRectangles.size(); ++i)
+                {
+                    aTempRectangle = basegfx::B2DRange(maRectangles[i]);
+                    aTempRectangle.expand(rDrawRectangle);
+                    area = aTempRectangle.getWidth() * aTempRectangle.getHeight();
+                    if (area < minArea)
+                        index = i;
+                }
+                maRectangles[index].expand(rDrawRectangle);
+            }
         }
     }
 
@@ -96,7 +138,6 @@ public:
     void clear()
     {
         maRenderEntries.clear();
-        maOverlapTrackingRectangle.reset();
     }
 
     std::vector<RenderEntry>& getEntries()
commit 01c06c78289c189d18825e3adf418f70cb7ec562
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue May 31 12:26:04 2016 +0900

    opengl: deferred texture drawing in RenderList, add drawAlphaRect
    
    Drawing accumulated textures (in Accumulatedtextures) is independent
    of drawing with render list which causes problems with rendering
    order when render list and accumulated textures are flushed. To
    solve this we need to combine both so we can check for overlapped
    drawing.
    
    Previously drawRect was using RenderList batch drawing but not
    drawAlphaRect which is essentially the same as drawRect but
    additionally supports alpha value. This adds support to draw
    alpha rectangles to RenderList and converts drawAlphaRect.
    
    Change-Id: I82bf0b410e5ebabb13bab7b29a2e53a6fdaa404f

diff --git a/vcl/inc/opengl/AccumulatedTextures.hxx b/vcl/inc/opengl/AccumulatedTextures.hxx
deleted file mode 100644
index 504cf6a..0000000
--- a/vcl/inc/opengl/AccumulatedTextures.hxx
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- */
-
-#ifndef INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
-#define INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
-
-#include <vcl/opengl/OpenGLHelper.hxx>
-
-#include <o3tl/make_unique.hxx>
-#include "opengl/texture.hxx"
-#include "opengl/VertexUtils.hxx"
-#include <memory>
-
-struct TextureDrawParameters
-{
-    std::vector<GLfloat> maVertices;
-    std::vector<GLfloat> maTextureCoords;
-};
-
-struct AccumulatedTexturesEntry
-{
-    OpenGLTexture maTexture;
-    std::unordered_map<SalColor, TextureDrawParameters> maColorTextureDrawParametersMap;
-
-    AccumulatedTexturesEntry(const OpenGLTexture& rTexture)
-        : maTexture(rTexture)
-    {}
-
-    void insert(const OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
-    {
-        TextureDrawParameters& aDrawParameters = maColorTextureDrawParametersMap[aColor];
-        rTexture.FillCoords<GL_TRIANGLES>(aDrawParameters.maTextureCoords, r2Rect, false);
-
-        GLfloat fX1 = r2Rect.mnDestX;
-        GLfloat fY1 = r2Rect.mnDestY;
-        GLfloat fX2 = fX1 + r2Rect.mnDestWidth;
-        GLfloat fY2 = fY1 + r2Rect.mnDestHeight;
-
-        std::vector<GLfloat>& rVertices = aDrawParameters.maVertices;
-        vcl::vertex::addRectangle<GL_TRIANGLES>(rVertices, fX1, fY1, fX2, fY2);
-    }
-};
-
-class AccumulatedTextures
-{
-private:
-    typedef std::unordered_map<GLuint, std::unique_ptr<AccumulatedTexturesEntry>> AccumulatedTexturesMap;
-
-    AccumulatedTexturesMap maEntries;
-
-public:
-    AccumulatedTextures()
-    {}
-
-    bool empty()
-    {
-        return maEntries.empty();
-    }
-
-    void clear()
-    {
-        maEntries.clear();
-    }
-
-    bool insert(OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
-    {
-        if (!rTexture)
-            return false;
-
-        GLuint nTextureId = rTexture.Id();
-
-        if (maEntries.find(nTextureId) == maEntries.end())
-        {
-            OpenGLTexture aWholeTexture(rTexture.GetWholeTexture());
-            maEntries[nTextureId] = o3tl::make_unique<AccumulatedTexturesEntry>(aWholeTexture);
-        }
-
-        std::unique_ptr<AccumulatedTexturesEntry>& rEntry = maEntries[nTextureId];
-        rEntry->insert(rTexture, aColor, r2Rect);
-
-        return true;
-    }
-
-    AccumulatedTexturesMap& getAccumulatedTexturesMap()
-    {
-        return maEntries;
-    }
-};
-
-#endif // INCLUDED_VCL_INC_OPENGL_ACCUMULATEDTEXTURES_H
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/opengl/RenderList.hxx b/vcl/inc/opengl/RenderList.hxx
index d533ad4..32ece73 100644
--- a/vcl/inc/opengl/RenderList.hxx
+++ b/vcl/inc/opengl/RenderList.hxx
@@ -11,12 +11,16 @@
 #ifndef INCLUDED_VCL_INC_OPENGL_RENDERLIST_H
 #define INCLUDED_VCL_INC_OPENGL_RENDERLIST_H
 
+#include <unordered_map>
+
 #include <glm/glm.hpp>
 
 #include <vcl/opengl/OpenGLHelper.hxx>
 #include <vcl/salgtype.hxx>
 #include <basegfx/range/b2drange.hxx>
 
+#include "opengl/texture.hxx"
+
 struct RenderParameters
 {
     std::vector<GLfloat>   maVertices;
@@ -24,12 +28,22 @@ struct RenderParameters
     std::vector<glm::vec4> maColors;
 };
 
+struct RenderTextureParameters
+{
+    std::vector<GLfloat>   maVertices;
+    std::vector<glm::vec4> maColors;
+    std::vector<GLfloat>   maTextureCoords;
+    OpenGLTexture          maTexture;
+};
+
 struct RenderEntry
 {
     RenderParameters maTriangleParameters;
     RenderParameters maLineParameters;
     RenderParameters maLineAAParameters;
 
+    std::unordered_map<GLuint, RenderTextureParameters> maTextureParametersMap;
+
     bool hasTriangles()
     {
         return !maTriangleParameters.maVertices.empty();
@@ -44,6 +58,11 @@ struct RenderEntry
     {
         return !maLineAAParameters.maVertices.empty();
     }
+
+    bool hasTextures()
+    {
+        return !maTextureParametersMap.empty();
+    }
 };
 
 class RenderList
@@ -85,9 +104,11 @@ public:
         return maRenderEntries;
     }
 
+    bool addDrawTextureWithMaskColor(OpenGLTexture& rTexture, const SalColor& rColor, const SalTwoRect& r2Rect);
+
     void addDrawPixel(long nX, long nY, const SalColor& rColor);
 
-    void addDrawRectangle(long nX, long nY, long nWidth, long nHeight,
+    void addDrawRectangle(long nX, long nY, long nWidth, long nHeight, double fTransparency,
                           const SalColor& rLineColor, const SalColor& rFillColor);
 
     void addDrawLine(long nX1, long nY1, long nX2, long nY2, const SalColor& rLineColor, bool bUseAA);
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index fdc4601..4323787 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -28,7 +28,6 @@
 #include "opengl/program.hxx"
 #include "opengl/texture.hxx"
 #include "regionband.hxx"
-#include "opengl/AccumulatedTextures.hxx"
 #include "opengl/RenderList.hxx"
 
 #include <vcl/opengl/OpenGLContext.hxx>
@@ -101,7 +100,6 @@ protected:
     SalColor mProgramSolidColor;
     double mProgramSolidTransparency;
 
-    std::unique_ptr<AccumulatedTextures>  mpAccumulatedTextures;
     std::unique_ptr<RenderList> mpRenderList;
 
     void ImplInitClipRegion();
diff --git a/vcl/opengl/RenderList.cxx b/vcl/opengl/RenderList.cxx
index de5a9d6..8188319 100644
--- a/vcl/opengl/RenderList.cxx
+++ b/vcl/opengl/RenderList.cxx
@@ -52,10 +52,13 @@ void RenderList::addDrawPixel(long nX, long nY, const SalColor& rColor)
     vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
 }
 
-void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, const SalColor& rLineColor, const SalColor& rFillColor)
+void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, double fTransparency,
+                                  const SalColor& rLineColor, const SalColor& rFillColor)
 {
     if (rLineColor == SALCOLOR_NONE && rFillColor == SALCOLOR_NONE)
         return;
+    if (fTransparency == 1.0f)
+        return;
 
     GLfloat fX1(nX);
     GLfloat fY1(nY);
@@ -74,10 +77,10 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, c
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX2 - 0.5f, fY1 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 - 0.5f, fY2 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
 
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rLineColor, fTransparency);
 
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
@@ -95,10 +98,10 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, c
             vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX2 - 0.5f, fY1 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
             vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 - 0.5f, fY2 - 0.5f, fX2 + 0.5f, fY2 + 0.5f);
 
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
-            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
+            vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
 
             vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
             vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
@@ -107,7 +110,7 @@ void RenderList::addDrawRectangle(long nX, long nY, long nWidth, long nHeight, c
         }
         // Draw rectangle fill with fill color
         vcl::vertex::addRectangle<GL_TRIANGLES>(rRenderParameter.maVertices, fX1 + 0.5f, fY1 + 0.5f, fX2 - 0.5f, fY2 - 0.5f);
-        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, 0.0f);
+        vcl::vertex::addQuadColors<GL_TRIANGLES>(rRenderParameter.maColors, rFillColor, fTransparency);
         vcl::vertex::addQuadEmptyExtrusionVectors<GL_TRIANGLES>(rRenderParameter.maExtrusionVectors);
     }
 }
@@ -213,4 +216,29 @@ void RenderList::addDrawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon,
     }
 }
 
+bool RenderList::addDrawTextureWithMaskColor(OpenGLTexture& rTexture, const SalColor& rColor, const SalTwoRect& r2Rect)
+{
+    if (!rTexture)
+        return false;
+
+    GLfloat fX1 = r2Rect.mnDestX;
+    GLfloat fY1 = r2Rect.mnDestY;
+    GLfloat fX2 = fX1 + r2Rect.mnDestWidth;
+    GLfloat fY2 = fY1 + r2Rect.mnDestHeight;
+
+    checkOverlapping(basegfx::B2DRange(fX1, fY1, fX2, fY2));
+
+    GLuint nTextureId = rTexture.Id();
+
+    RenderTextureParameters& rTextureParameter = maRenderEntries.back().maTextureParametersMap[nTextureId];
+    rTextureParameter.maTexture = rTexture;
+
+    rTexture.FillCoords<GL_TRIANGLES>(rTextureParameter.maTextureCoords, r2Rect, false);
+
+    vcl::vertex::addRectangle<GL_TRIANGLES>(rTextureParameter.maVertices, fX1, fY1, fX2, fY2);
+    vcl::vertex::addQuadColors<GL_TRIANGLES>(rTextureParameter.maColors, rColor, 0.0f);
+
+    return true;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 8e00d0e..394130c 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -85,7 +85,6 @@ OpenGLSalGraphicsImpl::OpenGLSalGraphicsImpl(SalGraphics& rParent, SalGeometryPr
     , mnDrawCountAtFlush(0)
     , mProgramSolidColor(SALCOLOR_NONE)
     , mProgramSolidTransparency(0.0)
-    , mpAccumulatedTextures(new AccumulatedTextures)
     , mpRenderList(new RenderList)
 {
 }
@@ -1503,107 +1502,90 @@ void OpenGLSalGraphicsImpl::DrawMask( OpenGLTexture& rMask, SalColor nMaskColor,
 
 void OpenGLSalGraphicsImpl::DeferredTextDraw(OpenGLTexture& rTexture, SalColor aMaskColor, const SalTwoRect& rPosAry)
 {
-    mpAccumulatedTextures->insert(rTexture, aMaskColor, rPosAry);
+    mpRenderList->addDrawTextureWithMaskColor(rTexture, aMaskColor, rPosAry);
 }
 
 void OpenGLSalGraphicsImpl::FlushDeferredDrawing()
 {
-    if (mpAccumulatedTextures->empty() && mpRenderList->empty())
+    if (mpRenderList->empty())
         return;
 
     VCL_GL_INFO("FlushDeferredDrawing: " << mpRenderList->getEntries().size());
 
-    if (!mpAccumulatedTextures->empty())
-    {
-        InitializePreDrawState();
-
-        OpenGLZone aZone;
+    InitializePreDrawState(XOROption::IMPLEMENT_XOR);
 
-        if (!UseProgram("combinedTextureVertexShader", "combinedTextureFragmentShader"))
-            return;
-        mpProgram->SetShaderType(TextureShaderType::MaskedColor);
-        mpProgram->SetIdentityTransform("transform");
-        mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-        for (auto& rPair : mpAccumulatedTextures->getAccumulatedTexturesMap())
+    OpenGLZone aZone;
+    for (RenderEntry& rRenderEntry : mpRenderList->getEntries())
+    {
+        if (rRenderEntry.hasTriangles() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+        {
+            RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
+            VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
+            mpProgram->SetShaderType(DrawShaderType::Normal);
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            ApplyProgramMatrices(0.5f);
+            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+            mpProgram->SetVertexColors(rParameters.maColors);
+            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            CHECK_GL_ERROR();
+            mpProgram->Clean();
+        }
+        if (rRenderEntry.hasLines() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
+        {
+            RenderParameters& rParameters = rRenderEntry.maLineParameters;
+            VCL_GL_INFO("Flush Lines: " << rParameters.maVertices.size());
+            mpProgram->SetShaderType(DrawShaderType::Line);
+            mpProgram->SetUniform1f("line_width", 1.0f);
+            mpProgram->SetUniform1f("feather", 0.0f); // Anti-Aliasing disabled
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            ApplyProgramMatrices(0.5f);
+            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+            mpProgram->SetVertexColors(rParameters.maColors);
+            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            CHECK_GL_ERROR();
+            mpProgram->Clean();
+        }
+        if (rRenderEntry.hasLinesAA() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
         {
-            OpenGLTexture& rTexture = rPair.second->maTexture;
-            mpProgram->SetTexture("texture", rTexture);
-            for (auto& rColorTwoRectPair: rPair.second->maColorTextureDrawParametersMap)
+            RenderParameters& rParameters = rRenderEntry.maLineAAParameters;
+            VCL_GL_INFO("Flush Lines AA: " << rParameters.maVertices.size());
+            mpProgram->SetShaderType(DrawShaderType::Line);
+            mpProgram->SetUniform1f("line_width", 1.0f);
+            mpProgram->SetUniform1f("feather", 0.5f); // Anti-Aliasing enabled
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            ApplyProgramMatrices(0.5f);
+            mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
+            mpProgram->SetVertexColors(rParameters.maColors);
+            mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
+            CHECK_GL_ERROR();
+            mpProgram->Clean();
+        }
+        if (rRenderEntry.hasTextures() && UseProgram("combinedTextureVertexShader", "combinedTextureFragmentShader", "#define USE_VERTEX_COLORS"))
+        {
+            mpProgram->SetShaderType(TextureShaderType::MaskedColor);
+            mpProgram->SetIdentityTransform("transform");
+            mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+            for (auto& rPair : rRenderEntry.maTextureParametersMap)
             {
-                mpProgram->SetColor("color", rColorTwoRectPair.first, 0);
-                TextureDrawParameters& rParameters = rColorTwoRectPair.second;
+                RenderTextureParameters& rParameters = rPair.second;
+                mpProgram->SetTexture("texture", rParameters.maTexture);
                 ApplyProgramMatrices();
                 mpProgram->SetTextureCoord(rParameters.maTextureCoords.data());
                 mpProgram->SetMaskCoord(rParameters.maTextureCoords.data());
                 mpProgram->SetAlphaCoord(rParameters.maTextureCoords.data());
-                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-            }
-        }
-        mpProgram->Clean();
-        mpAccumulatedTextures->clear();
-
-        PostDraw();
-    }
-
-    if (!mpRenderList->empty())
-    {
-        InitializePreDrawState(XOROption::IMPLEMENT_XOR);
-
-        OpenGLZone aZone;
-        for (RenderEntry& rRenderEntry : mpRenderList->getEntries())
-        {
-            if (rRenderEntry.hasTriangles() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-            {
-                RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
-                VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
-                mpProgram->SetShaderType(DrawShaderType::Normal);
-                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                ApplyProgramMatrices(0.5f);
-                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-                mpProgram->SetVertexColors(rParameters.maColors);
-                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-                CHECK_GL_ERROR();
-                mpProgram->Clean();
-            }
-            if (rRenderEntry.hasLines() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-            {
-                RenderParameters& rParameters = rRenderEntry.maLineParameters;
-                VCL_GL_INFO("Flush Lines: " << rParameters.maVertices.size());
-                mpProgram->SetShaderType(DrawShaderType::Line);
-                mpProgram->SetUniform1f("line_width", 1.0f);
-                mpProgram->SetUniform1f("feather", 0.0f); // Anti-Aliasing disabled
-                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                ApplyProgramMatrices(0.5f);
-                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
-                mpProgram->SetVertexColors(rParameters.maColors);
-                mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
-                CHECK_GL_ERROR();
-                mpProgram->Clean();
-            }
-            if (rRenderEntry.hasLinesAA() && UseProgram("combinedVertexShader", "combinedFragmentShader", "#define USE_VERTEX_COLORS"))
-            {
-                RenderParameters& rParameters = rRenderEntry.maLineAAParameters;
-                VCL_GL_INFO("Flush Lines AA: " << rParameters.maVertices.size());
-                mpProgram->SetShaderType(DrawShaderType::Line);
-                mpProgram->SetUniform1f("line_width", 1.0f);
-                mpProgram->SetUniform1f("feather", 0.5f); // Anti-Aliasing enabled
-                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-                ApplyProgramMatrices(0.5f);
-                mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
                 mpProgram->SetVertexColors(rParameters.maColors);
                 mpProgram->DrawArrays(GL_TRIANGLES, rParameters.maVertices);
                 CHECK_GL_ERROR();
-                mpProgram->Clean();
             }
+            mpProgram->Clean();
         }
-
-        mpRenderList->clear();
-        PostDraw();
     }
 
-    VCL_GL_INFO("End FlushDeferredDrawing");
+    mpRenderList->clear();
+    PostDraw();
 
+    VCL_GL_INFO("End FlushDeferredDrawing");
 }
 
 void OpenGLSalGraphicsImpl::DrawLinearGradient( const Gradient& rGradient, const Rectangle& rRect )
@@ -1733,7 +1715,7 @@ void OpenGLSalGraphicsImpl::drawLine(long nX1, long nY1, long nX2, long nY2)
 void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeight )
 {
     VCL_GL_INFO("::drawRect (" << nX << ", " << nY << ") [" << nWidth << ", " << nHeight << "]");
-    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, mnLineColor, mnFillColor);
+    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, 0.0, mnLineColor, mnFillColor);
 }
 
 void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pPtAry )
@@ -1926,15 +1908,10 @@ void OpenGLSalGraphicsImpl::drawMask(
             const SalBitmap& rSalBitmap,
             SalColor nMaskColor )
 {
-    OpenGLZone aZone;
-
     const OpenGLSalBitmap& rBitmap = static_cast<const OpenGLSalBitmap&>(rSalBitmap);
-    OpenGLTexture& rTexture( rBitmap.GetTexture() );
 
     VCL_GL_INFO( "::drawMask" );
-    PreDraw();
-    DrawMask( rTexture, nMaskColor, rPosAry );
-    PostDraw();
+    mpRenderList->addDrawTextureWithMaskColor(rBitmap.GetTexture(), nMaskColor, rPosAry);
 }
 
 SalBitmap* OpenGLSalGraphicsImpl::getBitmap( long nX, long nY, long nWidth, long nHeight )
@@ -2138,15 +2115,8 @@ bool OpenGLSalGraphicsImpl::drawAlphaRect(
                 long nWidth, long nHeight,
                 sal_uInt8 nTransparency )
 {
-    VCL_GL_INFO( "::drawAlphaRect" );
-    if( mnFillColor != SALCOLOR_NONE && nTransparency < 100 )
-    {
-        PreDraw();
-        UseSolid( mnFillColor, nTransparency );
-        DrawRect( nX, nY, nWidth, nHeight );
-        PostDraw();
-    }
-
+    VCL_GL_INFO("::drawAlphaRect (" << nX << ", " << nY << ") [" << nWidth << ", " << nHeight << "]");
+    mpRenderList->addDrawRectangle(nX, nY, nWidth, nHeight, double(nTransparency / 100.0), mnLineColor, mnFillColor);
     return true;
 }
 
commit 3d2b84cdadf743231a0060e60dfd17ca35adbee1
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Tue May 31 12:04:03 2016 +0900

    opengl: fix transparency when drawing polypolygons
    
    Change-Id: I963b1bbf322acb20bf4e21834ba9c7ae400eaf7d

diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 5020626..8e00d0e 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -1558,6 +1558,7 @@ void OpenGLSalGraphicsImpl::FlushDeferredDrawing()
                 RenderParameters& rParameters = rRenderEntry.maTriangleParameters;
                 VCL_GL_INFO("Flush Triangles: " << rParameters.maVertices.size());
                 mpProgram->SetShaderType(DrawShaderType::Normal);
+                mpProgram->SetBlendMode(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                 ApplyProgramMatrices(0.5f);
                 mpProgram->SetExtrusionVectors(rParameters.maExtrusionVectors.data());
                 mpProgram->SetVertexColors(rParameters.maColors);
@@ -1737,6 +1738,7 @@ void OpenGLSalGraphicsImpl::drawRect( long nX, long nY, long nWidth, long nHeigh
 
 void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pPtAry )
 {
+    VCL_GL_INFO("::drawPolyLine legacy -> redirecting to drawPolyLine");
     basegfx::B2DPolygon aPoly;
     aPoly.append(basegfx::B2DPoint(pPtAry->mnX, pPtAry->mnY), nPoints);
     for (sal_uInt32 i = 1; i < nPoints; ++i)
@@ -1748,6 +1750,7 @@ void OpenGLSalGraphicsImpl::drawPolyLine( sal_uInt32 nPoints, const SalPoint* pP
 
 void OpenGLSalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry )
 {
+    VCL_GL_INFO("::drawPolygon legacy -> redirecting to drawPolyPolygon with transparency");
     basegfx::B2DPolygon aPoly;
     aPoly.append(basegfx::B2DPoint(pPtAry->mnX, pPtAry->mnY), nPoints);
     for (sal_uInt32 i = 1; i < nPoints; ++i)
@@ -1758,6 +1761,7 @@ void OpenGLSalGraphicsImpl::drawPolygon( sal_uInt32 nPoints, const SalPoint* pPt
 
 void OpenGLSalGraphicsImpl::drawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32* pPointCounts, PCONSTSALPOINT* pPtAry )
 {
+    VCL_GL_INFO("::drawPolyPolygon legacy -> redirecting to drawPolyPolygon with transparency");
     basegfx::B2DPolyPolygon aPolyPoly;
     for(sal_uInt32 nPolygon = 0; nPolygon < nPoly; ++nPolygon)
     {


More information about the Libreoffice-commits mailing list