[Git][wxwidgets/wxwidgets][master] OSX make iOS and macOS share more drawing code (#25860)

1 view
Skip to first unread message

Vadim Zeitlin (@_VZ_)

unread,
Oct 7, 2025, 6:53:05 AMOct 7
to wx-commi...@googlegroups.com

Vadim Zeitlin pushed to branch master at wxWidgets / wxWidgets

Commits:

  • 20ff4627
    by Stefan Csomor at 2025-10-07T12:26:41+02:00
    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

9 changed files:

Changes:

  • include/wx/osx/core/private.h
    ... ... @@ -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
    

  • include/wx/osx/private/available.h
    ... ... @@ -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
     
    

  • src/common/dcgraph.cpp
    ... ... @@ -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
     
    

  • src/generic/regiong.cpp
    ... ... @@ -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
     
    

  • src/osx/artmac.cpp
    ... ... @@ -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
     // ----------------------------------------------------------------------------
    

  • src/osx/carbon/graphics.cpp
    ... ... @@ -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 &region )
    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
     }
    

  • src/osx/carbon/statbrma.cpp
    ... ... @@ -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
     }
    

  • src/osx/carbon/utilscocoa.mm
    ... ... @@ -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
    

  • src/osx/iphone/settings.mm
    ... ... @@ -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 Notification message regarding https://gitlab.com/wxwidgets/wxwidgets/-/commit/20ff462703a327b0d2b5c344e71dbf23b2a88610 at 1759834376

Reply all
Reply to author
Forward
0 new messages