mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Gfx: Change COM pointers to use WRL::ComPtr
This commit is contained in:
parent
799b4e6279
commit
eb5044b6fb
@ -22,16 +22,6 @@
|
||||
#include "Util/WICBitmapLockGDIP.h"
|
||||
#include "../../Library/Litestep.h"
|
||||
|
||||
template<class T>
|
||||
inline void SafeRelease(T** t)
|
||||
{
|
||||
if (*t)
|
||||
{
|
||||
(*t)->Release();
|
||||
*t = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
D2D1_COLOR_F ToColorF(const Gdiplus::Color& color)
|
||||
@ -54,13 +44,12 @@ D2D1_RECT_F ToRectF(const Gdiplus::RectF& rect)
|
||||
namespace Gfx {
|
||||
|
||||
UINT CanvasD2D::c_Instances = 0;
|
||||
ID2D1Factory* CanvasD2D::c_D2DFactory = nullptr;
|
||||
IDWriteFactory* CanvasD2D::c_DWFactory = nullptr;
|
||||
IDWriteGdiInterop* CanvasD2D::c_DWGDIInterop = nullptr;
|
||||
IWICImagingFactory* CanvasD2D::c_WICFactory = nullptr;
|
||||
Microsoft::WRL::ComPtr<ID2D1Factory> CanvasD2D::c_D2DFactory;
|
||||
Microsoft::WRL::ComPtr<IDWriteFactory> CanvasD2D::c_DWFactory;
|
||||
Microsoft::WRL::ComPtr<IDWriteGdiInterop> CanvasD2D::c_DWGDIInterop;
|
||||
Microsoft::WRL::ComPtr<IWICImagingFactory> CanvasD2D::c_WICFactory;
|
||||
|
||||
CanvasD2D::CanvasD2D() : Canvas(),
|
||||
m_Target(),
|
||||
m_Bitmap(),
|
||||
m_GdipGraphics(),
|
||||
m_GdipBitmap(),
|
||||
@ -88,7 +77,7 @@ bool CanvasD2D::Initialize()
|
||||
HRESULT hr = D2D1CreateFactory(
|
||||
D2D1_FACTORY_TYPE_SINGLE_THREADED,
|
||||
fo,
|
||||
&c_D2DFactory);
|
||||
c_D2DFactory.GetAddressOf());
|
||||
if (FAILED(hr)) return false;
|
||||
|
||||
hr = CoCreateInstance(
|
||||
@ -96,16 +85,16 @@ bool CanvasD2D::Initialize()
|
||||
nullptr,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_IWICImagingFactory,
|
||||
(LPVOID*)&c_WICFactory);
|
||||
(LPVOID*)c_WICFactory.GetAddressOf());
|
||||
if (FAILED(hr)) return false;
|
||||
|
||||
hr = DWriteCreateFactory(
|
||||
DWRITE_FACTORY_TYPE_SHARED,
|
||||
__uuidof(IDWriteFactory),
|
||||
(IUnknown**)&c_DWFactory);
|
||||
(IUnknown**)c_DWFactory.GetAddressOf());
|
||||
if (FAILED(hr)) return false;
|
||||
|
||||
hr = c_DWFactory->GetGdiInterop(&c_DWGDIInterop);
|
||||
hr = c_DWFactory->GetGdiInterop(c_DWGDIInterop.GetAddressOf());
|
||||
if (FAILED(hr)) return false;
|
||||
|
||||
hr = c_DWFactory->RegisterFontCollectionLoader(Util::DWriteFontCollectionLoader::GetInstance());
|
||||
@ -120,18 +109,18 @@ void CanvasD2D::Finalize()
|
||||
--c_Instances;
|
||||
if (c_Instances == 0)
|
||||
{
|
||||
SafeRelease(&c_D2DFactory);
|
||||
SafeRelease(&c_WICFactory);
|
||||
SafeRelease(&c_DWGDIInterop);
|
||||
c_D2DFactory.Reset();
|
||||
c_WICFactory.Reset();
|
||||
c_DWGDIInterop.Reset();
|
||||
|
||||
c_DWFactory->UnregisterFontCollectionLoader(Util::DWriteFontCollectionLoader::GetInstance());
|
||||
SafeRelease(&c_DWFactory);
|
||||
c_DWFactory.Reset();
|
||||
}
|
||||
}
|
||||
|
||||
void CanvasD2D::Dispose()
|
||||
{
|
||||
SafeRelease(&m_Target);
|
||||
m_Target.Reset();
|
||||
|
||||
delete m_GdipGraphics;
|
||||
m_GdipGraphics = nullptr;
|
||||
@ -205,8 +194,7 @@ void CanvasD2D::EndTargetDraw()
|
||||
if (m_Target)
|
||||
{
|
||||
m_Target->EndDraw();
|
||||
|
||||
SafeRelease(&m_Target);
|
||||
m_Target.Reset();
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,8 +318,8 @@ void CanvasD2D::DrawTextW(const WCHAR* str, UINT strLen, const TextFormat& forma
|
||||
Gdiplus::Color color;
|
||||
brush.GetColor(&color);
|
||||
|
||||
ID2D1SolidColorBrush* solidBrush;
|
||||
HRESULT hr = m_Target->CreateSolidColorBrush(ToColorF(color), &solidBrush);
|
||||
Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> solidBrush;
|
||||
HRESULT hr = m_Target->CreateSolidColorBrush(ToColorF(color), solidBrush.GetAddressOf());
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
TextFormatD2D& formatD2D = (TextFormatD2D&)format;
|
||||
@ -341,31 +329,27 @@ void CanvasD2D::DrawTextW(const WCHAR* str, UINT strLen, const TextFormat& forma
|
||||
|
||||
m_Target->DrawTextLayout(
|
||||
D2D1::Point2F(right ? rect.X - 2 : rect.X + 2.0f, rect.Y - 1.0f),
|
||||
formatD2D.m_TextLayout,
|
||||
solidBrush);
|
||||
|
||||
solidBrush->Release();
|
||||
formatD2D.m_TextLayout.Get(),
|
||||
solidBrush.Get());
|
||||
}
|
||||
}
|
||||
|
||||
bool CanvasD2D::MeasureTextW(const WCHAR* str, UINT strLen, const TextFormat& format, Gdiplus::RectF& rect)
|
||||
{
|
||||
IDWriteTextLayout* textLayout;
|
||||
Microsoft::WRL::ComPtr<IDWriteTextLayout> textLayout;
|
||||
HRESULT hr = c_DWFactory->CreateTextLayout(
|
||||
str,
|
||||
strLen,
|
||||
((TextFormatD2D&)format).m_TextFormat,
|
||||
((TextFormatD2D&)format).m_TextFormat.Get(),
|
||||
10000,
|
||||
10000,
|
||||
&textLayout);
|
||||
textLayout.GetAddressOf());
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
DWRITE_TEXT_METRICS metrics;
|
||||
textLayout->GetMetrics(&metrics);
|
||||
rect.Width = metrics.width + 5.0f;
|
||||
rect.Height = metrics.height + 1.0f; // 1.0f to get same result as GDI+.
|
||||
|
||||
textLayout->Release();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -376,14 +360,14 @@ bool CanvasD2D::MeasureTextLinesW(const WCHAR* str, UINT strLen, const TextForma
|
||||
{
|
||||
((TextFormatD2D&)format).m_TextFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_WRAP);
|
||||
|
||||
IDWriteTextLayout* textLayout;
|
||||
Microsoft::WRL::ComPtr<IDWriteTextLayout> textLayout;
|
||||
HRESULT hr = c_DWFactory->CreateTextLayout(
|
||||
str,
|
||||
strLen,
|
||||
((TextFormatD2D&)format).m_TextFormat,
|
||||
((TextFormatD2D&)format).m_TextFormat.Get(),
|
||||
rect.Width,
|
||||
10000,
|
||||
&textLayout);
|
||||
textLayout.GetAddressOf());
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
DWRITE_TEXT_METRICS metrics;
|
||||
@ -391,8 +375,6 @@ bool CanvasD2D::MeasureTextLinesW(const WCHAR* str, UINT strLen, const TextForma
|
||||
rect.Width = metrics.width + 5.0f;
|
||||
rect.Height = metrics.height + 1.0f; // 1.0f to get same result as GDI+.
|
||||
lines = metrics.lineCount;
|
||||
|
||||
textLayout->Release();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -419,15 +401,14 @@ void CanvasD2D::DrawBitmap(Gdiplus::Bitmap* bitmap, const Gdiplus::Rect& dstRect
|
||||
{
|
||||
D2D1_BITMAP_PROPERTIES props = D2D1::BitmapProperties(
|
||||
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED));
|
||||
ID2D1Bitmap* d2dBitmap;
|
||||
HRESULT hr = m_Target->CreateSharedBitmap(__uuidof(IWICBitmapLock), bitmapLock, &props, &d2dBitmap);
|
||||
Microsoft::WRL::ComPtr<ID2D1Bitmap> d2dBitmap;
|
||||
HRESULT hr = m_Target->CreateSharedBitmap(
|
||||
__uuidof(IWICBitmapLock), bitmapLock, &props, d2dBitmap.GetAddressOf());
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
auto rDst = ToRectF(dstRect);
|
||||
auto rSrc = ToRectF(srcRect);
|
||||
m_Target->DrawBitmap(d2dBitmap, rDst, 1.0F, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, rSrc);
|
||||
|
||||
d2dBitmap->Release();
|
||||
m_Target->DrawBitmap(d2dBitmap.Get(), rDst, 1.0F, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, rSrc);
|
||||
}
|
||||
|
||||
// D2D will still use the pixel data after this call (at the next Flush() or EndDraw()).
|
||||
@ -448,12 +429,11 @@ void CanvasD2D::FillRectangle(Gdiplus::Rect& rect, const Gdiplus::SolidBrush& br
|
||||
Gdiplus::Color color;
|
||||
brush.GetColor(&color);
|
||||
|
||||
ID2D1SolidColorBrush* solidBrush;
|
||||
HRESULT hr = m_Target->CreateSolidColorBrush(ToColorF(color), &solidBrush);
|
||||
Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> solidBrush;
|
||||
HRESULT hr = m_Target->CreateSolidColorBrush(ToColorF(color), solidBrush.GetAddressOf());
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
m_Target->FillRectangle(ToRectF(rect), solidBrush);
|
||||
solidBrush->Release();
|
||||
m_Target->FillRectangle(ToRectF(rect), solidBrush.Get());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <d2d1helper.h>
|
||||
#include <dwrite.h>
|
||||
#include <wincodec.h>
|
||||
#include <wrl/client.h>
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
@ -89,7 +90,7 @@ private:
|
||||
// Retrieves current GDI+ transform (if any) and converts to a D2D Matrix
|
||||
D2D1_MATRIX_3X2_F GetCurrentTransform();
|
||||
|
||||
ID2D1RenderTarget* m_Target;
|
||||
Microsoft::WRL::ComPtr<ID2D1RenderTarget> m_Target;
|
||||
Util::WICBitmapDIB m_Bitmap;
|
||||
|
||||
// GDI+ objects that share the pixel data of m_Bitmap.
|
||||
@ -99,10 +100,10 @@ private:
|
||||
bool m_TextAntiAliasing;
|
||||
|
||||
static UINT c_Instances;
|
||||
static ID2D1Factory* c_D2DFactory;
|
||||
static IDWriteFactory* c_DWFactory;
|
||||
static IDWriteGdiInterop* c_DWGDIInterop;
|
||||
static IWICImagingFactory* c_WICFactory;
|
||||
static Microsoft::WRL::ComPtr<ID2D1Factory> c_D2DFactory;
|
||||
static Microsoft::WRL::ComPtr<IDWriteFactory> c_DWFactory;
|
||||
static Microsoft::WRL::ComPtr<IDWriteGdiInterop> c_DWGDIInterop;
|
||||
static Microsoft::WRL::ComPtr<IWICImagingFactory> c_WICFactory;
|
||||
};
|
||||
|
||||
} // namespace Gfx
|
||||
|
@ -22,10 +22,7 @@
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
TextFormatD2D::TextFormatD2D() :
|
||||
m_TextFormat(),
|
||||
m_TextLayout(),
|
||||
m_InlineEllipsis()
|
||||
TextFormatD2D::TextFormatD2D()
|
||||
{
|
||||
}
|
||||
|
||||
@ -36,23 +33,9 @@ TextFormatD2D::~TextFormatD2D()
|
||||
|
||||
void TextFormatD2D::Dispose()
|
||||
{
|
||||
if (m_TextFormat)
|
||||
{
|
||||
m_TextFormat->Release();
|
||||
m_TextFormat = nullptr;
|
||||
}
|
||||
|
||||
if (m_TextLayout)
|
||||
{
|
||||
m_TextLayout->Release();
|
||||
m_TextLayout = nullptr;
|
||||
}
|
||||
|
||||
if (m_InlineEllipsis)
|
||||
{
|
||||
m_InlineEllipsis->Release();
|
||||
m_InlineEllipsis = nullptr;
|
||||
}
|
||||
m_TextFormat.Reset();
|
||||
m_TextLayout.Reset();
|
||||
m_InlineEllipsis.Reset();
|
||||
}
|
||||
|
||||
void TextFormatD2D::CreateLayout(const WCHAR* str, UINT strLen, float maxW, float maxH)
|
||||
@ -79,13 +62,8 @@ void TextFormatD2D::CreateLayout(const WCHAR* str, UINT strLen, float maxW, floa
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_TextLayout)
|
||||
{
|
||||
m_TextLayout->Release();
|
||||
m_TextLayout = nullptr;
|
||||
}
|
||||
|
||||
CanvasD2D::c_DWFactory->CreateTextLayout(str, strLen, m_TextFormat, maxW, maxH, &m_TextLayout);
|
||||
CanvasD2D::c_DWFactory->CreateTextLayout(
|
||||
str, strLen, m_TextFormat.Get(), maxW, maxH, m_TextLayout.ReleaseAndGetAddressOf());
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,7 +86,7 @@ void TextFormatD2D::SetProperties(
|
||||
// using the GDI family name and then create a text format using the DirectWrite family name
|
||||
// obtained from it.
|
||||
HRESULT hr = Util::GetDWritePropertiesFromGDIProperties(
|
||||
CanvasD2D::c_DWFactory, fontFamily, bold, italic, dwriteFontWeight, dwriteFontStyle,
|
||||
CanvasD2D::c_DWFactory.Get(), fontFamily, bold, italic, dwriteFontWeight, dwriteFontStyle,
|
||||
dwriteFontStretch, dwriteFamilyName, _countof(dwriteFamilyName));
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
@ -129,7 +107,7 @@ void TextFormatD2D::SetProperties(
|
||||
|
||||
// If |fontFamily| is not in the system collection, use the font collection from
|
||||
// |fontCollectionD2D| if possible.
|
||||
if (!Util::IsFamilyInSystemFontCollection(CanvasD2D::c_DWFactory, fontFamily) &&
|
||||
if (!Util::IsFamilyInSystemFontCollection(CanvasD2D::c_DWFactory.Get(), fontFamily) &&
|
||||
(fontCollectionD2D && fontCollectionD2D->InitializeCollection()))
|
||||
{
|
||||
IDWriteFont* dwriteFont = Util::FindDWriteFontInFontCollectionByGDIFamilyName(
|
||||
@ -183,10 +161,11 @@ void TextFormatD2D::SetTrimming(bool trim)
|
||||
{
|
||||
if (!m_InlineEllipsis)
|
||||
{
|
||||
CanvasD2D::c_DWFactory->CreateEllipsisTrimmingSign(m_TextFormat, &m_InlineEllipsis);
|
||||
CanvasD2D::c_DWFactory->CreateEllipsisTrimmingSign(
|
||||
m_TextFormat.Get(), m_InlineEllipsis.GetAddressOf());
|
||||
}
|
||||
|
||||
inlineObject = m_InlineEllipsis;
|
||||
inlineObject = m_InlineEllipsis.Get();
|
||||
trimming.granularity = DWRITE_TRIMMING_GRANULARITY_CHARACTER;
|
||||
wordWrapping = DWRITE_WORD_WRAPPING_WRAP;
|
||||
}
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "TextFormat.h"
|
||||
#include <string>
|
||||
#include <dwrite.h>
|
||||
#include <wrl/client.h>
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
@ -55,9 +56,9 @@ private:
|
||||
// changes.
|
||||
void CreateLayout(const WCHAR* str, UINT strLen, float maxW, float maxH);
|
||||
|
||||
IDWriteTextFormat* m_TextFormat;
|
||||
IDWriteTextLayout* m_TextLayout;
|
||||
IDWriteInlineObject* m_InlineEllipsis;
|
||||
Microsoft::WRL::ComPtr<IDWriteTextFormat> m_TextFormat;
|
||||
Microsoft::WRL::ComPtr<IDWriteTextLayout> m_TextLayout;
|
||||
Microsoft::WRL::ComPtr<IDWriteInlineObject> m_InlineEllipsis;
|
||||
|
||||
std::wstring m_LastString;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user