Add Direct2D support to wxSTC

This commit is contained in:
New Pagodi
2018-01-25 16:07:54 -06:00
parent f836d430e9
commit b936bfe85e
12 changed files with 1449 additions and 17 deletions

View File

@@ -0,0 +1,28 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/msw/private/graphicsd2d.h
// Purpose: Allow functions from graphicsd2d.cpp to be used in othe files
// Author: New Pagodi
// Created: 2017-10-31
// Copyright: (c) 2017 wxWidgets development team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef WX_MSW_PRIVATE_GRAPHICSD2D_H_
#define WX_MSW_PRIVATE_GRAPHICSD2D_H_
#if wxUSE_GRAPHICS_DIRECT2D
// Ensure no previous defines interfere with the Direct2D API headers
#undef GetHwnd
#include <d2d1.h>
#include <dwrite.h>
#include <wincodec.h>
WXDLLIMPEXP_CORE IWICImagingFactory* wxWICImagingFactory();
WXDLLIMPEXP_CORE ID2D1Factory* wxD2D1Factory();
WXDLLIMPEXP_CORE IDWriteFactory* wxDWriteFactory();
#endif // wxUSE_GRAPHICS_DIRECT2D
#endif // WX_MSW_PRIVATE_GRAPHICSD2D_H_

View File

@@ -3963,6 +3963,12 @@ public:
// to overlap from one line to the next. // to overlap from one line to the next.
void SetPhasesDraw(int phases); void SetPhasesDraw(int phases);
// Choose the quality level for text.
void SetFontQuality(int fontQuality);
// Retrieve the quality level for text.
int GetFontQuality() const;
// Scroll so that a display line is at the top of the display. // Scroll so that a display line is at the top of the display.
void SetFirstVisibleLine(int displayLine); void SetFirstVisibleLine(int displayLine);

View File

@@ -5153,6 +5153,27 @@ public:
*/ */
void SetPhasesDraw(int phases); void SetPhasesDraw(int phases);
/**
Choose the quality level for text.
The input should be one of the
@link wxStyledTextCtrl::wxSTC_EFF_QUALITY_DEFAULT wxSTC_EFF_QUALITY_* @endlink constants.
@remarks
This method only has any effect with the wxMSW port and when
technology has been set to wxSTC_TECHNOLOGY_DIRECTWRITE.
@since 3.1.1
*/
void SetFontQuality(int fontQuality);
/**
Retrieve the quality level for text.
The return value will be one of the
@link wxStyledTextCtrl::wxSTC_EFF_QUALITY_DEFAULT wxSTC_EFF_QUALITY_* @endlink constants.
@since 3.1.1
*/
int GetFontQuality() const;
/** /**
Change internal focus flag. Change internal focus flag.
*/ */
@@ -5166,8 +5187,10 @@ public:
/** /**
Set the technology used. Set the technology used.
The input should be one of the @remarks
@link wxStyledTextCtrl::wxSTC_TECHNOLOGY_DEFAULT wxSTC_TECHNOLOGY_* @endlink constants. For the wxMSW port, the input can be either wxSTC_TECHNOLOGY_DEFAULT
or wxSTC_TECHNOLOGY_DIRECTWRITE. With other ports, this method has
no effect.
*/ */
void SetTechnology(int technology); void SetTechnology(int technology);

View File

