xref: /MusicPlayer2/scintilla/include/Platform.h (revision 8af74909132ed5e696cb05b6689ae4baf14c1c96)
1*8af74909SZhong Yang // Scintilla source code edit control
2*8af74909SZhong Yang /** @file Platform.h
3*8af74909SZhong Yang  ** Interface to platform facilities. Also includes some basic utilities.
4*8af74909SZhong Yang  ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.
5*8af74909SZhong Yang  **/
6*8af74909SZhong Yang // Copyright 1998-2009 by Neil Hodgson <[email protected]>
7*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed.
8*8af74909SZhong Yang 
9*8af74909SZhong Yang #ifndef PLATFORM_H
10*8af74909SZhong Yang #define PLATFORM_H
11*8af74909SZhong Yang 
12*8af74909SZhong Yang // PLAT_GTK = GTK+ on Linux or Win32
13*8af74909SZhong Yang // PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32
14*8af74909SZhong Yang // PLAT_WIN = Win32 API on Win32 OS
15*8af74909SZhong Yang // PLAT_WX is wxWindows on any supported platform
16*8af74909SZhong Yang // PLAT_TK = Tcl/TK on Linux or Win32
17*8af74909SZhong Yang 
18*8af74909SZhong Yang #define PLAT_GTK 0
19*8af74909SZhong Yang #define PLAT_GTK_WIN32 0
20*8af74909SZhong Yang #define PLAT_GTK_MACOSX 0
21*8af74909SZhong Yang #define PLAT_MACOSX 0
22*8af74909SZhong Yang #define PLAT_WIN 0
23*8af74909SZhong Yang #define PLAT_WX  0
24*8af74909SZhong Yang #define PLAT_QT 0
25*8af74909SZhong Yang #define PLAT_FOX 0
26*8af74909SZhong Yang #define PLAT_CURSES 0
27*8af74909SZhong Yang #define PLAT_TK 0
28*8af74909SZhong Yang #define PLAT_HAIKU 0
29*8af74909SZhong Yang 
30*8af74909SZhong Yang #if defined(FOX)
31*8af74909SZhong Yang #undef PLAT_FOX
32*8af74909SZhong Yang #define PLAT_FOX 1
33*8af74909SZhong Yang 
34*8af74909SZhong Yang #elif defined(__WX__)
35*8af74909SZhong Yang #undef PLAT_WX
36*8af74909SZhong Yang #define PLAT_WX  1
37*8af74909SZhong Yang 
38*8af74909SZhong Yang #elif defined(CURSES)
39*8af74909SZhong Yang #undef PLAT_CURSES
40*8af74909SZhong Yang #define PLAT_CURSES 1
41*8af74909SZhong Yang 
42*8af74909SZhong Yang #elif defined(__HAIKU__)
43*8af74909SZhong Yang #undef PLAT_HAIKU
44*8af74909SZhong Yang #define PLAT_HAIKU 1
45*8af74909SZhong Yang 
46*8af74909SZhong Yang #elif defined(SCINTILLA_QT)
47*8af74909SZhong Yang #undef PLAT_QT
48*8af74909SZhong Yang #define PLAT_QT 1
49*8af74909SZhong Yang 
50*8af74909SZhong Yang #elif defined(TK)
51*8af74909SZhong Yang #undef PLAT_TK
52*8af74909SZhong Yang #define PLAT_TK 1
53*8af74909SZhong Yang 
54*8af74909SZhong Yang #elif defined(GTK)
55*8af74909SZhong Yang #undef PLAT_GTK
56*8af74909SZhong Yang #define PLAT_GTK 1
57*8af74909SZhong Yang 
58*8af74909SZhong Yang #if defined(__WIN32__) || defined(_MSC_VER)
59*8af74909SZhong Yang #undef PLAT_GTK_WIN32
60*8af74909SZhong Yang #define PLAT_GTK_WIN32 1
61*8af74909SZhong Yang #endif
62*8af74909SZhong Yang 
63*8af74909SZhong Yang #if defined(__APPLE__)
64*8af74909SZhong Yang #undef PLAT_GTK_MACOSX
65*8af74909SZhong Yang #define PLAT_GTK_MACOSX 1
66*8af74909SZhong Yang #endif
67*8af74909SZhong Yang 
68*8af74909SZhong Yang #elif defined(__APPLE__)
69*8af74909SZhong Yang 
70*8af74909SZhong Yang #undef PLAT_MACOSX
71*8af74909SZhong Yang #define PLAT_MACOSX 1
72*8af74909SZhong Yang 
73*8af74909SZhong Yang #else
74*8af74909SZhong Yang #undef PLAT_WIN
75*8af74909SZhong Yang #define PLAT_WIN 1
76*8af74909SZhong Yang 
77*8af74909SZhong Yang #endif
78*8af74909SZhong Yang 
79*8af74909SZhong Yang namespace Scintilla {
80*8af74909SZhong Yang 
81*8af74909SZhong Yang typedef float XYPOSITION;
82*8af74909SZhong Yang typedef double XYACCUMULATOR;
83*8af74909SZhong Yang 
84*8af74909SZhong Yang // Underlying the implementation of the platform classes are platform specific types.
85*8af74909SZhong Yang // Sometimes these need to be passed around by client code so they are defined here
86*8af74909SZhong Yang 
87*8af74909SZhong Yang typedef void *FontID;
88*8af74909SZhong Yang typedef void *SurfaceID;
89*8af74909SZhong Yang typedef void *WindowID;
90*8af74909SZhong Yang typedef void *MenuID;
91*8af74909SZhong Yang typedef void *TickerID;
92*8af74909SZhong Yang typedef void *Function;
93*8af74909SZhong Yang typedef void *IdlerID;
94*8af74909SZhong Yang 
95*8af74909SZhong Yang /**
96*8af74909SZhong Yang  * A geometric point class.
97*8af74909SZhong Yang  * Point is similar to the Win32 POINT and GTK+ GdkPoint types.
98*8af74909SZhong Yang  */
99*8af74909SZhong Yang class Point {
100*8af74909SZhong Yang public:
101*8af74909SZhong Yang 	XYPOSITION x;
102*8af74909SZhong Yang 	XYPOSITION y;
103*8af74909SZhong Yang 
x(x_)104*8af74909SZhong Yang 	constexpr explicit Point(XYPOSITION x_=0, XYPOSITION y_=0) noexcept : x(x_), y(y_) {
105*8af74909SZhong Yang 	}
106*8af74909SZhong Yang 
FromInts(int x_,int y_)107*8af74909SZhong Yang 	static constexpr Point FromInts(int x_, int y_) noexcept {
108*8af74909SZhong Yang 		return Point(static_cast<XYPOSITION>(x_), static_cast<XYPOSITION>(y_));
109*8af74909SZhong Yang 	}
110*8af74909SZhong Yang 
111*8af74909SZhong Yang 	constexpr bool operator!=(Point other) const noexcept {
112*8af74909SZhong Yang 		return (x != other.x) || (y != other.y);
113*8af74909SZhong Yang 	}
114*8af74909SZhong Yang 
115*8af74909SZhong Yang 	constexpr Point operator+(Point other) const noexcept {
116*8af74909SZhong Yang 		return Point(x + other.x, y + other.y);
117*8af74909SZhong Yang 	}
118*8af74909SZhong Yang 
119*8af74909SZhong Yang 	constexpr Point operator-(Point other) const noexcept {
120*8af74909SZhong Yang 		return Point(x - other.x, y - other.y);
121*8af74909SZhong Yang 	}
122*8af74909SZhong Yang 
123*8af74909SZhong Yang 	// Other automatically defined methods (assignment, copy constructor, destructor) are fine
124*8af74909SZhong Yang };
125*8af74909SZhong Yang 
126*8af74909SZhong Yang /**
127*8af74909SZhong Yang  * A geometric rectangle class.
128*8af74909SZhong Yang  * PRectangle is similar to Win32 RECT.
129*8af74909SZhong Yang  * PRectangles contain their top and left sides, but not their right and bottom sides.
130*8af74909SZhong Yang  */
131*8af74909SZhong Yang class PRectangle {
132*8af74909SZhong Yang public:
133*8af74909SZhong Yang 	XYPOSITION left;
134*8af74909SZhong Yang 	XYPOSITION top;
135*8af74909SZhong Yang 	XYPOSITION right;
136*8af74909SZhong Yang 	XYPOSITION bottom;
137*8af74909SZhong Yang 
138*8af74909SZhong Yang 	constexpr explicit PRectangle(XYPOSITION left_=0, XYPOSITION top_=0, XYPOSITION right_=0, XYPOSITION bottom_ = 0) noexcept :
left(left_)139*8af74909SZhong Yang 		left(left_), top(top_), right(right_), bottom(bottom_) {
140*8af74909SZhong Yang 	}
141*8af74909SZhong Yang 
FromInts(int left_,int top_,int right_,int bottom_)142*8af74909SZhong Yang 	static constexpr PRectangle FromInts(int left_, int top_, int right_, int bottom_) noexcept {
143*8af74909SZhong Yang 		return PRectangle(static_cast<XYPOSITION>(left_), static_cast<XYPOSITION>(top_),
144*8af74909SZhong Yang 			static_cast<XYPOSITION>(right_), static_cast<XYPOSITION>(bottom_));
145*8af74909SZhong Yang 	}
146*8af74909SZhong Yang 
147*8af74909SZhong Yang 	// Other automatically defined methods (assignment, copy constructor, destructor) are fine
148*8af74909SZhong Yang 
149*8af74909SZhong Yang 	constexpr bool operator==(const PRectangle &rc) const noexcept {
150*8af74909SZhong Yang 		return (rc.left == left) && (rc.right == right) &&
151*8af74909SZhong Yang 			(rc.top == top) && (rc.bottom == bottom);
152*8af74909SZhong Yang 	}
Contains(Point pt)153*8af74909SZhong Yang 	constexpr bool Contains(Point pt) const noexcept {
154*8af74909SZhong Yang 		return (pt.x >= left) && (pt.x <= right) &&
155*8af74909SZhong Yang 			(pt.y >= top) && (pt.y <= bottom);
156*8af74909SZhong Yang 	}
ContainsWholePixel(Point pt)157*8af74909SZhong Yang 	constexpr bool ContainsWholePixel(Point pt) const noexcept {
158*8af74909SZhong Yang 		// Does the rectangle contain all of the pixel to left/below the point
159*8af74909SZhong Yang 		return (pt.x >= left) && ((pt.x+1) <= right) &&
160*8af74909SZhong Yang 			(pt.y >= top) && ((pt.y+1) <= bottom);
161*8af74909SZhong Yang 	}
Contains(PRectangle rc)162*8af74909SZhong Yang 	constexpr bool Contains(PRectangle rc) const noexcept {
163*8af74909SZhong Yang 		return (rc.left >= left) && (rc.right <= right) &&
164*8af74909SZhong Yang 			(rc.top >= top) && (rc.bottom <= bottom);
165*8af74909SZhong Yang 	}
Intersects(PRectangle other)166*8af74909SZhong Yang 	constexpr bool Intersects(PRectangle other) const noexcept {
167*8af74909SZhong Yang 		return (right > other.left) && (left < other.right) &&
168*8af74909SZhong Yang 			(bottom > other.top) && (top < other.bottom);
169*8af74909SZhong Yang 	}
Move(XYPOSITION xDelta,XYPOSITION yDelta)170*8af74909SZhong Yang 	void Move(XYPOSITION xDelta, XYPOSITION yDelta) noexcept {
171*8af74909SZhong Yang 		left += xDelta;
172*8af74909SZhong Yang 		top += yDelta;
173*8af74909SZhong Yang 		right += xDelta;
174*8af74909SZhong Yang 		bottom += yDelta;
175*8af74909SZhong Yang 	}
Width()176*8af74909SZhong Yang 	constexpr XYPOSITION Width() const noexcept { return right - left; }
Height()177*8af74909SZhong Yang 	constexpr XYPOSITION Height() const noexcept { return bottom - top; }
Empty()178*8af74909SZhong Yang 	constexpr bool Empty() const noexcept {
179*8af74909SZhong Yang 		return (Height() <= 0) || (Width() <= 0);
180*8af74909SZhong Yang 	}
181*8af74909SZhong Yang };
182*8af74909SZhong Yang 
183*8af74909SZhong Yang /**
184*8af74909SZhong Yang  * Holds an RGB colour with 8 bits for each component.
185*8af74909SZhong Yang  */
186*8af74909SZhong Yang constexpr const float componentMaximum = 255.0f;
187*8af74909SZhong Yang class ColourDesired {
188*8af74909SZhong Yang 	int co;
189*8af74909SZhong Yang public:
co(co_)190*8af74909SZhong Yang 	constexpr explicit ColourDesired(int co_=0) noexcept : co(co_) {
191*8af74909SZhong Yang 	}
192*8af74909SZhong Yang 
ColourDesired(unsigned int red,unsigned int green,unsigned int blue)193*8af74909SZhong Yang 	constexpr ColourDesired(unsigned int red, unsigned int green, unsigned int blue) noexcept :
194*8af74909SZhong Yang 		co(red | (green << 8) | (blue << 16)) {
195*8af74909SZhong Yang 	}
196*8af74909SZhong Yang 
197*8af74909SZhong Yang 	constexpr bool operator==(const ColourDesired &other) const noexcept {
198*8af74909SZhong Yang 		return co == other.co;
199*8af74909SZhong Yang 	}
200*8af74909SZhong Yang 
AsInteger()201*8af74909SZhong Yang 	constexpr int AsInteger() const noexcept {
202*8af74909SZhong Yang 		return co;
203*8af74909SZhong Yang 	}
204*8af74909SZhong Yang 
205*8af74909SZhong Yang 	// Red, green and blue values as bytes 0..255
GetRed()206*8af74909SZhong Yang 	constexpr unsigned char GetRed() const noexcept {
207*8af74909SZhong Yang 		return co & 0xff;
208*8af74909SZhong Yang 	}
GetGreen()209*8af74909SZhong Yang 	constexpr unsigned char GetGreen() const noexcept {
210*8af74909SZhong Yang 		return (co >> 8) & 0xff;
211*8af74909SZhong Yang 	}
GetBlue()212*8af74909SZhong Yang 	constexpr unsigned char GetBlue() const noexcept {
213*8af74909SZhong Yang 		return (co >> 16) & 0xff;
214*8af74909SZhong Yang 	}
215*8af74909SZhong Yang 
216*8af74909SZhong Yang 	// Red, green and blue values as float 0..1.0
GetRedComponent()217*8af74909SZhong Yang 	constexpr float GetRedComponent() const noexcept {
218*8af74909SZhong Yang 		return GetRed() / componentMaximum;
219*8af74909SZhong Yang 	}
GetGreenComponent()220*8af74909SZhong Yang 	constexpr float GetGreenComponent() const noexcept {
221*8af74909SZhong Yang 		return GetGreen() / componentMaximum;
222*8af74909SZhong Yang 	}
GetBlueComponent()223*8af74909SZhong Yang 	constexpr float GetBlueComponent() const noexcept {
224*8af74909SZhong Yang 		return GetBlue() / componentMaximum;
225*8af74909SZhong Yang 	}
226*8af74909SZhong Yang };
227*8af74909SZhong Yang 
228*8af74909SZhong Yang /**
229*8af74909SZhong Yang * Holds an RGBA colour.
230*8af74909SZhong Yang */
231*8af74909SZhong Yang class ColourAlpha : public ColourDesired {
232*8af74909SZhong Yang public:
ColourDesired(co_)233*8af74909SZhong Yang 	constexpr explicit ColourAlpha(int co_ = 0) noexcept : ColourDesired(co_) {
234*8af74909SZhong Yang 	}
235*8af74909SZhong Yang 
ColourAlpha(unsigned int red,unsigned int green,unsigned int blue)236*8af74909SZhong Yang 	constexpr ColourAlpha(unsigned int red, unsigned int green, unsigned int blue) noexcept :
237*8af74909SZhong Yang 		ColourDesired(red | (green << 8) | (blue << 16)) {
238*8af74909SZhong Yang 	}
239*8af74909SZhong Yang 
ColourAlpha(unsigned int red,unsigned int green,unsigned int blue,unsigned int alpha)240*8af74909SZhong Yang 	constexpr ColourAlpha(unsigned int red, unsigned int green, unsigned int blue, unsigned int alpha) noexcept :
241*8af74909SZhong Yang 		ColourDesired(red | (green << 8) | (blue << 16) | (alpha << 24)) {
242*8af74909SZhong Yang 	}
243*8af74909SZhong Yang 
ColourAlpha(ColourDesired cd,unsigned int alpha)244*8af74909SZhong Yang 	constexpr ColourAlpha(ColourDesired cd, unsigned int alpha) noexcept :
245*8af74909SZhong Yang 		ColourDesired(cd.AsInteger() | (alpha << 24)) {
246*8af74909SZhong Yang 	}
247*8af74909SZhong Yang 
GetColour()248*8af74909SZhong Yang 	constexpr ColourDesired GetColour() const noexcept {
249*8af74909SZhong Yang 		return ColourDesired(AsInteger() & 0xffffff);
250*8af74909SZhong Yang 	}
251*8af74909SZhong Yang 
GetAlpha()252*8af74909SZhong Yang 	constexpr unsigned char GetAlpha() const noexcept {
253*8af74909SZhong Yang 		return (AsInteger() >> 24) & 0xff;
254*8af74909SZhong Yang 	}
255*8af74909SZhong Yang 
GetAlphaComponent()256*8af74909SZhong Yang 	constexpr float GetAlphaComponent() const noexcept {
257*8af74909SZhong Yang 		return GetAlpha() / componentMaximum;
258*8af74909SZhong Yang 	}
259*8af74909SZhong Yang 
MixedWith(ColourAlpha other)260*8af74909SZhong Yang 	constexpr ColourAlpha MixedWith(ColourAlpha other) const noexcept {
261*8af74909SZhong Yang 		const unsigned int red = (GetRed() + other.GetRed()) / 2;
262*8af74909SZhong Yang 		const unsigned int green = (GetGreen() + other.GetGreen()) / 2;
263*8af74909SZhong Yang 		const unsigned int blue = (GetBlue() + other.GetBlue()) / 2;
264*8af74909SZhong Yang 		const unsigned int alpha = (GetAlpha() + other.GetAlpha()) / 2;
265*8af74909SZhong Yang 		return ColourAlpha(red, green, blue, alpha);
266*8af74909SZhong Yang 	}
267*8af74909SZhong Yang };
268*8af74909SZhong Yang 
269*8af74909SZhong Yang /**
270*8af74909SZhong Yang * Holds an element of a gradient with an RGBA colour and a relative position.
271*8af74909SZhong Yang */
272*8af74909SZhong Yang class ColourStop {
273*8af74909SZhong Yang public:
274*8af74909SZhong Yang 	float position;
275*8af74909SZhong Yang 	ColourAlpha colour;
ColourStop(float position_,ColourAlpha colour_)276*8af74909SZhong Yang 	ColourStop(float position_, ColourAlpha colour_) noexcept :
277*8af74909SZhong Yang 		position(position_), colour(colour_) {
278*8af74909SZhong Yang 	}
279*8af74909SZhong Yang };
280*8af74909SZhong Yang 
281*8af74909SZhong Yang /**
282*8af74909SZhong Yang  * Font management.
283*8af74909SZhong Yang  */
284*8af74909SZhong Yang 
285*8af74909SZhong Yang struct FontParameters {
286*8af74909SZhong Yang 	const char *faceName;
287*8af74909SZhong Yang 	float size;
288*8af74909SZhong Yang 	int weight;
289*8af74909SZhong Yang 	bool italic;
290*8af74909SZhong Yang 	int extraFontFlag;
291*8af74909SZhong Yang 	int technology;
292*8af74909SZhong Yang 	int characterSet;
293*8af74909SZhong Yang 
294*8af74909SZhong Yang 	FontParameters(
295*8af74909SZhong Yang 		const char *faceName_,
296*8af74909SZhong Yang 		float size_=10,
297*8af74909SZhong Yang 		int weight_=400,
298*8af74909SZhong Yang 		bool italic_=false,
299*8af74909SZhong Yang 		int extraFontFlag_=0,
300*8af74909SZhong Yang 		int technology_=0,
301*8af74909SZhong Yang 		int characterSet_=0) noexcept :
302*8af74909SZhong Yang 
faceNameFontParameters303*8af74909SZhong Yang 		faceName(faceName_),
304*8af74909SZhong Yang 		size(size_),
305*8af74909SZhong Yang 		weight(weight_),
306*8af74909SZhong Yang 		italic(italic_),
307*8af74909SZhong Yang 		extraFontFlag(extraFontFlag_),
308*8af74909SZhong Yang 		technology(technology_),
309*8af74909SZhong Yang 		characterSet(characterSet_)
310*8af74909SZhong Yang 	{
311*8af74909SZhong Yang 	}
312*8af74909SZhong Yang 
313*8af74909SZhong Yang };
314*8af74909SZhong Yang 
315*8af74909SZhong Yang class Font {
316*8af74909SZhong Yang protected:
317*8af74909SZhong Yang 	FontID fid;
318*8af74909SZhong Yang public:
319*8af74909SZhong Yang 	Font() noexcept;
320*8af74909SZhong Yang 	// Deleted so Font objects can not be copied
321*8af74909SZhong Yang 	Font(const Font &) = delete;
322*8af74909SZhong Yang 	Font(Font &&) = delete;
323*8af74909SZhong Yang 	Font &operator=(const Font &) = delete;
324*8af74909SZhong Yang 	Font &operator=(Font &&) = delete;
325*8af74909SZhong Yang 	virtual ~Font();
326*8af74909SZhong Yang 
327*8af74909SZhong Yang 	virtual void Create(const FontParameters &fp);
328*8af74909SZhong Yang 	virtual void Release();
329*8af74909SZhong Yang 
GetID()330*8af74909SZhong Yang 	FontID GetID() const noexcept { return fid; }
331*8af74909SZhong Yang 	// Alias another font - caller guarantees not to Release
SetID(FontID fid_)332*8af74909SZhong Yang 	void SetID(FontID fid_) noexcept { fid = fid_; }
333*8af74909SZhong Yang 	friend class Surface;
334*8af74909SZhong Yang 	friend class SurfaceImpl;
335*8af74909SZhong Yang };
336*8af74909SZhong Yang 
337*8af74909SZhong Yang class IScreenLine {
338*8af74909SZhong Yang public:
339*8af74909SZhong Yang 	virtual std::string_view Text() const = 0;
340*8af74909SZhong Yang 	virtual size_t Length() const = 0;
341*8af74909SZhong Yang 	virtual size_t RepresentationCount() const = 0;
342*8af74909SZhong Yang 	virtual XYPOSITION Width() const = 0;
343*8af74909SZhong Yang 	virtual XYPOSITION Height() const = 0;
344*8af74909SZhong Yang 	virtual XYPOSITION TabWidth() const = 0;
345*8af74909SZhong Yang 	virtual XYPOSITION TabWidthMinimumPixels() const = 0;
346*8af74909SZhong Yang 	virtual const Font *FontOfPosition(size_t position) const = 0;
347*8af74909SZhong Yang 	virtual XYPOSITION RepresentationWidth(size_t position) const = 0;
348*8af74909SZhong Yang 	virtual XYPOSITION TabPositionAfter(XYPOSITION xPosition) const = 0;
349*8af74909SZhong Yang };
350*8af74909SZhong Yang 
351*8af74909SZhong Yang struct Interval {
352*8af74909SZhong Yang 	XYPOSITION left;
353*8af74909SZhong Yang 	XYPOSITION right;
354*8af74909SZhong Yang };
355*8af74909SZhong Yang 
356*8af74909SZhong Yang class IScreenLineLayout {
357*8af74909SZhong Yang public:
358*8af74909SZhong Yang 	virtual ~IScreenLineLayout() = default;
359*8af74909SZhong Yang 	virtual size_t PositionFromX(XYPOSITION xDistance, bool charPosition) = 0;
360*8af74909SZhong Yang 	virtual XYPOSITION XFromPosition(size_t caretPosition) = 0;
361*8af74909SZhong Yang 	virtual std::vector<Interval> FindRangeIntervals(size_t start, size_t end) = 0;
362*8af74909SZhong Yang };
363*8af74909SZhong Yang 
364*8af74909SZhong Yang /**
365*8af74909SZhong Yang  * A surface abstracts a place to draw.
366*8af74909SZhong Yang  */
367*8af74909SZhong Yang class Surface {
368*8af74909SZhong Yang public:
369*8af74909SZhong Yang 	Surface() noexcept = default;
370*8af74909SZhong Yang 	Surface(const Surface &) = delete;
371*8af74909SZhong Yang 	Surface(Surface &&) = delete;
372*8af74909SZhong Yang 	Surface &operator=(const Surface &) = delete;
373*8af74909SZhong Yang 	Surface &operator=(Surface &&) = delete;
~Surface()374*8af74909SZhong Yang 	virtual ~Surface() {}
375*8af74909SZhong Yang 	static Surface *Allocate(int technology);
376*8af74909SZhong Yang 
377*8af74909SZhong Yang 	virtual void Init(WindowID wid)=0;
378*8af74909SZhong Yang 	virtual void Init(SurfaceID sid, WindowID wid)=0;
379*8af74909SZhong Yang 	virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0;
380*8af74909SZhong Yang 
381*8af74909SZhong Yang 	virtual void Release()=0;
382*8af74909SZhong Yang 	virtual bool Initialised()=0;
383*8af74909SZhong Yang 	virtual void PenColour(ColourDesired fore)=0;
384*8af74909SZhong Yang 	virtual int LogPixelsY()=0;
385*8af74909SZhong Yang 	virtual int DeviceHeightFont(int points)=0;
386*8af74909SZhong Yang 	virtual void MoveTo(int x_, int y_)=0;
387*8af74909SZhong Yang 	virtual void LineTo(int x_, int y_)=0;
388*8af74909SZhong Yang 	virtual void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back)=0;
389*8af74909SZhong Yang 	virtual void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back)=0;
390*8af74909SZhong Yang 	virtual void FillRectangle(PRectangle rc, ColourDesired back)=0;
391*8af74909SZhong Yang 	virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;
392*8af74909SZhong Yang 	virtual void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back)=0;
393*8af74909SZhong Yang 	virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
394*8af74909SZhong Yang 		ColourDesired outline, int alphaOutline, int flags)=0;
395*8af74909SZhong Yang 	enum class GradientOptions { leftToRight, topToBottom };
396*8af74909SZhong Yang 	virtual void GradientRectangle(PRectangle rc, const std::vector<ColourStop> &stops, GradientOptions options)=0;
397*8af74909SZhong Yang 	virtual void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) = 0;
398*8af74909SZhong Yang 	virtual void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back)=0;
399*8af74909SZhong Yang 	virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;
400*8af74909SZhong Yang 
401*8af74909SZhong Yang 	virtual std::unique_ptr<IScreenLineLayout> Layout(const IScreenLine *screenLine) = 0;
402*8af74909SZhong Yang 
403*8af74909SZhong Yang 	virtual void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase, std::string_view text, ColourDesired fore, ColourDesired back) = 0;
404*8af74909SZhong Yang 	virtual void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase, std::string_view text, ColourDesired fore, ColourDesired back) = 0;
405*8af74909SZhong Yang 	virtual void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase, std::string_view text, ColourDesired fore) = 0;
406*8af74909SZhong Yang 	virtual void MeasureWidths(Font &font_, std::string_view text, XYPOSITION *positions) = 0;
407*8af74909SZhong Yang 	virtual XYPOSITION WidthText(Font &font_, std::string_view text) = 0;
408*8af74909SZhong Yang 	virtual XYPOSITION Ascent(Font &font_)=0;
409*8af74909SZhong Yang 	virtual XYPOSITION Descent(Font &font_)=0;
410*8af74909SZhong Yang 	virtual XYPOSITION InternalLeading(Font &font_)=0;
411*8af74909SZhong Yang 	virtual XYPOSITION Height(Font &font_)=0;
412*8af74909SZhong Yang 	virtual XYPOSITION AverageCharWidth(Font &font_)=0;
413*8af74909SZhong Yang 
414*8af74909SZhong Yang 	virtual void SetClip(PRectangle rc)=0;
415*8af74909SZhong Yang 	virtual void FlushCachedState()=0;
416*8af74909SZhong Yang 
417*8af74909SZhong Yang 	virtual void SetUnicodeMode(bool unicodeMode_)=0;
418*8af74909SZhong Yang 	virtual void SetDBCSMode(int codePage)=0;
419*8af74909SZhong Yang 	virtual void SetBidiR2L(bool bidiR2L_)=0;
420*8af74909SZhong Yang };
421*8af74909SZhong Yang 
422*8af74909SZhong Yang /**
423*8af74909SZhong Yang  * Class to hide the details of window manipulation.
424*8af74909SZhong Yang  * Does not own the window which will normally have a longer life than this object.
425*8af74909SZhong Yang  */
426*8af74909SZhong Yang class Window {
427*8af74909SZhong Yang protected:
428*8af74909SZhong Yang 	WindowID wid;
429*8af74909SZhong Yang public:
Window()430*8af74909SZhong Yang 	Window() noexcept : wid(nullptr), cursorLast(cursorInvalid) {
431*8af74909SZhong Yang 	}
432*8af74909SZhong Yang 	Window(const Window &source) = delete;
433*8af74909SZhong Yang 	Window(Window &&) = delete;
434*8af74909SZhong Yang 	Window &operator=(WindowID wid_) noexcept {
435*8af74909SZhong Yang 		wid = wid_;
436*8af74909SZhong Yang 		cursorLast = cursorInvalid;
437*8af74909SZhong Yang 		return *this;
438*8af74909SZhong Yang 	}
439*8af74909SZhong Yang 	Window &operator=(const Window &) = delete;
440*8af74909SZhong Yang 	Window &operator=(Window &&) = delete;
441*8af74909SZhong Yang 	virtual ~Window();
GetID()442*8af74909SZhong Yang 	WindowID GetID() const noexcept { return wid; }
Created()443*8af74909SZhong Yang 	bool Created() const noexcept { return wid != nullptr; }
444*8af74909SZhong Yang 	void Destroy();
445*8af74909SZhong Yang 	PRectangle GetPosition() const;
446*8af74909SZhong Yang 	void SetPosition(PRectangle rc);
447*8af74909SZhong Yang 	void SetPositionRelative(PRectangle rc, const Window *relativeTo);
448*8af74909SZhong Yang 	PRectangle GetClientPosition() const;
449*8af74909SZhong Yang 	void Show(bool show=true);
450*8af74909SZhong Yang 	void InvalidateAll();
451*8af74909SZhong Yang 	void InvalidateRectangle(PRectangle rc);
452*8af74909SZhong Yang 	virtual void SetFont(Font &font);
453*8af74909SZhong Yang 	enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand };
454*8af74909SZhong Yang 	void SetCursor(Cursor curs);
455*8af74909SZhong Yang 	PRectangle GetMonitorRect(Point pt);
456*8af74909SZhong Yang private:
457*8af74909SZhong Yang 	Cursor cursorLast;
458*8af74909SZhong Yang };
459*8af74909SZhong Yang 
460*8af74909SZhong Yang /**
461*8af74909SZhong Yang  * Listbox management.
462*8af74909SZhong Yang  */
463*8af74909SZhong Yang 
464*8af74909SZhong Yang // ScintillaBase implements IListBoxDelegate to receive ListBoxEvents from a ListBox
465*8af74909SZhong Yang 
466*8af74909SZhong Yang struct ListBoxEvent {
467*8af74909SZhong Yang 	enum class EventType { selectionChange, doubleClick } event;
ListBoxEventListBoxEvent468*8af74909SZhong Yang 	ListBoxEvent(EventType event_) noexcept : event(event_) {
469*8af74909SZhong Yang 	}
470*8af74909SZhong Yang };
471*8af74909SZhong Yang 
472*8af74909SZhong Yang class IListBoxDelegate {
473*8af74909SZhong Yang public:
474*8af74909SZhong Yang 	virtual void ListNotify(ListBoxEvent *plbe)=0;
475*8af74909SZhong Yang };
476*8af74909SZhong Yang 
477*8af74909SZhong Yang class ListBox : public Window {
478*8af74909SZhong Yang public:
479*8af74909SZhong Yang 	ListBox() noexcept;
480*8af74909SZhong Yang 	~ListBox() override;
481*8af74909SZhong Yang 	static ListBox *Allocate();
482*8af74909SZhong Yang 
483*8af74909SZhong Yang 	void SetFont(Font &font) override =0;
484*8af74909SZhong Yang 	virtual void Create(Window &parent, int ctrlID, Point location, int lineHeight_, bool unicodeMode_, int technology_)=0;
485*8af74909SZhong Yang 	virtual void SetAverageCharWidth(int width)=0;
486*8af74909SZhong Yang 	virtual void SetVisibleRows(int rows)=0;
487*8af74909SZhong Yang 	virtual int GetVisibleRows() const=0;
488*8af74909SZhong Yang 	virtual PRectangle GetDesiredRect()=0;
489*8af74909SZhong Yang 	virtual int CaretFromEdge()=0;
490*8af74909SZhong Yang 	virtual void Clear()=0;
491*8af74909SZhong Yang 	virtual void Append(char *s, int type = -1)=0;
492*8af74909SZhong Yang 	virtual int Length()=0;
493*8af74909SZhong Yang 	virtual void Select(int n)=0;
494*8af74909SZhong Yang 	virtual int GetSelection()=0;
495*8af74909SZhong Yang 	virtual int Find(const char *prefix)=0;
496*8af74909SZhong Yang 	virtual void GetValue(int n, char *value, int len)=0;
497*8af74909SZhong Yang 	virtual void RegisterImage(int type, const char *xpm_data)=0;
498*8af74909SZhong Yang 	virtual void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage) = 0;
499*8af74909SZhong Yang 	virtual void ClearRegisteredImages()=0;
500*8af74909SZhong Yang 	virtual void SetDelegate(IListBoxDelegate *lbDelegate)=0;
501*8af74909SZhong Yang 	virtual void SetList(const char* list, char separator, char typesep)=0;
502*8af74909SZhong Yang };
503*8af74909SZhong Yang 
504*8af74909SZhong Yang /**
505*8af74909SZhong Yang  * Menu management.
506*8af74909SZhong Yang  */
507*8af74909SZhong Yang class Menu {
508*8af74909SZhong Yang 	MenuID mid;
509*8af74909SZhong Yang public:
510*8af74909SZhong Yang 	Menu() noexcept;
GetID()511*8af74909SZhong Yang 	MenuID GetID() const noexcept { return mid; }
512*8af74909SZhong Yang 	void CreatePopUp();
513*8af74909SZhong Yang 	void Destroy();
514*8af74909SZhong Yang 	void Show(Point pt, Window &w);
515*8af74909SZhong Yang };
516*8af74909SZhong Yang 
517*8af74909SZhong Yang /**
518*8af74909SZhong Yang  * Dynamic Library (DLL/SO/...) loading
519*8af74909SZhong Yang  */
520*8af74909SZhong Yang class DynamicLibrary {
521*8af74909SZhong Yang public:
522*8af74909SZhong Yang 	virtual ~DynamicLibrary() = default;
523*8af74909SZhong Yang 
524*8af74909SZhong Yang 	/// @return Pointer to function "name", or NULL on failure.
525*8af74909SZhong Yang 	virtual Function FindFunction(const char *name) = 0;
526*8af74909SZhong Yang 
527*8af74909SZhong Yang 	/// @return true if the library was loaded successfully.
528*8af74909SZhong Yang 	virtual bool IsValid() = 0;
529*8af74909SZhong Yang 
530*8af74909SZhong Yang 	/// @return An instance of a DynamicLibrary subclass with "modulePath" loaded.
531*8af74909SZhong Yang 	static DynamicLibrary *Load(const char *modulePath);
532*8af74909SZhong Yang };
533*8af74909SZhong Yang 
534*8af74909SZhong Yang #if defined(__clang__)
535*8af74909SZhong Yang # if __has_feature(attribute_analyzer_noreturn)
536*8af74909SZhong Yang #  define CLANG_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
537*8af74909SZhong Yang # else
538*8af74909SZhong Yang #  define CLANG_ANALYZER_NORETURN
539*8af74909SZhong Yang # endif
540*8af74909SZhong Yang #else
541*8af74909SZhong Yang # define CLANG_ANALYZER_NORETURN
542*8af74909SZhong Yang #endif
543*8af74909SZhong Yang 
544*8af74909SZhong Yang /**
545*8af74909SZhong Yang  * Platform class used to retrieve system wide parameters such as double click speed
546*8af74909SZhong Yang  * and chrome colour. Not a creatable object, more of a module with several functions.
547*8af74909SZhong Yang  */
548*8af74909SZhong Yang class Platform {
549*8af74909SZhong Yang public:
550*8af74909SZhong Yang 	Platform() = default;
551*8af74909SZhong Yang 	Platform(const Platform &) = delete;
552*8af74909SZhong Yang 	Platform(Platform &&) = delete;
553*8af74909SZhong Yang 	Platform &operator=(const Platform &) = delete;
554*8af74909SZhong Yang 	Platform &operator=(Platform &&) = delete;
555*8af74909SZhong Yang 	~Platform() = default;
556*8af74909SZhong Yang 	static ColourDesired Chrome();
557*8af74909SZhong Yang 	static ColourDesired ChromeHighlight();
558*8af74909SZhong Yang 	static const char *DefaultFont();
559*8af74909SZhong Yang 	static int DefaultFontSize();
560*8af74909SZhong Yang 	static unsigned int DoubleClickTime();
561*8af74909SZhong Yang 	static void DebugDisplay(const char *s);
LongFromTwoShorts(short a,short b)562*8af74909SZhong Yang 	static constexpr long LongFromTwoShorts(short a,short b) noexcept {
563*8af74909SZhong Yang 		return (a) | ((b) << 16);
564*8af74909SZhong Yang 	}
565*8af74909SZhong Yang 
566*8af74909SZhong Yang 	static void DebugPrintf(const char *format, ...);
567*8af74909SZhong Yang 	static bool ShowAssertionPopUps(bool assertionPopUps_);
568*8af74909SZhong Yang 	static void Assert(const char *c, const char *file, int line) CLANG_ANALYZER_NORETURN;
569*8af74909SZhong Yang };
570*8af74909SZhong Yang 
571*8af74909SZhong Yang #ifdef  NDEBUG
572*8af74909SZhong Yang #define PLATFORM_ASSERT(c) ((void)0)
573*8af74909SZhong Yang #else
574*8af74909SZhong Yang #define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Scintilla::Platform::Assert(#c, __FILE__, __LINE__))
575*8af74909SZhong Yang #endif
576*8af74909SZhong Yang 
577*8af74909SZhong Yang }
578*8af74909SZhong Yang 
579*8af74909SZhong Yang #endif
580