[Libreoffice-commits] core.git: Branch 'libreoffice-5-1' - vcl/inc vcl/opengl vcl/win
Tomaž Vajngerl
tomaz.vajngerl at collabora.co.uk
Wed May 11 09:53:54 UTC 2016
vcl/inc/opengl/AccumulatedTextures.hxx | 7 +++++
vcl/opengl/PackedTextureAtlas.cxx | 8 +++---
vcl/opengl/gdiimpl.cxx | 7 ++++-
vcl/opengl/texture.cxx | 10 +++++---
vcl/win/source/gdi/winlayout.cxx | 39 +++++++++++++++++++++------------
5 files changed, 46 insertions(+), 25 deletions(-)
New commits:
commit 5d7badd2f2341171733c5fabf111ecf9674bc3d4
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date: Sat Apr 30 14:58:27 2016 +0900
tdf#99258 bail out if we fail to reserve the texture + more
(cherry picked from commit d22ca8d8cb050b9006720f39c612c5c32eab8795)
also includes coverity fixes from commits:
coverity#1358428 fix "Null pointer dereferences"
4e07c7e279b21c4ae93b832a65e221e2dab5391d
cid#1358836 reorganize to silence Resource leak in object
6e970c11645f1a05638e49da9e2911fe59628838
Check if we have an OpenGL context before using API that requires it
347e46da399b8cc96d9dd8dbfd62120db473b555
opengl: Check if texture is valid before asking for Id
0214aa8ce427905477602dbf1d55278c4959fcac
Change-Id: I830e313352b69a7665bff953aadb1334be0dc847
Reviewed-on: https://gerrit.libreoffice.org/24829
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Tor Lillqvist <tml at collabora.com>
Tested-by: Tor Lillqvist <tml at collabora.com>
diff --git a/vcl/inc/opengl/AccumulatedTextures.hxx b/vcl/inc/opengl/AccumulatedTextures.hxx
index e74c065..882a694 100644
--- a/vcl/inc/opengl/AccumulatedTextures.hxx
+++ b/vcl/inc/opengl/AccumulatedTextures.hxx
@@ -88,8 +88,11 @@ public:
maEntries.clear();
}
- void insert(OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
+ bool insert(OpenGLTexture& rTexture, const SalColor& aColor, const SalTwoRect& r2Rect)
{
+ if (!rTexture)
+ return false;
+
GLuint nTextureId = rTexture.Id();
if (maEntries.find(nTextureId) == maEntries.end())
@@ -100,6 +103,8 @@ public:
std::unique_ptr<AccumulatedTexturesEntry>& rEntry = maEntries[nTextureId];
rEntry->insert(rTexture, aColor, r2Rect);
+
+ return true;
}
AccumulatedTexturesMap& getAccumulatedTexturesMap()
diff --git a/vcl/opengl/PackedTextureAtlas.cxx b/vcl/opengl/PackedTextureAtlas.cxx
index 0231cbd..c8e9c3f 100644
--- a/vcl/opengl/PackedTextureAtlas.cxx
+++ b/vcl/opengl/PackedTextureAtlas.cxx
@@ -110,7 +110,7 @@ Node* Node::insert(int nWidth, int nHeight, int nPadding)
struct PackedTexture
{
- ImplOpenGLTexture* mpTexture;
+ std::unique_ptr<ImplOpenGLTexture> mpTexture;
std::unique_ptr<Node> mpRootNode;
int mnDeallocatedArea;
@@ -132,7 +132,7 @@ PackedTextureAtlasManager::~PackedTextureAtlasManager()
for (std::unique_ptr<PackedTexture>& pPackedTexture : maPackedTextures)
{
// Free texture early in VCL shutdown while we have a context.
- delete pPackedTexture->mpTexture;
+ pPackedTexture->mpTexture.reset();
}
}
@@ -152,7 +152,7 @@ OpenGLTexture PackedTextureAtlasManager::Reserve(int nWidth, int nHeight)
Node* pNode = pPackedTexture->mpRootNode->insert(nWidth, nHeight, 1);
if (pNode != nullptr)
{
- return OpenGLTexture(pPackedTexture->mpTexture, pNode->mRectangle, -1);
+ return OpenGLTexture(pPackedTexture->mpTexture.get(), pNode->mRectangle, -1);
}
}
CreateNewTexture();
@@ -160,7 +160,7 @@ OpenGLTexture PackedTextureAtlasManager::Reserve(int nWidth, int nHeight)
Node* pNode = pPackedTexture->mpRootNode->insert(nWidth, nHeight, 1);
if (pNode != nullptr)
{
- return OpenGLTexture(pPackedTexture->mpTexture, pNode->mRectangle, -1);
+ return OpenGLTexture(pPackedTexture->mpTexture.get(), pNode->mRectangle, -1);
}
return OpenGLTexture();
}
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index d9640b9..c6139e8 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -2497,8 +2497,11 @@ void OpenGLSalGraphicsImpl::doFlush()
{
FlushDeferredDrawing();
- mpContext->state()->scissor().disable();
- mpContext->state()->stencil().disable();
+ if (OpenGLContext::hasCurrent())
+ {
+ mpContext->state()->scissor().disable();
+ mpContext->state()->stencil().disable();
+ }
if( IsOffscreen() )
return;
diff --git a/vcl/opengl/texture.cxx b/vcl/opengl/texture.cxx
index 9f5f9a2..63e39b8 100644
--- a/vcl/opengl/texture.cxx
+++ b/vcl/opengl/texture.cxx
@@ -413,11 +413,11 @@ void OpenGLTexture::FillCoords<GL_TRIANGLES>(std::vector<GLfloat>& aCoord, const
GLfloat y1 = 0.0f;
GLfloat y2 = 0.0f;
- double fTextureWidth(mpImpl->mnWidth);
- double fTextureHeight(mpImpl->mnHeight);
-
if (mpImpl)
{
+ double fTextureWidth(mpImpl->mnWidth);
+ double fTextureHeight(mpImpl->mnHeight);
+
x1 = (maRect.Left() + rPosAry.mnSrcX) / fTextureWidth;
x2 = (maRect.Left() + rPosAry.mnSrcX + rPosAry.mnSrcWidth) / fTextureWidth;
@@ -472,7 +472,9 @@ void OpenGLTexture::GetWholeCoord( GLfloat* pCoord ) const
OpenGLTexture OpenGLTexture::GetWholeTexture()
{
- return OpenGLTexture(mpImpl, Rectangle(Point(0, 0), Size(mpImpl->mnWidth, mpImpl->mnHeight)), -1);
+ if (mpImpl)
+ return OpenGLTexture(mpImpl, Rectangle(Point(0, 0), Size(mpImpl->mnWidth, mpImpl->mnHeight)), -1);
+ return OpenGLTexture();
}
GLenum OpenGLTexture::GetFilter() const
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 170c94b..360a3d3 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -127,10 +127,12 @@ public:
gGlobalGlyphCache.get()->maGlyphCaches.erase(this);
}
- void ReserveTextureSpace(OpenGLGlyphDrawElement& rElement, int nWidth, int nHeight)
+ bool ReserveTextureSpace(OpenGLGlyphDrawElement& rElement, int nWidth, int nHeight)
{
GlobalGlyphCache* pGlobalGlyphCache = gGlobalGlyphCache.get();
rElement.maTexture = pGlobalGlyphCache->maPackedTextureAtlas.Reserve(nWidth, nHeight);
+ if (!rElement.maTexture)
+ return false;
std::vector<GLuint> aTextureIDs = pGlobalGlyphCache->maPackedTextureAtlas.ReduceTextureNumber(8);
if (!aTextureIDs.empty())
{
@@ -139,6 +141,7 @@ public:
pGlyphCache->RemoveTextures(aTextureIDs);
}
}
+ return true;
}
void RemoveTextures(std::vector<GLuint>& rTextureIDs)
@@ -508,8 +511,11 @@ bool ImplWinFontEntry::CacheGlyphToAtlas(bool bRealGlyphIndices, int nGlyphIndex
pTxt->ReleaseFont();
- maGlyphCache.ReserveTextureSpace(aElement, nBitmapWidth, nBitmapHeight);
- aDC.copyToTexture(aElement.maTexture);
+ if (!maGlyphCache.ReserveTextureSpace(aElement, nBitmapWidth, nBitmapHeight))
+ return false;
+ if (!aDC.copyToTexture(aElement.maTexture))
+ return false;
+
maGlyphCache.PutDrawElementInCache(aElement, nGlyphIndex);
SelectFont(aDC.getCompatibleHDC(), hOrigFont);
@@ -1459,11 +1465,11 @@ bool SimpleWinLayout::CacheGlyphs(SalGraphics& rGraphics) const
nCodePoint = mpOutGlyphs[i];
}
- if (mrWinFontEntry.GetGlyphCache().IsGlyphCached(nCodePoint))
- continue;
-
- if (!mrWinFontEntry.CacheGlyphToAtlas(false, nCodePoint, *this, rGraphics))
- return false;
+ if (!mrWinFontEntry.GetGlyphCache().IsGlyphCached(nCodePoint))
+ {
+ if (!mrWinFontEntry.CacheGlyphToAtlas(false, nCodePoint, *this, rGraphics))
+ return false;
+ }
}
return true;
@@ -1508,6 +1514,9 @@ bool SimpleWinLayout::DrawCachedGlyphs(SalGraphics& rGraphics) const
OpenGLGlyphDrawElement& rElement(mrWinFontEntry.GetGlyphCache().GetDrawElement(nCodePoint));
OpenGLTexture& rTexture = rElement.maTexture;
+ if (!rTexture)
+ return false;
+
SalTwoRect a2Rects(0, 0,
rTexture.GetWidth(), rTexture.GetHeight(),
nAdvance + aPos.X() - rElement.getExtraOffset() + rElement.maLeftOverhangs,
@@ -2729,12 +2738,11 @@ bool UniscribeLayout::CacheGlyphs(SalGraphics& rGraphics) const
for (int i = 0; i < mnGlyphCount; i++)
{
int nCodePoint = mpOutGlyphs[i];
-
- if (mrWinFontEntry.GetGlyphCache().IsGlyphCached(nCodePoint))
- continue;
-
- if (!mrWinFontEntry.CacheGlyphToAtlas(true, nCodePoint, *this, rGraphics))
- return false;
+ if (!mrWinFontEntry.GetGlyphCache().IsGlyphCached(nCodePoint))
+ {
+ if (!mrWinFontEntry.CacheGlyphToAtlas(true, nCodePoint, *this, rGraphics))
+ return false;
+ }
}
}
@@ -2994,6 +3002,9 @@ bool UniscribeLayout::DrawCachedGlyphsUsingTextures(SalGraphics& rGraphics) cons
OpenGLGlyphDrawElement& rElement = mrWinFontEntry.GetGlyphCache().GetDrawElement(mpOutGlyphs[i]);
OpenGLTexture& rTexture = rElement.maTexture;
+ if (!rTexture)
+ return false;
+
if (rElement.mbVertical)
{
SalTwoRect a2Rects(0, 0,
More information about the Libreoffice-commits
mailing list