mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 18:23:15 +02:00
Simplify KiROUND using std::llround/clamp
Removes the bespoke rounding in favor of std::llround and std::clamp routines
This commit is contained in:
parent
4aa2047f45
commit
50c7aff3ff
@ -41,7 +41,7 @@ int GetPenSizeForBold( int aTextSize )
|
|||||||
|
|
||||||
int GetPenSizeForDemiBold( int aTextSize )
|
int GetPenSizeForDemiBold( int aTextSize )
|
||||||
{
|
{
|
||||||
return KiROUND( aTextSize / 6 );
|
return KiROUND( aTextSize / 6.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,11 +174,11 @@ void PANEL_SETUP_PINMAP::reBuildMatrixPanel()
|
|||||||
|
|
||||||
if( ( ii == jj ) && !m_initialized )
|
if( ( ii == jj ) && !m_initialized )
|
||||||
{
|
{
|
||||||
wxPoint textPos( x + KiROUND( bitmapSize.x / 2 ),
|
wxPoint textPos( x + KiROUND( bitmapSize.x / 2.0 ),
|
||||||
y - charSize.y * 2 );
|
y - charSize.y * 2 );
|
||||||
new wxStaticText( m_matrixPanel, wxID_ANY, CommentERC_V[ii], textPos );
|
new wxStaticText( m_matrixPanel, wxID_ANY, CommentERC_V[ii], textPos );
|
||||||
|
|
||||||
wxPoint calloutPos( x + KiROUND( bitmapSize.x / 2 ),
|
wxPoint calloutPos( x + KiROUND( bitmapSize.x / 2.0 ),
|
||||||
y - charSize.y );
|
y - charSize.y );
|
||||||
new wxStaticText( m_matrixPanel, wxID_ANY, "|", calloutPos );
|
new wxStaticText( m_matrixPanel, wxID_ANY, "|", calloutPos );
|
||||||
}
|
}
|
||||||
|
@ -1653,7 +1653,7 @@ SCH_TEXT* SCH_IO_EAGLE::loadLabel( const std::unique_ptr<ELABEL>& aLabel,
|
|||||||
|
|
||||||
if( aLabel->rot )
|
if( aLabel->rot )
|
||||||
{
|
{
|
||||||
for( int i = 0; i < KiROUND( aLabel->rot->degrees / 90 ) %4; ++i )
|
for( int i = 0; i < KiROUND( aLabel->rot->degrees / 90.0 ) %4; ++i )
|
||||||
label->Rotate90( false );
|
label->Rotate90( false );
|
||||||
|
|
||||||
if( aLabel->rot->mirror )
|
if( aLabel->rot->mirror )
|
||||||
|
@ -558,7 +558,7 @@ int SCH_PAINTER::getOperatingPointTextSize() const
|
|||||||
int screenTextSize = std::abs( (int) m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
|
int screenTextSize = std::abs( (int) m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
|
||||||
|
|
||||||
// 66% zoom-relative
|
// 66% zoom-relative
|
||||||
return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3 );
|
return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1272,7 +1272,7 @@ void SCH_PAINTER::drawAnchor( const VECTOR2I& aPos, bool aDrawingShadows )
|
|||||||
// In order for the anchors to be visible but unobtrusive, their size must factor in the
|
// In order for the anchors to be visible but unobtrusive, their size must factor in the
|
||||||
// current zoom level.
|
// current zoom level.
|
||||||
const MATRIX3x3D& matrix = m_gal->GetScreenWorldMatrix();
|
const MATRIX3x3D& matrix = m_gal->GetScreenWorldMatrix();
|
||||||
int radius = KiROUND( std::fabs( matrix.GetScale().x * TEXT_ANCHOR_SIZE ) / 25 )
|
int radius = KiROUND( std::fabs( matrix.GetScale().x * TEXT_ANCHOR_SIZE ) / 25.0 )
|
||||||
+ schIUScale.MilsToIU( TEXT_ANCHOR_SIZE );
|
+ schIUScale.MilsToIU( TEXT_ANCHOR_SIZE );
|
||||||
|
|
||||||
COLOR4D color = aDrawingShadows ? m_schSettings.GetLayerColor( LAYER_SELECTION_SHADOWS )
|
COLOR4D color = aDrawingShadows ? m_schSettings.GetLayerColor( LAYER_SELECTION_SHADOWS )
|
||||||
|
@ -1317,7 +1317,7 @@ bool SCH_SELECTION_TOOL::CollectHits( SCH_COLLECTOR& aCollector, const VECTOR2I&
|
|||||||
const std::vector<KICAD_T>& aScanTypes )
|
const std::vector<KICAD_T>& aScanTypes )
|
||||||
{
|
{
|
||||||
int pixelThreshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
|
int pixelThreshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
|
||||||
int gridThreshold = KiROUND( getView()->GetGAL()->GetGridSize().EuclideanNorm() / 2 );
|
int gridThreshold = KiROUND( getView()->GetGAL()->GetGridSize().EuclideanNorm() / 2.0 );
|
||||||
aCollector.m_Threshold = std::max( pixelThreshold, gridThreshold );
|
aCollector.m_Threshold = std::max( pixelThreshold, gridThreshold );
|
||||||
aCollector.m_ShowPinElectricalTypes = m_frame->GetRenderSettings()->m_ShowPinsElectricalType;
|
aCollector.m_ShowPinElectricalTypes = m_frame->GetRenderSettings()->m_ShowPinsElectricalType;
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ inline void InferBold( TEXT_ATTRIBUTES* aAttrs )
|
|||||||
*/
|
*/
|
||||||
inline int GetKnockoutTextMargin( const VECTOR2I& aSize, int aThickness )
|
inline int GetKnockoutTextMargin( const VECTOR2I& aSize, int aThickness )
|
||||||
{
|
{
|
||||||
return std::max( KiROUND( aThickness / 2 ), KiROUND( aSize.y / 9.0 ) );
|
return std::max( KiROUND( aThickness / 2.0 ), KiROUND( aSize.y / 9.0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to avoid directly including wx/log.h for the templated functions in kimath
|
* Helper to avoid directly including wx/log.h for the templated functions in kimath
|
||||||
@ -92,53 +93,38 @@ inline constexpr ret_type KiCheckedCast( in_type v )
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Round a floating point number to an integer using "round halfway cases away from zero".
|
* Round a numeric value to an integer using "round halfway cases away from zero" and
|
||||||
|
* clamp the result to the limits of the return type.
|
||||||
*
|
*
|
||||||
* In Debug build an assert fires if will not fit into the return type.
|
* In Debug build an assert fires if will not fit into the return type.
|
||||||
*/
|
*/
|
||||||
template <typename fp_type, typename ret_type = int>
|
template <typename fp_type, typename ret_type = int>
|
||||||
constexpr ret_type KiROUND( fp_type v, bool aQuiet = false )
|
constexpr ret_type KiROUND( fp_type v, bool aQuiet = false )
|
||||||
{
|
{
|
||||||
using max_ret = long long int;
|
using limits = std::numeric_limits<ret_type>;
|
||||||
fp_type ret = v < 0 ? v - 0.5 : v + 0.5;
|
|
||||||
|
|
||||||
if( ret > std::numeric_limits<ret_type>::max() )
|
|
||||||
{
|
|
||||||
if( !aQuiet )
|
|
||||||
{
|
|
||||||
kimathLogOverflow( double( v ), typeid( ret_type ).name() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::numeric_limits<ret_type>::max() - 1;
|
|
||||||
}
|
|
||||||
else if( ret < std::numeric_limits<ret_type>::lowest() )
|
|
||||||
{
|
|
||||||
if( !aQuiet )
|
|
||||||
{
|
|
||||||
kimathLogOverflow( double( v ), typeid( ret_type ).name() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( std::numeric_limits<ret_type>::is_signed )
|
|
||||||
return std::numeric_limits<ret_type>::lowest() + 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#if __cplusplus >= 202302L // isnan is not constexpr until C++23
|
#if __cplusplus >= 202302L // isnan is not constexpr until C++23
|
||||||
else if constexpr( std::is_floating_point_v<fp_type> )
|
if constexpr( std::is_floating_point_v<fp_type> )
|
||||||
{
|
{
|
||||||
if( std::isnan( v ) )
|
if( std::isnan( v ) )
|
||||||
{
|
{
|
||||||
if( !aQuiet )
|
if( !aQuiet )
|
||||||
{
|
|
||||||
kimathLogOverflow( double( v ), typeid( ret_type ).name() );
|
kimathLogOverflow( double( v ), typeid( ret_type ).name() );
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret_type( max_ret( ret ) );
|
long long rounded = std::llround( v );
|
||||||
|
long long clamped = std::clamp<long long>( rounded,
|
||||||
|
static_cast<long long>( limits::lowest() ),
|
||||||
|
static_cast<long long>( limits::max() ) );
|
||||||
|
|
||||||
|
if( !aQuiet && clamped != rounded )
|
||||||
|
kimathLogOverflow( double( v ), typeid( ret_type ).name() );
|
||||||
|
|
||||||
|
return static_cast<ret_type>( clamped );
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_WIMPLICIT_FLOAT_CONVERSION
|
#ifdef HAVE_WIMPLICIT_FLOAT_CONVERSION
|
||||||
|
@ -767,7 +767,7 @@ bool CONNECTIVITY_DATA::TestTrackEndpointDangling( PCB_TRACK* aTrack, bool aIgno
|
|||||||
// each end. If that's their only connection then they're still dangling.
|
// each end. If that's their only connection then they're still dangling.
|
||||||
|
|
||||||
PCB_LAYER_ID layer = aTrack->GetLayer();
|
PCB_LAYER_ID layer = aTrack->GetLayer();
|
||||||
int accuracy = KiROUND( aTrack->GetWidth() / 2 );
|
int accuracy = KiROUND( aTrack->GetWidth() / 2.0 );
|
||||||
int start_count = 0;
|
int start_count = 0;
|
||||||
int end_count = 0;
|
int end_count = 0;
|
||||||
|
|
||||||
|
@ -342,9 +342,9 @@ bool CN_ANCHOR::IsDangling() const
|
|||||||
return connected_count < minimal_count;
|
return connected_count < minimal_count;
|
||||||
|
|
||||||
if( Parent()->Type() == PCB_TRACE_T || Parent()->Type() == PCB_ARC_T )
|
if( Parent()->Type() == PCB_TRACE_T || Parent()->Type() == PCB_ARC_T )
|
||||||
accuracy = KiROUND( static_cast<const PCB_TRACK*>( Parent() )->GetWidth() / 2 );
|
accuracy = KiROUND( static_cast<const PCB_TRACK*>( Parent() )->GetWidth() / 2.0 );
|
||||||
else if( Parent()->Type() == PCB_SHAPE_T )
|
else if( Parent()->Type() == PCB_SHAPE_T )
|
||||||
accuracy = KiROUND( static_cast<const PCB_SHAPE*>( Parent() )->GetWidth() / 2 );
|
accuracy = KiROUND( static_cast<const PCB_SHAPE*>( Parent() )->GetWidth() / 2.0 );
|
||||||
|
|
||||||
// Items with multiple anchors have usually items connected to each anchor.
|
// Items with multiple anchors have usually items connected to each anchor.
|
||||||
// We want only the item count of this anchor point
|
// We want only the item count of this anchor point
|
||||||
|
@ -91,7 +91,7 @@ static int compute_pad_access_code( BOARD *aPcb, LSET aLayerMask )
|
|||||||
/* Convert and clamp a size from IU to decimils */
|
/* Convert and clamp a size from IU to decimils */
|
||||||
static int iu_to_d356(int iu, int clamp)
|
static int iu_to_d356(int iu, int clamp)
|
||||||
{
|
{
|
||||||
int val = KiROUND( iu / ( pcbIUScale.IU_PER_MILS / 10 ) );
|
int val = KiROUND( static_cast<double>( iu ) / ( pcbIUScale.IU_PER_MILS / 10.0 ) );
|
||||||
if( val > clamp ) return clamp;
|
if( val > clamp ) return clamp;
|
||||||
if( val < -clamp ) return -clamp;
|
if( val < -clamp ) return -clamp;
|
||||||
return val;
|
return val;
|
||||||
|
@ -739,7 +739,7 @@ void PCB_IO_EAGLE::loadPlain( wxXmlNode* aGraphics )
|
|||||||
pcbtxt->SetText( kicadText );
|
pcbtxt->SetText( kicadText );
|
||||||
|
|
||||||
double ratio = t.ratio ? *t.ratio : 8; // DTD says 8 is default
|
double ratio = t.ratio ? *t.ratio : 8; // DTD says 8 is default
|
||||||
int textThickness = KiROUND( t.size.ToPcbUnits() * ratio / 100 );
|
int textThickness = KiROUND( t.size.ToPcbUnits() * ratio / 100.0 );
|
||||||
pcbtxt->SetTextThickness( textThickness );
|
pcbtxt->SetTextThickness( textThickness );
|
||||||
pcbtxt->SetTextSize( kicad_fontsize( t.size, textThickness ) );
|
pcbtxt->SetTextSize( kicad_fontsize( t.size, textThickness ) );
|
||||||
pcbtxt->SetKeepUpright( false );
|
pcbtxt->SetKeepUpright( false );
|
||||||
@ -1033,7 +1033,7 @@ void PCB_IO_EAGLE::loadPlain( wxXmlNode* aGraphics )
|
|||||||
if( d.textsize )
|
if( d.textsize )
|
||||||
{
|
{
|
||||||
double ratio = 8; // DTD says 8 is default
|
double ratio = 8; // DTD says 8 is default
|
||||||
textThickness = KiROUND( d.textsize->ToPcbUnits() * ratio / 100 );
|
textThickness = KiROUND( d.textsize->ToPcbUnits() * ratio / 100.0 );
|
||||||
textSize = kicad_fontsize( *d.textsize, textThickness );
|
textSize = kicad_fontsize( *d.textsize, textThickness );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1710,7 +1710,7 @@ void PCB_IO_EAGLE::orientFPText( FOOTPRINT* aFootprint, const EELEMENT& e, PCB_T
|
|||||||
ratio = *a.ratio;
|
ratio = *a.ratio;
|
||||||
|
|
||||||
VECTOR2I fontz = aFPText->GetTextSize();
|
VECTOR2I fontz = aFPText->GetTextSize();
|
||||||
int textThickness = KiROUND( fontz.y * ratio / 100 );
|
int textThickness = KiROUND( fontz.y * ratio / 100.0 );
|
||||||
|
|
||||||
aFPText->SetTextThickness( textThickness );
|
aFPText->SetTextThickness( textThickness );
|
||||||
|
|
||||||
@ -2123,7 +2123,7 @@ void PCB_IO_EAGLE::packageText( FOOTPRINT* aFootprint, wxXmlNode* aTree ) const
|
|||||||
textItem->SetLayer( layer );
|
textItem->SetLayer( layer );
|
||||||
|
|
||||||
double ratio = t.ratio ? *t.ratio : 8; // DTD says 8 is default
|
double ratio = t.ratio ? *t.ratio : 8; // DTD says 8 is default
|
||||||
int textThickness = KiROUND( t.size.ToPcbUnits() * ratio / 100 );
|
int textThickness = KiROUND( t.size.ToPcbUnits() * ratio / 100.0 );
|
||||||
|
|
||||||
textItem->SetTextThickness( textThickness );
|
textItem->SetTextThickness( textThickness );
|
||||||
textItem->SetTextSize( kicad_fontsize( t.size, textThickness ) );
|
textItem->SetTextSize( kicad_fontsize( t.size, textThickness ) );
|
||||||
|
@ -53,7 +53,7 @@ public:
|
|||||||
|
|
||||||
double ScaleSize( double aValue ) override
|
double ScaleSize( double aValue ) override
|
||||||
{ //
|
{ //
|
||||||
return KiROUND( ( aValue * 254000 ) / 100 ) * 100;
|
return KiROUND( ( aValue * 254000.0 ) / 100.0 ) * 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseBoard( BOARD* aBoard, const VECTOR2D& aOrigin,
|
void ParseBoard( BOARD* aBoard, const VECTOR2D& aOrigin,
|
||||||
|
@ -55,7 +55,7 @@ public:
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
static T ScaleSize( T aValue )
|
static T ScaleSize( T aValue )
|
||||||
{
|
{
|
||||||
return KiROUND( aValue * 25400 / 500 ) * 500;
|
return KiROUND( aValue * 25400.0 / 500.0 ) * 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -445,7 +445,7 @@ int CONVERT_TOOL::CreatePolys( const TOOL_EVENT& aEvent )
|
|||||||
if( resolvedSettings.m_Strategy == BOUNDING_HULL )
|
if( resolvedSettings.m_Strategy == BOUNDING_HULL )
|
||||||
{
|
{
|
||||||
if( resolvedSettings.m_Gap > 0 )
|
if( resolvedSettings.m_Gap > 0 )
|
||||||
resolvedSettings.m_Gap += KiROUND( (double) resolvedSettings.m_LineWidth / 2 );
|
resolvedSettings.m_Gap += KiROUND( (double) resolvedSettings.m_LineWidth / 2.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !getPolys( resolvedSettings ) )
|
if( !getPolys( resolvedSettings ) )
|
||||||
|
@ -46,7 +46,7 @@ struct ZONE_FILL_TEST_FIXTURE
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
constexpr int delta = KiROUND( 0.006 * pcbIUScale.IU_PER_MM );
|
int delta = KiROUND( 0.006 * pcbIUScale.IU_PER_MM );
|
||||||
|
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE( BasicZoneFills, ZONE_FILL_TEST_FIXTURE )
|
BOOST_FIXTURE_TEST_CASE( BasicZoneFills, ZONE_FILL_TEST_FIXTURE )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user