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

📄 dc.cpp

📁 Wxpython Implemented on Windows CE, Source code
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    &bounds,
                    &baseline );
                background.right = background.left + bounds.h ;
                background.bottom = background.top + bounds.v ;
                ::EraseRect( &background ) ;
            }
            ::DrawThemeTextBox( mString,
                kThemeCurrentPortFont,
                kThemeStateActive,
                false,
                &frame,
                teJustLeft,
                nil );
        }
        else
#endif
        {
            wxCharBuffer text = linetext.mb_str(wxConvLocal) ;
            if ( m_backgroundMode != wxTRANSPARENT )
            {
                Rect frame = { yy - fi.ascent + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy - fi.ascent + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
                short width = ::TextWidth( text , 0 , strlen(text) ) ;
                frame.right = frame.left + width ;

                ::EraseRect( &frame ) ;
            }
            ::DrawText( text , 0 , strlen(text) ) ;
         }
    }
    ::TextMode( srcOr ) ;
}

bool  wxDC::CanGetTextExtent() const
{
    wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));
    return true ;
}

void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height,
                            wxCoord *descent, wxCoord *externalLeading ,
                            wxFont *theFont ) const
{
    wxCHECK_RET(Ok(), wxT("Invalid DC"));
    wxMacFastPortSetter helper(this) ;
    wxFont formerFont = m_font ;
    if ( theFont )
    {
        // work around the constness
        *((wxFont*)(&m_font)) = *theFont ;
    }
    MacInstallFont() ;
    FontInfo fi ;
    ::GetFontInfo( &fi ) ;
#if TARGET_CARBON
    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
        useGetThemeText = false ;
#endif
    if ( height )
        *height = YDEV2LOGREL( fi.descent + fi.ascent ) ;
    if ( descent )
        *descent =YDEV2LOGREL( fi.descent );
    if ( externalLeading )
        *externalLeading = YDEV2LOGREL( fi.leading ) ;
    int length = strtext.length() ;

    int laststop = 0 ;
    int i = 0 ;
    int curwidth = 0 ;
    if ( width )
    {
        *width = 0 ;
#if 0 // apparently we don't have to do all that
        while( i < length )
        {
            if( strtext[i] == 13 || strtext[i] == 10)
            {
                wxString linetext = strtext.Mid( laststop , i - laststop ) ;
                if ( height )
                    *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;
#if TARGET_CARBON
                if ( useGetThemeText )
                {
                    Point bounds={0,0} ;
                    SInt16 baseline ;
                    wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
                    ::GetThemeTextDimensions( mString,
                        kThemeCurrentPortFont,
                        kThemeStateActive,
                        false,
                        &bounds,
                        &baseline );
                    curwidth = bounds.h ;
                }
                else
#endif
                {
                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ;
                    curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
                }
                if ( curwidth > *width )
                    *width = XDEV2LOGREL( curwidth ) ;
                laststop = i+1 ;
            }
            i++ ;
        }

        wxString linetext = strtext.Mid( laststop , i - laststop ) ;
#endif // 0
        wxString linetext = strtext ;
#if TARGET_CARBON
        if ( useGetThemeText )
        {
            Point bounds={0,0} ;
            SInt16 baseline ;
            wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
            ::GetThemeTextDimensions( mString,
                kThemeCurrentPortFont,
                kThemeStateActive,
                false,
                &bounds,
                &baseline );
            curwidth = bounds.h ;
        }
        else
#endif
        {
            wxCharBuffer text = linetext.mb_str(wxConvLocal) ;
            curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
        }
        if ( curwidth > *width )
            *width = XDEV2LOGREL( curwidth ) ;
    }
    if ( theFont )
    {
        // work around the constness
        *((wxFont*)(&m_font)) = formerFont ;
        m_macFontInstalled = false ;
    }
}


bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
{
    wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));

    widths.Empty();
    widths.Add(0, text.length());

    if (text.length() == 0)
        return false;

    wxMacFastPortSetter helper(this) ;
    MacInstallFont() ;
#if TARGET_CARBON
    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
        useGetThemeText = false ;

    if ( useGetThemeText )
    {
        // If anybody knows how to do this more efficiently yet still handle
        // the fractional glyph widths that may be present when using AA
        // fonts, please change it.  Currently it is measuring from the
        // begining of the string for each succeding substring, which is much
        // slower than this should be.
        for (size_t i=0; i<text.length(); i++)
        {
            wxString str(text.Left(i+1));
            Point bounds = {0,0};
            SInt16 baseline ;
            wxMacCFStringHolder mString(str, m_font.GetEncoding());
            ::GetThemeTextDimensions( mString,
                                      kThemeCurrentPortFont,
                                      kThemeStateActive,
                                      false,
                                      &bounds,
                                      &baseline );
            widths[i] = XDEV2LOGREL(bounds.h);
        }
    }
    else
