diff options
| author | Neil <nyamatongwe@gmail.com> | 2014-11-24 18:01:03 +1100 | 
|---|---|---|
| committer | Neil <nyamatongwe@gmail.com> | 2014-11-24 18:01:03 +1100 | 
| commit | 69ac0fbbbf25ecbc77330628fceed360f77f9193 (patch) | |
| tree | c2d39104a41a1ad710c5e0c761c8c0cd6aeaed6f | |
| parent | c1ce889ce992cf7006120c01c336fc51b44de9d1 (diff) | |
| download | scintilla-mirror-69ac0fbbbf25ecbc77330628fceed360f77f9193.tar.gz | |
SC_TECHNOLOGY_DIRECTWRITEDC is another provisional mode for DirectWrite drawing
which may fix problems with sibling windows.
| -rw-r--r-- | doc/ScintillaDoc.html | 19 | ||||
| -rw-r--r-- | doc/ScintillaHistory.html | 5 | ||||
| -rw-r--r-- | include/Scintilla.h | 1 | ||||
| -rw-r--r-- | include/Scintilla.iface | 1 | ||||
| -rw-r--r-- | win32/ScintillaWin.cxx | 59 | 
5 files changed, 65 insertions, 20 deletions
| diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 068dbdf9d..8b9ecb1b2 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -82,7 +82,7 @@      <h1>Scintilla Documentation</h1> -    <p>Last edited 16 November 2014 NH</p> +    <p>Last edited 24 November 2014 NH</p>      <p>There is <a class="jump" href="Design.html">an overview of the internal design of      Scintilla</a>.<br /> @@ -3270,16 +3270,20 @@ struct Sci_TextToFind {       <b id="SCI_GETTECHNOLOGY">SCI_GETTECHNOLOGY</b><br />      The technology property allows choosing between different drawing APIs and options.      On most platforms, the only choice is <code>SC_TECHNOLOGY_DEFAULT</code> (0). -    On Windows Vista or later, <code>SC_TECHNOLOGY_DIRECTWRITE</code> (1) or -    <code class="provisional">SC_TECHNOLOGY_DIRECTWRITERETAIN</code> (2) +    On Windows Vista or later, <code>SC_TECHNOLOGY_DIRECTWRITE</code> (1), +    <code class="provisional">SC_TECHNOLOGY_DIRECTWRITERETAIN</code> (2), or +    <code class="provisional">SC_TECHNOLOGY_DIRECTWRITEDC</code> (3)      can be chosen to use the Direct2D and DirectWrite APIs for higher quality antialiased drawing.      <code class="provisional">SC_TECHNOLOGY_DIRECTWRITERETAIN</code> differs from      <code>SC_TECHNOLOGY_DIRECTWRITE</code> by requesting that the frame      is retained after being presented which may prevent drawing failures on some cards and drivers. +    <code class="provisional">SC_TECHNOLOGY_DIRECTWRITEDC</code> differs from +    <code>SC_TECHNOLOGY_DIRECTWRITE</code> by using DirectWrite to draw into a GDI DC.      Since Direct2D buffers drawing, Scintilla's buffering can be turned off with      <code>SCI_SETBUFFEREDDRAW(0)</code>. -    <span class="provisional">Since <code>SC_TECHNOLOGY_DIRECTWRITERETAIN</code> -    is provisional, it may be changed or removed in a future release if a better solution is found.</span></p> +    <span class="provisional">Since <code>SC_TECHNOLOGY_DIRECTWRITERETAIN</code> and +    <code>SC_TECHNOLOGY_DIRECTWRITEDC</code> +    are provisional, they may be changed or removed in a future release if a better solution is found.</span></p>      <p><b id="SCI_SETFONTQUALITY">SCI_SETFONTQUALITY(int fontQuality)</b><br />       <b id="SCI_GETFONTQUALITY">SCI_GETFONTQUALITY</b><br /> @@ -7459,8 +7463,9 @@ for line = lineStart to lineEnd do SCI_ENSUREVISIBLE(line) next      <p>Provisional features are displayed in this document with <span class="provisional">a distinctive background colour</span>.</p>      <p>There are currently no provisional messages. -    The <code class="provisional">SC_TECHNOLOGY_DIRECTWRITERETAIN</code> value for -    <a class="message" href="#SCI_SETTECHNOLOGY">SCI_SETTECHNOLOGY</a> is provisional.</p> +    The <code class="provisional">SC_TECHNOLOGY_DIRECTWRITERETAIN</code> and +    <code class="provisional">SC_TECHNOLOGY_DIRECTWRITEDC</code> values for +    <a class="message" href="#SCI_SETTECHNOLOGY">SCI_SETTECHNOLOGY</a> are provisional.</p>      <p>Using C++11 <regex> is provisional.</p> diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index ddd3c78a6..58c02178c 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -521,6 +521,11 @@  	<a href="http://sourceforge.net/p/scintilla/bugs/1643/">Bug #1643</a>.  	</li>  	<li> +	On Windows another DirectWrite mode SC_TECHNOLOGY_DIRECTWRITEDC added +	which may avoid drawing failures in some circumstances by drawing into a GDI DC. +	This feature is provisional and may be changed or removed if a better solution is found. +	</li> +	<li>  	On Windows, avoid processing mouse move events where the mouse has not moved as these can  	cause unexpected dwell start notifications.  	<a href="http://sourceforge.net/p/scintilla/bugs/1670/">Bug #1670</a>. diff --git a/include/Scintilla.h b/include/Scintilla.h index 9779cfee6..deaede845 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -899,6 +899,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,  #define SC_TECHNOLOGY_DEFAULT 0  #define SC_TECHNOLOGY_DIRECTWRITE 1  #define SC_TECHNOLOGY_DIRECTWRITERETAIN 2 +#define SC_TECHNOLOGY_DIRECTWRITEDC 3  #define SCI_SETTECHNOLOGY 2630  #define SCI_GETTECHNOLOGY 2631  #define SCI_CREATELOADER 2632 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index e8c96591b..ca54c65ee 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -2366,6 +2366,7 @@ fun void ScrollToEnd=2629(,)  val SC_TECHNOLOGY_DEFAULT=0  val SC_TECHNOLOGY_DIRECTWRITE=1  val SC_TECHNOLOGY_DIRECTWRITERETAIN=2 +val SC_TECHNOLOGY_DIRECTWRITEDC=3  # Set the technology used.  set void SetTechnology=2630(int technology,) diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 237f8e17a..bd205e370 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -210,7 +210,7 @@ class ScintillaWin :  	static ATOM callClassAtom;  #if defined(USE_D2D) -	ID2D1HwndRenderTarget *pRenderTarget; +	ID2D1RenderTarget *pRenderTarget;  	bool renderTargetValid;  #endif @@ -222,7 +222,7 @@ class ScintillaWin :  	virtual void Initialise();  	virtual void Finalise();  #if defined(USE_D2D) -	void EnsureRenderTarget(); +	void EnsureRenderTarget(HDC hdc);  	void DropRenderTarget();  #endif  	HWND MainHWND(); @@ -441,7 +441,7 @@ void ScintillaWin::Finalise() {  #if defined(USE_D2D) -void ScintillaWin::EnsureRenderTarget() { +void ScintillaWin::EnsureRenderTarget(HDC hdc) {  	if (!renderTargetValid) {  		DropRenderTarget();  		renderTargetValid = true; @@ -455,12 +455,6 @@ void ScintillaWin::EnsureRenderTarget() {  		// Create a Direct2D render target.  #if 1 -		D2D1_HWND_RENDER_TARGET_PROPERTIES dhrtp; -		dhrtp.hwnd = hw; -		dhrtp.pixelSize = size; -		dhrtp.presentOptions = (technology == SC_TECHNOLOGY_DIRECTWRITERETAIN) ? -			D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS : D2D1_PRESENT_OPTIONS_NONE; -  		D2D1_RENDER_TARGET_PROPERTIES drtp;  		drtp.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;  		drtp.pixelFormat.format = DXGI_FORMAT_UNKNOWN; @@ -470,7 +464,32 @@ void ScintillaWin::EnsureRenderTarget() {  		drtp.usage = D2D1_RENDER_TARGET_USAGE_NONE;  		drtp.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; -		pD2DFactory->CreateHwndRenderTarget(drtp, dhrtp, &pRenderTarget); +		if (technology == SC_TECHNOLOGY_DIRECTWRITEDC) { +			// Explicit pixel format needed. +			drtp.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, +				D2D1_ALPHA_MODE_IGNORE); + +			ID2D1DCRenderTarget *pDCRT = NULL; +			HRESULT hr = pD2DFactory->CreateDCRenderTarget(&drtp, &pDCRT); +			if (FAILED(hr)) { +				Platform::DebugPrintf("Failed CreateDCRenderTarget 0x%x\n", hr); +			} +			pRenderTarget = pDCRT; + +		} else { +			D2D1_HWND_RENDER_TARGET_PROPERTIES dhrtp; +			dhrtp.hwnd = hw; +			dhrtp.pixelSize = size; +			dhrtp.presentOptions = (technology == SC_TECHNOLOGY_DIRECTWRITERETAIN) ? +			D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS : D2D1_PRESENT_OPTIONS_NONE; + +			ID2D1HwndRenderTarget *pHwndRenderTarget = NULL; +			HRESULT hr = pD2DFactory->CreateHwndRenderTarget(drtp, dhrtp, &pHwndRenderTarget); +			if (FAILED(hr)) { +				Platform::DebugPrintf("Failed CreateHwndRenderTarget 0x%x\n", hr); +			} +			pRenderTarget = pHwndRenderTarget; +		}  #else  		pD2DFactory->CreateHwndRenderTarget(  			D2D1::RenderTargetProperties( @@ -484,6 +503,16 @@ void ScintillaWin::EnsureRenderTarget() {  		// need to be recreated.  		DropGraphics(false);  	} + +	if (technology == SC_TECHNOLOGY_DIRECTWRITEDC) { +		RECT rcWindow; +		GetClientRect(MainHWND(), &rcWindow); +		HRESULT hr = static_cast<ID2D1DCRenderTarget*>(pRenderTarget)->BindDC(hdc, &rcWindow); +		if (FAILED(hr)) { +			Platform::DebugPrintf("BindDC failed 0x%x\n", hr); +			DropRenderTarget(); +		} +	}  }  void ScintillaWin::DropRenderTarget() { @@ -638,7 +667,7 @@ LRESULT ScintillaWin::WndPaint(uptr_t wParam) {  		}  	} else {  #if defined(USE_D2D) -		EnsureRenderTarget(); +		EnsureRenderTarget(pps->hdc);  		AutoSurface surfaceWindow(pRenderTarget, this);  		if (surfaceWindow) {  			pRenderTarget->BeginDraw(); @@ -1413,6 +1442,7 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam  		case SCI_SETTECHNOLOGY:  			if ((wParam == SC_TECHNOLOGY_DEFAULT) ||   				(wParam == SC_TECHNOLOGY_DIRECTWRITERETAIN) || +				(wParam == SC_TECHNOLOGY_DIRECTWRITEDC) ||  				(wParam == SC_TECHNOLOGY_DIRECTWRITE)) {  				if (technology != static_cast<int>(wParam)) {  					if (static_cast<int>(wParam) > SC_TECHNOLOGY_DEFAULT) { @@ -1424,6 +1454,9 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam  						return 0;  #endif  					} +#if defined(USE_D2D) +					DropRenderTarget(); +#endif  					technology = static_cast<int>(wParam);  					// Invalidate all cached information including layout.  					DropGraphics(true); @@ -2549,7 +2582,7 @@ void ScintillaWin::HorizontalScrollMessage(WPARAM wParam) {   * This paint will not be abandoned.   */  void ScintillaWin::FullPaint() { -	if (technology == SC_TECHNOLOGY_DEFAULT) { +	if ((technology == SC_TECHNOLOGY_DEFAULT) || (technology == SC_TECHNOLOGY_DIRECTWRITEDC)) {  		HDC hdc = ::GetDC(MainHWND());  		FullPaintDC(hdc);  		::ReleaseDC(MainHWND(), hdc); @@ -2574,7 +2607,7 @@ void ScintillaWin::FullPaintDC(HDC hdc) {  		}  	} else {  #if defined(USE_D2D) -		EnsureRenderTarget(); +		EnsureRenderTarget(hdc);  		AutoSurface surfaceWindow(pRenderTarget, this);  		if (surfaceWindow) {  			pRenderTarget->BeginDraw(); | 
