aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornyamatongwe <unknown>2011-08-11 13:17:37 +1000
committernyamatongwe <unknown>2011-08-11 13:17:37 +1000
commitd3cb2fd86ffe51a93548d4f0b48efc6bec3f0868 (patch)
tree656db107908da4a26eea362805cbb1d5aa3ab01a
parent4e7c52c1935534fbd4ba3ebda77ae28155842f60 (diff)
downloadscintilla-mirror-d3cb2fd86ffe51a93548d4f0b48efc6bec3f0868.tar.gz
Fix bugs in calltip and autocompletion with technology choice.
Simplified Direct2D code.
-rw-r--r--win32/PlatWin.cxx71
-rw-r--r--win32/ScintillaWin.cxx23
2 files changed, 43 insertions, 51 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 2849144e1..f3c063c1b 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -1192,15 +1192,9 @@ namespace Scintilla {
class SurfaceD2D : public Surface {
bool unicodeMode;
- HDC hdc;
- bool hdcOwned;
- int maxWidthMeasure;
- int maxLenText;
int x, y;
int codePage;
- // If 9x OS and current code page is same as ANSI code page.
- bool win9xACPSame;
ID2D1RenderTarget *pRenderTarget;
bool ownRenderTarget;
@@ -1211,9 +1205,10 @@ class SurfaceD2D : public Surface {
FLOAT yDescent;
ID2D1SolidColorBrush *pBrush;
+
+ int logPixelsY;
float dpiScaleX;
float dpiScaleY;
- bool hasBegun;
void SetFont(Font &font_);
@@ -1224,7 +1219,7 @@ public:
SurfaceD2D();
virtual ~SurfaceD2D();
- void SetDWrite(HDC hdc);
+ void SetScale();
void Init(WindowID wid);
void Init(SurfaceID sid, WindowID wid);
void InitPixMap(int width, int height, Surface *surface_, WindowID wid);
@@ -1279,27 +1274,24 @@ public:
SurfaceD2D::SurfaceD2D() :
unicodeMode(false),
- hdc(0), hdcOwned(false),
x(0), y(0) {
- // Windows 9x has only a 16 bit coordinate system so break after 30000 pixels
- maxWidthMeasure = IsNT() ? INT_MAX : 30000;
- // There appears to be a 16 bit string length limit in GDI on NT and a limit of
- // 8192 characters on Windows 95.
- maxLenText = IsNT() ? 65535 : 8192;
codePage = 0;
- win9xACPSame = false;
pRenderTarget = NULL;
ownRenderTarget = false;
clipsActive = 0;
+
+ // From selected font
pTextFormat = NULL;
yAscent = 2;
yDescent = 1;
+
pBrush = NULL;
+
+ logPixelsY = 72;
dpiScaleX = 1.0;
dpiScaleY = 1.0;
- hasBegun = false;
}
SurfaceD2D::~SurfaceD2D() {
@@ -1307,12 +1299,6 @@ SurfaceD2D::~SurfaceD2D() {
}
void SurfaceD2D::Release() {
- if (hdcOwned) {
- ::DeleteDC(reinterpret_cast<HDC>(hdc));
- hdc = 0;
- hdcOwned = false;
- }
-
if (pBrush) {
pBrush->Release();
pBrush = 0;
@@ -1329,9 +1315,12 @@ void SurfaceD2D::Release() {
}
}
-void SurfaceD2D::SetDWrite(HDC hdc) {
- dpiScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0f;
- dpiScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0f;
+void SurfaceD2D::SetScale() {
+ HDC hdcMeasure = ::CreateCompatibleDC(NULL);
+ logPixelsY = ::GetDeviceCaps(hdcMeasure, LOGPIXELSY);
+ dpiScaleX = ::GetDeviceCaps(hdcMeasure, LOGPIXELSX) / 96.0f;
+ dpiScaleY = logPixelsY / 96.0f;
+ ::DeleteDC(hdcMeasure);
}
bool SurfaceD2D::Initialised() {
@@ -1342,29 +1331,20 @@ HRESULT SurfaceD2D::FlushDrawing() {
return pRenderTarget->Flush();
}
-void SurfaceD2D::Init(WindowID wid) {
+void SurfaceD2D::Init(WindowID /* wid */) {
Release();
- hdc = ::CreateCompatibleDC(NULL);
- hdcOwned = true;
- ::SetTextAlign(reinterpret_cast<HDC>(hdc), TA_BASELINE);
- RECT rc;
- ::GetClientRect(reinterpret_cast<HWND>(wid), &rc);
- SetDWrite(hdc);
+ SetScale();
}
void SurfaceD2D::Init(SurfaceID sid, WindowID) {
Release();
- hdc = ::CreateCompatibleDC(NULL);
- hdcOwned = true;
+ SetScale();
pRenderTarget = reinterpret_cast<ID2D1HwndRenderTarget *>(sid);
- ::SetTextAlign(reinterpret_cast<HDC>(hdc), TA_BASELINE);
- SetDWrite(hdc);
}
void SurfaceD2D::InitPixMap(int width, int height, Surface *surface_, WindowID) {
Release();
- hdc = ::CreateCompatibleDC(NULL); // Just for measurement
- hdcOwned = true;
+ SetScale();
SurfaceD2D *psurfOther = static_cast<SurfaceD2D *>(surface_);
ID2D1BitmapRenderTarget *pCompatibleRenderTarget = NULL;
HRESULT hr = psurfOther->pRenderTarget->CreateCompatibleRenderTarget(
@@ -1411,7 +1391,7 @@ void SurfaceD2D::SetFont(Font &font_) {
}
int SurfaceD2D::LogPixelsY() {
- return ::GetDeviceCaps(hdc, LOGPIXELSY);
+ return logPixelsY;
}
int SurfaceD2D::DeviceHeightFont(int points) {
@@ -1878,7 +1858,6 @@ void SurfaceD2D::SetUnicodeMode(bool unicodeMode_) {
void SurfaceD2D::SetDBCSMode(int codePage_) {
// No action on window as automatically handled by system.
codePage = codePage_;
- win9xACPSame = !IsNT() && ((unsigned int)codePage == ::GetACP());
}
Surface *Surface::Allocate(int technology) {
@@ -2485,7 +2464,16 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) {
if (pimage) {
Surface *surfaceItem = Surface::Allocate(technology);
if (surfaceItem) {
- if (pD2DFactory) {
+ if (technology == SCWIN_TECH_GDI) {
+ surfaceItem->Init(pDrawItem->hDC, pDrawItem->hwndItem);
+ int left = pDrawItem->rcItem.left + ItemInset.x + ImageInset.x;
+ PRectangle rcImage(left, pDrawItem->rcItem.top,
+ left + images.GetWidth(), pDrawItem->rcItem.bottom);
+ surfaceItem->DrawRGBAImage(rcImage,
+ pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels());
+ delete surfaceItem;
+ ::SetTextAlign(pDrawItem->hDC, TA_TOP);
+ } else {
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(
@@ -2510,7 +2498,6 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) {
surfaceItem->DrawRGBAImage(rcImage,
pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels());
delete surfaceItem;
- ::SetTextAlign(pDrawItem->hDC, TA_TOP);
pDCRT->EndDraw();
pDCRT->Release();
}
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index bfc4c1b43..c16da8fdb 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -2792,20 +2792,25 @@ sptr_t PASCAL ScintillaWin::CTWndProc(
RECT rc;
GetClientRect(hWnd, &rc);
// Create a Direct2D render target.
- pD2DFactory->CreateHwndRenderTarget(
- D2D1::RenderTargetProperties(),
- D2D1::HwndRenderTargetProperties(hWnd, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)),
- &pCTRenderTarget);
- //surfaceWindow->Init(ps.hdc, hWnd);
- surfaceWindow->Init(pCTRenderTarget, hWnd);
+ if (sciThis->technology == SC_TECHNOLOGY_DEFAULT) {
+ surfaceWindow->Init(ps.hdc, hWnd);
+ } else {
+ pD2DFactory->CreateHwndRenderTarget(
+ D2D1::RenderTargetProperties(),
+ D2D1::HwndRenderTargetProperties(hWnd, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)),
+ &pCTRenderTarget);
+ surfaceWindow->Init(pCTRenderTarget, hWnd);
+ pCTRenderTarget->BeginDraw();
+ }
surfaceWindow->SetUnicodeMode(SC_CP_UTF8 == sciThis->ct.codePage);
surfaceWindow->SetDBCSMode(sciThis->ct.codePage);
- pCTRenderTarget->BeginDraw();
sciThis->ct.PaintCT(surfaceWindow);
- pCTRenderTarget->EndDraw();
+ if (pCTRenderTarget)
+ pCTRenderTarget->EndDraw();
surfaceWindow->Release();
delete surfaceWindow;
- pCTRenderTarget->Release();
+ if (pCTRenderTarget)
+ pCTRenderTarget->Release();
}
::EndPaint(hWnd, &ps);
return 0;