Magic_Game/core/e2dimpl.h

190 lines
4.7 KiB
C
Raw Normal View History

2018-10-03 22:02:46 +08:00
// Copyright (c) 2016-2018 Easy2D - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#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>
2018-10-03 22:02:46 +08:00
class E2DTextRenderer
2018-09-05 13:38:30 +08:00
: public IDWriteTextRenderer
{
private:
2018-10-03 22:02:46 +08:00
E2DTextRenderer();
2018-09-05 13:38:30 +08:00
2018-10-03 22:02:46 +08:00
~E2DTextRenderer();
2018-09-05 13:38:30 +08:00
public:
static HRESULT Create(
2018-10-03 22:02:46 +08:00
E2DTextRenderer** ppTextRenderer,
2018-09-05 13:38:30 +08:00
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_;
};
2018-09-10 20:55:20 +08:00
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>
class RuntimeException
: public std::exception
2018-09-05 13:38:30 +08:00
{
public:
2018-09-10 20:55:20 +08:00
RuntimeException() E2D_NOEXCEPT
: exception("unknown runtime exception", 1)
{
}
2018-05-24 12:24:39 +08:00
2018-09-10 20:55:20 +08:00
explicit RuntimeException(
char const* const message
) E2D_NOEXCEPT
: exception(message, 1)
{
}
2018-09-05 13:38:30 +08:00
};
2018-05-24 12:24:39 +08:00
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));
2018-09-10 20:55:20 +08:00
throw RuntimeException(s_str);
2018-09-05 13:38:30 +08:00
}
2018-08-15 00:06:03 +08:00
}
}