@@ -72,6 +72,7 @@
#include "wx/private/graphics.h" #include "wx/private/graphics.h"
#include "wx/stack.h" #include "wx/stack.h"
#include "wx/sharedptr.h" #include "wx/sharedptr.h"
#include "wx/msw/private/graphicsd2d.h"
// This must be the last header included to only affect the DEFINE_GUID() // This must be the last header included to only affect the DEFINE_GUID()
// occurrences below but not any GUIDs declared in the standard files included // occurrences below but not any GUIDs declared in the standard files included
@@ -219,6 +220,9 @@ wxDirect2D::DWriteCreateFactory_t wxDirect2D::DWriteCreateFactory = NULL;
DEFINE_GUID(wxIID_IWICImagingFactory, DEFINE_GUID(wxIID_IWICImagingFactory,
0xec5ec8a9, 0xc395, 0x4314, 0x9c, 0x77, 0x54, 0xd7, 0xa9, 0x35, 0xff, 0x70); 0xec5ec8a9, 0xc395, 0x4314, 0x9c, 0x77, 0x54, 0xd7, 0xa9, 0x35, 0xff, 0x70);
DEFINE_GUID(wxIID_ID2D1Factory,
0x06152247, 0x6f50, 0x465a, 0x92, 0x45, 0x11, 0x8b, 0xfd, 0x3b, 0x60, 0x07);
DEFINE_GUID(wxIID_IDWriteFactory, DEFINE_GUID(wxIID_IDWriteFactory,
0xb859ee5a, 0xd838, 0x4b5b, 0xa2, 0xe8, 0x1a, 0xdc, 0x7d, 0x93, 0xdb, 0x48); 0xb859ee5a, 0xd838, 0x4b5b, 0xa2, 0xe8, 0x1a, 0xdc, 0x7d, 0x93, 0xdb, 0x48);
@@ -299,6 +303,39 @@ IWICImagingFactory* wxWICImagingFactory()
return gs_WICImagingFactory; return gs_WICImagingFactory;
} }
static ID2D1Factory* gs_ID2D1Factory = NULL;
ID2D1Factory* wxD2D1Factory()
{
if (!wxDirect2D::Initialize())
return NULL;
if (gs_ID2D1Factory == NULL)
{
D2D1_FACTORY_OPTIONS factoryOptions = {D2D1_DEBUG_LEVEL_NONE};
// According to
// https://msdn.microsoft.com/en-us/library/windows/desktop/ee794287(v=vs.85).aspx
// the Direct2D Debug Layer is only available starting with Windows 8
// and Visual Studio 2012.
#if defined(__WXDEBUG__) && defined(__VISUALC__) && wxCHECK_VISUALC_VERSION(11)
if ( wxGetWinVersion() >= wxWinVersion_8 )
{
factoryOptions.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION;
}
#endif //__WXDEBUG__
HRESULT hr = wxDirect2D::D2D1CreateFactory(
D2D1_FACTORY_TYPE_SINGLE_THREADED,
wxIID_ID2D1Factory,
&factoryOptions,
reinterpret_cast<void**>(&gs_ID2D1Factory)
);
wxCHECK_HRESULT_RET_PTR(hr);
}
return gs_ID2D1Factory;
}
static IDWriteFactory* gs_IDWriteFactory = NULL; static IDWriteFactory* gs_IDWriteFactory = NULL;
IDWriteFactory* wxDWriteFactory() IDWriteFactory* wxDWriteFactory()
@@ -4457,13 +4494,9 @@ wxGraphicsRenderer* wxGraphicsRenderer::GetDirect2DRenderer()
return gs_D2DRenderer; return gs_D2DRenderer;
} }
wxD2DRenderer::wxD2DRenderer() wxD2DRenderer::wxD2DRenderer():m_direct2dFactory(wxD2D1Factory())
{ {
if ( m_direct2dFactory.get() == NULL )
HRESULT result;
result = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_direct2dFactory);
if (FAILED(result))
{ {
wxFAIL_MSG("Could not create Direct2D Factory."); wxFAIL_MSG("Could not create Direct2D Factory.");
} }
@@ -4770,6 +4803,12 @@ public:
gs_D2DRenderer = NULL; gs_D2DRenderer = NULL;
} }
if ( gs_ID2D1Factory )
{
gs_ID2D1Factory->Release();
gs_ID2D1Factory = NULL;
}
::CoUninitialize(); ::CoUninitialize();
} }

File diff suppressed because it is too large Load Diff

View File

