Kaydet (Commit) dae61482 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl Kaydeden (comit) Tomaž Vajngerl

tdf#106265 ScopedHDC to clean-up hDC when rendering glyphs

Change-Id: I96ecf625126740610200c012c3c7002fac7e1548
Reviewed-on: https://gerrit.libreoffice.org/37347Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst c8e3a40a
/* -*- 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_WIN_SCOPEDHDC_HXX
#define INCLUDED_VCL_INC_WIN_SCOPEDHDC_HXX
class ScopedHDC
{
private:
HDC m_hDC;
public:
explicit ScopedHDC(HDC hDC)
: m_hDC(hDC)
{}
ScopedHDC(const ScopedHDC&) = delete;
ScopedHDC& operator=(const ScopedHDC&) = delete;
~ScopedHDC()
{
if (m_hDC)
DeleteDC(m_hDC);
}
HDC get() const
{
return m_hDC;
}
explicit operator bool() const
{
return m_hDC != nullptr;
}
};
#endif // INCLUDED_VCL_INC_WIN_SCOPEDHDC_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "sft.hxx" #include "sft.hxx"
#include "sallayout.hxx" #include "sallayout.hxx"
#include "CommonSalLayout.hxx" #include "CommonSalLayout.hxx"
#include "win/ScopedHDC.hxx"
#include <cstdio> #include <cstdio>
#include <cstdlib> #include <cstdlib>
...@@ -57,17 +58,17 @@ bool WinFontInstance::CacheGlyphToAtlas(HDC hDC, HFONT hFont, int nGlyphIndex, S ...@@ -57,17 +58,17 @@ bool WinFontInstance::CacheGlyphToAtlas(HDC hDC, HFONT hFont, int nGlyphIndex, S
{ {
OpenGLGlyphDrawElement aElement; OpenGLGlyphDrawElement aElement;
HDC hNewDC = CreateCompatibleDC(hDC); ScopedHDC aHDC(CreateCompatibleDC(hDC));
if (hNewDC == nullptr)
if (!aHDC)
{ {
SAL_WARN("vcl.gdi", "CreateCompatibleDC failed: " << WindowsErrorString(GetLastError())); SAL_WARN("vcl.gdi", "CreateCompatibleDC failed: " << WindowsErrorString(GetLastError()));
return false; return false;
} }
HFONT hOrigFont = static_cast<HFONT>(SelectObject(hNewDC, hFont)); HFONT hOrigFont = static_cast<HFONT>(SelectObject(aHDC.get(), hFont));
if (hOrigFont == nullptr) if (hOrigFont == nullptr)
{ {
SAL_WARN("vcl.gdi", "SelectObject failed: " << WindowsErrorString(GetLastError())); SAL_WARN("vcl.gdi", "SelectObject failed: " << WindowsErrorString(GetLastError()));
DeleteDC(hNewDC);
return false; return false;
} }
...@@ -76,10 +77,9 @@ bool WinFontInstance::CacheGlyphToAtlas(HDC hDC, HFONT hFont, int nGlyphIndex, S ...@@ -76,10 +77,9 @@ bool WinFontInstance::CacheGlyphToAtlas(HDC hDC, HFONT hFont, int nGlyphIndex, S
if (!pTxt) if (!pTxt)
return false; return false;
if (!pTxt->BindFont(hNewDC)) if (!pTxt->BindFont(aHDC.get()))
{ {
SAL_WARN("vcl.gdi", "Binding of font failed. The font might not be supported by Direct Write."); SAL_WARN("vcl.gdi", "Binding of font failed. The font might not be supported by Direct Write.");
DeleteDC(hNewDC);
return false; return false;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment