mirror of
https://github.com/rizonesoft/Notepad3.git
synced 2026-06-11 21:03:05 +08:00
+ upd: current scintilla development
This commit is contained in:
parent
9a2bf5e76d
commit
42eae314b5
@ -78,6 +78,6 @@ namespace CompactEncDet {
|
||||
Encoding TopEncodingOfTLDHint(const char* name);
|
||||
Encoding TopEncodingOfCharsetHint(const char* name);
|
||||
const char* Version();
|
||||
}; // End namespace CompactEncDet
|
||||
} // End namespace CompactEncDet
|
||||
|
||||
#endif // COMPACT_ENC_DET_COMPACT_ENC_DET_H_
|
||||
|
||||
@ -605,6 +605,9 @@
|
||||
for rectangular or thin selection by performing no action.
|
||||
<a href="https://sourceforge.net/p/scintilla/bugs/2078/">Bug #2078</a>.
|
||||
</li>
|
||||
<li>
|
||||
Platform layer font cache removed on Win32 as there is a platform-independent cache.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>
|
||||
<a href="https://www.scintilla.org/scite413.zip">Release 4.1.3</a>
|
||||
|
||||
@ -62,12 +62,6 @@ namespace Scintilla {
|
||||
|
||||
UINT CodePageFromCharSet(DWORD characterSet, UINT documentCodePage);
|
||||
|
||||
RECT RectFromPRectangle(PRectangle prc) noexcept {
|
||||
RECT rc = {static_cast<LONG>(prc.left), static_cast<LONG>(prc.top),
|
||||
static_cast<LONG>(prc.right), static_cast<LONG>(prc.bottom)};
|
||||
return rc;
|
||||
}
|
||||
|
||||
#if defined(USE_D2D)
|
||||
IDWriteFactory *pIDWriteFactory = nullptr;
|
||||
ID2D1Factory *pD2DFactory = nullptr;
|
||||
@ -152,7 +146,7 @@ struct FormatAndMetrics {
|
||||
FLOAT yAscent;
|
||||
FLOAT yDescent;
|
||||
FLOAT yInternalLeading;
|
||||
FormatAndMetrics(HFONT hfont_, int extraFontFlag_, int characterSet_) :
|
||||
FormatAndMetrics(HFONT hfont_, int extraFontFlag_, int characterSet_) noexcept :
|
||||
technology(SCWIN_TECH_GDI), hfont(hfont_),
|
||||
#if defined(USE_D2D)
|
||||
pTextFormat(nullptr),
|
||||
@ -165,7 +159,7 @@ struct FormatAndMetrics {
|
||||
int characterSet_,
|
||||
FLOAT yAscent_,
|
||||
FLOAT yDescent_,
|
||||
FLOAT yInternalLeading_) :
|
||||
FLOAT yInternalLeading_) noexcept :
|
||||
technology(SCWIN_TECH_DIRECTWRITE),
|
||||
hfont{},
|
||||
pTextFormat(pTextFormat_),
|
||||
@ -228,11 +222,11 @@ HFONT FormatAndMetrics::HFont() {
|
||||
|
||||
namespace {
|
||||
|
||||
void *PointerFromWindow(HWND hWnd) {
|
||||
void *PointerFromWindow(HWND hWnd) noexcept {
|
||||
return reinterpret_cast<void *>(::GetWindowLongPtr(hWnd, 0));
|
||||
}
|
||||
|
||||
void SetWindowPointer(HWND hWnd, void *ptr) {
|
||||
void SetWindowPointer(HWND hWnd, void *ptr) noexcept {
|
||||
::SetWindowLongPtr(hWnd, 0, reinterpret_cast<LONG_PTR>(ptr));
|
||||
}
|
||||
|
||||
@ -241,11 +235,11 @@ HINSTANCE hinstPlatformRes {};
|
||||
|
||||
HCURSOR reverseArrowCursor {};
|
||||
|
||||
FormatAndMetrics *FamFromFontID(void *fid) {
|
||||
FormatAndMetrics *FamFromFontID(void *fid) noexcept {
|
||||
return static_cast<FormatAndMetrics *>(fid);
|
||||
}
|
||||
|
||||
BYTE Win32MapFontQuality(int extraFontFlag) {
|
||||
constexpr BYTE Win32MapFontQuality(int extraFontFlag) noexcept {
|
||||
switch (extraFontFlag & SC_EFF_QUALITY_MASK) {
|
||||
|
||||
case SC_EFF_QUALITY_NON_ANTIALIASED:
|
||||
@ -263,7 +257,7 @@ BYTE Win32MapFontQuality(int extraFontFlag) {
|
||||
}
|
||||
|
||||
#if defined(USE_D2D)
|
||||
D2D1_TEXT_ANTIALIAS_MODE DWriteMapFontQuality(int extraFontFlag) {
|
||||
constexpr D2D1_TEXT_ANTIALIAS_MODE DWriteMapFontQuality(int extraFontFlag) noexcept {
|
||||
switch (extraFontFlag & SC_EFF_QUALITY_MASK) {
|
||||
|
||||
case SC_EFF_QUALITY_NON_ANTIALIASED:
|
||||
@ -292,51 +286,11 @@ void SetLogFont(LOGFONTW &lf, const char *faceName, int characterSet, float size
|
||||
UTF16FromUTF8(faceName, lf.lfFaceName, LF_FACESIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a hash from the parameters for a font to allow easy checking for identity.
|
||||
* If one font is the same as another, its hash will be the same, but if the hash is the
|
||||
* same then they may still be different.
|
||||
*/
|
||||
int HashFont(const FontParameters &fp) noexcept {
|
||||
return
|
||||
static_cast<int>(fp.size) ^
|
||||
(fp.characterSet << 10) ^
|
||||
((fp.extraFontFlag & SC_EFF_QUALITY_MASK) << 9) ^
|
||||
((fp.weight/100) << 12) ^
|
||||
(fp.italic ? 0x20000000 : 0) ^
|
||||
(fp.technology << 15) ^
|
||||
fp.faceName[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class FontCached : Font {
|
||||
FontCached *next;
|
||||
int usage;
|
||||
float size;
|
||||
FontID CreateFontFromParameters(const FontParameters &fp) {
|
||||
LOGFONTW lf;
|
||||
int technology;
|
||||
int hash;
|
||||
explicit FontCached(const FontParameters &fp);
|
||||
bool SameAs(const FontParameters &fp);
|
||||
void Release() override;
|
||||
|
||||
static FontCached *first;
|
||||
public:
|
||||
~FontCached() override {}
|
||||
static FontID FindOrCreate(const FontParameters &fp);
|
||||
static void ReleaseId(FontID fid_);
|
||||
};
|
||||
|
||||
FontCached *FontCached::first = nullptr;
|
||||
|
||||
FontCached::FontCached(const FontParameters &fp) :
|
||||
next(nullptr), usage(0), size(1.0), hash(0) {
|
||||
SetLogFont(lf, fp.faceName, fp.characterSet, fp.size, fp.weight, fp.italic, fp.extraFontFlag);
|
||||
technology = fp.technology;
|
||||
hash = HashFont(fp);
|
||||
fid = 0;
|
||||
if (technology == SCWIN_TECH_GDI) {
|
||||
FontID fid = nullptr;
|
||||
if (fp.technology == SCWIN_TECH_GDI) {
|
||||
HFONT hfont = ::CreateFontIndirectW(&lf);
|
||||
fid = new FormatAndMetrics(hfont, fp.extraFontFlag, fp.characterSet);
|
||||
} else {
|
||||
@ -347,18 +301,11 @@ FontCached::FontCached(const FontParameters &fp) :
|
||||
UTF16FromUTF8(fp.faceName, wszFace, faceSize);
|
||||
const FLOAT fHeight = fp.size;
|
||||
const DWRITE_FONT_STYLE style = fp.italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;
|
||||
|
||||
//HRESULT hr = pIDWriteFactory->CreateTextFormat(wszFace, nullptr,
|
||||
// static_cast<DWRITE_FONT_WEIGHT>(fp.weight),
|
||||
// style,
|
||||
// DWRITE_FONT_STRETCH_NORMAL, fHeight, L"en-us", &pTextFormat);
|
||||
// patch for rendering chineese fonts: (https://sourceforge.net/p/scintilla/bugs/2027/)
|
||||
HRESULT hr = pIDWriteFactory->CreateTextFormat(wszFace, nullptr,
|
||||
static_cast<DWRITE_FONT_WEIGHT>(fp.weight),
|
||||
style,
|
||||
DWRITE_FONT_STRETCH_NORMAL, fHeight, L"", &pTextFormat);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
HRESULT hr = pIDWriteFactory->CreateTextFormat(wszFace, nullptr,
|
||||
static_cast<DWRITE_FONT_WEIGHT>(fp.weight),
|
||||
style,
|
||||
DWRITE_FONT_STRETCH_NORMAL, fHeight, L"en-us", &pTextFormat);
|
||||
if (SUCCEEDED(hr)) {
|
||||
pTextFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
|
||||
|
||||
FLOAT yAscent = 1.0f;
|
||||
@ -389,67 +336,9 @@ FontCached::FontCached(const FontParameters &fp) :
|
||||
}
|
||||
#endif
|
||||
}
|
||||
usage = 1;
|
||||
return fid;
|
||||
}
|
||||
|
||||
bool FontCached::SameAs(const FontParameters &fp) {
|
||||
if (
|
||||
(size == fp.size) &&
|
||||
(lf.lfWeight == fp.weight) &&
|
||||
(lf.lfItalic == (fp.italic ? 1 : 0)) &&
|
||||
(lf.lfCharSet == fp.characterSet) &&
|
||||
(lf.lfQuality == Win32MapFontQuality(fp.extraFontFlag)) &&
|
||||
(technology == fp.technology)) {
|
||||
wchar_t wszFace[LF_FACESIZE] = L"";
|
||||
UTF16FromUTF8(fp.faceName, wszFace, LF_FACESIZE);
|
||||
return 0 == wcscmp(lf.lfFaceName,wszFace);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void FontCached::Release() {
|
||||
delete FamFromFontID(fid);
|
||||
fid = nullptr;
|
||||
}
|
||||
|
||||
FontID FontCached::FindOrCreate(const FontParameters &fp) {
|
||||
FontID ret {};
|
||||
::EnterCriticalSection(&crPlatformLock);
|
||||
const int hashFind = HashFont(fp);
|
||||
for (FontCached *cur=first; cur; cur=cur->next) {
|
||||
if ((cur->hash == hashFind) &&
|
||||
cur->SameAs(fp)) {
|
||||
cur->usage++;
|
||||
ret = cur->fid;
|
||||
}
|
||||
}
|
||||
if (!ret) {
|
||||
FontCached *fc = new FontCached(fp);
|
||||
fc->next = first;
|
||||
first = fc;
|
||||
ret = fc->fid;
|
||||
}
|
||||
::LeaveCriticalSection(&crPlatformLock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void FontCached::ReleaseId(FontID fid_) {
|
||||
::EnterCriticalSection(&crPlatformLock);
|
||||
FontCached **pcur=&first;
|
||||
for (FontCached *cur=first; cur; cur=cur->next) {
|
||||
if (cur->fid == fid_) {
|
||||
cur->usage--;
|
||||
if (cur->usage == 0) {
|
||||
*pcur = cur->next;
|
||||
cur->Release();
|
||||
cur->next = nullptr;
|
||||
delete cur;
|
||||
}
|
||||
break;
|
||||
}
|
||||
pcur=&cur->next;
|
||||
}
|
||||
::LeaveCriticalSection(&crPlatformLock);
|
||||
}
|
||||
|
||||
Font::Font() noexcept : fid{} {
|
||||
@ -458,18 +347,16 @@ Font::Font() noexcept : fid{} {
|
||||
Font::~Font() {
|
||||
}
|
||||
|
||||
#define FONTS_CACHED
|
||||
|
||||
void Font::Create(const FontParameters &fp) {
|
||||
Release();
|
||||
if (fp.faceName)
|
||||
fid = FontCached::FindOrCreate(fp);
|
||||
fid = CreateFontFromParameters(fp);
|
||||
}
|
||||
|
||||
void Font::Release() {
|
||||
if (fid)
|
||||
FontCached::ReleaseId(fid);
|
||||
fid = 0;
|
||||
delete FamFromFontID(fid);
|
||||
fid = nullptr;
|
||||
}
|
||||
|
||||
// Buffer to hold strings and string position arrays without always allocating on heap.
|
||||
@ -538,17 +425,17 @@ class SurfaceGDI : public Surface {
|
||||
|
||||
void BrushColor(ColourDesired back);
|
||||
void SetFont(Font &font_);
|
||||
void Clear();
|
||||
void Clear() noexcept;
|
||||
|
||||
public:
|
||||
SurfaceGDI();
|
||||
SurfaceGDI() noexcept;
|
||||
// Deleted so SurfaceGDI objects can not be copied.
|
||||
SurfaceGDI(const SurfaceGDI &) = delete;
|
||||
SurfaceGDI(SurfaceGDI &&) = delete;
|
||||
SurfaceGDI &operator=(const SurfaceGDI &) = delete;
|
||||
SurfaceGDI &operator=(SurfaceGDI &&) = delete;
|
||||
|
||||
~SurfaceGDI() override;
|
||||
~SurfaceGDI() noexcept override;
|
||||
|
||||
void Init(WindowID wid) override;
|
||||
void Init(SurfaceID sid, WindowID wid) override;
|
||||
@ -595,14 +482,14 @@ public:
|
||||
void SetBidiR2L(bool bidiR2L_) override;
|
||||
};
|
||||
|
||||
SurfaceGDI::SurfaceGDI() {
|
||||
SurfaceGDI::SurfaceGDI() noexcept {
|
||||
}
|
||||
|
||||
SurfaceGDI::~SurfaceGDI() {
|
||||
SurfaceGDI::~SurfaceGDI() noexcept {
|
||||
Clear();
|
||||
}
|
||||
|
||||
void SurfaceGDI::Clear() {
|
||||
void SurfaceGDI::Clear() noexcept {
|
||||
if (penOld) {
|
||||
::SelectObject(hdc, penOld);
|
||||
::DeleteObject(pen);
|
||||
@ -769,7 +656,7 @@ void SurfaceGDI::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesir
|
||||
namespace {
|
||||
|
||||
// Plot a point into a DWORD buffer symmetrically to all 4 quadrants
|
||||
void __forceinline AllFour(DWORD *pixels, int width, int height, int x, int y, DWORD val) {
|
||||
void AllFour(DWORD *pixels, int width, int height, int x, int y, DWORD val) noexcept {
|
||||
pixels[y*width+x] = val;
|
||||
pixels[y*width+width-1-x] = val;
|
||||
pixels[(height-1-y)*width+x] = val;
|
||||
@ -788,7 +675,7 @@ DWORD dwordFromBGRA(byte b, byte g, byte r, byte a) noexcept {
|
||||
return converter.val;
|
||||
}
|
||||
|
||||
DWORD dwordMultiplied(ColourDesired colour, unsigned int alpha) {
|
||||
DWORD dwordMultiplied(ColourDesired colour, unsigned int alpha) noexcept {
|
||||
return dwordFromBGRA(
|
||||
static_cast<byte>(colour.GetBlue() * alpha / 255),
|
||||
static_cast<byte>(colour.GetGreen() * alpha / 255),
|
||||
@ -1104,11 +991,11 @@ class SurfaceD2D : public Surface {
|
||||
float dpiScaleX;
|
||||
float dpiScaleY;
|
||||
|
||||
void Clear();
|
||||
void Clear() noexcept;
|
||||
void SetFont(Font &font_);
|
||||
|
||||
public:
|
||||
SurfaceD2D();
|
||||
SurfaceD2D() noexcept;
|
||||
// Deleted so SurfaceD2D objects can not be copied.
|
||||
SurfaceD2D(const SurfaceD2D &) = delete;
|
||||
SurfaceD2D(SurfaceD2D &&) = delete;
|
||||
@ -1166,7 +1053,7 @@ public:
|
||||
void SetBidiR2L(bool bidiR2L_) override;
|
||||
};
|
||||
|
||||
SurfaceD2D::SurfaceD2D() :
|
||||
SurfaceD2D::SurfaceD2D() noexcept :
|
||||
unicodeMode(false),
|
||||
x(0), y(0) {
|
||||
|
||||
@ -1194,7 +1081,7 @@ SurfaceD2D::~SurfaceD2D() {
|
||||
Clear();
|
||||
}
|
||||
|
||||
void SurfaceD2D::Clear() {
|
||||
void SurfaceD2D::Clear() noexcept {
|
||||
if (pBrush) {
|
||||
pBrush->Release();
|
||||
pBrush = nullptr;
|
||||
@ -1326,7 +1213,7 @@ void SurfaceD2D::MoveTo(int x_, int y_) {
|
||||
y = y_;
|
||||
}
|
||||
|
||||
static int Delta(int difference) {
|
||||
static constexpr int Delta(int difference) noexcept {
|
||||
if (difference < 0)
|
||||
return -1;
|
||||
else if (difference > 0)
|
||||
@ -2227,7 +2114,7 @@ Surface *Surface::Allocate(int technology) {
|
||||
|
||||
namespace {
|
||||
|
||||
HWND HwndFromWindowID(WindowID wid) {
|
||||
HWND HwndFromWindowID(WindowID wid) noexcept {
|
||||
return static_cast<HWND>(wid);
|
||||
}
|
||||
|
||||
@ -2256,14 +2143,14 @@ void Window::SetPosition(PRectangle rc) {
|
||||
|
||||
namespace {
|
||||
|
||||
static RECT RectFromMonitor(HMONITOR hMonitor) {
|
||||
static RECT RectFromMonitor(HMONITOR hMonitor) noexcept {
|
||||
MONITORINFO mi = {};
|
||||
mi.cbSize = sizeof(mi);
|
||||
if (GetMonitorInfo(hMonitor, &mi)) {
|
||||
return mi.rcWork;
|
||||
}
|
||||
RECT rc = {0, 0, 0, 0};
|
||||
if (::SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0) == 0) {
|
||||
if (::SystemParametersInfoA(SPI_GETWORKAREA, 0, &rc, 0) == 0) {
|
||||
rc.left = 0;
|
||||
rc.top = 0;
|
||||
rc.right = 0;
|
||||
@ -2335,7 +2222,7 @@ void Window::SetFont(Font &font) {
|
||||
|
||||
namespace {
|
||||
|
||||
void FlipBitmap(HBITMAP bitmap, int width, int height) {
|
||||
void FlipBitmap(HBITMAP bitmap, int width, int height) noexcept {
|
||||
HDC hdc = ::CreateCompatibleDC(NULL);
|
||||
if (hdc) {
|
||||
HBITMAP prevBmp = SelectBitmap(hdc, bitmap);
|
||||
@ -2345,7 +2232,7 @@ void FlipBitmap(HBITMAP bitmap, int width, int height) {
|
||||
}
|
||||
}
|
||||
|
||||
HCURSOR GetReverseArrowCursor() {
|
||||
HCURSOR GetReverseArrowCursor() noexcept {
|
||||
if (reverseArrowCursor)
|
||||
return reverseArrowCursor;
|
||||
|
||||
@ -2440,7 +2327,7 @@ class LineToItem {
|
||||
std::vector<ListItemData> data;
|
||||
|
||||
public:
|
||||
void Clear() {
|
||||
void Clear() noexcept {
|
||||
words.clear();
|
||||
data.clear();
|
||||
}
|
||||
@ -2453,7 +2340,7 @@ public:
|
||||
return missing;
|
||||
}
|
||||
}
|
||||
int Count() const {
|
||||
int Count() const noexcept {
|
||||
return static_cast<int>(data.size());
|
||||
}
|
||||
|
||||
@ -3303,7 +3190,7 @@ LRESULT PASCAL ListBoxX::StaticWndProc(
|
||||
|
||||
namespace {
|
||||
|
||||
bool ListBoxX_Register() {
|
||||
bool ListBoxX_Register() noexcept {
|
||||
WNDCLASSEX wndclassc;
|
||||
wndclassc.cbSize = sizeof(wndclassc);
|
||||
// We need CS_HREDRAW and CS_VREDRAW because of the ellipsis that might be drawn for
|
||||
@ -3324,7 +3211,7 @@ bool ListBoxX_Register() {
|
||||
return ::RegisterClassEx(&wndclassc) != 0;
|
||||
}
|
||||
|
||||
bool ListBoxX_Unregister() {
|
||||
bool ListBoxX_Unregister() noexcept {
|
||||
return ::UnregisterClass(ListBoxX_ClassName, hinstPlatformRes) != 0;
|
||||
}
|
||||
|
||||
@ -3355,7 +3242,7 @@ class DynamicLibraryImpl : public DynamicLibrary {
|
||||
protected:
|
||||
HMODULE h;
|
||||
public:
|
||||
explicit DynamicLibraryImpl(const char *modulePath) {
|
||||
explicit DynamicLibraryImpl(const char *modulePath) noexcept {
|
||||
h = ::LoadLibraryA(modulePath);
|
||||
}
|
||||
|
||||
@ -3365,7 +3252,7 @@ public:
|
||||
}
|
||||
|
||||
// Use GetProcAddress to get a pointer to the relevant function.
|
||||
Function FindFunction(const char *name) override {
|
||||
Function FindFunction(const char *name) noexcept override {
|
||||
if (h) {
|
||||
// C++ standard doesn't like casts between function pointers and void pointers so use a union
|
||||
union {
|
||||
@ -3379,7 +3266,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
bool IsValid() override {
|
||||
bool IsValid() noexcept override {
|
||||
return h != NULL;
|
||||
}
|
||||
};
|
||||
|
||||
@ -13,7 +13,11 @@ namespace Scintilla {
|
||||
extern void Platform_Initialise(void *hInstance);
|
||||
extern void Platform_Finalise(bool fromDllMain);
|
||||
|
||||
RECT RectFromPRectangle(PRectangle prc) noexcept;
|
||||
constexpr RECT RectFromPRectangle(PRectangle prc) noexcept {
|
||||
RECT rc = { static_cast<LONG>(prc.left), static_cast<LONG>(prc.top),
|
||||
static_cast<LONG>(prc.right), static_cast<LONG>(prc.bottom) };
|
||||
return rc;
|
||||
}
|
||||
|
||||
#if defined(USE_D2D)
|
||||
extern bool LoadD2D();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user