@@ -6,3 +6,69 @@ wxRect wxRectFromPRectangle(PRectangle prc);
PRectangle PRectangleFromwxRect(wxRect rc); PRectangle PRectangleFromwxRect(wxRect rc);
wxColour wxColourFromCD(const ColourDesired& ca); wxColour wxColourFromCD(const ColourDesired& ca);
class SurfaceData
{
public:
virtual ~SurfaceData(){}
};
#if wxUSE_GRAPHICS_DIRECT2D
#include <wx/msw/private/graphicsd2d.h>
#include <wx/msw/private/comptr.h>
class ScintillaWX;
class SurfaceDataD2D: public SurfaceData
{
public:
SurfaceDataD2D(ScintillaWX*);
bool Initialised() const;
void DiscardGraphicsResources();
HRESULT CreateGraphicsResources();
void SetEditorPaintAbandoned();
ID2D1DCRenderTarget* GetRenderTarget() const {return m_pRenderTarget.get();}
ID2D1SolidColorBrush* GetSolidBrush() const {return m_pSolidBrush.get();}
ID2D1BitmapBrush* GetPatternBrush() const {return m_pPatternBrush.get();}
IDWriteRenderingParams* GetDefaultRenderingParams() const
{return m_defaultRenderingParams;}
IDWriteRenderingParams* GetCustomClearTypeRenderingParams() const
{return m_customClearTypeRenderingParams;}
private:
wxCOMPtr<ID2D1Factory> m_pD2DFactory;
wxCOMPtr<IDWriteFactory> m_pDWriteFactory;
wxCOMPtr<ID2D1DCRenderTarget> m_pRenderTarget;
wxCOMPtr<ID2D1SolidColorBrush> m_pSolidBrush;
wxCOMPtr<ID2D1BitmapBrush> m_pPatternBrush;
wxCOMPtr<IDWriteRenderingParams> m_defaultRenderingParams;
wxCOMPtr<IDWriteRenderingParams> m_customClearTypeRenderingParams;
ScintillaWX* m_editor;
};
class SurfaceFontDataD2D: public SurfaceData
{
public:
SurfaceFontDataD2D(const FontParameters& fp);
bool Initialised() const;
XYPOSITION GetAscent() const {return m_ascent;}
XYPOSITION GetDescent() const {return m_descent;}
XYPOSITION GetInternalLeading() const {return m_internalLeading;}
XYPOSITION GetAverageCharWidth() const {return m_averageCharWidth;}
D2D1_TEXT_ANTIALIAS_MODE GetFontQuality() const {return m_aaMode;}
IDWriteTextFormat* GetFormat() const {return m_pTextFormat.get();}
private:
XYPOSITION m_ascent;
XYPOSITION m_descent;
XYPOSITION m_internalLeading;
XYPOSITION m_averageCharWidth;
D2D1_TEXT_ANTIALIAS_MODE m_aaMode;
wxCOMPtr<IDWriteTextFormat> m_pTextFormat;
};
#endif // wxUSE_GRAPHICS_DIRECT2D

View File

@@ -118,6 +118,7 @@ public:
m_ct(ct), m_swx(swx), m_cx(wxDefaultCoord), m_cy(wxDefaultCoord) m_ct(ct), m_swx(swx), m_cx(wxDefaultCoord), m_cy(wxDefaultCoord)
{ {
SetBackgroundStyle(wxBG_STYLE_CUSTOM); SetBackgroundStyle(wxBG_STYLE_CUSTOM);
SetName("wxSTCCallTip");
} }
~wxSTCCallTip() { ~wxSTCCallTip() {
@@ -134,7 +135,7 @@ public:
void OnPaint(wxPaintEvent& WXUNUSED(evt)) void OnPaint(wxPaintEvent& WXUNUSED(evt))
{ {
wxAutoBufferedPaintDC dc(this); wxAutoBufferedPaintDC dc(this);
Surface* surfaceWindow = Surface::Allocate(0); Surface* surfaceWindow = Surface::Allocate(m_swx->technology);
surfaceWindow->Init(&dc, m_ct->wDraw.GetID()); surfaceWindow->Init(&dc, m_ct->wDraw.GetID());
m_ct->PaintCT(surfaceWindow); m_ct->PaintCT(surfaceWindow);
surfaceWindow->Release(); surfaceWindow->Release();
@@ -270,6 +271,8 @@ ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
timers[tickScroll] = new wxSTCTimer(this,tickScroll); timers[tickScroll] = new wxSTCTimer(this,tickScroll);
timers[tickWiden] = new wxSTCTimer(this,tickWiden); timers[tickWiden] = new wxSTCTimer(this,tickWiden);
timers[tickDwell] = new wxSTCTimer(this,tickDwell); timers[tickDwell] = new wxSTCTimer(this,tickDwell);
m_surfaceData = NULL;
} }
@@ -278,6 +281,11 @@ ScintillaWX::~ScintillaWX() {
delete i->second; delete i->second;
} }
timers.clear(); timers.clear();
if ( m_surfaceData != NULL ) {
delete m_surfaceData;
}
Finalise(); Finalise();
} }
@@ -817,6 +825,36 @@ sptr_t ScintillaWX::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam)
} }
#endif #endif
#if wxUSE_GRAPHICS_DIRECT2D
case SCI_SETTECHNOLOGY:
if ((wParam == SC_TECHNOLOGY_DEFAULT) || (wParam == SC_TECHNOLOGY_DIRECTWRITE)) {
if (technology != static_cast<int>(wParam)) {
SurfaceDataD2D* newSurfaceData(NULL);
if (static_cast<int>(wParam) > SC_TECHNOLOGY_DEFAULT) {
newSurfaceData = new SurfaceDataD2D(this);
if (!newSurfaceData->Initialised()) {
// Failed to load Direct2D or DirectWrite so no effect
delete newSurfaceData;
return 0;
}
}
technology = static_cast<int>(wParam);
if ( m_surfaceData ) {
delete m_surfaceData;
}
m_surfaceData = newSurfaceData;
// Invalidate all cached information including layout.
DropGraphics(true);
InvalidateStyleRedraw();
}
}
break;
#endif
#ifdef SCI_LEXER #ifdef SCI_LEXER
case SCI_LOADLEXERLIBRARY: case SCI_LOADLEXERLIBRARY:
LexerManager::GetInstance()->Load((const char*)lParam); LexerManager::GetInstance()->Load((const char*)lParam);