#endif
    {
        wxCharBuffer buff = text.mb_str(wxConvLocal);
        size_t len = strlen(buff);
        short* measurements = new short[len+1];
        MeasureText(len, buff.data(), measurements);

        // Copy to widths, starting at measurements[1]
        // NOTE: this doesn't take into account any multi-byte characters
        // in buff, it probabkly should...
        for (size_t i=0; i<text.length(); i++)
            widths[i] = XDEV2LOGREL(measurements[i+1]);

        delete [] measurements;
    }

    return true;
}



wxCoord   wxDC::GetCharWidth(void) const
{
    wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
    wxMacFastPortSetter helper(this) ;
    MacInstallFont() ;
    int width = 0 ;
#if TARGET_CARBON
    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
    if ( UMAGetSystemVersion() < 0x1000 || ((wxFont*)&m_font)->GetNoAntiAliasing() )
        useGetThemeText = false ;
#endif
    char text[] = "g" ;
#if TARGET_CARBON
    if ( useGetThemeText )
    {
        Point bounds={0,0} ;
        SInt16 baseline ;
        CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text , 1 , CFStringGetSystemEncoding(), false ) ;
        ::GetThemeTextDimensions( mString,
            kThemeCurrentPortFont,
            kThemeStateActive,
            false,
            &bounds,
            &baseline );
        CFRelease( mString ) ;
        width = bounds.h ;
    }
    else
#endif
    {
        width = ::TextWidth( text , 0 , 1 ) ;
    }
    return YDEV2LOGREL(width) ;
}

wxCoord   wxDC::GetCharHeight(void) const
{
    wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
    wxMacFastPortSetter helper(this) ;
    MacInstallFont() ;
    FontInfo fi ;
    ::GetFontInfo( &fi ) ;
    return YDEV2LOGREL( fi.descent + fi.ascent );
}

void  wxDC::Clear(void)
{
    wxCHECK_RET(Ok(), wxT("Invalid DC"));
    wxMacFastPortSetter helper(this) ;
    Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
    if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)
    {
        ::PenNormal() ;
        //MacInstallBrush() ;
        MacSetupBackgroundForCurrentPort( m_backgroundBrush ) ;
        ::EraseRect( &rect ) ;
    }
}

void wxDC::MacInstallFont() const
{
    wxCHECK_RET(Ok(), wxT("Invalid DC"));
    //    if ( m_macFontInstalled )
    //        return ;
    Pattern blackColor ;
    MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
    if ( m_font.Ok() )
    {
        ::TextFont( m_font.GetMacFontNum() ) ;
        ::TextSize( (short)(m_scaleY * m_font.GetMacFontSize()) ) ;
        ::TextFace( m_font.GetMacFontStyle() ) ;
        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 );
    }
    else
    {
        FontFamilyID fontId ;
        Str255 fontName ;
        SInt16 fontSize ;
        Style fontStyle ;
        GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
        GetFNum( fontName, &fontId );
        ::TextFont( fontId ) ;
        ::TextSize( short(m_scaleY * fontSize) ) ;
        ::TextFace( fontStyle ) ;
        // todo reset after spacing changes - or store the current spacing somewhere
        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 );
    }
    short mode = patCopy ;
    // todo :
    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 ;
        // unsupported TODO
    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 ;
    }
    ::PenMode( mode ) ;
    OSStatus status = noErr ;
    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.GetMacFontSize()) ) ;
    Style qdStyle = m_font.GetMacFontStyle() ;
    ATSUFontID    atsuFont = m_font.GetMacATSUFontID() ;
    status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
    wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
    ATSUAttributeTag atsuTags[] =
    {
        kATSUFontTag ,
            kATSUSizeTag ,
            //        kATSUColorTag ,
            //        kATSUBaselineClassTag ,
            kATSUVerticalCharacterTag,
            kATSUQDBoldfaceTag ,
            kATSUQDItalicTag ,
            kATSUQDUnderlineTag ,
            kATSUQDCondensedTag ,
            kATSUQDExtendedTag ,
    } ;
    ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
    {
        sizeof( ATSUFontID ) ,
            sizeof( Fixed ) ,
            //        sizeof( RGBColor ) ,
            //        sizeof( BslnBaselineClass ) ,
            sizeof( ATSUVerticalCharacterType),
            sizeof( Boolean ) ,
            sizeof( Boolean ) ,
            sizeof( Boolean ) ,
            sizeof( Boolean ) ,
            sizeof( Boolean ) ,
    } ;
    Boolean kTrue = true ;
    Boolean kFalse = false ;
    //BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ;
    ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
    ATSUAttributeValuePtr    atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
    {
        &atsuFont ,
            &atsuSize ,
            //        &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) ,
            //        &kBaselineDefault ,
            &kHorizontal,
            (qdStyle & bold) ? &kTrue : &kFalse ,
 

⌨️ 快捷键说明

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