Magic_Game/core/e2dimpl.h

195 lines
4.0 KiB
C
Raw Normal View History

#pragma once
2018-09-05 13:33:39 +08:00
#include "e2dutil.h"
namespace e2d
{
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
class Music;
2018-09-05 13:38:30 +08:00
// <20><>Դ<EFBFBD>ص<EFBFBD>
class VoiceCallback
: public IXAudio2VoiceCallback
{
public:
VoiceCallback();
2018-08-12 12:06:06 +08:00
2018-09-05 13:38:30 +08:00
~VoiceCallback();
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) {}
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) {}
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnStreamEnd) (THIS);
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) {}
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext);
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext);
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) {}
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, SetCallbackOnStreamEnd) (THIS_ const Function& func);
2018-09-05 13:38:30 +08:00
STDMETHOD_(void, SetCallbackOnLoopEnd) (THIS_ const Function& func);
2018-09-05 13:38:30 +08:00
protected:
Function loop_end_callback_;
Function stream_end_callback_;
};
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE>
class E2DTextRenderer
: public IDWriteTextRenderer
{
private:
E2DTextRenderer();
~E2DTextRenderer();
public:
static HRESULT Create(
E2DTextRenderer** ppTextRenderer,
ID2D1Factory* pD2DFactory,
ID2D1HwndRenderTarget* pRT,
ID2D1SolidColorBrush* pBrush
);
STDMETHOD_(void, SetTextStyle)(
CONST D2D1_COLOR_F &fillColor,
BOOL outline,
CONST D2D1_COLOR_F &outline_color,
FLOAT outline_width,
D2D1_LINE_JOIN outlineJoin
);
STDMETHOD(DrawGlyphRun)(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
DWRITE_MEASURING_MODE measuringMode,
__in DWRITE_GLYPH_RUN const* glyphRun,
__in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
IUnknown* clientDrawingEffect
);
STDMETHOD(DrawUnderline)(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
__in DWRITE_UNDERLINE const* underline,
IUnknown* clientDrawingEffect
);
STDMETHOD(DrawStrikethrough)(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
__in DWRITE_STRIKETHROUGH const* strikethrough,
IUnknown* clientDrawingEffect
);
STDMETHOD(DrawInlineObject)(
__maybenull void* clientDrawingContext,
FLOAT originX,
FLOAT originY,
IDWriteInlineObject* inlineObject,
BOOL IsSideways,
BOOL IsRightToLeft,
IUnknown* clientDrawingEffect
);
STDMETHOD(IsPixelSnappingDisabled)(
__maybenull void* clientDrawingContext,
__out BOOL* isDisabled
);
STDMETHOD(GetCurrentTransform)(
__maybenull void* clientDrawingContext,
__out DWRITE_MATRIX* transform
);
STDMETHOD(GetPixelsPerDip)(
__maybenull void* clientDrawingContext,
__out FLOAT* pixelsPerDip
);
public:
unsigned long STDMETHODCALLTYPE AddRef();
unsigned long STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE QueryInterface(
IID const& riid,
void** ppvObject
);
private:
unsigned long cRefCount_;
D2D1_COLOR_F sFillColor_;
D2D1_COLOR_F sOutlineColor_;
FLOAT fOutlineWidth;
BOOL bShowOutline_;
ID2D1Factory* pD2DFactory_;
ID2D1HwndRenderTarget* pRT_;
ID2D1SolidColorBrush* pBrush_;
ID2D1StrokeStyle * pCurrStrokeStyle_;
};
// <20>
class Exception
{
public:
Exception() E2D_NOEXCEPT;
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
explicit Exception(const char * message) E2D_NOEXCEPT;
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
Exception(Exception const& other) E2D_NOEXCEPT;
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
virtual ~Exception() E2D_NOEXCEPT;
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
Exception& operator=(Exception const& other) E2D_NOEXCEPT;
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
// <20><>ȡ<EFBFBD><EFBFBD><ECB3A3>Ϣ
virtual const char * GetMsg() const;
2018-05-24 00:58:16 +08:00
2018-09-05 13:38:30 +08:00
private:
const char * message_;
};
2018-05-24 12:24:39 +08:00
2018-09-05 13:38:30 +08:00
// ϵͳ<CFB5>
class SystemException
: public Exception
{
public:
SystemException() E2D_NOEXCEPT;
2018-05-24 12:24:39 +08:00
2018-09-05 13:38:30 +08:00
explicit SystemException(const char * message) E2D_NOEXCEPT;
};
2018-05-24 12:24:39 +08:00
2018-08-15 00:06:03 +08:00
2018-09-05 13:38:30 +08:00
template<class Interface>
inline void SafeRelease(Interface*& p)
2018-08-15 00:06:03 +08:00
{
2018-09-05 13:38:30 +08:00
if (p != nullptr)
{
p->Release();
p = nullptr;
}
2018-08-15 00:06:03 +08:00
}
2018-09-05 13:38:30 +08:00
inline void ThrowIfFailed(HRESULT hr)
2018-08-15 00:06:03 +08:00
{
2018-09-05 13:38:30 +08:00
if (FAILED(hr))
{
// <20>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD>öϵ<C3B6><CFB5>Բ<EFBFBD><D4B2><EFBFBD> D2D API <20>쳣.
static char s_str[64] = {};
sprintf_s(s_str, "Failure with HRESULT of %08X", static_cast<unsigned int>(hr));
throw SystemException(s_str);
}
2018-08-15 00:06:03 +08:00
}
}