View File

@@ -87,6 +87,7 @@ class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_STC wxStyledTextCtrl; // forward class WXDLLIMPEXP_FWD_STC wxStyledTextCtrl; // forward
class ScintillaWX; class ScintillaWX;
class wxSTCTimer; class wxSTCTimer;
class SurfaceData;
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// Helper classes // Helper classes
@@ -196,6 +197,8 @@ public:
void ClipChildren(wxDC& dc, PRectangle rect); void ClipChildren(wxDC& dc, PRectangle rect);
void SetUseAntiAliasing(bool useAA); void SetUseAntiAliasing(bool useAA);
bool GetUseAntiAliasing(); bool GetUseAntiAliasing();
SurfaceData* GetSurfaceData() const {return m_surfaceData;}
void SetPaintAbandoned(){paintState = paintAbandoned;}
private: private:
bool capturedMouse; bool capturedMouse;
@@ -212,6 +215,7 @@ private:
int wheelVRotation; int wheelVRotation;
int wheelHRotation; int wheelHRotation;
SurfaceData* m_surfaceData;
// For use in creating a system caret // For use in creating a system caret
bool HasCaretSizeChanged(); bool HasCaretSizeChanged();

View File

@@ -517,6 +517,7 @@ docsMap = {
'SetMouseDwellTime':'Notifications', 'SetMouseDwellTime':'Notifications',
'GetBufferedDraw':'OtherSettings', 'GetBufferedDraw':'OtherSettings',
'GetCodePage':'OtherSettings', 'GetCodePage':'OtherSettings',
'GetFontQuality':'OtherSettings',
'GetFocus':'OtherSettings', 'GetFocus':'OtherSettings',
'GetIMEInteraction':'OtherSettings', 'GetIMEInteraction':'OtherSettings',
'GetPhasesDraw':'OtherSettings', 'GetPhasesDraw':'OtherSettings',
@@ -525,6 +526,7 @@ docsMap = {
'SetBufferedDraw':'OtherSettings', 'SetBufferedDraw':'OtherSettings',
'SetCodePage':'OtherSettings', 'SetCodePage':'OtherSettings',
'SetFocus':'OtherSettings', 'SetFocus':'OtherSettings',
'SetFontQuality':'OtherSettings',
'SetIMEInteraction':'OtherSettings', 'SetIMEInteraction':'OtherSettings',
'SetLayoutCache':'OtherSettings', 'SetLayoutCache':'OtherSettings',
'SetPhasesDraw':'OtherSettings', 'SetPhasesDraw':'OtherSettings',
@@ -840,7 +842,9 @@ docSubstitutions = {
'SetSelectionMode':{'SC_SEL_STREAM':'wxSTC_SEL_STREAM', 'SetSelectionMode':{'SC_SEL_STREAM':'wxSTC_SEL_STREAM',
'SC_SEL_RECTANGLE':'wxSTC_SEL_RECTANGLE','SC_SEL_THIN':'wxSTC_SEL_THIN', 'SC_SEL_RECTANGLE':'wxSTC_SEL_RECTANGLE','SC_SEL_THIN':'wxSTC_SEL_THIN',
'SC_SEL_LINES':'wxSTC_SEL_LINES'} 'SC_SEL_LINES':'wxSTC_SEL_LINES'},
'SetFontQuality':{' from the FontQuality enumeration':''}
} }
@@ -1033,10 +1037,24 @@ extendedDocs = {
'@endlink constants.',), '@endlink constants.',),
'SetTechnology': 'SetTechnology':
('The input should be one of the', ('@remarks',
'@link wxStyledTextCtrl::wxSTC_TECHNOLOGY_DEFAULT wxSTC_TECHNOLOGY_* ' 'For the wxMSW port, the input can be either wxSTC_TECHNOLOGY_DEFAULT',
'or wxSTC_TECHNOLOGY_DIRECTWRITE. With other ports, this method has',
'no effect.',),
'GetFontQuality':
('The return value will be one of the',
'@link wxStyledTextCtrl::wxSTC_EFF_QUALITY_DEFAULT wxSTC_EFF_QUALITY_* '
'@endlink constants.',), '@endlink constants.',),
'SetFontQuality':
('The input should be one of the',
'@link wxStyledTextCtrl::wxSTC_EFF_QUALITY_DEFAULT wxSTC_EFF_QUALITY_* '
'@endlink constants.',
'@remarks',
'This method only has any effect with the wxMSW port and when',
'technology has been set to wxSTC_TECHNOLOGY_DIRECTWRITE.',),
'GetIMEInteraction': 'GetIMEInteraction':
('The return value will be one of the', ('The return value will be one of the',
'@link wxStyledTextCtrl::wxSTC_IME_WINDOWED wxSTC_IME_* @endlink constants.',), '@link wxStyledTextCtrl::wxSTC_IME_WINDOWED wxSTC_IME_* @endlink constants.',),
@@ -1362,6 +1380,7 @@ sinceAnnotations= {
'FoldDisplayTextSetStyle':'3.1.1', 'FoldDisplayTextSetStyle':'3.1.1',
'GetDirectFunction':'3.1.1', 'GetDirectFunction':'3.1.1',
'GetDirectPointer':'3.1.1', 'GetDirectPointer':'3.1.1',
'GetFontQuality':'3.1.1',
'GetIdleStyling':'3.1.1', 'GetIdleStyling':'3.1.1',
'GetLexerLanguage':'3.1.1', 'GetLexerLanguage':'3.1.1',
'GetMarginBackN':'3.1.1', 'GetMarginBackN':'3.1.1',
@@ -1374,6 +1393,7 @@ sinceAnnotations= {
'MultiEdgeClearAll':'3.1.1', 'MultiEdgeClearAll':'3.1.1',
'MultipleSelectAddEach':'3.1.1', 'MultipleSelectAddEach':'3.1.1',
'MultipleSelectAddNext':'3.1.1', 'MultipleSelectAddNext':'3.1.1',
'SetFontQuality':'3.1.1',
'SetIdleStyling':'3.1.1', 'SetIdleStyling':'3.1.1',
'SetMarginBackN':'3.1.1', 'SetMarginBackN':'3.1.1',
'SetMargins':'3.1.1', 'SetMargins':'3.1.1',

View File

@@ -895,8 +895,6 @@ methodOverrideMap = {
return stc2wx(buf);''' return stc2wx(buf);'''
), ),
'SetFontQuality' : (None, 0, 0),
'GetFontQuality' : (None, 0, 0),
'SetSelection' : (None, 0, 0), 'SetSelection' : (None, 0, 0),
'GetCharacterPointer' : (0, 'GetCharacterPointer' : (0,

View File

@@ -231,6 +231,10 @@ bool wxStyledTextCtrl::Create(wxWindow *parent,
SetBufferedDraw(true); SetBufferedDraw(true);
#endif #endif
#if wxUSE_GRAPHICS_DIRECT2D
SetFontQuality(wxSTC_EFF_QUALITY_DEFAULT);
#endif
return true; return true;
} }
@@ -2533,6 +2537,18 @@ void wxStyledTextCtrl::SetPhasesDraw(int phases)
SendMsg(SCI_SETPHASESDRAW, phases, 0); SendMsg(SCI_SETPHASESDRAW, phases, 0);
} }
// Choose the quality level for text.
void wxStyledTextCtrl::SetFontQuality(int fontQuality)
{
SendMsg(SCI_SETFONTQUALITY, fontQuality, 0);
}
// Retrieve the quality level for text.
int wxStyledTextCtrl::GetFontQuality() const
{
return SendMsg(SCI_GETFONTQUALITY, 0, 0);
}
// Scroll so that a display line is at the top of the display. // Scroll so that a display line is at the top of the display.
void wxStyledTextCtrl::SetFirstVisibleLine(int displayLine) void wxStyledTextCtrl::SetFirstVisibleLine(int displayLine)
{ {

View File

@@ -231,6 +231,10 @@ bool wxStyledTextCtrl::Create(wxWindow *parent,
SetBufferedDraw(true); SetBufferedDraw(true);
#endif #endif
#if wxUSE_GRAPHICS_DIRECT2D
SetFontQuality(wxSTC_EFF_QUALITY_DEFAULT);
#endif
return true; return true;
} }