⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dc.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    ::TextFace( m_font.MacGetFontStyle() ) ;    m_macFontInstalled = true ;    m_macBrushInstalled = false ;    m_macPenInstalled = false ;    RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel());    RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel());    ::RGBForeColor( &forecolor );    ::RGBBackColor( &backcolor );    // TODO:    short mode = patCopy ;    switch ( m_logicalFunction )    {    case wxCOPY:       // src        mode = patCopy ;        break ;    case wxINVERT:     // NOT dst        ::PenPat(GetQDGlobalsBlack(&blackColor));        mode = patXor ;        break ;    case wxXOR:        // src XOR dst        mode = patXor ;        break ;    case wxOR_REVERSE: // src OR (NOT dst)        mode = notPatOr ;        break ;    case wxSRC_INVERT: // (NOT src)        mode = notPatCopy ;        break ;    case wxAND: // src AND dst        mode = adMin ;        break ;    // TODO: unsupported    case wxCLEAR:      // 0    case wxAND_REVERSE:// src AND (NOT dst)    case wxAND_INVERT: // (NOT src) AND dst    case wxNO_OP:      // dst    case wxNOR:        // (NOT src) AND (NOT dst)    case wxEQUIV:      // (NOT src) XOR dst    case wxOR_INVERT:  // (NOT src) OR dst    case wxNAND:       // (NOT src) OR (NOT dst)    case wxOR:         // src OR dst    case wxSET:        // 1        //        case wxSRC_OR:     // source _bitmap_ OR destination        //        case wxSRC_AND:     // source _bitmap_ AND destination        break ;    default:        break ;    }    ::PenMode( mode ) ;    OSStatus status = noErr ;    status = ATSUCreateAndCopyStyle( (ATSUStyle) m_font.MacGetATSUStyle() , (ATSUStyle*) &m_macATSUIStyle ) ;    wxASSERT_MSG( status == noErr , wxT("couldn't set create ATSU style") ) ;    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.MacGetFontSize()) ) ;    ATSUAttributeTag atsuTags[] =    {            kATSUSizeTag ,    } ;    ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =    {            sizeof( Fixed ) ,    } ;    ATSUAttributeValuePtr    atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =    {            &atsuSize ,    } ;    status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag) ,        atsuTags, atsuSizes, atsuValues);    wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") ) ;}Pattern gPatterns[] ={    // hatch patterns    { { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } } ,    { { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } } ,    { { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } } ,    { { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } } ,    { { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } } ,    { { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } } ,    { { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } } ,    // dash patterns    { { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } } , // DOT    { { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } } , // LONG_DASH    { { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } } , // SHORT_DASH    { { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } } , // DOT_DASH} ;static void wxMacGetPattern(int penStyle, Pattern *pattern){    int index = 0;  // solid pattern by default    switch (penStyle)    {        // hatches        case wxBDIAGONAL_HATCH:     index = 1; break;        case wxFDIAGONAL_HATCH:     index = 2; break;        case wxCROSS_HATCH:         index = 3; break;        case wxHORIZONTAL_HATCH:    index = 4; break;        case wxVERTICAL_HATCH:      index = 5; break;        case wxCROSSDIAG_HATCH:     index = 6; break;        // dashes        case wxDOT:                 index = 7; break;        case wxLONG_DASH:           index = 8; break;        case wxSHORT_DASH:          index = 9; break;        case wxDOT_DASH:            index = 10; break;        default:            break;    }    *pattern = gPatterns[index];}void wxDC::MacInstallPen() const{    wxCHECK_RET(Ok(), wxT("wxDC::MacInstallPen - invalid DC"));    //Pattern     blackColor;    //    if ( m_macPenInstalled )    //        return ;    RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());    RGBColor backcolor = MAC_WXCOLORREF( m_backgroundBrush.GetColour().GetPixel());    ::RGBForeColor( &forecolor );    ::RGBBackColor( &backcolor );    ::PenNormal() ;    // null means only one pixel, at whatever resolution    int penWidth = (int) (m_pen.GetWidth() * m_scaleX) ;    if ( penWidth == 0 )        penWidth = 1 ;    ::PenSize(penWidth, penWidth);    Pattern pat;    int penStyle = m_pen.GetStyle();    if (penStyle == wxUSER_DASH)    {        // FIXME: there should be exactly 8 items in the dash        wxDash* dash ;        int number = m_pen.GetDashes(&dash) ;        int index = 0;        for ( int i = 0 ; i < 8 ; ++i )        {            pat.pat[i] = dash[index] ;            if (index < number - 1)                index++;        }    }    else    {        wxMacGetPattern(penStyle, &pat);    }    ::PenPat(&pat);    // TODO:    short mode = patCopy ;    switch ( m_logicalFunction )    {    case wxCOPY:       // only foreground color, leave background (thus not patCopy)        mode = patOr ;        break ;    case wxINVERT:     // NOT dst        //            ::PenPat(GetQDGlobalsBlack(&blackColor));        mode = patXor ;        break ;    case wxXOR:        // src XOR dst        mode = patXor ;        break ;    case wxOR_REVERSE: // src OR (NOT dst)        mode = notPatOr ;        break ;    case wxSRC_INVERT: // (NOT src)        mode = notPatCopy ;        break ;    case wxAND: // src AND dst        mode = adMin ;        break ;    // TODO: unsupported    case wxCLEAR:      // 0    case wxAND_REVERSE:// src AND (NOT dst)    case wxAND_INVERT: // (NOT src) AND dst    case wxNO_OP:      // dst    case wxNOR:        // (NOT src) AND (NOT dst)    case wxEQUIV:      // (NOT src) XOR dst    case wxOR_INVERT:  // (NOT src) OR dst    case wxNAND:       // (NOT src) OR (NOT dst)    case wxOR:         // src OR dst    case wxSET:        // 1        //        case wxSRC_OR:     // source _bitmap_ OR destination        //        case wxSRC_AND:     // source _bitmap_ AND destination        break ;    default:        break ;    }    ::PenMode( mode ) ;    m_macPenInstalled = true ;    m_macBrushInstalled = false ;    m_macFontInstalled = false ;}void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background ){    Pattern whiteColor ;    if ( background.Ok() )    {        switch ( background.MacGetBrushKind() )        {            case kwxMacBrushTheme :                ::SetThemeBackground( background.MacGetTheme() , wxDisplayDepth() , true ) ;                break ;            case kwxMacBrushThemeBackground :            {                Rect extent ;                ThemeBackgroundKind bg = background.MacGetThemeBackground( &extent ) ;                ::ApplyThemeBackground( bg , &extent, kThemeStateActive , wxDisplayDepth() , true ) ;            }                break ;            case kwxMacBrushColour :            {                ::RGBBackColor( &MAC_WXCOLORREF( background.GetColour().GetPixel()) );                int brushStyle = background.GetStyle();                if (brushStyle == wxSOLID)                    ::BackPat(GetQDGlobalsWhite(&whiteColor));                else if (background.IsHatch())                {                    Pattern pat ;                    wxMacGetPattern(brushStyle, &pat);                    ::BackPat(&pat);                }                else                {                    ::BackPat(GetQDGlobalsWhite(&whiteColor));                }            }                break ;            default:                break ;        }    }}void wxDC::MacInstallBrush() const{    wxCHECK_RET(Ok(), wxT("Invalid DC"));    //    if ( m_macBrushInstalled )    //        return ;    Pattern     blackColor ;    bool backgroundTransparent = (GetBackgroundMode() == wxTRANSPARENT) ;    ::RGBForeColor( &MAC_WXCOLORREF( m_brush.GetColour().GetPixel()) );    ::RGBBackColor( &MAC_WXCOLORREF( m_backgroundBrush.GetColour().GetPixel()) );    int brushStyle = m_brush.GetStyle();    if (brushStyle == wxSOLID)    {        switch ( m_brush.MacGetBrushKind() )        {            case kwxMacBrushTheme :                {                    Pattern whiteColor ;                    ::BackPat(GetQDGlobalsWhite(&whiteColor));                    ::SetThemePen( m_brush.MacGetTheme() , wxDisplayDepth() , true ) ;                }            break ;            default :                ::PenPat(GetQDGlobalsBlack(&blackColor));                break ;        }    }    else if (m_brush.IsHatch())    {        Pattern pat ;        wxMacGetPattern(brushStyle, &pat);        ::PenPat(&pat);    }    else if ( m_brush.GetStyle() == wxSTIPPLE || m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE )    {        // we force this in order to be compliant with wxMSW        backgroundTransparent = false ;        // for these the text fore (and back for MASK_OPAQUE) colors are used        wxBitmap* bitmap = m_brush.GetStipple() ;        int width = bitmap->GetWidth() ;        int height = bitmap->GetHeight() ;        GWorldPtr gw = NULL ;        if ( m_brush.GetStyle() == wxSTIPPLE )            gw = MAC_WXHBITMAP(bitmap->GetHBITMAP(NULL))  ;        else            gw = MAC_WXHBITMAP(bitmap->GetMask()->GetHBITMAP()) ;        PixMapHandle gwpixmaphandle = GetGWorldPixMap( gw ) ;        LockPixels( gwpixmaphandle ) ;        bool isMonochrome = !IsPortColor( gw ) ;        if ( !isMonochrome )        {            if ( (**gwpixmaphandle).pixelSize == 1 )                isMonochrome = true ;        }        if ( isMonochrome && width == 8 && height == 8 )        {            ::RGBForeColor( &MAC_WXCOLORREF( m_textForegroundColour.GetPixel()) );            ::RGBForeColor( &MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()) );            BitMap* gwbitmap = (BitMap*) *gwpixmaphandle ; // since the color depth is 1 it is a BitMap            UInt8 *gwbits = (UInt8*) gwbitmap->baseAddr ;            int alignment = gwbitmap->rowBytes & 0x7FFF ;            Pattern pat ;            for ( int i = 0 ; i < 8 ; ++i )            {                pat.pat[i] = gwbits[i * alignment + 0] ;            }            UnlockPixels( GetGWorldPixMap( gw ) ) ;            ::PenPat( &pat ) ;        }        else        {            // this will be the code to handle power of 2 patterns, we will have to arrive at a nice            // caching scheme before putting this into production            Handle      image;            long        imageSize;            PixPatHandle pixpat = NewPixPat() ;            CopyPixMap(gwpixmaphandle, (**pixpat).patMap);            imageSize = GetPixRowBytes((**pixpat).patMap) *                ((**(**pixpat).patMap).bounds.bottom -                (**(**pixpat).patMap).bounds.top);            PtrToHand( (**gwpixmaphandle).baseAddr, &image, imageSize );            (**pixpat).patData = image;            if ( isMonochrome )            {                CTabHandle ctable = ((**((**pixpat).patMap)).pmTable) ;                ColorSpecPtr ctspec = (ColorSpecPtr) &(**ctable).ctTable ;                if ( ctspec[0].rgb.red == 0x0000 )                {                    ctspec[1].rgb = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()) ;                    ctspec[0].rgb = MAC_WXCOLORREF( m_textForegroundColour.GetPixel()) ;                }                else                {                    ctspec[0].rgb = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()) ;                    ctspec[1].rgb = MAC_WXCOLORREF( m_textForegroundColour.GetPixel()) ;                }                ::CTabChanged( ctable ) ;            }            ::PenPixPat(pixpat);            m_macForegroundPixMap = pixpat ;        }        UnlockPixels( gwpixmaphandle ) ;    }    else    {        ::PenPat(GetQDGlobalsBlack(&blackColor));    }    short mode = patCopy ;    switch ( m_logicalFunction )    {    case wxCOPY:       // src        if ( backgroundTransparent )            mode = patOr ;        else            mode = patCopy ;        break ;    case wxINVERT:     // NOT dst        if ( !backgroundTransparent )            ::PenPat(GetQDGlobalsBlack(&blackColor));        mode = patXor ;        break ;    case wxXOR:        // src XOR dst        mode = patXor ;        break ;    case wxOR_REVERSE: // src OR (NOT dst)        mode = notPatOr ;        break ;    case wxSRC_INVERT: // (NOT src)        mode = notPatCopy ;        break ;    case wxAND: // src AND dst        mode = adMin ;        break ;    // TODO: unsupported    case wxCLEAR:      // 0    case wxAND_REVERSE:// src AND (NOT dst)    case wxAND_INVERT: // (NOT src) AND dst    case wxNO_OP:      // dst    case wxNOR:        // (NOT src) AND (NOT dst)    case wxEQUIV:      // (NOT src) XOR dst    case wxOR_INVERT:  // (NOT src) OR dst    case wxNAND:       // (NOT src) OR (NOT dst)    case wxOR:         // src OR dst    case wxSET:        // 1        //        case wxSRC_OR:     // source _bitmap_ OR destination        //        case wxSRC_AND:     // source _bitmap_ AND destination        break ;    default:        break ;    }    ::PenMode( mode ) ;    m_macBrushInstalled = true ;    m_macPenInstalled = false ;    m_macFontInstal

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -