5#include "Stroika/Foundation/Execution/Exceptions.h"
7namespace Stroika::Frameworks::Led {
14 template <
typename COORD_TYPE>
15 constexpr Point_Base<COORD_TYPE>::Point_Base ()
20 template <
typename COORD_TYPE>
21 constexpr Point_Base<COORD_TYPE>::Point_Base (COORD_TYPE newV, COORD_TYPE newH)
26 template <
typename COORD_TYPE>
27 constexpr Point_Base<COORD_TYPE> operator+ (
const Point_Base<COORD_TYPE>& lhs,
const Point_Base<COORD_TYPE>& rhs)
29 Led_Point result = lhs;
40 inline Led_Point operator- (
const Led_Point& lhs,
const Led_Point& rhs)
42 return (Led_Point (lhs.v - rhs.v, lhs.h - rhs.h));
50 template <
typename POINT_TYPE,
typename SIZE_TYPE>
55 constexpr Rect_Base<POINT_TYPE, SIZE_TYPE>::Rect_Base ()
56 : top (CoordinateType (0))
57 , left (CoordinateType (0))
58 , bottom (CoordinateType (0))
59 , right (CoordinateType (0))
62 template <
typename POINT_TYPE,
typename SIZE_TYPE>
67 constexpr Rect_Base<POINT_TYPE, SIZE_TYPE>::Rect_Base (CoordinateType newTop, CoordinateType newLeft, DistanceType newHeight, DistanceType newWidth)
70 , bottom (newTop + newHeight)
71 , right (newLeft + newWidth)
74 template <
typename POINT_TYPE,
typename SIZE_TYPE>
75 constexpr Rect_Base<POINT_TYPE, SIZE_TYPE>::Rect_Base (POINT_TYPE origin, SIZE_TYPE size)
78 , bottom (origin.v + size.v)
79 , right (origin.h + size.h)
82 template <
typename POINT_TYPE,
typename SIZE_TYPE>
87 inline typename Rect_Base<POINT_TYPE, SIZE_TYPE>::CoordinateType Rect_Base<POINT_TYPE, SIZE_TYPE>::GetTop ()
const
91 template <
typename POINT_TYPE,
typename SIZE_TYPE>
96 inline typename Rect_Base<POINT_TYPE, SIZE_TYPE>::CoordinateType Rect_Base<POINT_TYPE, SIZE_TYPE>::GetLeft ()
const
100 template <
typename POINT_TYPE,
typename SIZE_TYPE>
105 inline typename Rect_Base<POINT_TYPE, SIZE_TYPE>::CoordinateType Rect_Base<POINT_TYPE, SIZE_TYPE>::GetBottom ()
const
109 template <
typename POINT_TYPE,
typename SIZE_TYPE>
114 inline typename Rect_Base<POINT_TYPE, SIZE_TYPE>::CoordinateType Rect_Base<POINT_TYPE, SIZE_TYPE>::GetRight ()
const
118 template <
typename POINT_TYPE,
typename SIZE_TYPE>
123 inline bool Rect_Base<POINT_TYPE, SIZE_TYPE>::IsEmpty ()
const
125 return (right <= left or bottom <= top);
127 template <
typename POINT_TYPE,
typename SIZE_TYPE>
132 inline typename Rect_Base<POINT_TYPE, SIZE_TYPE>::DistanceType Rect_Base<POINT_TYPE, SIZE_TYPE>::GetHeight ()
const
134 Ensure (bottom >= top);
135 return (bottom - top);
137 template <
typename POINT_TYPE,
typename SIZE_TYPE>
142 inline typename Rect_Base<POINT_TYPE, SIZE_TYPE>::DistanceType Rect_Base<POINT_TYPE, SIZE_TYPE>::GetWidth ()
const
144 Ensure (right >= left);
145 return (right - left);
147 template <
typename POINT_TYPE,
typename SIZE_TYPE>
148 inline POINT_TYPE Rect_Base<POINT_TYPE, SIZE_TYPE>::GetTopLeft ()
const
150 return (POINT_TYPE (top, left));
152 template <
typename POINT_TYPE,
typename SIZE_TYPE>
153 inline POINT_TYPE Rect_Base<POINT_TYPE, SIZE_TYPE>::GetTopRight ()
const
155 return (POINT_TYPE (top, right));
157 template <
typename POINT_TYPE,
typename SIZE_TYPE>
158 inline POINT_TYPE Rect_Base<POINT_TYPE, SIZE_TYPE>::GetBotRight ()
const
160 return (POINT_TYPE (bottom, right));
162 template <
typename POINT_TYPE,
typename SIZE_TYPE>
163 inline POINT_TYPE Rect_Base<POINT_TYPE, SIZE_TYPE>::GetOrigin ()
const
165 return (POINT_TYPE (top, left));
167 template <
typename POINT_TYPE,
typename SIZE_TYPE>
168 inline SIZE_TYPE Rect_Base<POINT_TYPE, SIZE_TYPE>::GetSize ()
const
170 return (SIZE_TYPE (bottom - top, right - left));
172 template <
typename POINT_TYPE,
typename SIZE_TYPE>
173 inline bool Rect_Base<POINT_TYPE, SIZE_TYPE>::Contains (POINT_TYPE p)
const
175 return ((p >= GetTopLeft ()) and (p <= GetBotRight ()));
177 template <
typename POINT_TYPE,
typename SIZE_TYPE>
178 inline bool Rect_Base<POINT_TYPE, SIZE_TYPE>::Contains (Rect_Base<POINT_TYPE, SIZE_TYPE> r)
const
181 return (Contains (r.GetTopLeft ()) and Contains (r.GetBotRight ()));
183 template <
typename POINT_TYPE,
typename SIZE_TYPE>
184 inline void Rect_Base<POINT_TYPE, SIZE_TYPE>::SetOrigin (POINT_TYPE p)
189 template <
typename POINT_TYPE,
typename SIZE_TYPE>
190 inline void Rect_Base<POINT_TYPE, SIZE_TYPE>::SetTop (CoordinateType t)
194 template <
typename POINT_TYPE,
typename SIZE_TYPE>
195 inline void Rect_Base<POINT_TYPE, SIZE_TYPE>::SetLeft (CoordinateType l)
199 template <
typename POINT_TYPE,
typename SIZE_TYPE>
200 inline void Rect_Base<POINT_TYPE, SIZE_TYPE>::SetBottom (CoordinateType b)
204 template <
typename POINT_TYPE,
typename SIZE_TYPE>
205 inline void Rect_Base<POINT_TYPE, SIZE_TYPE>::SetRight (CoordinateType r)
209 template <
typename POINT_TYPE,
typename SIZE_TYPE>
210 inline const Rect_Base<POINT_TYPE, SIZE_TYPE>& Rect_Base<POINT_TYPE, SIZE_TYPE>::operator+= (
const POINT_TYPE& delta)
212 *
this = THIS_TYPE (GetTopLeft () + delta, GetSize ());
215 template <
typename POINT_TYPE,
typename SIZE_TYPE>
216 inline const Rect_Base<POINT_TYPE, SIZE_TYPE>& Rect_Base<POINT_TYPE, SIZE_TYPE>::operator-= (
const POINT_TYPE& delta)
218 *
this = THIS_TYPE (GetTopLeft () - delta, GetSize ());
221 template <
typename POINT_TYPE,
typename SIZE_TYPE>
226 inline const Rect_Base<POINT_TYPE, SIZE_TYPE>& Rect_Base<POINT_TYPE, SIZE_TYPE>::operator*= (
const Rect_Base<POINT_TYPE, SIZE_TYPE>& intersectWith)
228 POINT_TYPE topLeft = max (GetTopLeft (), intersectWith.GetTopLeft ());
229 POINT_TYPE botRight = min (GetBotRight (), intersectWith.GetBotRight ());
230 POINT_TYPE newSize = botRight - topLeft;
231 if (newSize >= Led_Point (0, 0)) {
232 *
this = THIS_TYPE (topLeft, SIZE_TYPE (newSize));
235 *
this = THIS_TYPE (0, 0, 0, 0);
239 template <
typename POINT_TYPE,
typename SIZE_TYPE>
240 inline bool Rect_Base<POINT_TYPE, SIZE_TYPE>::operator== (
const Rect_Base<POINT_TYPE, SIZE_TYPE>& rhs)
const
242 return ((GetLeft () == rhs.GetLeft ()) and (GetRight () == rhs.GetRight ()) and (GetTop () == rhs.GetTop ()) and
243 (GetBottom () == rhs.GetBottom ()));
251 constexpr inline TWIPS::TWIPS (
long v)
255 constexpr TWIPS::operator long ()
const
259 inline TWIPS& TWIPS::operator+= (
const TWIPS& rhs)
261 fValue += rhs.fValue;
264 inline TWIPS& TWIPS::operator-= (
const TWIPS& rhs)
266 fValue -= rhs.fValue;
269 inline TWIPS& TWIPS::operator*= (
double rhs)
271 fValue =
static_cast<long> (fValue * rhs);
274 inline TWIPS operator+ (
const TWIPS& lhs,
const TWIPS& rhs)
276 return TWIPS (
static_cast<long> (lhs) +
static_cast<long> (rhs));
278 inline TWIPS operator- (
const TWIPS& lhs,
const TWIPS& rhs)
280 return TWIPS (
static_cast<long> (lhs) -
static_cast<long> (rhs));
282 inline constexpr TWIPS TWIPS::kPoint = TWIPS{20};
283 inline constexpr TWIPS TWIPS::kInch = TWIPS{1440};
284 inline constexpr TWIPS TWIPS::kOneInch = TWIPS{1440};
286#if qStroika_Platform_Windows
292 inline FontObject::~FontObject ()
294 (void)DeleteObject ();
296 inline FontObject ::operator HFONT ()
const
300 inline int FontObject ::GetObject (
int nCount, LPVOID lpObject)
const
302 Assert (m_hObject !=
nullptr);
303 return ::GetObject (m_hObject, nCount, lpObject);
305 inline BOOL FontObject ::DeleteObject ()
307 if (m_hObject ==
nullptr)
311 return ::DeleteObject (h);
313 inline BOOL FontObject ::CreateFontIndirect (
const LOGFONT* lpLogFont)
315 return Attach (::CreateFontIndirect (lpLogFont));
317 inline BOOL FontObject ::Attach (HFONT hObject)
319 Assert (m_hObject ==
nullptr);
320 if (hObject ==
nullptr)
327#if qStroika_Platform_Windows
333 inline Brush::Brush (COLORREF crColor)
336 if (!Attach (::CreateSolidBrush (crColor)))
337 Foundation::Execution::Throw (bad_alloc{});
339 inline Brush::~Brush ()
341 (void)DeleteObject ();
343 inline Brush::operator HBRUSH ()
const
347 inline BOOL Brush::Attach (HBRUSH hObject)
349 Assert (m_hObject ==
nullptr);
350 if (hObject ==
nullptr)
355 inline BOOL Brush::DeleteObject ()
357 if (m_hObject ==
nullptr)
359 HBRUSH h = m_hObject;
361 return ::DeleteObject (h);
365#if qStroika_Frameworks_Led_SupportGDI
371 inline Region::Region ()
372#if qStroika_Platform_Windows
373 : fRgn{::CreateRectRgn (0, 0, 0, 0)}
376#if qStroika_Platform_Windows
377 Foundation::Execution::ThrowIfNull (fRgn);
380 inline Region::Region (
const Led_Rect& r)
381#if qStroika_Platform_Windows
382 : fRgn (::CreateRectRgn (r.GetLeft (), r.GetTop (), r.GetRight (), r.GetBottom ()))
385 Require (r.GetHeight () >= 0);
386 Require (r.GetWidth () >= 0);
387#if qStroika_Platform_Windows
388 Foundation::Execution::ThrowIfNull (fRgn);
390 Assert (GetBoundingRect () == r or (GetBoundingRect ().IsEmpty () and r.IsEmpty ()));
392 inline Region::Region (
const Region& from)
393#if qStroika_Platform_Windows
394 : fRgn (::CreateRectRgn (0, 0, 0, 0))
397#if qStroika_Platform_Windows
398 Foundation::Execution::ThrowIfNull (fRgn);
400#if qStroika_Platform_Windows
401 Verify (::CombineRgn (fRgn, from, from, RGN_COPY) != ERROR);
404 inline const Region& Region::operator= (
const Region& rhs)
406#if qStroika_Platform_Windows
407 Verify (::CombineRgn (fRgn, rhs, rhs, RGN_COPY) != ERROR);
409#if qStroika_Platform_Windows
410 Foundation::Execution::ThrowIfNull (fRgn);
414 inline Region::~Region ()
416#if qStroika_Platform_Windows
417 if (fRgn !=
nullptr) {
418 ::DeleteObject (fRgn);
422 inline bool Region::IsEmpty ()
const
424#if qStroika_Platform_Windows
430 inline Led_Rect Region::GetBoundingRect ()
const
432#if qStroika_Platform_Windows
435 int tmp = ::GetRgnBox (fRgn, &r);
439 Assert (AsLedRect (r) == Led_Rect (0, 0, 0, 0));
442 return AsLedRect (r);
445 return Led_Rect (0, 0, 0, 0);
448 inline Region operator* (
const Region& lhs,
const Region& rhs)
451#if qStroika_Platform_Windows
452 Verify (::CombineRgn (result, lhs, rhs, RGN_AND) != ERROR);
456 inline Region operator+ (
const Region& lhs,
const Region& rhs)
459#if qStroika_Platform_Windows
460 Verify (::CombineRgn (result, lhs, rhs, RGN_OR) != ERROR);
464 inline Led_Rect operator* (
const Led_Rect& lhs,
const Led_Rect& rhs)
469#if qStroika_Platform_Windows
470 inline Region::operator HRGN ()
const
474 inline int Region::CombineRgn (Region* pRgn1, Region* pRgn2,
int nCombineMode)
476 Require (pRgn1 !=
nullptr);
477 Require (pRgn2 !=
nullptr);
478 Require (fRgn !=
nullptr);
479 return ::CombineRgn (fRgn, pRgn1->fRgn, pRgn2->fRgn, nCombineMode);
481 inline BOOL Region::PtInRegion (
int x,
int y)
const
483 Require (fRgn !=
nullptr);
484 return ::PtInRegion (fRgn, x, y);
486 inline BOOL Region::PtInRegion (POINT point)
const
488 Require (fRgn !=
nullptr);
489 return ::PtInRegion (fRgn, point.x, point.y);
492 inline BOOL Region::DeleteObject ()
498 return ::DeleteObject (r);
508#if qStroika_Frameworks_Led_SupportGDI
509 inline DistanceType TabStopList::ComputeTabStopAfterPosition (Tablet* tablet, DistanceType afterPos)
const
512 return tablet->CvtFromTWIPSH (ComputeTabStopAfterPosition (tablet->CvtToTWIPSH (afterPos)));
516#if qStroika_Platform_Windows
522 inline Bitmap::~Bitmap ()
524 if (m_hObject !=
nullptr) {
525 ::DeleteObject (m_hObject);
528 inline void Bitmap::DeleteObject ()
530 if (m_hObject !=
nullptr) {
531 ::DeleteObject (m_hObject);
535 inline Bitmap::operator HBITMAP ()
const
539 inline Led_Size Bitmap::GetImageSize ()
const
547#if qStroika_Frameworks_Led_SupportGDI
553#if qStroika_Platform_Windows
554 inline Tablet::operator HDC ()
const
564 inline CoordinateType Tablet::CvtFromTWIPSV (TWIPS from)
const
566#if qStroika_Platform_Windows
567 if (fLogPixelsV == 0) {
568 fLogPixelsV = GetDeviceCaps (LOGPIXELSY);
571 Verify (::GetViewportOrgEx (m_hAttribDC, &vpOrg));
573 Verify (::GetWindowOrgEx (m_hAttribDC, &wOrg));
575 x.y += ::MulDiv (from, fLogPixelsV, 1440);
576 Verify (::DPtoLP (m_hAttribDC, &x, 1));
578 Assert (x.x == wOrg.x);
582 return from * Globals::Get ().GetMainScreenLogPixelsV () / 1440;
591 inline CoordinateType Tablet::CvtFromTWIPSH (TWIPS from)
const
593#if qStroika_Platform_Windows
594 if (fLogPixelsH == 0) {
595 fLogPixelsH = GetDeviceCaps (LOGPIXELSX);
598 Verify (::GetViewportOrgEx (m_hAttribDC, &vpOrg));
600 Verify (::GetWindowOrgEx (m_hAttribDC, &wOrg));
602 x.x += ::MulDiv (from, fLogPixelsH, 1440);
603 Verify (::DPtoLP (m_hAttribDC, &x, 1));
605 Assert (x.y == wOrg.y);
609 return from * Globals::Get ().GetMainScreenLogPixelsH () / 1440;
618 inline TWIPS Tablet::CvtToTWIPSV (CoordinateType from)
const
620#if qStroika_Platform_Windows
621 if (fLogPixelsV == 0) {
622 fLogPixelsV = GetDeviceCaps (LOGPIXELSY);
625 Verify (::GetViewportOrgEx (m_hAttribDC, &vpOrg));
627 Verify (::GetWindowOrgEx (m_hAttribDC, &wOrg));
630 Verify (::LPtoDP (m_hAttribDC, &x, 1));
632 Assert (x.x == wOrg.x);
633 return TWIPS (::MulDiv (x.y, 1440, fLogPixelsV));
635 return TWIPS (from * 1440 / Globals::Get ().GetMainScreenLogPixelsV ());
644 inline TWIPS Tablet::CvtToTWIPSH (CoordinateType from)
const
646#if qStroika_Platform_Windows
647 if (fLogPixelsH == 0) {
648 fLogPixelsH = GetDeviceCaps (LOGPIXELSX);
651 Verify (::GetViewportOrgEx (m_hAttribDC, &vpOrg));
653 Verify (::GetWindowOrgEx (m_hAttribDC, &wOrg));
656 Verify (::LPtoDP (m_hAttribDC, &x, 1));
658 Assert (x.y == vpOrg.y);
659 return TWIPS (::MulDiv (x.x, 1440, fLogPixelsH));
661 return TWIPS (from * 1440 / Globals::Get ().GetMainScreenLogPixelsH ());
665#if qStroika_Platform_Windows
666 inline BOOL Tablet::BitBlt (
int x,
int y,
int nWidth,
int nHeight, Tablet* pSrcDC,
int xSrc,
int ySrc, DWORD dwRop)
669 return ::BitBlt (m_hDC, x, y, nWidth, nHeight, pSrcDC->m_hDC, xSrc, ySrc, dwRop);
671 inline BOOL Tablet::CreateCompatibleDC (Tablet* pDC)
673 Assert (m_hDC ==
nullptr);
674 Assert (m_hAttribDC ==
nullptr);
676 m_hDC = ::CreateCompatibleDC (pDC ==
nullptr ?
nullptr : pDC->m_hDC);
677 if (m_hDC ==
nullptr)
684 inline COLORREF Tablet::SetTextColor (COLORREF crColor)
686 Assert (m_hDC !=
nullptr);
687 COLORREF crRetVal = CLR_INVALID;
689 if (m_hDC != m_hAttribDC)
690 crRetVal = ::SetTextColor (m_hDC, crColor);
691 if (m_hAttribDC !=
nullptr)
692 crRetVal = ::SetTextColor (m_hAttribDC, crColor);
695 inline COLORREF Tablet::SetBkColor (COLORREF crColor)
697 Assert (m_hDC !=
nullptr);
698 COLORREF crRetVal = CLR_INVALID;
700 if (m_hDC != m_hAttribDC)
701 crRetVal = ::SetBkColor (m_hDC, crColor);
702 if (m_hAttribDC !=
nullptr)
703 crRetVal = ::SetBkColor (m_hAttribDC, crColor);
706 inline HWND Tablet::GetWindow ()
const
708 Assert (m_hDC !=
nullptr);
709 return ::WindowFromDC (m_hDC);
711 inline BOOL Tablet::IsPrinting ()
const
715 inline BOOL Tablet::RoundRect (
int x1,
int y1,
int x2,
int y2,
int x3,
int y3)
717 Assert (m_hDC !=
nullptr);
718 return ::RoundRect (m_hDC, x1, y1, x2, y2, x3, y3);
720 inline BOOL Tablet::TextOut (
int x,
int y, LPCTSTR lpszString,
int nCount)
722 Assert (m_hDC !=
nullptr);
723 return ::TextOut (m_hDC, x, y, lpszString, nCount);
725 inline int Tablet::SetBkMode (
int nBkMode)
727 Assert (m_hDC !=
nullptr);
730 if (m_hDC != m_hAttribDC)
731 nRetVal = ::SetBkMode (m_hDC, nBkMode);
732 if (m_hAttribDC !=
nullptr)
733 nRetVal = ::SetBkMode (m_hAttribDC, nBkMode);
736 inline unsigned int Tablet::SetTextAlign (
unsigned int nTextAlign)
738 Assert (m_hDC !=
nullptr);
739 unsigned int nRetVal = 0;
741 if (m_hDC != m_hAttribDC)
742 nRetVal = ::SetTextAlign (m_hDC, nTextAlign);
743 if (m_hAttribDC !=
nullptr)
744 nRetVal = ::SetTextAlign (m_hAttribDC, nTextAlign);
747 inline SIZE Tablet::GetWindowExt ()
const
749 Assert (m_hAttribDC !=
nullptr);
751 Verify (::GetWindowExtEx (m_hAttribDC, &size));
754 inline SIZE Tablet::GetViewportExt ()
const
756 Assert (m_hAttribDC !=
nullptr);
758 Verify (::GetViewportExtEx (m_hAttribDC, &size));
761 inline BOOL Tablet::Rectangle (
int x1,
int y1,
int x2,
int y2)
763 Assert (m_hDC !=
nullptr);
764 return ::Rectangle (m_hDC, x1, y1, x2, y2);
766 inline BOOL Tablet::Rectangle (
const RECT& r)
768 Assert (m_hDC !=
nullptr);
769 return ::Rectangle (m_hDC, r.left, r.top, r.right, r.bottom);
771 inline BOOL Tablet::Rectangle (LPCRECT lpRect)
773 Assert (m_hDC !=
nullptr);
774 return ::Rectangle (m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
776 inline BOOL Tablet::GetTextMetrics (LPTEXTMETRIC lpMetrics)
const
778 Assert (m_hAttribDC !=
nullptr);
779 return ::GetTextMetrics (m_hAttribDC, lpMetrics);
781 inline HBITMAP Tablet::SelectObject (HBITMAP hBitmap)
783 Assert (m_hDC !=
nullptr);
784 return (HBITMAP)::SelectObject (m_hDC, hBitmap);
787 inline HFONT Tablet::SelectObject (HFONT hFont)
789 Assert (m_hDC !=
nullptr);
790 return (HFONT)::SelectObject (m_hDC, hFont);
793 inline POINT Tablet::SetWindowOrg (
int x,
int y)
795 Assert (m_hDC !=
nullptr);
797 memset (&point, 0,
sizeof (point));
798 if (m_hDC != m_hAttribDC)
799 Verify (::SetWindowOrgEx (m_hDC, x, y, &point));
800 if (m_hAttribDC !=
nullptr)
801 Verify (::SetWindowOrgEx (m_hAttribDC, x, y, &point));
804 inline int Tablet::GetDeviceCaps (
int nIndex)
const
806 Assert (m_hAttribDC !=
nullptr);
807 return ::GetDeviceCaps (m_hAttribDC, nIndex);
809 inline BOOL Tablet::Attach (HDC hDC, Tablet::OwnDCControl ownsDC)
811 Assert (m_hDC ==
nullptr);
812 Assert (m_hAttribDC ==
nullptr);
822 inline HDC Tablet::Detach ()
825 m_hAttribDC =
nullptr;
830 inline void Tablet::MoveTo (
const Led_Point& to)
832#if qStroika_Platform_Windows
833 Assert (m_hDC !=
nullptr);
834 Verify (::MoveToEx (m_hDC, to.h, to.v,
nullptr));
837 inline void Tablet::LineTo (
const Led_Point& to)
839#if qStroika_Platform_Windows
840 Assert (m_hDC !=
nullptr);
841 Verify (::LineTo (m_hDC, to.h, to.v));
844 inline Region Tablet::GetClip ()
const
847#if qStroika_Platform_Windows
848 int r = ::GetClipRgn (*
this, result);
849 Assert (r == 0 or r == 1 or r == -1);
851 static Region kWideOpened = Region (Led_Rect (-10000, -10000, 20000, 20000));
852 result = kWideOpened;
859 inline bool Tablet::GetClip (Region* r)
const
862#if qStroika_Platform_Windows
863 int res = ::GetClipRgn (*
this, *r);
864 Assert (res == 0 or res == 1 or res == -1);
874 inline void Tablet::SetClip ()
876#if qStroika_Platform_Windows
877 Verify (::SelectClipRgn (*
this,
nullptr) != ERROR);
882 inline void Tablet::SetClip (
const Led_Rect& clipTo)
884#if qStroika_Platform_Windows
885 Verify (::SelectClipRgn (*
this, Region (clipTo)) != ERROR);
886 Ensure (GetClip ().GetBoundingRect () == clipTo);
891 inline void Tablet::SetClip (
const Region& clipTo)
893#if qStroika_Platform_Windows
894 Verify (::SelectClipRgn (*
this, clipTo) != ERROR);
901#if qStroika_Frameworks_Led_SupportGDI
907 inline Globals& Globals::Get ()
909 if (sThe ==
nullptr) {
910 sThe =
new Globals ();
914 inline DistanceType Globals::GetMainScreenLogPixelsH ()
const
918 inline DistanceType Globals::GetMainScreenLogPixelsV ()
const
929 inline Led_Rect operator- (
const Led_Rect& lhs,
const Led_Point& rhs)
931 return Led_Rect (lhs.GetTop () - rhs.v, lhs.GetLeft () - rhs.h, lhs.GetHeight (), lhs.GetWidth ());
933 inline Led_Rect operator+ (Led_Point p, Led_Rect r)
935 return (Led_Rect (r.GetTop () + p.v, r.GetLeft () + p.h, r.GetHeight (), r.GetWidth ()));
937 inline Led_Rect operator+ (Led_Rect r, Led_Point p)
939 return (Led_Rect (r.GetTop () + p.v, r.GetLeft () + p.h, r.GetHeight (), r.GetWidth ()));
947 inline bool Intersect (
const Led_Rect& lhs,
const Led_Rect& rhs)
949 if (rhs.GetTop () >= lhs.GetBottom ()) {
952 else if (rhs.GetBottom () <= lhs.GetTop ()) {
955 else if (rhs.GetLeft () >= lhs.GetRight ()) {
958 else if (rhs.GetRight () <= lhs.GetLeft ()) {
962 if (rhs.GetHeight () == 0 or rhs.GetWidth () == 0 or lhs.GetHeight () == 0 or lhs.GetWidth () == 0) {
967#if qStroika_Frameworks_Led_SupportGDI
968 inline bool Intersect (
const Led_Rect& lhs,
const Region& rhs)
970#if qStroika_Platform_Windows
973 return result.CombineRgn (&lhsRgn,
const_cast<Region*
> (&rhs), RGN_AND) != NULLREGION;
976 inline bool Intersect (
const Region& lhs,
const Led_Rect& rhs)
978#if qStroika_Platform_Windows
981 return result.CombineRgn (
const_cast<Region*
> (&lhs), &rhsRgn, RGN_AND) != NULLREGION;
984 inline bool Intersect (
const Region& lhs,
const Region& rhs)
986#if qStroika_Platform_Windows
988 return result.CombineRgn (
const_cast<Region*
> (&lhs),
const_cast<Region*
> (&rhs), RGN_AND) != NULLREGION;
998 inline Led_Rect
Intersection (
const Led_Rect& lhs,
const Led_Rect& rhs)
1009 inline Led_Size operator+ (Led_Size lhs, Led_Size rhs)
1011 return Led_Size (lhs.v + rhs.v, lhs.h + rhs.h);
1013 inline Led_Size operator* (
int lhs, Led_Size rhs)
1015 return Led_Size (lhs * rhs.v, lhs * rhs.h);
1028 inline Led_Rect InsetRect (
const Led_Rect& r,
int vBy,
int hBy)
1030 return Led_Rect (r.GetTop () + vBy, r.GetLeft () + hBy, max (0L, CoordinateType (r.GetHeight ()) - 2 * vBy),
1031 max (0L, CoordinateType (r.GetWidth ()) - 2 * hBy));
1044 inline Led_Rect EnsureRectInRect (
const Led_Rect& r, Led_Rect enlosingR)
1046 DistanceType winWidth = min (r.GetWidth (), enlosingR.GetWidth ());
1047 DistanceType winHeight = min (r.GetHeight (), enlosingR.GetHeight ());
1048 CoordinateType winLeft = max (r.GetLeft (), enlosingR.GetLeft ());
1049 CoordinateType winTop = max (r.GetTop (), enlosingR.GetTop ());
1051 DISABLE_COMPILER_MSC_WARNING_START (4018)
1052 if ((winLeft + winWidth) > enlosingR.GetRight ()) {
1053 winLeft = enlosingR.GetRight () - winWidth;
1055 if ((winTop + winHeight) > enlosingR.GetBottom ()) {
1056 winTop = enlosingR.GetBottom () - winHeight;
1058 DISABLE_COMPILER_MSC_WARNING_END (4018)
1059 return Led_Rect (winTop, winLeft, winHeight, winWidth);
1062#if qStroika_Frameworks_Led_SupportGDI
1073 inline Led_Rect EnsureRectOnScreen ([[maybe_unused]] Led_Rect& r)
1075#if qStroika_Platform_Windows
1078 memset (&rWorkArea, 0,
sizeof (rWorkArea));
1079 BOOL bResult = SystemParametersInfo (SPI_GETWORKAREA,
sizeof (RECT), &rWorkArea, 0);
1081 rWorkArea.left = rWorkArea.top = 0;
1082 rWorkArea.right = GetSystemMetrics (SM_CXSCREEN);
1083 rWorkArea.bottom = GetSystemMetrics (SM_CYSCREEN);
1085 return EnsureRectInRect (r, AsLedRect (rWorkArea));
1088 return Led_Rect (0, 0, 0, 0);
1098#if qStroika_Platform_Windows
1099 inline Led_Point AsLedPoint (POINT p)
1101 return Led_Point (p.y, p.x);
1103 inline POINT AsPOINT (Led_Point p)
1110 inline Led_Rect AsLedRect (RECT r)
1112 return Led_Rect (r.top, r.left, r.bottom - r.top, r.right - r.left);
1114 inline RECT AsRECT (Led_Rect r)
1117 newR.top = r.GetTop ();
1118 newR.left = r.GetLeft ();
1119 newR.bottom = r.GetBottom ();
1120 newR.right = r.GetRight ();
1123 inline SIZE AsSIZE (Led_Size s)
1130 inline Led_Size AsLedSize (SIZE s)
1139#if qStroika_Frameworks_Led_SupportGDI
1145 inline TWIPS Led_CvtScreenPixelsToTWIPSV (CoordinateType from)
1147#if qStroika_Platform_Windows
1148 return TWIPS (::MulDiv (from, 1440, Globals::Get ().GetMainScreenLogPixelsV ()));
1150 return TWIPS (from * 1440 / Globals::Get ().GetMainScreenLogPixelsV ());
1159 inline TWIPS Led_CvtScreenPixelsToTWIPSH (CoordinateType from)
1161#if qStroika_Platform_Windows
1162 return TWIPS (::MulDiv (from, 1440, Globals::Get ().GetMainScreenLogPixelsH ()));
1164 return TWIPS (from * 1440 / Globals::Get ().GetMainScreenLogPixelsH ());
1172 inline CoordinateType Led_CvtScreenPixelsFromTWIPSV (TWIPS from)
1174#if qStroika_Platform_Windows
1175 return ::MulDiv (from, Globals::Get ().GetMainScreenLogPixelsV (), 1440);
1177 return TWIPS{from * Globals::Get ().GetMainScreenLogPixelsV () / 1440};
1185 inline CoordinateType Led_CvtScreenPixelsFromTWIPSH (TWIPS from)
1187#if qStroika_Platform_Windows
1188 return ::MulDiv (from, Globals::Get ().GetMainScreenLogPixelsH (), 1440);
1190 return TWIPS{from * Globals::Get ().GetMainScreenLogPixelsH () / 1440};
1195#if qStroika_Frameworks_Led_SupportGDI
1201#if qStroika_Platform_Windows
1202 inline FontMetrics::FontMetrics (
const TEXTMETRIC& from)
1203 : fPlatformSpecific (from)
1207 inline DistanceType FontMetrics::GetAscent ()
const
1209#if qStroika_Platform_Windows
1210 return (fPlatformSpecific.tmAscent);
1213 inline DistanceType FontMetrics::GetDescent ()
const
1215#if qStroika_Platform_Windows
1216 return (fPlatformSpecific.tmDescent);
1219 inline DistanceType FontMetrics::GetLeading ()
const
1221#if qStroika_Platform_Windows
1222 return (fPlatformSpecific.tmExternalLeading);
1225 inline DistanceType FontMetrics::GetHeight ()
const
1227#if qStroika_Platform_Windows
1228 Assert (fPlatformSpecific.tmHeight >= 0);
1229 Assert (GetAscent () + GetDescent () == DistanceType (fPlatformSpecific.tmHeight));
1231 return (GetAscent () + GetDescent ());
1233 inline DistanceType FontMetrics::GetLineHeight ()
const
1235 return (GetAscent () + GetDescent () + GetLeading ());
1237 inline nonvirtual DistanceType FontMetrics::GetMaxCharacterWidth ()
const
1239#if qStroika_Platform_Windows
1240 return fPlatformSpecific.tmMaxCharWidth;
1243#if qStroika_Platform_Windows
1244 inline nonvirtual DistanceType FontMetrics::GetAveCharacterWidth ()
const
1246 return fPlatformSpecific.tmAveCharWidth;
1249#if qStroika_Platform_Windows
1250 inline FontMetrics::operator
const TEXTMETRIC*()
const
1252 return &fPlatformSpecific;
1254 inline FontMetrics::operator TEXTMETRIC*()
1256 return &fPlatformSpecific;
1266 constexpr inline Color::Color (ColorValue redValue, ColorValue greenValue, ColorValue blueValue)
1268 , fGreen{greenValue}
1272#if qStroika_Platform_Windows
1273 inline Color::Color (COLORREF colorRef)
1274 : fRed (static_cast<ColorValue> (GetRValue (colorRef)) << 8)
1275 , fGreen (static_cast<ColorValue> (GetGValue (colorRef)) << 8)
1276 , fBlue (static_cast<ColorValue> (GetBValue (colorRef)) << 8)
1280 inline Color::ColorValue Color::GetRed ()
const
1284 inline Color::ColorValue Color::GetGreen ()
const
1288 inline Color::ColorValue Color::GetBlue ()
const
1292#if qStroika_Platform_Windows
1293 inline COLORREF Color::GetOSRep ()
const
1295 return RGB (fRed >> 8, fGreen >> 8, fBlue >> 8);
1298 inline Color operator* (Color lhs,
float factor)
1300 using CV = Color::ColorValue;
1301 return Color (
static_cast<CV
> (lhs.GetRed () * factor),
static_cast<CV
> (lhs.GetGreen () * factor),
static_cast<CV
> (lhs.GetBlue () * factor));
1303 inline Color operator/ (Color lhs,
float divBy)
1305 return Color (
static_cast<Color::ColorValue
> (lhs.GetRed () / divBy),
static_cast<Color::ColorValue
> (lhs.GetGreen () / divBy),
1306 static_cast<Color::ColorValue
> (lhs.GetBlue () / divBy));
1308 inline Color operator+ (Color lhs, Color rhs)
1310 return Color (lhs.GetRed () + rhs.GetRed (), lhs.GetGreen () + rhs.GetGreen (), lhs.GetBlue () + rhs.GetBlue ());
1312 inline Color operator- (Color lhs, Color rhs)
1314 return Color (lhs.GetRed () - rhs.GetRed (), lhs.GetGreen () - rhs.GetGreen (), lhs.GetBlue () - rhs.GetBlue ());
1316 inline unsigned int Distance_Squared (Color lhs, Color rhs)
1318 int rDiff =
static_cast<int> (lhs.GetRed ()) -
static_cast<int> (rhs.GetRed ());
1319 int gDiff =
static_cast<int> (lhs.GetGreen ()) -
static_cast<int> (rhs.GetGreen ());
1320 int bDiff =
static_cast<int> (lhs.GetBlue ()) -
static_cast<int> (rhs.GetBlue ());
1321 unsigned int sum = rDiff * rDiff + gDiff * gDiff + bDiff * bDiff;
1324 inline unsigned int Distance (Color lhs, Color rhs)
1326 return static_cast<unsigned int> (::sqrt (
static_cast<float> (Distance_Squared (lhs, rhs))));
1328#if qStroika_Platform_Windows
1329 inline unsigned int Distance_Squared (COLORREF lhs, COLORREF rhs)
1331 int rDiff =
static_cast<int> (GetRValue (lhs)) -
static_cast<int> (GetRValue (rhs));
1332 int gDiff =
static_cast<int> (GetGValue (lhs)) -
static_cast<int> (GetGValue (rhs));
1333 int bDiff =
static_cast<int> (GetBValue (lhs)) -
static_cast<int> (GetBValue (rhs));
1334 unsigned int sum = rDiff * rDiff + gDiff * gDiff + bDiff * bDiff;
1342 struct less<Stroika::Frameworks::Led::Color> {
1345 if (_Left.GetRed () < _Right.GetRed ()) {
1348 else if (_Left.GetRed () == _Right.GetRed ()) {
1349 if (_Left.GetGreen () < _Right.GetGreen ()) {
1352 else if (_Left.GetGreen () == _Right.GetGreen ()) {
1353 return (_Left.GetBlue () < _Right.GetBlue ());
1361namespace Stroika::Frameworks::Led {
1362#if qStroika_Platform_Windows
1363 inline Pen::Pen (
int nPenStyle,
int nWidth, COLORREF crColor)
1364 : m_hObject{nullptr}
1366 if (!Attach (::CreatePen (nPenStyle, nWidth, crColor)))
1367 Foundation::Execution::Throw (bad_alloc{});
1371 (void)DeleteObject ();
1373 inline Pen::operator HPEN ()
const
1377 inline BOOL Pen::Attach (HPEN hObject)
1379 Assert (m_hObject ==
nullptr);
1380 if (hObject ==
nullptr)
1382 m_hObject = hObject;
1385 inline BOOL Pen::DeleteObject ()
1387 if (m_hObject ==
nullptr)
1390 m_hObject =
nullptr;
1391 return ::DeleteObject (h);
1396namespace Stroika::Frameworks::Led {
1402 constexpr LineSpacing::LineSpacing (Rule rule)
1405 Require (rule == eSingleSpace or rule == eOnePointFiveSpace or rule == eDoubleSpace);
1407 constexpr LineSpacing::LineSpacing (Rule rule, TWIPS twips)
1409 , fArg{static_cast<unsigned> (twips)}
1411 Require (rule == eAtLeastTWIPSSpacing or rule == eExactTWIPSSpacing);
1413 constexpr LineSpacing::LineSpacing (Rule rule,
unsigned lineCount)
1417 Require (rule == eExactLinesSpacing);
1418 switch (lineCount) {
1420 fRule = eSingleSpace;
1423 fRule = eOnePointFiveSpace;
1426 fRule = eDoubleSpace;
1430 constexpr bool LineSpacing::operator== (
const LineSpacing& rhs)
const
1432 if (fRule != rhs.fRule) {
1435 if (fRule == LineSpacing::eAtLeastTWIPSSpacing or fRule == LineSpacing::eExactTWIPSSpacing or fRule == LineSpacing::eExactLinesSpacing) {
1436 if (fArg != rhs.fArg) {
1448#if qStroika_Platform_Windows
1449 inline FontSpecification::FontNameSpecifier::FontNameSpecifier ()
1460 inline FontSpecification::FontSpecification (
const IncrementalFontSpecification& from)
1461#if qStroika_Platform_Windows
1462 : fFontInfo (((
const FontSpecification&)from).fFontInfo)
1464 : fFontFamily (from.fFontFamily)
1465 , fBold (from.fBold)
1466 , fItalics (from.fItalics)
1467 , fUnderline (from.fUnderline)
1468 , fFontSize (from.fFontSize)
1470 , fSubOrSuperScript (((
const FontSpecification&)from).fSubOrSuperScript)
1471 , fTextColor (((
const FontSpecification&)from).fTextColor)
1479 inline SDKString FontSpecification::GetFontName ()
const
1481#if qStroika_Platform_Windows
1482 return fFontInfo.lfFaceName;
1484 return fFontFamily.AsSDKString ();
1488 inline FontSpecification::FontNameSpecifier FontSpecification::GetFontNameSpecifier ()
const
1490#if qStroika_Platform_Windows
1491 return fFontInfo.lfFaceName;
1503 inline bool FontSpecification::GetStyle_Plain ()
const
1505 if (fSubOrSuperScript != eNoSubOrSuperscript) {
1508#if qStroika_Platform_Windows
1509 return (fFontInfo.lfItalic ==
false and fFontInfo.lfWeight <= FW_NORMAL and fFontInfo.lfUnderline ==
false and fFontInfo.lfStrikeOut ==
false);
1511 return not fBold and not fItalics and not fUnderline;
1519 inline void FontSpecification::SetStyle_Plain ()
1521 fSubOrSuperScript = eNoSubOrSuperscript;
1522#if qStroika_Platform_Windows
1523 fFontInfo.lfItalic =
false;
1524 fFontInfo.lfWeight = FW_NORMAL;
1525 fFontInfo.lfUnderline =
false;
1526 fFontInfo.lfStrikeOut =
false;
1529 inline bool FontSpecification::GetStyle_Bold ()
const
1531#if qStroika_Platform_Windows
1532 return fFontInfo.lfWeight > FW_NORMAL;
1537 inline void FontSpecification::SetStyle_Bold (
bool isBold)
1539#if qStroika_Platform_Windows
1540 fFontInfo.lfWeight = isBold ? FW_BOLD : FW_NORMAL;
1543 inline bool FontSpecification::GetStyle_Italic ()
const
1545#if qStroika_Platform_Windows
1546 return !!fFontInfo.lfItalic;
1551 inline void FontSpecification::SetStyle_Italic (
bool isItalic)
1553#if qStroika_Platform_Windows
1554 fFontInfo.lfItalic = isItalic;
1556 fItalics = isItalic;
1559 inline bool FontSpecification::GetStyle_Underline ()
const
1561#if qStroika_Platform_Windows
1562 return !!fFontInfo.lfUnderline;
1567 inline void FontSpecification::SetStyle_Underline (
bool isUnderline)
1569#if qStroika_Platform_Windows
1570 fFontInfo.lfUnderline = isUnderline;
1573 inline FontSpecification::SubOrSuperScript FontSpecification::GetStyle_SubOrSuperScript ()
const
1575 return fSubOrSuperScript;
1577 inline void FontSpecification::SetStyle_SubOrSuperScript (SubOrSuperScript subOrSuperScript)
1579 fSubOrSuperScript = subOrSuperScript;
1581#if qStroika_Platform_Windows
1582 inline bool FontSpecification::GetStyle_Strikeout ()
const
1584 return !!fFontInfo.lfStrikeOut;
1586 inline void FontSpecification::SetStyle_Strikeout (
bool isStrikeout)
1588 fFontInfo.lfStrikeOut = isStrikeout;
1592 inline FontSpecification::FontSize FontSpecification::GetPointSize ()
const
1594#if qStroika_Platform_Windows
1595 if (fFontInfo.lfHeight >= 0) {
1599 WindowDC screenDC (
nullptr);
1601 Verify (font.CreateFontIndirect (&fFontInfo));
1602 HFONT oldFont = screenDC.SelectObject (font);
1604 screenDC.GetTextMetrics (&tms);
1605 screenDC.SelectObject (oldFont);
1606 return (
unsigned short)::MulDiv (tms.tmHeight, 72, Globals::Get ().GetMainScreenLogPixelsV ());
1609 return static_cast<unsigned short> (::MulDiv (-fFontInfo.lfHeight, 72, Globals::Get ().GetMainScreenLogPixelsV ()));
1615 inline void FontSpecification::SetPointSize (FontSize pointSize)
1617#if qStroika_Platform_Windows
1618 fFontInfo.lfHeight = ::MulDiv (-
long (pointSize), Globals::Get ().GetMainScreenLogPixelsV (), 72);
1620 fFontSize = pointSize;
1623#if qStroika_Platform_Windows
1624 inline long FontSpecification::PeekAtTMHeight ()
const
1626 return fFontInfo.lfHeight;
1628 inline void FontSpecification::PokeAtTMHeight (
long tmHeight)
1630 fFontInfo.lfHeight = tmHeight;
1633 inline Color FontSpecification::GetTextColor ()
const
1637 inline void FontSpecification::SetTextColor (
const Color& textColor)
1639 fTextColor = textColor;
1641#if qStroika_Platform_Windows
1642 inline LOGFONT FontSpecification::GetOSRep ()
const
1646 inline void FontSpecification::GetOSRep (LOGFONT* logFont)
const
1649 *logFont = fFontInfo;
1651 inline void FontSpecification::SetOSRep (LOGFONT logFont)
1653 fFontInfo = logFont;
1655 inline void FontSpecification::LightSetOSRep (LOGFONT logFont)
1657 fFontInfo = logFont;
1658 fFontInfo.lfWidth = 0;
1659 fFontInfo.lfEscapement = 0;
1660 fFontInfo.lfOrientation = 0;
1661 fFontInfo.lfCharSet = DEFAULT_CHARSET;
1662 fFontInfo.lfOutPrecision = 0;
1663 fFontInfo.lfClipPrecision = 0;
1664 fFontInfo.lfQuality = 0;
1665 fFontInfo.lfPitchAndFamily = 0;
1668#if qStroika_Platform_Windows
1669 inline FontSpecification::FontSpecification (
const LOGFONT& logFont)
1671 , fSubOrSuperScript (eNoSubOrSuperscript)
1672 , fTextColor (Color::kBlack)
1674 LightSetOSRep (logFont);
1677 inline bool FontSpecification::operator== (
const FontSpecification& rhs)
const
1679 const FontSpecification& lhs = *
this;
1681 if (lhs.GetFontNameSpecifier () != rhs.GetFontNameSpecifier ()) {
1686#if qStroika_Platform_Windows
1687 if (lhs.GetStyle_Bold () != rhs.GetStyle_Bold ()) {
1690 if (lhs.GetStyle_Italic () != rhs.GetStyle_Italic ()) {
1693 if (lhs.GetStyle_Underline () != rhs.GetStyle_Underline ()) {
1696 if (lhs.GetStyle_Strikeout () != rhs.GetStyle_Strikeout ()) {
1700 if (lhs.GetStyle_SubOrSuperScript () != rhs.GetStyle_SubOrSuperScript ()) {
1705 if (lhs.GetTextColor () != rhs.GetTextColor ()) {
1710#if qStroika_Platform_Windows
1712 if (lhs.PeekAtTMHeight () == rhs.PeekAtTMHeight ()) {
1715 else if ((lhs.PeekAtTMHeight () > 0) == (rhs.PeekAtTMHeight () > 0)) {
1722 if (lhs.GetPointSize () != rhs.GetPointSize ()) {
1728 inline void FontSpecification::MergeIn (
const IncrementalFontSpecification& addInTheseAttributes)
1731 if (addInTheseAttributes.GetFontNameSpecifier_Valid ()) {
1732 SetFontNameSpecifier (addInTheseAttributes.GetFontNameSpecifier ());
1736 if (addInTheseAttributes.GetStyle_Bold_Valid ()) {
1737 SetStyle_Bold (addInTheseAttributes.GetStyle_Bold ());
1739 if (addInTheseAttributes.GetStyle_Italic_Valid ()) {
1740 SetStyle_Italic (addInTheseAttributes.GetStyle_Italic ());
1742 if (addInTheseAttributes.GetStyle_Underline_Valid ()) {
1743 SetStyle_Underline (addInTheseAttributes.GetStyle_Underline ());
1745 if (addInTheseAttributes.GetStyle_SubOrSuperScript_Valid ()) {
1746 SetStyle_SubOrSuperScript (addInTheseAttributes.GetStyle_SubOrSuperScript ());
1748#if qStroika_Platform_Windows
1749 if (addInTheseAttributes.GetStyle_Strikeout_Valid ()) {
1750 SetStyle_Strikeout (addInTheseAttributes.GetStyle_Strikeout ());
1755 if (addInTheseAttributes.GetPointSize_Valid ()) {
1756#if qStroika_Platform_Windows
1758 PokeAtTMHeight (addInTheseAttributes.PeekAtTMHeight ());
1760 SetPointSize (addInTheseAttributes.GetPointSize ());
1763 if (addInTheseAttributes.GetPointSizeIncrement_Valid ()) {
1764 short pointSize = GetPointSize ();
1765 pointSize += addInTheseAttributes.GetPointSizeIncrement ();
1766 if (pointSize <= 0) {
1769 SetPointSize (pointSize);
1773 if (addInTheseAttributes.GetTextColor_Valid ()) {
1774 SetTextColor (addInTheseAttributes.GetTextColor ());
1777#if qStroika_Platform_Windows
1779 if (addInTheseAttributes.GetDidSetOSRepCallFlag ()) {
1781 addInTheseAttributes.GetOSRep (&lf);
1792 inline IncrementalFontSpecification::IncrementalFontSpecification (
const FontSpecification& fontSpec)
1793 : FontSpecification{fontSpec}
1794 , fFontSpecifierValid (true)
1795 , fStyleValid_Bold (true)
1796 , fStyleValid_Italic (true)
1797 , fStyleValid_Underline (true)
1798 , fStyleValid_SubOrSuperScript (true)
1800#if qStroika_Platform_Windows
1801 fStyleValid_Strikeout (true)
1802 , fDidSetOSRepCallFlag (true)
1805 fFontSizeValid (true)
1806 , fFontSizeIncrementValid (false)
1807 , fTextColorValid (true)
1810 inline FontSpecification::FontNameSpecifier IncrementalFontSpecification::GetFontNameSpecifier ()
const
1812 Require (fFontSpecifierValid);
1813 return inherited::GetFontNameSpecifier ();
1815 inline bool IncrementalFontSpecification::GetFontNameSpecifier_Valid ()
const
1817 return (fFontSpecifierValid);
1819 inline void IncrementalFontSpecification::InvalidateFontNameSpecifier ()
1821 fFontSpecifierValid =
false;
1822#if qStroika_Platform_Windows
1823 fDidSetOSRepCallFlag =
false;
1826 inline void IncrementalFontSpecification::SetFontNameSpecifier (FontNameSpecifier fontNameSpecifier)
1828 fFontSpecifierValid =
true;
1829#if qStroika_Platform_Windows
1830 fDidSetOSRepCallFlag =
false;
1832 inherited::SetFontNameSpecifier (fontNameSpecifier);
1834 inline void IncrementalFontSpecification::SetFontName (
const SDKString& fontName)
1836 fFontSpecifierValid =
true;
1837#if qStroika_Platform_Windows
1838 fDidSetOSRepCallFlag =
false;
1840 inherited::SetFontName (fontName);
1842 inline bool IncrementalFontSpecification::GetStyle_Plain ()
const
1844 Require (fStyleValid_Bold);
1845 Require (fStyleValid_Italic);
1846 Require (fStyleValid_Underline);
1847 Require (fStyleValid_SubOrSuperScript);
1848#if qStroika_Platform_Windows
1849 Require (fStyleValid_Strikeout);
1851 return inherited::GetStyle_Plain ();
1853 inline bool IncrementalFontSpecification::GetStyle_Plain_Valid ()
const
1855 bool isValid = fStyleValid_Bold and fStyleValid_Italic and fStyleValid_Underline and fStyleValid_SubOrSuperScript;
1856#if qStroika_Platform_Windows
1857 isValid = isValid and fStyleValid_Strikeout;
1861 inline void IncrementalFontSpecification::InvalidateStyles ()
1863 fStyleValid_Bold =
false;
1864 fStyleValid_Italic =
false;
1865 fStyleValid_Underline =
false;
1866 fStyleValid_SubOrSuperScript =
false;
1867#if qStroika_Platform_Windows
1868 fStyleValid_Strikeout =
false;
1869 fDidSetOSRepCallFlag =
false;
1872 inline void IncrementalFontSpecification::SetStyle_Plain ()
1874 fStyleValid_Bold =
true;
1875 fStyleValid_Italic =
true;
1876 fStyleValid_Underline =
true;
1877 fStyleValid_SubOrSuperScript =
true;
1878#if qStroika_Platform_Windows
1879 fStyleValid_Strikeout =
true;
1880 fDidSetOSRepCallFlag =
false;
1882 inherited::SetStyle_Plain ();
1884 inline bool IncrementalFontSpecification::GetStyle_Bold ()
const
1886 Require (fStyleValid_Bold);
1887 return inherited::GetStyle_Bold ();
1889 inline bool IncrementalFontSpecification::GetStyle_Bold_Valid ()
const
1891 return (fStyleValid_Bold);
1893 inline void IncrementalFontSpecification::InvalidateStyle_Bold ()
1895 fStyleValid_Bold =
false;
1896#if qStroika_Platform_Windows
1897 fDidSetOSRepCallFlag =
false;
1900 inline void IncrementalFontSpecification::SetStyle_Bold (
bool isBold)
1902 fStyleValid_Bold =
true;
1903#if qStroika_Platform_Windows
1904 fDidSetOSRepCallFlag =
false;
1906 inherited::SetStyle_Bold (isBold);
1908 inline bool IncrementalFontSpecification::GetStyle_Italic ()
const
1910 Require (fStyleValid_Italic);
1911 return inherited::GetStyle_Italic ();
1913 inline bool IncrementalFontSpecification::GetStyle_Italic_Valid ()
const
1915 return (fStyleValid_Italic);
1917 inline void IncrementalFontSpecification::InvalidateStyle_Italic ()
1919 fStyleValid_Italic =
false;
1920#if qStroika_Platform_Windows
1921 fDidSetOSRepCallFlag =
false;
1924 inline void IncrementalFontSpecification::SetStyle_Italic (
bool isItalic)
1926 fStyleValid_Italic =
true;
1927#if qStroika_Platform_Windows
1928 fDidSetOSRepCallFlag =
false;
1930 inherited::SetStyle_Italic (isItalic);
1932 inline bool IncrementalFontSpecification::GetStyle_Underline ()
const
1934 Require (fStyleValid_Underline);
1935 return inherited::GetStyle_Underline ();
1937 inline bool IncrementalFontSpecification::GetStyle_Underline_Valid ()
const
1939 return (fStyleValid_Underline);
1941 inline void IncrementalFontSpecification::InvalidateStyle_Underline ()
1943 fStyleValid_Underline =
false;
1944#if qStroika_Platform_Windows
1945 fDidSetOSRepCallFlag =
false;
1948 inline void IncrementalFontSpecification::SetStyle_Underline (
bool isUnderline)
1950 fStyleValid_Underline =
true;
1951#if qStroika_Platform_Windows
1952 fDidSetOSRepCallFlag =
false;
1954 inherited::SetStyle_Underline (isUnderline);
1956 inline FontSpecification::SubOrSuperScript IncrementalFontSpecification::GetStyle_SubOrSuperScript ()
const
1958 Require (fStyleValid_SubOrSuperScript);
1959 return inherited::GetStyle_SubOrSuperScript ();
1961 inline bool IncrementalFontSpecification::GetStyle_SubOrSuperScript_Valid ()
const
1963 return (fStyleValid_SubOrSuperScript);
1965 inline void IncrementalFontSpecification::InvalidateStyle_SubOrSuperScript ()
1967 fStyleValid_SubOrSuperScript =
false;
1968#if qStroika_Platform_Windows
1969 fDidSetOSRepCallFlag =
false;
1972 inline void IncrementalFontSpecification::SetStyle_SubOrSuperScript (SubOrSuperScript subOrSuperScript)
1974 fStyleValid_SubOrSuperScript =
true;
1975#if qStroika_Platform_Windows
1976 fDidSetOSRepCallFlag =
false;
1978 inherited::SetStyle_SubOrSuperScript (subOrSuperScript);
1980#if qStroika_Platform_Windows
1981 inline bool IncrementalFontSpecification::GetStyle_Strikeout ()
const
1983 Require (fStyleValid_Strikeout);
1984 return (inherited::GetStyle_Strikeout ());
1986 inline bool IncrementalFontSpecification::GetStyle_Strikeout_Valid ()
const
1988 return (fStyleValid_Strikeout);
1990 inline void IncrementalFontSpecification::InvalidateStyle_Strikeout ()
1992 fStyleValid_Strikeout =
false;
1993#if qStroika_Platform_Windows
1994 fDidSetOSRepCallFlag =
false;
1997 inline void IncrementalFontSpecification::SetStyle_Strikeout (
bool isStrikeout)
1999 fStyleValid_Strikeout =
true;
2000#if qStroika_Platform_Windows
2001 fDidSetOSRepCallFlag =
false;
2003 inherited::SetStyle_Strikeout (isStrikeout);
2007 inline unsigned short IncrementalFontSpecification::GetPointSize ()
const
2009 Require (fFontSizeValid);
2010 Require (not fFontSizeIncrementValid);
2011 return inherited::GetPointSize ();
2013 inline bool IncrementalFontSpecification::GetPointSize_Valid ()
const
2015 return (fFontSizeValid);
2017 inline void IncrementalFontSpecification::InvalidatePointSize ()
2019 fFontSizeValid =
false;
2020 fFontSizeIncrementValid =
false;
2021#if qStroika_Platform_Windows
2022 fDidSetOSRepCallFlag =
false;
2025 inline void IncrementalFontSpecification::SetPointSize (FontSize pointSize)
2027 fFontSizeValid =
true;
2028#if qStroika_Platform_Windows
2029 fDidSetOSRepCallFlag =
false;
2031 inherited::SetPointSize (pointSize);
2032 fFontSizeIncrementValid =
false;
2034#if qStroika_Platform_Windows
2035 inline void IncrementalFontSpecification::PokeAtTMHeight (
long tmHeight)
2037 fFontSizeValid =
true;
2038 fDidSetOSRepCallFlag =
false;
2039 fFontSizeIncrementValid =
false;
2040 inherited::PokeAtTMHeight (tmHeight);
2043 inline short IncrementalFontSpecification::GetPointSizeIncrement ()
const
2045 Require (not fFontSizeValid);
2046 Require (fFontSizeIncrementValid);
2047 return (
short)inherited::GetPointSize ();
2049 inline bool IncrementalFontSpecification::GetPointSizeIncrement_Valid ()
const
2051 return (fFontSizeIncrementValid);
2053 inline void IncrementalFontSpecification::InvalidatePointSizeIncrement ()
2055 fFontSizeValid =
false;
2056 fFontSizeIncrementValid =
false;
2057#if qStroika_Platform_Windows
2058 fDidSetOSRepCallFlag =
false;
2061 inline void IncrementalFontSpecification::SetPointSizeIncrement (
short pointSizeIncrement)
2063 fFontSizeValid =
false;
2064#if qStroika_Platform_Windows
2065 fDidSetOSRepCallFlag =
false;
2067 inherited::SetPointSize ((
unsigned short)pointSizeIncrement);
2068 fFontSizeIncrementValid =
true;
2070 inline Color IncrementalFontSpecification::GetTextColor ()
const
2072 Require (fTextColorValid);
2073 return inherited::GetTextColor ();
2075 inline bool IncrementalFontSpecification::GetTextColor_Valid ()
const
2077 return (fTextColorValid);
2079 inline void IncrementalFontSpecification::InvalidateTextColor ()
2081 fTextColorValid =
false;
2083 inline void IncrementalFontSpecification::SetTextColor (
const Color& textColor)
2085 fTextColorValid =
true;
2086 inherited::SetTextColor (textColor);
2088#if qStroika_Platform_Windows
2089 inline LOGFONT IncrementalFontSpecification::GetOSRep ()
const
2091 Require (fFontSpecifierValid and fStyleValid_Bold and fStyleValid_Italic and fStyleValid_Underline and fFontSizeValid);
2092 Require (fStyleValid_Strikeout);
2093 return inherited::GetOSRep ();
2095 inline void IncrementalFontSpecification::GetOSRep (LOGFONT* logFont)
const
2098 Require (fFontSpecifierValid and fStyleValid_Bold and fStyleValid_Italic and fStyleValid_Underline and fFontSizeValid);
2099 Require (fStyleValid_Strikeout);
2100 inherited::GetOSRep (logFont);
2102 inline void IncrementalFontSpecification::SetOSRep (LOGFONT logFont)
2104 fFontSpecifierValid =
true;
2105 fStyleValid_Bold =
true;
2106 fStyleValid_Italic =
true;
2107 fStyleValid_Underline =
true;
2108 fStyleValid_Strikeout =
true;
2109 fFontSizeValid =
true;
2110 fFontSizeIncrementValid =
false;
2111 fDidSetOSRepCallFlag =
true;
2112 inherited::SetOSRep (logFont);
2114 inline void IncrementalFontSpecification::LightSetOSRep (LOGFONT logFont)
2116 fFontSpecifierValid =
true;
2117 fStyleValid_Bold =
true;
2118 fStyleValid_Italic =
true;
2119 fStyleValid_Underline =
true;
2120 fStyleValid_Strikeout =
true;
2121 fFontSizeValid =
true;
2122 fFontSizeIncrementValid =
false;
2123 fDidSetOSRepCallFlag =
true;
2124 inherited::LightSetOSRep (logFont);
2126 inline bool IncrementalFontSpecification::GetDidSetOSRepCallFlag ()
const
2128 return fDidSetOSRepCallFlag;
2131 inline void IncrementalFontSpecification::MergeIn (
const IncrementalFontSpecification& addInTheseAttributes)
2134 if (addInTheseAttributes.GetFontNameSpecifier_Valid ()) {
2135 SetFontNameSpecifier (addInTheseAttributes.GetFontNameSpecifier ());
2139 if (addInTheseAttributes.GetStyle_Bold_Valid ()) {
2140 SetStyle_Bold (addInTheseAttributes.GetStyle_Bold ());
2142 if (addInTheseAttributes.GetStyle_Italic_Valid ()) {
2143 SetStyle_Italic (addInTheseAttributes.GetStyle_Italic ());
2145 if (addInTheseAttributes.GetStyle_Underline_Valid ()) {
2146 SetStyle_Underline (addInTheseAttributes.GetStyle_Underline ());
2148#if qStroika_Platform_Windows
2149 if (addInTheseAttributes.GetStyle_Strikeout_Valid ()) {
2150 SetStyle_Strikeout (addInTheseAttributes.GetStyle_Strikeout ());
2155 if (addInTheseAttributes.GetPointSize_Valid ()) {
2156#if qStroika_Platform_Windows
2158 PokeAtTMHeight (addInTheseAttributes.PeekAtTMHeight ());
2160 SetPointSize (addInTheseAttributes.GetPointSize ());
2163 if (addInTheseAttributes.GetPointSizeIncrement_Valid ()) {
2164 short pointSize = GetPointSize ();
2165 pointSize += addInTheseAttributes.GetPointSizeIncrement ();
2166 if (pointSize <= 0) {
2169 SetPointSize (pointSize);
2173 if (addInTheseAttributes.GetTextColor_Valid ()) {
2174 SetTextColor (addInTheseAttributes.GetTextColor ());
2177#if qStroika_Platform_Windows
2178 fDidSetOSRepCallFlag = addInTheseAttributes.GetDidSetOSRepCallFlag ();
2181 inline bool IncrementalFontSpecification::operator== (
const IncrementalFontSpecification& rhs)
const
2188 if (GetFontNameSpecifier_Valid () != rhs.GetFontNameSpecifier_Valid ()) {
2191 if (GetFontNameSpecifier_Valid () and (GetFontNameSpecifier () != rhs.GetFontNameSpecifier ())) {
2198 if (GetStyle_Bold_Valid () != rhs.GetStyle_Bold_Valid ()) {
2201 if (GetStyle_Bold_Valid () and (GetStyle_Bold () != rhs.GetStyle_Bold ())) {
2206 if (GetStyle_Italic_Valid () != rhs.GetStyle_Italic_Valid ()) {
2209 if (GetStyle_Italic_Valid () and (GetStyle_Italic () != rhs.GetStyle_Italic ())) {
2214 if (GetStyle_Underline_Valid () != rhs.GetStyle_Underline_Valid ()) {
2217 if (GetStyle_Underline_Valid () and (GetStyle_Underline () != rhs.GetStyle_Underline ())) {
2222 if (GetStyle_SubOrSuperScript_Valid () != rhs.GetStyle_SubOrSuperScript_Valid ()) {
2225 if (GetStyle_SubOrSuperScript_Valid () and (GetStyle_SubOrSuperScript () != rhs.GetStyle_SubOrSuperScript ())) {
2229#if qStroika_Platform_Windows
2231 if (GetStyle_Strikeout_Valid () != rhs.GetStyle_Strikeout_Valid ()) {
2234 if (GetStyle_Strikeout_Valid () and (GetStyle_Strikeout () != rhs.GetStyle_Strikeout ())) {
2242 if (GetTextColor_Valid () != rhs.GetTextColor_Valid ()) {
2245 if (GetTextColor_Valid () and (GetTextColor () != rhs.GetTextColor ())) {
2252 if (GetPointSizeIncrement_Valid () != rhs.GetPointSizeIncrement_Valid ()) {
2255 if (GetPointSizeIncrement_Valid () and (GetPointSizeIncrement () != rhs.GetPointSizeIncrement ())) {
2260 if (GetPointSize_Valid () != rhs.GetPointSize_Valid ()) {
2263 if (GetPointSize_Valid ()) {
2264#if qStroika_Platform_Windows
2266 if (PeekAtTMHeight () == rhs.PeekAtTMHeight ()) {
2269 else if ((PeekAtTMHeight () > 0) == (rhs.PeekAtTMHeight () > 0)) {
2276 if (GetPointSize () != rhs.GetPointSize ()) {
2290 inline const vector<SDKString>& InstalledFonts::GetUsableFontNames ()
const
2295#if qStroika_Frameworks_Led_SupportGDI
2301 inline Color Led_GetTextColor ()
2303#if qStroika_Platform_Windows
2304 return Color (::GetSysColor (COLOR_WINDOWTEXT));
2313 inline Color Led_GetTextBackgroundColor ()
2315#if qStroika_Platform_Windows
2316 return Color (::GetSysColor (COLOR_WINDOW));
2321#if qStroika_Frameworks_Led_SupportGDI
2327 inline Color Led_GetSelectedTextColor ()
2329#if qStroika_Platform_Windows
2331 return Color (::GetSysColor (COLOR_HIGHLIGHTTEXT));
2334 inline Color Led_GetSelectedTextBackgroundColor ()
2336#if qStroika_Platform_Windows
2338 return Color (::GetSysColor (COLOR_HIGHLIGHT));
2343#if qStroika_Frameworks_Led_SupportGDI
2349 inline Tablet::ClipNarrowAndRestore::ClipNarrowAndRestore (Tablet* tablet)
2351 , fHasOldClip (false)
2355#if qStroika_Platform_Windows
2356 if (::GetDeviceCaps (fTablet->m_hDC, TECHNOLOGY) == DT_METAFILE) {
2360 fHasOldClip = tablet->GetClip (&fOldClip);
2362 inline Tablet::ClipNarrowAndRestore::ClipNarrowAndRestore (Tablet* tablet,
const Led_Rect& clipFurtherTo)
2364 , fHasOldClip (false)
2368 fHasOldClip = tablet->GetClip (&fOldClip);
2369#if qStroika_Platform_Windows
2374 if (::GetDeviceCaps (tablet->m_hDC, TECHNOLOGY) == DT_METAFILE) {
2377 Verify (::IntersectClipRect (*tablet, clipFurtherTo.GetLeft (), clipFurtherTo.GetTop (), clipFurtherTo.GetRight (),
2378 clipFurtherTo.GetBottom ()) != ERROR);
2381 inline Tablet::ClipNarrowAndRestore::ClipNarrowAndRestore (Tablet* tablet, [[maybe_unused]]
const Region& clipFurtherTo)
2383 , fHasOldClip (false)
2387 fHasOldClip = tablet->GetClip (&fOldClip);
2388#if qStroika_Platform_Windows
2394 inline Tablet::ClipNarrowAndRestore::~ClipNarrowAndRestore ()
2397#if qStroika_Platform_Windows
2398 if (::GetDeviceCaps (fTablet->m_hDC, TECHNOLOGY) == DT_METAFILE) {
2403 fTablet->SetClip (fOldClip);
2406 fTablet->SetClip ();
2411#if qStroika_Platform_Windows
2417 inline WindowDC::WindowDC (HWND hWnd)
2420 Require (fHWnd_ ==
nullptr or ::IsWindow (fHWnd_));
2421 if (!Attach (::GetWindowDC (fHWnd_))) {
2422 Foundation::Execution::Throw (bad_alloc{});
2425 inline WindowDC::~WindowDC ()
2428 ::ReleaseDC (fHWnd_, Detach ());
2433#if qStroika_Frameworks_Led_SupportGDI
2439#if qStroika_Platform_Windows
2440 inline GDI_Obj_Selector::GDI_Obj_Selector (Tablet* tablet, HGDIOBJ objToSelect)
2442 , fRestoreObject (nullptr)
2443 , fRestoreAttribObject (nullptr)
2449 if (tablet->m_hDC != tablet->m_hAttribDC) {
2450 fRestoreObject = ::SelectObject (tablet->m_hDC, objToSelect);
2452 if (tablet->m_hAttribDC !=
nullptr) {
2453 fRestoreAttribObject = ::SelectObject (tablet->m_hAttribDC, objToSelect);
2457 inline GDI_Obj_Selector::~GDI_Obj_Selector ()
2459#if qStroika_Platform_Windows
2461 if (fRestoreObject !=
nullptr) {
2462 Verify (::SelectObject (fTablet->m_hDC, fRestoreObject));
2464 if (fRestoreAttribObject !=
nullptr) {
2465 Verify (::SelectObject (fTablet->m_hAttribDC, fRestoreAttribObject));
2476 inline short Led_GetMacPictTop (
const Led_Picture* picture)
2479 return Led_ByteSwapFromMac (picture->picFrameTop);
2481 inline short Led_GetMacPictLeft (
const Led_Picture* picture)
2484 return Led_ByteSwapFromMac (picture->picFrameLeft);
2486 inline short Led_GetMacPictBottom (
const Led_Picture* picture)
2489 return Led_ByteSwapFromMac (picture->picFrameBottom);
2491 inline short Led_GetMacPictRight (
const Led_Picture* picture)
2494 return Led_ByteSwapFromMac (picture->picFrameRight);
2496 inline short Led_GetMacPictWidth (
const Led_Picture* picture)
2498 return Led_GetMacPictRight (picture) - Led_GetMacPictLeft (picture);
2500 inline short Led_GetMacPictHeight (
const Led_Picture* picture)
2502 return Led_GetMacPictBottom (picture) - Led_GetMacPictTop (picture);
2504 inline Led_Size Led_GetMacPictSize (
const Led_Picture* picture)
2506 return Led_Size (Led_GetMacPictHeight (picture), Led_GetMacPictWidth (picture));
2509#if qStroika_Frameworks_Led_ProvideIMESupport
2515 DISABLE_COMPILER_MSC_WARNING_START (6011)
2516 inline IME& IME::Get ()
2518 if (sThe ==
nullptr) {
2524 DISABLE_COMPILER_MSC_WARNING_END (6011)
2525 inline
void IME::Enable ()
2527 if (fIMEEnableProc !=
nullptr) {
2528 fIMEEnableProc (
nullptr,
true);
2531 inline void IME::Disable ()
2533 if (fIMEEnableProc !=
nullptr) {
2534 fIMEEnableProc (
nullptr,
false);
2537 inline bool IME::Available ()
const
2539 return fWinNlsAvailable;
2541 inline void IME::ForgetPosition ()
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
set< T > Intersection(const set< T > &s1, const set< T > &s2)
basic_string< SDKChar > SDKString
Ptr Attach(PlatformNativeHandle sd)