Renderer增加获取三种类型ID2D1StrokeStyle的接口

This commit is contained in:
Nomango 2018-05-24 17:19:54 +08:00
parent 93cb13fe72
commit 6ea9d6ef85
5 changed files with 175 additions and 104 deletions

View File

@ -12,6 +12,9 @@ static ID2D1SolidColorBrush * s_pSolidBrush = nullptr;
static IWICImagingFactory * s_pIWICFactory = nullptr;
static IDWriteFactory * s_pDWriteFactory = nullptr;
static e2d::TextRenderer * s_pTextRenderer = nullptr;
static ID2D1StrokeStyle * s_pMiterStrokeStyle = nullptr;
static ID2D1StrokeStyle * s_pBevelStrokeStyle = nullptr;
static ID2D1StrokeStyle * s_pRoundStrokeStyle = nullptr;
static D2D1_COLOR_F s_nClearColor = D2D1::ColorF(D2D1::ColorF::Black);
@ -23,11 +26,80 @@ bool e2d::Renderer::__createDeviceIndependentResources()
&s_pDirect2dFactory
);
// 工厂将返回当前的系统 DPI这个值也将用来创建窗口
if (SUCCEEDED(hr))
{
s_pDirect2dFactory->GetDesktopDpi(&s_fDpiScaleX, &s_fDpiScaleY);
}
if (FAILED(hr))
{
throw SystemException(L"Create ID2D1Factory failed");
}
else
{
hr = s_pDirect2dFactory->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_LINE_JOIN_MITER,
2.0f,
D2D1_DASH_STYLE_SOLID,
0.0f),
nullptr,
0,
&s_pMiterStrokeStyle
);
}
if (FAILED(hr))
{
throw SystemException(L"Create ID2D1StrokeStyle failed");
}
else
{
hr = s_pDirect2dFactory->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_LINE_JOIN_BEVEL,
2.0f,
D2D1_DASH_STYLE_SOLID,
0.0f),
nullptr,
0,
&s_pBevelStrokeStyle
);
}
if (FAILED(hr))
{
throw SystemException(L"Create ID2D1StrokeStyle failed");
}
else
{
hr = s_pDirect2dFactory->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_LINE_JOIN_ROUND,
2.0f,
D2D1_DASH_STYLE_SOLID,
0.0f),
nullptr,
0,
&s_pRoundStrokeStyle
);
}
if (FAILED(hr))
{
throw SystemException(L"Create ID2D1StrokeStyle failed");
}
else
{
// 创建 WIC 绘图工厂,用于统一处理各种格式的图片
hr = CoCreateInstance(
@ -59,9 +131,6 @@ bool e2d::Renderer::__createDeviceIndependentResources()
}
else
{
// 工厂将返回当前的系统 DPI这个值也将用来创建窗口
Renderer::getID2D1Factory()->GetDesktopDpi(&s_fDpiScaleX, &s_fDpiScaleY);
// 创建文本格式化对象
hr = s_pDWriteFactory->CreateTextFormat(
L"",
@ -130,7 +199,7 @@ bool e2d::Renderer::__createDeviceResources()
else
{
// 创建自定义的文字渲染器
s_pTextRenderer = new (std::nothrow) TextRenderer(
s_pTextRenderer = TextRenderer::Create(
s_pDirect2dFactory,
s_pRenderTarget,
s_pSolidBrush
@ -146,6 +215,9 @@ void e2d::Renderer::__discardDeviceResources()
SafeRelease(s_pRenderTarget);
SafeRelease(s_pSolidBrush);
SafeRelease(s_pTextRenderer);
SafeRelease(s_pMiterStrokeStyle);
SafeRelease(s_pBevelStrokeStyle);
SafeRelease(s_pRoundStrokeStyle);
}
void e2d::Renderer::__discardResources()
@ -155,6 +227,9 @@ void e2d::Renderer::__discardResources()
SafeRelease(s_pRenderTarget);
SafeRelease(s_pSolidBrush);
SafeRelease(s_pTextRenderer);
SafeRelease(s_pMiterStrokeStyle);
SafeRelease(s_pBevelStrokeStyle);
SafeRelease(s_pRoundStrokeStyle);
SafeRelease(s_pIWICFactory);
SafeRelease(s_pDWriteFactory);
}
@ -292,3 +367,18 @@ e2d::TextRenderer * e2d::Renderer::getTextRenderer()
{
return s_pTextRenderer;
}
ID2D1StrokeStyle * e2d::Renderer::getMiterID2D1StrokeStyle()
{
return s_pMiterStrokeStyle;
}
ID2D1StrokeStyle * e2d::Renderer::getBevelID2D1StrokeStyle()
{
return s_pBevelStrokeStyle;
}
ID2D1StrokeStyle * e2d::Renderer::getRoundID2D1StrokeStyle()
{
return s_pRoundStrokeStyle;
}

View File

@ -1,5 +1,6 @@
#include "..\e2dcommon.h"
#include <iomanip>
#include <cwctype>
#include <comutil.h>
#pragma comment(lib, "comsuppw.lib")
@ -377,20 +378,14 @@ int e2d::String::compare(const String & str) const
e2d::String e2d::String::toUpper() const
{
String str(*this);
for (size_t i = 0, length = _str.size(); i < length; ++i)
str[i] = towupper(str[i]);
std::transform(str._str.begin(), str._str.end(), str._str.begin(), std::towupper);
return std::move(str);
}
e2d::String e2d::String::toLower() const
{
e2d::String str(*this);
for (size_t i = 0, length = _str.size(); i < length; ++i)
str[i] = towlower(str[i]);
std::transform(str._str.begin(), str._str.end(), str._str.begin(), std::towlower);
return std::move(str);
}

View File

@ -3,24 +3,17 @@
using namespace e2d;
TextRenderer::TextRenderer(
ID2D1Factory* pD2DFactory,
ID2D1HwndRenderTarget* pRT,
ID2D1SolidColorBrush* pBrush
)
TextRenderer::TextRenderer()
: cRefCount_(0)
, pD2DFactory_(pD2DFactory)
, pRT_(pRT)
, pBrush_(pBrush)
, pD2DFactory_(nullptr)
, pRT_(nullptr)
, pBrush_(nullptr)
, sFillColor_()
, sOutlineColor_()
, fOutlineWidth(1)
, bShowOutline_(TRUE)
, nOutlineJoin_(D2D1_LINE_JOIN_MITER)
, pCurrStrokeStyle_(nullptr)
{
pD2DFactory_->AddRef();
pRT_->AddRef();
pBrush_->AddRef();
}
TextRenderer::~TextRenderer()
@ -30,6 +23,26 @@ TextRenderer::~TextRenderer()
SafeRelease(pBrush_);
}
TextRenderer * TextRenderer::Create(
ID2D1Factory* pD2DFactory,
ID2D1HwndRenderTarget* pRT,
ID2D1SolidColorBrush* pBrush
)
{
TextRenderer * pTextRenderer = new (std::nothrow) TextRenderer();
if (pTextRenderer)
{
pD2DFactory->AddRef();
pRT->AddRef();
pBrush->AddRef();
pTextRenderer->pD2DFactory_ = pD2DFactory;
pTextRenderer->pRT_ = pRT;
pTextRenderer->pBrush_ = pBrush;
}
return pTextRenderer;
}
STDMETHODIMP_(void) TextRenderer::SetTextStyle(
CONST D2D1_COLOR_F &fillColor,
BOOL hasOutline,
@ -42,7 +55,22 @@ STDMETHODIMP_(void) TextRenderer::SetTextStyle(
bShowOutline_ = hasOutline;
sOutlineColor_ = outlineColor;
fOutlineWidth = 2 * outlineWidth;
nOutlineJoin_ = outlineJoin;
switch (outlineJoin)
{
case D2D1_LINE_JOIN_MITER:
pCurrStrokeStyle_ = Renderer::getMiterID2D1StrokeStyle();
break;
case D2D1_LINE_JOIN_BEVEL:
pCurrStrokeStyle_ = Renderer::getBevelID2D1StrokeStyle();
break;
case D2D1_LINE_JOIN_ROUND:
pCurrStrokeStyle_ = Renderer::getRoundID2D1StrokeStyle();
break;
default:
pCurrStrokeStyle_ = nullptr;
break;
}
}
STDMETHODIMP TextRenderer::DrawGlyphRun(
@ -107,32 +135,14 @@ STDMETHODIMP TextRenderer::DrawGlyphRun(
if (SUCCEEDED(hr) && bShowOutline_)
{
ID2D1StrokeStyle * pStrokeStyle = nullptr;
hr = Renderer::getID2D1Factory()->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
nOutlineJoin_,
2.0f,
D2D1_DASH_STYLE_SOLID,
0.0f),
nullptr,
0,
&pStrokeStyle
pBrush_->SetColor(sOutlineColor_);
pRT_->DrawGeometry(
pTransformedGeometry,
pBrush_,
fOutlineWidth,
pCurrStrokeStyle_
);
if (SUCCEEDED(hr))
{
pBrush_->SetColor(sOutlineColor_);
pRT_->DrawGeometry(
pTransformedGeometry,
pBrush_,
fOutlineWidth,
pStrokeStyle
);
}
}
if (SUCCEEDED(hr))
@ -193,32 +203,14 @@ STDMETHODIMP TextRenderer::DrawUnderline(
if (SUCCEEDED(hr) && bShowOutline_)
{
ID2D1StrokeStyle * pStrokeStyle = nullptr;
hr = Renderer::getID2D1Factory()->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
nOutlineJoin_,
2.0f,
D2D1_DASH_STYLE_SOLID,
0.0f),
nullptr,
0,
&pStrokeStyle
pBrush_->SetColor(sOutlineColor_);
pRT_->DrawGeometry(
pTransformedGeometry,
pBrush_,
fOutlineWidth,
pCurrStrokeStyle_
);
if (SUCCEEDED(hr))
{
pBrush_->SetColor(sOutlineColor_);
pRT_->DrawGeometry(
pTransformedGeometry,
pBrush_,
fOutlineWidth,
pStrokeStyle
);
}
}
if (SUCCEEDED(hr))
@ -278,32 +270,14 @@ STDMETHODIMP TextRenderer::DrawStrikethrough(
if (SUCCEEDED(hr) && bShowOutline_)
{
ID2D1StrokeStyle * pStrokeStyle = nullptr;
hr = Renderer::getID2D1Factory()->CreateStrokeStyle(
D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE_FLAT,
nOutlineJoin_,
2.0f,
D2D1_DASH_STYLE_SOLID,
0.0f),
nullptr,
0,
&pStrokeStyle
pBrush_->SetColor(sOutlineColor_);
pRT_->DrawGeometry(
pTransformedGeometry,
pBrush_,
fOutlineWidth,
pCurrStrokeStyle_
);
if (SUCCEEDED(hr))
{
pBrush_->SetColor(sOutlineColor_);
pRT_->DrawGeometry(
pTransformedGeometry,
pBrush_,
fOutlineWidth,
pStrokeStyle
);
}
}
if (SUCCEEDED(hr))

View File

@ -416,6 +416,15 @@ public:
// 获取文字渲染器
static TextRenderer * getTextRenderer();
// 获取 Miter 样式的 ID2D1StrokeStyle
static ID2D1StrokeStyle * getMiterID2D1StrokeStyle();
// 获取 Bevel 样式的 ID2D1StrokeStyle
static ID2D1StrokeStyle * getBevelID2D1StrokeStyle();
// 获取 Round 样式的 ID2D1StrokeStyle
static ID2D1StrokeStyle * getRoundID2D1StrokeStyle();
private:
// 渲染游戏画面
static void __render();

View File

@ -71,15 +71,18 @@ protected:
class TextRenderer
: public IDWriteTextRenderer
{
private:
TextRenderer();
~TextRenderer();
public:
TextRenderer(
static TextRenderer * Create(
ID2D1Factory* pD2DFactory,
ID2D1HwndRenderTarget* pRT,
ID2D1SolidColorBrush* pBrush
);
~TextRenderer();
STDMETHOD_(void, SetTextStyle)(
CONST D2D1_COLOR_F &fillColor,
BOOL hasOutline,
@ -153,10 +156,10 @@ private:
D2D1_COLOR_F sOutlineColor_;
FLOAT fOutlineWidth;
BOOL bShowOutline_;
D2D1_LINE_JOIN nOutlineJoin_;
ID2D1Factory* pD2DFactory_;
ID2D1HwndRenderTarget* pRT_;
ID2D1SolidColorBrush* pBrush_;
ID2D1StrokeStyle * pCurrStrokeStyle_;
};