OSX make iOS and macOS share more drawing code (#25860) * fix for wxRegionGeneric behavior according to the documentation a freshly created wxRegion must return IsEmpty() as false even though it is not valid * fixing icon sizes on iOS * have an availability macro for iOS code as well * make macOS and iOS share more image drawing code * add native artprovider for macOS and iOS use named system images * have system color closer to macOS * add scaling to retrieved system graphics * move initialization to front because of callbacks occurring in ::Create * guarding against default size argument
... | ... | @@ -133,7 +133,11 @@ CGImageRef WXDLLIMPEXP_CORE wxOSXGetCGImageFromImage( WXImage nsimage, CGRect* r |
133 | 133 | CGContextRef WXDLLIMPEXP_CORE wxOSXCreateBitmapContextFromImage( WXImage nsimage, bool *isTemplate = nullptr);
|
134 | 134 | WXImage WXDLLIMPEXP_CORE wxOSXGetImageFromCGImage( CGImageRef image, double scale = 1.0, bool isTemplate = false);
|
135 | 135 | double WXDLLIMPEXP_CORE wxOSXGetImageScaleFactor(WXImage image);
|
136 | - |
|
136 | +wxBitmapBundle WXDLLIMPEXP_CORE wxOSXCreateSystemBitmapBundle(const wxString& name, const wxSize& size);
|
|
137 | +WXImage WXDLLIMPEXP_CORE wxOSXGetSystemImage(const wxString& name);
|
|
138 | +wxBitmapBundle WXDLLIMPEXP_CORE wxOSXCreateSystemBitmapBundle(const wxString& id, const wxString &client, const wxSize& size);
|
|
139 | +void WXDLLIMPEXP_CORE wxOSXDrawImage(CGContextRef inContext, const CGRect* inBounds, WXImage inImage, wxCompositionMode composition) ;
|
|
140 | +bool WXDLLIMPEXP_CORE wxOSXGetCGBlendMode(wxCompositionMode op, wxInt32& mode);
|
|
137 | 141 | |
138 | 142 | class wxWindowMac;
|
139 | 143 | // to
|
... | ... | @@ -18,6 +18,9 @@ |
18 | 18 | #define WX_IS_MACOS_AVAILABLE(major, minor) \
|
19 | 19 | __builtin_available(macOS major ## . ## minor, *)
|
20 | 20 | |
21 | + #define WX_IS_IOS_AVAILABLE(major, minor) \
|
|
22 | + __builtin_available(iOS major ## . ## minor, *)
|
|
23 | + |
|
21 | 24 | #define WX_IS_MACOS_OR_IOS_AVAILABLE(macmajor, macminor, imajor, iminor) \
|
22 | 25 | __builtin_available(macOS macmajor ## . ## macminor, iOS imajor ##. ## iminor, *)
|
23 | 26 |
... | ... | @@ -290,8 +290,8 @@ void wxGCDCImpl::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y ) |
290 | 290 | wxCHECK_RET( IsOk(), wxT("wxGCDC(cg)::DoDrawIcon - invalid DC") );
|
291 | 291 | wxCHECK_RET( icon.IsOk(), wxT("wxGCDC(cg)::DoDrawIcon - invalid icon") );
|
292 | 292 | |
293 | - wxCoord w = icon.GetWidth();
|
|
294 | - wxCoord h = icon.GetHeight();
|
|
293 | + wxCoord w = icon.GetLogicalWidth();
|
|
294 | + wxCoord h = icon.GetLogicalHeight();
|
|
295 | 295 | |
296 | 296 | m_graphicContext->DrawIcon( icon , x, y, w, h );
|
297 | 297 |
... | ... | @@ -375,7 +375,9 @@ bool wxRegionGeneric::DoOffset(wxCoord x, wxCoord y) |
375 | 375 | |
376 | 376 | bool wxRegionGeneric::IsEmpty() const
|
377 | 377 | {
|
378 | - wxASSERT(m_refData);
|
|
378 | + if ( m_refData == nullptr )
|
|
379 | + return false;
|
|
380 | + |
|
379 | 381 | return REGION::XEmptyRegion(M_REGIONDATA);
|
380 | 382 | }
|
381 | 383 |
... | ... | @@ -34,14 +34,9 @@ protected: |
34 | 34 | virtual wxIconBundle CreateIconBundle(const wxArtID& id,
|
35 | 35 | const wxArtClient& client) override;
|
36 | 36 | #endif
|
37 | -#if wxOSX_USE_COCOA_OR_IPHONE
|
|
38 | 37 | virtual wxBitmapBundle CreateBitmapBundle(const wxArtID& id,
|
39 | 38 | const wxArtClient& client,
|
40 | - const wxSize& size) override
|
|
41 | - {
|
|
42 | - return wxOSXCreateSystemBitmapBundle(id, client, size);
|
|
43 | - }
|
|
44 | -#endif
|
|
39 | + const wxSize& size) override;
|
|
45 | 40 | };
|
46 | 41 | |
47 | 42 | /* static */ void wxArtProvider::InitNativeProvider()
|
... | ... | @@ -51,57 +46,60 @@ protected: |
51 | 46 | |
52 | 47 | #if wxOSX_USE_COCOA_OR_CARBON
|
53 | 48 | |
49 | +// under cocoa we still have access to the old native icons, so map them
|
|
50 | + |
|
54 | 51 | // ----------------------------------------------------------------------------
|
55 | 52 | // helper macros
|
56 | 53 | // ----------------------------------------------------------------------------
|
57 | 54 | |
58 | -#define CREATE_STD_ICON(iconId, xpmRc) \
|
|
55 | +#define CREATE_STD_ICON(iconId) \
|
|
59 | 56 | { \
|
60 | 57 | wxIconBundle icon(wxT(iconId), wxBITMAP_TYPE_ICON_RESOURCE); \
|
61 | 58 | return icon; \
|
62 | 59 | }
|
63 | 60 | |
64 | 61 | // Macro used in CreateBitmap to get wxICON_FOO icons:
|
65 | -#define ART_MSGBOX(artId, iconId, xpmRc) \
|
|
62 | +#define ART_MSGBOX(artId, iconId) \
|
|
66 | 63 | if ( id == artId ) \
|
67 | 64 | { \
|
68 | - CREATE_STD_ICON(#iconId, xpmRc) \
|
|
65 | + CREATE_STD_ICON(#iconId) \
|
|
69 | 66 | }
|
70 | 67 | |
68 | +// ----------------------------------------------------------------------------
|
|
69 | +// CreateIconBundle
|
|
70 | +// ----------------------------------------------------------------------------
|
|
71 | + |
|
71 | 72 | static wxIconBundle wxMacArtProvider_CreateIconBundle(const wxArtID& id)
|
72 | 73 | {
|
73 | - ART_MSGBOX(wxART_ERROR, wxICON_ERROR, error)
|
|
74 | - ART_MSGBOX(wxART_INFORMATION, wxICON_INFORMATION, info)
|
|
75 | - ART_MSGBOX(wxART_WARNING, wxICON_WARNING, warning)
|
|
76 | - ART_MSGBOX(wxART_QUESTION, wxICON_QUESTION, question)
|
|
74 | + ART_MSGBOX(wxART_ERROR, wxICON_ERROR)
|
|
75 | + ART_MSGBOX(wxART_INFORMATION, wxICON_INFORMATION)
|
|
76 | + ART_MSGBOX(wxART_WARNING, wxICON_WARNING)
|
|
77 | + ART_MSGBOX(wxART_QUESTION, wxICON_QUESTION)
|
|
77 | 78 | |
78 | - ART_MSGBOX(wxART_FOLDER, wxICON_FOLDER, folder)
|
|
79 | - ART_MSGBOX(wxART_FOLDER_OPEN, wxICON_FOLDER_OPEN, folder_open)
|
|
80 | - ART_MSGBOX(wxART_NORMAL_FILE, wxICON_NORMAL_FILE, deffile)
|
|
81 | - ART_MSGBOX(wxART_EXECUTABLE_FILE, wxICON_EXECUTABLE_FILE, exefile)
|
|
79 | + ART_MSGBOX(wxART_FOLDER, wxICON_FOLDER)
|
|
80 | + ART_MSGBOX(wxART_FOLDER_OPEN, wxICON_FOLDER_OPEN)
|
|
81 | + ART_MSGBOX(wxART_NORMAL_FILE, wxICON_NORMAL_FILE)
|
|
82 | + ART_MSGBOX(wxART_EXECUTABLE_FILE, wxICON_EXECUTABLE_FILE)
|
|
82 | 83 | |
83 | - ART_MSGBOX(wxART_CDROM, wxICON_CDROM, cdrom)
|
|
84 | - ART_MSGBOX(wxART_FLOPPY, wxICON_FLOPPY, floppy)
|
|
85 | - ART_MSGBOX(wxART_HARDDISK, wxICON_HARDDISK, harddisk)
|
|
86 | - ART_MSGBOX(wxART_REMOVABLE, wxICON_REMOVABLE, removable)
|
|
87 | - ART_MSGBOX(wxART_PRINT, wxICON_PRINT, print)
|
|
84 | + ART_MSGBOX(wxART_CDROM, wxICON_CDROM)
|
|
85 | + ART_MSGBOX(wxART_FLOPPY, wxICON_FLOPPY)
|
|
86 | + ART_MSGBOX(wxART_HARDDISK, wxICON_HARDDISK)
|
|
87 | + ART_MSGBOX(wxART_REMOVABLE, wxICON_REMOVABLE)
|
|
88 | + ART_MSGBOX(wxART_PRINT, wxICON_PRINT)
|
|
88 | 89 | |
89 | - ART_MSGBOX(wxART_DELETE, wxICON_DELETE, delete)
|
|
90 | + ART_MSGBOX(wxART_DELETE, wxICON_DELETE)
|
|
90 | 91 | |
91 | - ART_MSGBOX(wxART_GO_BACK, wxICON_GO_BACK, back)
|
|
92 | - ART_MSGBOX(wxART_GO_FORWARD, wxICON_GO_FORWARD, forward)
|
|
93 | - ART_MSGBOX(wxART_GO_HOME, wxICON_GO_HOME, home)
|
|
92 | + ART_MSGBOX(wxART_GO_BACK, wxICON_GO_BACK)
|
|
93 | + ART_MSGBOX(wxART_GO_FORWARD, wxICON_GO_FORWARD)
|
|
94 | + ART_MSGBOX(wxART_GO_HOME, wxICON_GO_HOME)
|
|
94 | 95 | |
95 | - ART_MSGBOX(wxART_HELP_SETTINGS, wxICON_HELP_SETTINGS, htmoptns)
|
|
96 | - ART_MSGBOX(wxART_HELP_PAGE, wxICON_HELP_PAGE, htmpage)
|
|
97 | - ART_MSGBOX(wxART_HELP_FOLDER, wxICON_HELP_FOLDER, htmlfoldr)
|
|
96 | + ART_MSGBOX(wxART_HELP_SETTINGS, wxICON_HELP_SETTINGS)
|
|
97 | + ART_MSGBOX(wxART_HELP_PAGE, wxICON_HELP_PAGE)
|
|
98 | + ART_MSGBOX(wxART_HELP_FOLDER, wxICON_HELP_FOLDER)
|
|
98 | 99 | |
99 | 100 | return wxNullIconBundle;
|
100 | 101 | }
|
101 | 102 | |
102 | -// ----------------------------------------------------------------------------
|
|
103 | -// CreateIconBundle
|
|
104 | -// ----------------------------------------------------------------------------
|
|
105 | 103 | |
106 | 104 | wxIconBundle wxMacArtProvider::CreateIconBundle(const wxArtID& id, const wxArtClient& client)
|
107 | 105 | {
|
... | ... | @@ -115,6 +113,61 @@ wxIconBundle wxMacArtProvider::CreateIconBundle(const wxArtID& id, const wxArtCl |
115 | 113 | |
116 | 114 | #endif
|
117 | 115 | |
116 | +// ----------------------------------------------------------------------------
|
|
117 | +// CreateBitmapBundle
|
|
118 | +// ----------------------------------------------------------------------------
|
|
119 | + |
|
120 | +// ----------------------------------------------------------------------------
|
|
121 | +// helper macros
|
|
122 | +// ----------------------------------------------------------------------------
|
|
123 | + |
|
124 | +#define ART_BITMAP(artId, symbolname) \
|
|
125 | + if ( id == artId ) \
|
|
126 | + { \
|
|
127 | + return wxOSXCreateSystemBitmapBundle(symbolname, size); \
|
|
128 | + }
|
|
129 | + |
|
130 | +static wxBitmapBundle wxMacArtProvider_CreateBitmapBundle(const wxArtID& id, const wxSize& size)
|
|
131 | +{
|
|
132 | + ART_BITMAP(wxART_ERROR, "xmark.circle" )
|
|
133 | + ART_BITMAP(wxART_INFORMATION, "info.circle" )
|
|
134 | + ART_BITMAP(wxART_WARNING, "exclamationmark.triangle" )
|
|
135 | + ART_BITMAP(wxART_QUESTION, "questionmark.circle" )
|
|
136 | + |
|
137 | + ART_BITMAP(wxART_FOLDER, "folder")
|
|
138 | + ART_BITMAP(wxART_FOLDER_OPEN, "folder")
|
|
139 | + ART_BITMAP(wxART_NORMAL_FILE, "document")
|
|
140 | + ART_BITMAP(wxART_EXECUTABLE_FILE,"app")
|
|
141 | + |
|
142 | + ART_BITMAP(wxART_CDROM, "opticalsdrive")
|
|
143 | + ART_BITMAP(wxART_FLOPPY, "opticalsdrive")
|
|
144 | + ART_BITMAP(wxART_HARDDISK, "internaldrive")
|
|
145 | + ART_BITMAP(wxART_REMOVABLE, "externaldrive")
|
|
146 | + ART_BITMAP(wxART_PRINT, "printer")
|
|
147 | + |
|
148 | + ART_BITMAP(wxART_DELETE, "minus.circle")
|
|
149 | + |
|
150 | + ART_BITMAP(wxART_GO_BACK, "arrow.backward.circle")
|
|
151 | + ART_BITMAP(wxART_GO_FORWARD, "arrow.fordward.circle")
|
|
152 | + ART_BITMAP(wxART_GO_HOME, "house")
|
|
153 | + |
|
154 | + ART_BITMAP(wxART_HELP_SETTINGS, "gear.badge.questionmark")
|
|
155 | + ART_BITMAP(wxART_HELP_PAGE, "questionmark.text.page")
|
|
156 | + ART_BITMAP(wxART_HELP_FOLDER, "questionmark.folder")
|
|
157 | + |
|
158 | + return wxBitmapBundle();
|
|
159 | +}
|
|
160 | + |
|
161 | +wxBitmapBundle wxMacArtProvider::CreateBitmapBundle(const wxArtID& id, const wxArtClient& client, const wxSize& size )
|
|
162 | +{
|
|
163 | + // On the Mac folders in lists are always drawn closed, so if an open
|
|
164 | + // folder icon is asked for we will ask for a closed one in its place
|
|
165 | + if ( client == wxART_LIST && id == wxART_FOLDER_OPEN )
|
|
166 | + return wxMacArtProvider_CreateBitmapBundle(wxART_FOLDER, size);
|
|
167 | + |
|
168 | + return wxMacArtProvider_CreateBitmapBundle(id, size);
|
|
169 | +}
|
|
170 | + |
|
118 | 171 | // ----------------------------------------------------------------------------
|
119 | 172 | // wxArtProvider::GetNativeDIPSizeHint()
|
120 | 173 | // ----------------------------------------------------------------------------
|
... | ... | @@ -46,29 +46,55 @@ extern void wxOSXUnlockFocus( WXWidget view) ; |
46 | 46 | #endif
|
47 | 47 | #endif
|
48 | 48 | |
49 | -// copying values from NSCompositingModes (see also webkit and cairo sources)
|
|
50 | - |
|
51 | -typedef enum CGCompositeOperation {
|
|
52 | - kCGCompositeOperationClear = 0,
|
|
53 | - kCGCompositeOperationCopy = 1,
|
|
54 | - kCGCompositeOperationSourceOver = 2,
|
|
55 | - kCGCompositeOperationSourceIn = 3,
|
|
56 | - kCGCompositeOperationSourceOut = 4,
|
|
57 | - kCGCompositeOperationSourceAtop = 5,
|
|
58 | - kCGCompositeOperationDestinationOver = 6,
|
|
59 | - kCGCompositeOperationDestinationIn = 7,
|
|
60 | - kCGCompositeOperationDestinationOut = 8,
|
|
61 | - kCGCompositeOperationDestinationAtop = 9,
|
|
62 | - kCGCompositeOperationXOR = 10,
|
|
63 | - kCGCompositeOperationPlusDarker = 11,
|
|
64 | -// NS only, unsupported by CG : Highlight
|
|
65 | - kCGCompositeOperationPlusLighter = 12
|
|
66 | -} CGCompositeOperation ;
|
|
67 | - |
|
68 | -extern "C"
|
|
69 | -{
|
|
70 | - CG_EXTERN void CGContextSetCompositeOperation (CGContextRef context, int operation);
|
|
71 | -} ;
|
|
49 | +bool wxOSXGetCGBlendMode(wxCompositionMode op, wxInt32& mode)
|
|
50 | +{
|
|
51 | + switch( op )
|
|
52 | + {
|
|
53 | + case wxCOMPOSITION_CLEAR:
|
|
54 | + mode = kCGBlendModeClear;
|
|
55 | + break;
|
|
56 | + case wxCOMPOSITION_SOURCE:
|
|
57 | + mode = kCGBlendModeCopy;
|
|
58 | + break;
|
|
59 | + case wxCOMPOSITION_OVER:
|
|
60 | + mode = kCGBlendModeNormal;
|
|
61 | + break;
|
|
62 | + case wxCOMPOSITION_IN:
|
|
63 | + mode = kCGBlendModeSourceIn;
|
|
64 | + break;
|
|
65 | + case wxCOMPOSITION_OUT:
|
|
66 | + mode = kCGBlendModeSourceOut;
|
|
67 | + break;
|
|
68 | + case wxCOMPOSITION_ATOP:
|
|
69 | + mode = kCGBlendModeSourceAtop;
|
|
70 | + break;
|
|
71 | + case wxCOMPOSITION_DEST_OVER:
|
|
72 | + mode = kCGBlendModeDestinationOver;
|
|
73 | + break;
|
|
74 | + case wxCOMPOSITION_DEST_IN:
|
|
75 | + mode = kCGBlendModeDestinationIn;
|
|
76 | + break;
|
|
77 | + case wxCOMPOSITION_DEST_OUT:
|
|
78 | + mode = kCGBlendModeDestinationOut;
|
|
79 | + break;
|
|
80 | + case wxCOMPOSITION_DEST_ATOP:
|
|
81 | + mode = kCGBlendModeDestinationAtop;
|
|
82 | + break;
|
|
83 | + case wxCOMPOSITION_XOR:
|
|
84 | + mode = kCGBlendModeExclusion; // Not kCGBlendModeXOR!
|
|
85 | + break;
|
|
86 | + case wxCOMPOSITION_ADD:
|
|
87 | + mode = kCGBlendModePlusLighter ;
|
|
88 | + break;
|
|
89 | + case wxCOMPOSITION_DIFF:
|
|
90 | + mode = kCGBlendModeDifference ;
|
|
91 | + break;
|
|
92 | + default:
|
|
93 | + return false;
|
|
94 | + break;
|
|
95 | + }
|
|
96 | + return true;
|
|
97 | +}
|
|
72 | 98 | |
73 | 99 | //-----------------------------------------------------------------------------
|
74 | 100 | // constants
|
... | ... | @@ -1962,107 +1988,13 @@ bool wxMacCoreGraphicsContext::DoSetCompositionMode(wxCompositionMode op) |
1962 | 1988 | if (op == wxCOMPOSITION_DEST)
|
1963 | 1989 | return true;
|
1964 | 1990 | |
1965 | - // TODO REMOVE if we don't need it because of bugs in 10.5
|
|
1966 | -#if 0
|
|
1991 | + wxInt32 blendMode;
|
|
1992 | + if ( wxOSXGetCGBlendMode(op, blendMode ) )
|
|
1967 | 1993 | {
|
1968 | - CGCompositeOperation cop = kCGCompositeOperationSourceOver;
|
|
1969 | - CGBlendMode mode = kCGBlendModeNormal;
|
|
1970 | - switch( op )
|
|
1971 | - {
|
|
1972 | - case wxCOMPOSITION_CLEAR:
|
|
1973 | - cop = kCGCompositeOperationClear;
|
|
1974 | - break;
|
|
1975 | - case wxCOMPOSITION_SOURCE:
|
|
1976 | - cop = kCGCompositeOperationCopy;
|
|
1977 | - break;
|
|
1978 | - case wxCOMPOSITION_OVER:
|
|
1979 | - mode = kCGBlendModeNormal;
|
|
1980 | - break;
|
|
1981 | - case wxCOMPOSITION_IN:
|
|
1982 | - cop = kCGCompositeOperationSourceIn;
|
|
1983 | - break;
|
|
1984 | - case wxCOMPOSITION_OUT:
|
|
1985 | - cop = kCGCompositeOperationSourceOut;
|
|
1986 | - break;
|
|
1987 | - case wxCOMPOSITION_ATOP:
|
|
1988 | - cop = kCGCompositeOperationSourceAtop;
|
|
1989 | - break;
|
|
1990 | - case wxCOMPOSITION_DEST_OVER:
|
|
1991 | - cop = kCGCompositeOperationDestinationOver;
|
|
1992 | - break;
|
|
1993 | - case wxCOMPOSITION_DEST_IN:
|
|
1994 | - cop = kCGCompositeOperationDestinationIn;
|
|
1995 | - break;
|
|
1996 | - case wxCOMPOSITION_DEST_OUT:
|
|
1997 | - cop = kCGCompositeOperationDestinationOut;
|
|
1998 | - break;
|
|
1999 | - case wxCOMPOSITION_DEST_ATOP:
|
|
2000 | - cop = kCGCompositeOperationDestinationAtop;
|
|
2001 | - break;
|
|
2002 | - case wxCOMPOSITION_XOR:
|
|
2003 | - cop = kCGCompositeOperationXOR;
|
|
2004 | - break;
|
|
2005 | - case wxCOMPOSITION_ADD:
|
|
2006 | - mode = kCGBlendModePlusLighter ;
|
|
2007 | - break;
|
|
2008 | - default:
|
|
2009 | - return false;
|
|
2010 | - }
|
|
2011 | - if ( cop != kCGCompositeOperationSourceOver )
|
|
2012 | - CGContextSetCompositeOperation(m_cgContext, cop);
|
|
2013 | - else
|
|
2014 | - CGContextSetBlendMode(m_cgContext, mode);
|
|
2015 | - }
|
|
2016 | -#endif
|
|
2017 | - {
|
|
2018 | - CGBlendMode mode = kCGBlendModeNormal;
|
|
2019 | - switch( op )
|
|
2020 | - {
|
|
2021 | - case wxCOMPOSITION_CLEAR:
|
|
2022 | - mode = kCGBlendModeClear;
|
|
2023 | - break;
|
|
2024 | - case wxCOMPOSITION_SOURCE:
|
|
2025 | - mode = kCGBlendModeCopy;
|
|
2026 | - break;
|
|
2027 | - case wxCOMPOSITION_OVER:
|
|
2028 | - mode = kCGBlendModeNormal;
|
|
2029 | - break;
|
|
2030 | - case wxCOMPOSITION_IN:
|
|
2031 | - mode = kCGBlendModeSourceIn;
|
|
2032 | - break;
|
|
2033 | - case wxCOMPOSITION_OUT:
|
|
2034 | - mode = kCGBlendModeSourceOut;
|
|
2035 | - break;
|
|
2036 | - case wxCOMPOSITION_ATOP:
|
|
2037 | - mode = kCGBlendModeSourceAtop;
|
|
2038 | - break;
|
|
2039 | - case wxCOMPOSITION_DEST_OVER:
|
|
2040 | - mode = kCGBlendModeDestinationOver;
|
|
2041 | - break;
|
|
2042 | - case wxCOMPOSITION_DEST_IN:
|
|
2043 | - mode = kCGBlendModeDestinationIn;
|
|
2044 | - break;
|
|
2045 | - case wxCOMPOSITION_DEST_OUT:
|
|
2046 | - mode = kCGBlendModeDestinationOut;
|
|
2047 | - break;
|
|
2048 | - case wxCOMPOSITION_DEST_ATOP:
|
|
2049 | - mode = kCGBlendModeDestinationAtop;
|
|
2050 | - break;
|
|
2051 | - case wxCOMPOSITION_XOR:
|
|
2052 | - mode = kCGBlendModeExclusion; // Not kCGBlendModeXOR!
|
|
2053 | - break;
|
|
2054 | - case wxCOMPOSITION_ADD:
|
|
2055 | - mode = kCGBlendModePlusLighter ;
|
|
2056 | - break;
|
|
2057 | - case wxCOMPOSITION_DIFF:
|
|
2058 | - mode = kCGBlendModeDifference ;
|
|
2059 | - break;
|
|
2060 | - default:
|
|
2061 | - return false;
|
|
2062 | - }
|
|
2063 | - CGContextSetBlendMode(m_cgContext, mode);
|
|
1994 | + CGContextSetBlendMode(m_cgContext, (CGBlendMode) blendMode);
|
|
1995 | + return true;
|
|
2064 | 1996 | }
|
2065 | - return true;
|
|
1997 | + return false;
|
|
2066 | 1998 | }
|
2067 | 1999 | |
2068 | 2000 | void wxMacCoreGraphicsContext::BeginLayer(wxDouble opacity)
|
... | ... | @@ -2112,8 +2044,18 @@ void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion ) |
2112 | 2044 | m_clipRgn.reset(mutableShape);
|
2113 | 2045 | }
|
2114 | 2046 | #else
|
2115 | - // allow usage as measuring context
|
|
2116 | - // wxASSERT_MSG( m_cgContext != nullptr, "Needs a valid context for clipping" );
|
|
2047 | + std::vector<CGRect> rects;
|
|
2048 | + wxRegionIterator ri(region);
|
|
2049 | + while (ri)
|
|
2050 | + {
|
|
2051 | + rects.push_back(CGRectMake( (CGFloat) ri.GetX() , (CGFloat) ri.GetY() , (CGFloat) ri.GetW() , (CGFloat) ri.GetH() ));
|
|
2052 | + ++ri;
|
|
2053 | + }
|
|
2054 | + |
|
2055 | + if ( m_cgContext )
|
|
2056 | + {
|
|
2057 | + CGContextClipToRects( m_cgContext, rects.data(), rects.size() );
|
|
2058 | + }
|
|
2117 | 2059 | #endif
|
2118 | 2060 | CheckInvariants();
|
2119 | 2061 | }
|
... | ... | @@ -2444,16 +2386,11 @@ void wxMacCoreGraphicsContext::Rotate( wxDouble angle ) |
2444 | 2386 | |
2445 | 2387 | void wxMacCoreGraphicsContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
2446 | 2388 | {
|
2447 | -#if wxOSX_USE_COCOA
|
|
2448 | 2389 | if (EnsureIsValid())
|
2449 | 2390 | {
|
2450 | 2391 | CGRect r = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h );
|
2451 | - wxOSXDrawNSImage( m_cgContext, &r, bmp.GetNSImage(), m_composition);
|
|
2392 | + wxOSXDrawImage( m_cgContext, &r, bmp.OSXGetImage(), m_composition);
|
|
2452 | 2393 | }
|
2453 | -#else
|
|
2454 | - wxGraphicsBitmap bitmap = GetRenderer()->CreateBitmap(bmp);
|
|
2455 | - DrawBitmap(bitmap, x, y, w, h);
|
|
2456 | -#endif
|
|
2457 | 2394 | }
|
2458 | 2395 | |
2459 | 2396 | void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
... | ... | @@ -2508,12 +2445,10 @@ void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDoubl |
2508 | 2445 | if (m_composition == wxCOMPOSITION_DEST)
|
2509 | 2446 | return;
|
2510 | 2447 | |
2511 | -#if wxOSX_USE_COCOA
|
|
2512 | 2448 | {
|
2513 | 2449 | CGRect r = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h );
|
2514 | - wxOSXDrawNSImage( m_cgContext, &r, icon.GetNSImage(), m_composition);
|
|
2450 | + wxOSXDrawImage( m_cgContext, &r, icon.OSXGetImage(), m_composition);
|
|
2515 | 2451 | }
|
2516 | -#endif
|
|
2517 | 2452 | |
2518 | 2453 | CheckInvariants();
|
2519 | 2454 | }
|
... | ... | @@ -58,6 +58,7 @@ bool wxStatusBarMac::Create(wxWindow *parent, wxWindowID id, |
58 | 58 | const wxString& name)
|
59 | 59 | {
|
60 | 60 | SetBackgroundStyle( wxBG_STYLE_TRANSPARENT );
|
61 | + InitCornerInset();
|
|
61 | 62 | |
62 | 63 | if ( !wxStatusBarGeneric::Create( parent, id, style, name ) )
|
63 | 64 | return false;
|
... | ... | @@ -66,7 +67,6 @@ bool wxStatusBarMac::Create(wxWindow *parent, wxWindowID id, |
66 | 67 | SetWindowVariant( wxWINDOW_VARIANT_SMALL );
|
67 | 68 | |
68 | 69 | InitColours();
|
69 | - InitCornerInset();
|
|
70 | 70 | |
71 | 71 | return true;
|
72 | 72 | }
|
... | ... | @@ -184,19 +184,25 @@ WXImage wxOSXGetWXImageFromCGColor(CGColorRef /*col*/) |
184 | 184 | |
185 | 185 | #if wxOSX_USE_IPHONE
|
186 | 186 | |
187 | -wxBitmapBundle wxOSXCreateSystemBitmapBundle(const wxString& name, const wxString &client, const wxSize& size)
|
|
187 | +WXImage wxOSXGetSystemImage(const wxString& name)
|
|
188 | 188 | {
|
189 | -#if 1
|
|
190 | - // unfortunately this only accesses images in the app bundle, not the system wide globals
|
|
191 | 189 | wxCFStringRef cfname(name);
|
192 | - return wxOSXMakeBundleFromImage( [UIImage imageNamed:cfname.AsNSString()] );
|
|
193 | -#else
|
|
194 | - return wxNullBitmap;
|
|
195 | -#endif
|
|
196 | -}
|
|
197 | 190 | |
191 | +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
|
|
192 | + if ( WX_IS_IOS_AVAILABLE(13, 0) )
|
|
193 | + {
|
|
194 | + UIImage* image = [UIImage systemImageNamed:cfname.AsNSString()];
|
|
195 | + if ( image )
|
|
196 | + return image;
|
|
197 | + }
|
|
198 | 198 | #endif
|
199 | 199 | |
200 | + UIImage* image = [UIImage imageNamed:cfname.AsNSString()];
|
|
201 | + return image;
|
|
202 | + |
|
203 | +}
|
|
204 | +#endif // wxOSX_USE_IPHONE
|
|
205 | + |
|
200 | 206 | #if wxOSX_USE_COCOA
|
201 | 207 | |
202 | 208 | WXImage wxOSXGetSystemImage(const wxString& name)
|
... | ... | @@ -216,18 +222,26 @@ WXImage wxOSXGetSystemImage(const wxString& name) |
216 | 222 | return nsimage;
|
217 | 223 | }
|
218 | 224 | |
219 | -wxBitmapBundle wxOSXCreateSystemBitmapBundle(const wxString& name, const wxString &WXUNUSED(client), const wxSize& WXUNUSED(sizeHint))
|
|
225 | +#endif // wxOSX_USE_COCOA
|
|
226 | + |
|
227 | +wxBitmapBundle wxOSXCreateSystemBitmapBundle(const wxString& name, const wxSize& size)
|
|
220 | 228 | {
|
221 | - NSImage* nsimage = wxOSXGetSystemImage(name);
|
|
229 | + WXImage nsimage = wxOSXGetSystemImage(name);
|
|
222 | 230 | if ( nsimage )
|
223 | 231 | {
|
232 | + if ( size != wxDefaultSize )
|
|
233 | + {
|
|
234 | +#if wxOSX_USE_COCOA
|
|
235 | + [nsimage setSize:NSMakeSize(size.x,size.y)];
|
|
236 | +#else
|
|
237 | + // determine whether we should scale the image
|
|
238 | +#endif
|
|
239 | + }
|
|
224 | 240 | return wxOSXMakeBundleFromImage( nsimage );
|
225 | 241 | }
|
226 | 242 | return wxNullBitmap;
|
227 | 243 | }
|
228 | 244 | |
229 | -#endif
|
|
230 | - |
|
231 | 245 | WXImage wxOSXGetImageFromCGImage( CGImageRef image, double scaleFactor, bool isTemplate )
|
232 | 246 | {
|
233 | 247 | #if wxOSX_USE_COCOA
|
... | ... | @@ -259,6 +273,11 @@ WX_NSImage WXDLLIMPEXP_CORE wxOSXGetNSImageFromCFURL( CFURLRef urlref ) |
259 | 273 | [newImage autorelease];
|
260 | 274 | return( newImage );
|
261 | 275 | }
|
276 | + |
|
277 | +WXImage wxOSXGetIconForType(OSType type )
|
|
278 | +{
|
|
279 | + return [[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode(type)];
|
|
280 | +}
|
|
262 | 281 | #endif
|
263 | 282 | |
264 | 283 | CGImageRef WXDLLIMPEXP_CORE wxOSXGetCGImageFromImage( WXImage nsimage, CGRect* r, CGContextRef cg)
|
... | ... | @@ -362,21 +381,18 @@ namespace |
362 | 381 | #endif
|
363 | 382 | } // anonymous namespace
|
364 | 383 | |
365 | -void WXDLLIMPEXP_CORE wxOSXDrawNSImage(
|
|
366 | - CGContextRef inContext,
|
|
367 | - const CGRect * inBounds,
|
|
368 | - WXImage inImage,
|
|
369 | - wxCompositionMode composition)
|
|
384 | +void WXDLLIMPEXP_CORE wxOSXDrawImage(CGContextRef inContext, const CGRect* inBounds, WXImage inImage, wxCompositionMode composition)
|
|
370 | 385 | {
|
371 | 386 | if (inImage != nil)
|
372 | 387 | {
|
373 | 388 | CGContextSaveGState(inContext);
|
389 | + |
|
390 | +#if wxOSX_USE_COCOA
|
|
374 | 391 | CGContextTranslateCTM(inContext, inBounds->origin.x, inBounds->origin.y + inBounds->size.height);
|
375 | 392 | CGRect r = *inBounds;
|
376 | 393 | r.origin.x = r.origin.y = 0;
|
377 | 394 | CGContextScaleCTM(inContext, 1, -1);
|
378 | 395 | |
379 | -#if wxOSX_USE_COCOA
|
|
380 | 396 | NSGraphicsContext *previousContext = [NSGraphicsContext currentContext];
|
381 | 397 | NSGraphicsContext *nsGraphicsContext = [NSGraphicsContext graphicsContextWithCGContext:inContext flipped:NO];
|
382 | 398 | [NSGraphicsContext setCurrentContext:nsGraphicsContext];
|
... | ... | @@ -384,7 +400,11 @@ void WXDLLIMPEXP_CORE wxOSXDrawNSImage( |
384 | 400 | [inImage drawInRect:NSRectFromCGRect(r) fromRect:NSZeroRect operation:wxOSXNSCompositionFromWXComposition(composition) fraction:1.0];
|
385 | 401 | [NSGraphicsContext setCurrentContext:previousContext];
|
386 | 402 | #else
|
387 | - CGContextDrawImage(inContext, r, [inImage CGImage]);
|
|
403 | + UIGraphicsPushContext(inContext);
|
|
404 | + wxInt32 blendMode;
|
|
405 | + if ( wxOSXGetCGBlendMode(composition, blendMode ) )
|
|
406 | + [inImage drawInRect:*inBounds blendMode: (CGBlendMode) blendMode alpha:1.0];
|
|
407 | + UIGraphicsPopContext();
|
|
388 | 408 | #endif
|
389 | 409 | CGContextRestoreGState(inContext);
|
390 | 410 | |
... | ... | @@ -400,24 +420,6 @@ double wxOSXGetMainScreenContentScaleFactor() |
400 | 420 | #endif
|
401 | 421 | }
|
402 | 422 | |
403 | -WXImage wxOSXGetIconForType(OSType type )
|
|
404 | -{
|
|
405 | -#if wxOSX_USE_COCOA
|
|
406 | - return [[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode(type)];
|
|
407 | -#else
|
|
408 | - return nullptr;
|
|
409 | -#endif
|
|
410 | -}
|
|
411 | - |
|
412 | -void wxOSXSetImageSize(WXImage image, CGFloat width, CGFloat height)
|
|
413 | -{
|
|
414 | -#if wxOSX_USE_COCOA
|
|
415 | - [image setSize:NSMakeSize(width, height)];
|
|
416 | -#else
|
|
417 | - // TODO
|
|
418 | -#endif
|
|
419 | -}
|
|
420 | - |
|
421 | 423 | double wxOSXGetImageScaleFactor(WXImage image)
|
422 | 424 | {
|
423 | 425 | #if wxOSX_USE_COCOA
|
... | ... | @@ -81,81 +81,81 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) |
81 | 81 | |
82 | 82 | switch ( index )
|
83 | 83 | {
|
84 | - case wxSYS_COLOUR_WINDOW:
|
|
85 | - sysColor = [UIColor systemBackgroundColor];
|
|
86 | - break ;
|
|
87 | - case wxSYS_COLOUR_SCROLLBAR :
|
|
88 | - case wxSYS_COLOUR_BACKGROUND:
|
|
89 | - case wxSYS_COLOUR_ACTIVECAPTION:
|
|
90 | - case wxSYS_COLOUR_INACTIVECAPTION:
|
|
84 | + case wxSYS_COLOUR_SCROLLBAR:
|
|
85 | + sysColor = [UIColor systemBackgroundColor]; // color of slot
|
|
86 | + break;
|
|
87 | + case wxSYS_COLOUR_DESKTOP: // No idea how to get desktop background
|
|
88 | + // fall through, window background is reasonable
|
|
89 | + case wxSYS_COLOUR_ACTIVECAPTION: // No idea how to get this
|
|
90 | + // fall through, window background is reasonable
|
|
91 | + case wxSYS_COLOUR_INACTIVECAPTION: // No idea how to get this
|
|
92 | + // fall through, window background is reasonable
|
|
91 | 93 | case wxSYS_COLOUR_MENU:
|
94 | + case wxSYS_COLOUR_MENUBAR:
|
|
92 | 95 | case wxSYS_COLOUR_WINDOWFRAME:
|
93 | 96 | case wxSYS_COLOUR_ACTIVEBORDER:
|
94 | 97 | case wxSYS_COLOUR_INACTIVEBORDER:
|
98 | + case wxSYS_COLOUR_GRADIENTACTIVECAPTION:
|
|
99 | + case wxSYS_COLOUR_GRADIENTINACTIVECAPTION:
|
|
100 | + sysColor = [UIColor systemBackgroundColor];
|
|
101 | + break;
|
|
102 | + case wxSYS_COLOUR_WINDOW:
|
|
103 | + sysColor = [UIColor systemBackgroundColor];
|
|
104 | + break;
|
|
105 | + case wxSYS_COLOUR_GRIDLINES:
|
|
106 | + sysColor = [UIColor separatorColor];
|
|
107 | + break;
|
|
95 | 108 | case wxSYS_COLOUR_BTNFACE:
|
96 | - case wxSYS_COLOUR_MENUBAR:
|
|
97 | - sysColor = [UIColor systemFillColor];
|
|
98 | - break ;
|
|
99 | - |
|
100 | - case wxSYS_COLOUR_LISTBOX :
|
|
101 | - sysColor = [UIColor whiteColor];
|
|
102 | - break ;
|
|
103 | - |
|
109 | + sysColor = [UIColor systemBackgroundColor];
|
|
110 | + break;
|
|
111 | + case wxSYS_COLOUR_LISTBOX:
|
|
112 | + sysColor = [UIColor systemBackgroundColor];
|
|
113 | + break;
|
|
104 | 114 | case wxSYS_COLOUR_BTNSHADOW:
|
115 | + case wxSYS_COLOUR_3DDKSHADOW:
|
|
105 | 116 | sysColor = [UIColor systemFillColor];
|
106 | - break ;
|
|
107 | - |
|
117 | + break;
|
|
108 | 118 | case wxSYS_COLOUR_BTNTEXT:
|
109 | 119 | case wxSYS_COLOUR_MENUTEXT:
|
110 | 120 | case wxSYS_COLOUR_WINDOWTEXT:
|
111 | 121 | case wxSYS_COLOUR_CAPTIONTEXT:
|
112 | - case wxSYS_COLOUR_INFOTEXT:
|
|
113 | 122 | case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
|
123 | + case wxSYS_COLOUR_INFOTEXT:
|
|
114 | 124 | case wxSYS_COLOUR_LISTBOXTEXT:
|
115 | 125 | sysColor = [UIColor labelColor];
|
116 | - break ;
|
|
117 | - |
|
126 | + break;
|
|
118 | 127 | case wxSYS_COLOUR_HIGHLIGHT:
|
119 | - {
|
|
120 | - sysColor = [UIColor lightTextColor];
|
|
121 | - }
|
|
122 | - break ;
|
|
123 | - |
|
128 | + sysColor = [UIColor systemBackgroundColor];
|
|
129 | + break;
|
|
124 | 130 | case wxSYS_COLOUR_BTNHIGHLIGHT:
|
131 | + sysColor = [UIColor systemBackgroundColor];
|
|
132 | + break;
|
|
125 | 133 | case wxSYS_COLOUR_GRAYTEXT:
|
126 | - sysColor = [UIColor lightTextColor];
|
|
127 | - break ;
|
|
128 | - |
|
129 | - case wxSYS_COLOUR_3DDKSHADOW:
|
|
130 | - sysColor = [UIColor darkTextColor];
|
|
131 | - break ;
|
|
132 | - |
|
134 | + sysColor = [UIColor secondaryLabelColor];
|
|
135 | + break;
|
|
133 | 136 | case wxSYS_COLOUR_3DLIGHT:
|
134 | - sysColor = [UIColor lightTextColor];
|
|
135 | - break ;
|
|
136 | - |
|
137 | - case wxSYS_COLOUR_HIGHLIGHTTEXT :
|
|
138 | - case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT :
|
|
139 | - sysColor = [UIColor whiteColor];
|
|
140 | - break ;
|
|
141 | - |
|
142 | - case wxSYS_COLOUR_INFOBK :
|
|
143 | - // we don't have a way to detect tooltip color, so use the
|
|
144 | - // standard value used at least on 10.4:
|
|
145 | - sysColor = [UIColor systemFillColor];
|
|
146 | - break ;
|
|
137 | + sysColor = [UIColor secondaryLabelColor];
|
|
138 | + break;
|
|
139 | + case wxSYS_COLOUR_HIGHLIGHTTEXT:
|
|
140 | + sysColor = [UIColor labelColor];
|
|
141 | + break;
|
|
142 | + case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT:
|
|
143 | + sysColor = [UIColor systemBackgroundColor];
|
|
144 | + break;
|
|
145 | + case wxSYS_COLOUR_INFOBK:
|
|
146 | + // tooltip (bogus)
|
|
147 | + sysColor = [UIColor systemBackgroundColor];
|
|
148 | + break;
|
|
147 | 149 | case wxSYS_COLOUR_APPWORKSPACE:
|
150 | + // MDI window color (bogus)
|
|
148 | 151 | sysColor = [UIColor systemBackgroundColor];
|
149 | - break ;
|
|
150 | - |
|
152 | + break;
|
|
151 | 153 | case wxSYS_COLOUR_HOTLIGHT:
|
152 | - case wxSYS_COLOUR_GRADIENTACTIVECAPTION:
|
|
153 | - case wxSYS_COLOUR_GRADIENTINACTIVECAPTION:
|
|
154 | + sysColor = [UIColor linkColor];
|
|
155 | + break;
|
|
154 | 156 | case wxSYS_COLOUR_MENUHILIGHT:
|
155 | - // TODO:
|
|
156 | - sysColor = [UIColor whiteColor];
|
|
157 | - break ;
|
|
158 | - |
|
157 | + sysColor = [UIColor linkColor];
|
|
158 | + break;
|
|
159 | 159 | default:
|
160 | 160 | if(index>=wxSYS_COLOUR_MAX)
|
161 | 161 | {
|
—
View it on GitLab.
You're receiving this email because of your account on gitlab.com. Manage all notifications · Help