Exclude formatting chars from text width approximation.
Fixes https://gitlab.com/kicad/code/kicad/issues/9080
This commit is contained in:
parent
6818539f6d
commit
59c15842f8
|
@ -452,7 +452,7 @@ wxString EscapeHTML( const wxString& aString )
|
||||||
{
|
{
|
||||||
wxString converted;
|
wxString converted;
|
||||||
|
|
||||||
for( wxUniChar c: aString )
|
for( wxUniChar c : aString )
|
||||||
{
|
{
|
||||||
if( c == '\"' )
|
if( c == '\"' )
|
||||||
converted += """;
|
converted += """;
|
||||||
|
@ -480,6 +480,90 @@ bool NoPrintableChars( const wxString& aString )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of printable (ie: non-formatting) chars. Used to approximate rendered
|
||||||
|
* text size when speed is more important than accuracy.
|
||||||
|
*/
|
||||||
|
int PrintableCharCount( const wxString& aString )
|
||||||
|
{
|
||||||
|
int char_count = 0;
|
||||||
|
int overbarDepth = -1;
|
||||||
|
int superSubDepth = -1;
|
||||||
|
int braceNesting = 0;
|
||||||
|
|
||||||
|
for( auto chIt = aString.begin(), end = aString.end(); chIt < end; ++chIt )
|
||||||
|
{
|
||||||
|
if( *chIt == '\t' )
|
||||||
|
{
|
||||||
|
// We don't format tabs in bitmap text (where this is currently used), so just
|
||||||
|
// drop them from the count.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if( *chIt == '^' && superSubDepth == -1 )
|
||||||
|
{
|
||||||
|
auto lookahead = chIt;
|
||||||
|
|
||||||
|
if( ++lookahead != end && *lookahead == '{' )
|
||||||
|
{
|
||||||
|
chIt = lookahead;
|
||||||
|
superSubDepth = braceNesting;
|
||||||
|
braceNesting++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( *chIt == '_' && superSubDepth == -1 )
|
||||||
|
{
|
||||||
|
auto lookahead = chIt;
|
||||||
|
|
||||||
|
if( ++lookahead != end && *lookahead == '{' )
|
||||||
|
{
|
||||||
|
chIt = lookahead;
|
||||||
|
superSubDepth = braceNesting;
|
||||||
|
braceNesting++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( *chIt == '~' && overbarDepth == -1 )
|
||||||
|
{
|
||||||
|
auto lookahead = chIt;
|
||||||
|
|
||||||
|
if( ++lookahead != end && *lookahead == '{' )
|
||||||
|
{
|
||||||
|
chIt = lookahead;
|
||||||
|
overbarDepth = braceNesting;
|
||||||
|
braceNesting++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( *chIt == '{' )
|
||||||
|
{
|
||||||
|
braceNesting++;
|
||||||
|
}
|
||||||
|
else if( *chIt == '}' )
|
||||||
|
{
|
||||||
|
if( braceNesting > 0 )
|
||||||
|
braceNesting--;
|
||||||
|
|
||||||
|
if( braceNesting == superSubDepth )
|
||||||
|
{
|
||||||
|
superSubDepth = -1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( braceNesting == overbarDepth )
|
||||||
|
{
|
||||||
|
overbarDepth = -1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return char_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
char* StrPurge( char* text )
|
char* StrPurge( char* text )
|
||||||
{
|
{
|
||||||
static const char whitespace[] = " \t\n\r\f\v";
|
static const char whitespace[] = " \t\n\r\f\v";
|
||||||
|
|
|
@ -133,6 +133,12 @@ char* GetLine( FILE* aFile, char* Line, int* LineNum = nullptr, int SizeLine = 2
|
||||||
*/
|
*/
|
||||||
bool NoPrintableChars( const wxString& aString );
|
bool NoPrintableChars( const wxString& aString );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of printable (ie: non-formatting) chars. Used to approximate rendered
|
||||||
|
* text size when speed is more important than accuracy.
|
||||||
|
*/
|
||||||
|
int PrintableCharCount( const wxString& aString );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove leading and training spaces, tabs and end of line chars in \a text
|
* Remove leading and training spaces, tabs and end of line chars in \a text
|
||||||
*
|
*
|
||||||
|
|
|
@ -778,8 +778,8 @@ void PCB_PAINTER::draw( const PCB_VIA* aVia, int aLayer )
|
||||||
|
|
||||||
wxString netname = UnescapeString( aVia->GetShortNetname() );
|
wxString netname = UnescapeString( aVia->GetShortNetname() );
|
||||||
|
|
||||||
// calculate the size of net name text:
|
// approximate the size of net name text:
|
||||||
double tsize = 1.5 * size / netname.Length();
|
double tsize = 1.5 * size / PrintableCharCount( netname );
|
||||||
tsize = std::min( tsize, size );
|
tsize = std::min( tsize, size );
|
||||||
|
|
||||||
// Use a smaller text size to handle interline, pen size..
|
// Use a smaller text size to handle interline, pen size..
|
||||||
|
@ -960,8 +960,8 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
|
||||||
// position to display 2 lines
|
// position to display 2 lines
|
||||||
if( displayNetname && m_pcbSettings.m_padNumbers )
|
if( displayNetname && m_pcbSettings.m_padNumbers )
|
||||||
{
|
{
|
||||||
size = size / 2.0;
|
size = size / 2.5;
|
||||||
textpos.y = size / 2.0;
|
textpos.y = size / 1.7;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( displayNetname )
|
if( displayNetname )
|
||||||
|
@ -974,11 +974,11 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
|
||||||
else if( pinType == wxT( "free" ) && netname.StartsWith( wxT( "unconnected-(" ) ) )
|
else if( pinType == wxT( "free" ) && netname.StartsWith( wxT( "unconnected-(" ) ) )
|
||||||
netname = "*";
|
netname = "*";
|
||||||
|
|
||||||
// calculate the size of net name text:
|
// approximate the size of net name text:
|
||||||
double tsize = 1.5 * padsize.x / netname.Length();
|
double tsize = 1.5 * padsize.x / PrintableCharCount( netname );
|
||||||
tsize = std::min( tsize, size );
|
tsize = std::min( tsize, size );
|
||||||
|
|
||||||
// Use a smaller text size to handle interline, pen size..
|
// Use a smaller text size to handle interline, pen size...
|
||||||
tsize *= 0.7;
|
tsize *= 0.7;
|
||||||
VECTOR2D namesize( tsize, tsize );
|
VECTOR2D namesize( tsize, tsize );
|
||||||
|
|
||||||
|
@ -991,10 +991,12 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
|
||||||
{
|
{
|
||||||
const wxString& padNumber = aPad->GetNumber();
|
const wxString& padNumber = aPad->GetNumber();
|
||||||
textpos.y = -textpos.y;
|
textpos.y = -textpos.y;
|
||||||
double tsize = 1.5 * padsize.x / padNumber.Length();
|
|
||||||
|
// approximate the size of the pad number text:
|
||||||
|
double tsize = 1.5 * padsize.x / PrintableCharCount( padNumber );
|
||||||
tsize = std::min( tsize, size );
|
tsize = std::min( tsize, size );
|
||||||
|
|
||||||
// Use a smaller text size to handle interline, pen size..
|
// Use a smaller text size to handle interline, pen size...
|
||||||
tsize *= 0.7;
|
tsize *= 0.7;
|
||||||
tsize = std::min( tsize, size );
|
tsize = std::min( tsize, size );
|
||||||
VECTOR2D numsize( tsize, tsize );
|
VECTOR2D numsize( tsize, tsize );
|
||||||
|
@ -1665,7 +1667,7 @@ void PCB_PAINTER::draw( const PCB_GROUP* aGroup, int aLayer )
|
||||||
wxPoint textOffset = wxPoint( width.x / 2, - KiROUND( textSize * 0.5 ) );
|
wxPoint textOffset = wxPoint( width.x / 2, - KiROUND( textSize * 0.5 ) );
|
||||||
wxPoint titleHeight = wxPoint( 0, KiROUND( textSize * 2.0 ) );
|
wxPoint titleHeight = wxPoint( 0, KiROUND( textSize * 2.0 ) );
|
||||||
|
|
||||||
if( !name.IsEmpty() && (int) aGroup->GetName().Length() * textSize < bbox.GetWidth() )
|
if( PrintableCharCount( name ) * textSize < bbox.GetWidth() )
|
||||||
{
|
{
|
||||||
m_gal->DrawLine( topLeft, topLeft - titleHeight );
|
m_gal->DrawLine( topLeft, topLeft - titleHeight );
|
||||||
m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
|
m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
|
||||||
|
|
Loading…
Reference in New Issue