You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.8 KiB

// Dick Hollenbeck's KiROUND R&D // This provides better project control over rounding to int from double // than wxRound() did. This scheme provides better logging in Debug builds // and it provides for compile time calculation of constants. #include <stdio.h> #include <assert.h> #include <limits.h> //-----<KiROUND KIT>------------------------------------------------------------ /** * KiROUND * rounds a floating point number to an int using * "round halfway cases away from zero". * In Debug build an assert fires if will not fit into an int. */ #if defined( DEBUG ) // DEBUG: a macro to capture line and file, then calls this inline static inline int KiRound( double v, int line, const char* filename ) { v = v < 0 ? v - 0.5 : v + 0.5; if( v > INT_MAX + 0.5 ) { printf( "%s: in file %s on line %d, val: %.16g too ' > 0 ' for int\n", __FUNCTION__, filename, line, v ); } else if( v < INT_MIN - 0.5 ) { printf( "%s: in file %s on line %d, val: %.16g too ' < 0 ' for int\n", __FUNCTION__, filename, line, v ); } return int( v ); } #define KiROUND( v ) KiRound( v, __LINE__, __FILE__ ) #else // RELEASE: a macro so compile can pre-compute constants. #define KiROUND( v ) int( (v) < 0 ? (v) - 0.5 : (v) + 0.5 ) #endif //-----</KiROUND KIT>----------------------------------------------------------- // Only a macro is compile time calculated, an inline function causes a static constructor // in a situation like this. // Therefore the Release build is best done with a MACRO not an inline function. int Computed = KiROUND( 14.3 * 8 ); int main( int argc, char** argv ) { for( double d = double(INT_MAX)-1; d < double(INT_MAX)+8; d += 2.0 ) { int i = KiROUND( d ); printf( "t: %d %.16g\n", i, d ); } return 0; }
14 years ago
18 years ago
2 years ago
18 years ago
  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
  5. * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
  6. * Copyright (C) 2012 Wayne Stambaugh <stambaughw@gmail.com>
  7. * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version 2
  12. * of the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, you may find one here:
  21. * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  22. * or you may search the http://www.gnu.org website for the version 2 license,
  23. * or you may write to the Free Software Foundation, Inc.,
  24. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  25. */
  26. #include <gr_basic.h>
  27. #include <plotters/plotter.h>
  28. #include <trigo.h>
  29. #include <math/util.h> // for KiROUND
  30. #include <font/font.h>
  31. #include <callback_gal.h>
  32. int GetPenSizeForBold( int aTextSize )
  33. {
  34. return KiROUND( aTextSize / 5.0 );
  35. }
  36. int GetPenSizeForDemiBold( int aTextSize )
  37. {
  38. return KiROUND( aTextSize / 6 );
  39. }
  40. int GetPenSizeForBold( const wxSize& aTextSize )
  41. {
  42. return GetPenSizeForBold( std::min( aTextSize.x, aTextSize.y ) );
  43. }
  44. int GetPenSizeForDemiBold( const wxSize& aTextSize )
  45. {
  46. return GetPenSizeForDemiBold( std::min( aTextSize.x, aTextSize.y ) );
  47. }
  48. int GetPenSizeForNormal( int aTextSize )
  49. {
  50. return KiROUND( aTextSize / 8.0 );
  51. }
  52. int GetPenSizeForNormal( const wxSize& aTextSize )
  53. {
  54. return GetPenSizeForNormal( std::min( aTextSize.x, aTextSize.y ) );
  55. }
  56. int ClampTextPenSize( int aPenSize, int aSize, bool aStrict )
  57. {
  58. double scale = aStrict ? 0.18 : 0.25;
  59. int maxWidth = KiROUND( (double) aSize * scale );
  60. return std::min( aPenSize, maxWidth );
  61. }
  62. float ClampTextPenSize( float aPenSize, int aSize, bool aStrict )
  63. {
  64. double scale = aStrict ? 0.18 : 0.25;
  65. float maxWidth = (float) aSize * scale;
  66. return std::min( aPenSize, maxWidth );
  67. }
  68. int ClampTextPenSize( int aPenSize, const VECTOR2I& aSize, bool aStrict )
  69. {
  70. int size = std::min( std::abs( aSize.x ), std::abs( aSize.y ) );
  71. return ClampTextPenSize( aPenSize, size, aStrict );
  72. }
  73. int GRTextWidth( const wxString& aText, KIFONT::FONT* aFont, const VECTOR2I& aSize,
  74. int aThickness, bool aBold, bool aItalic, const KIFONT::METRICS& aFontMetrics )
  75. {
  76. if( !aFont )
  77. aFont = KIFONT::FONT::GetFont();
  78. return KiROUND( aFont->StringBoundaryLimits( aText, aSize, aThickness, aBold, aItalic,
  79. aFontMetrics ).x );
  80. }
  81. void GRPrintText( wxDC* aDC, const VECTOR2I& aPos, const COLOR4D& aColor, const wxString& aText,
  82. const EDA_ANGLE& aOrient, const VECTOR2I& aSize,
  83. enum GR_TEXT_H_ALIGN_T aH_justify, enum GR_TEXT_V_ALIGN_T aV_justify,
  84. int aWidth, bool aItalic, bool aBold, KIFONT::FONT* aFont,
  85. const KIFONT::METRICS& aFontMetrics )
  86. {
  87. KIGFX::GAL_DISPLAY_OPTIONS empty_opts;
  88. bool fill_mode = true;
  89. if( !aFont )
  90. aFont = KIFONT::FONT::GetFont();
  91. if( aWidth == 0 ) // Use default values if aWidth == 0
  92. {
  93. if( aBold )
  94. aWidth = GetPenSizeForBold( std::min( aSize.x, aSize.y ) );
  95. else
  96. aWidth = GetPenSizeForNormal( std::min( aSize.x, aSize.y ) );
  97. }
  98. if( aWidth < 0 )
  99. {
  100. aWidth = -aWidth;
  101. fill_mode = false;
  102. }
  103. CALLBACK_GAL callback_gal( empty_opts,
  104. // Stroke callback
  105. [&]( const VECTOR2I& aPt1, const VECTOR2I& aPt2 )
  106. {
  107. if( fill_mode )
  108. GRLine( aDC, aPt1, aPt2, aWidth, aColor );
  109. else
  110. GRCSegm( aDC, aPt1, aPt2, aWidth, aColor );
  111. },
  112. // Polygon callback
  113. [&]( const SHAPE_LINE_CHAIN& aPoly )
  114. {
  115. GRClosedPoly( aDC, aPoly.PointCount(), aPoly.CPoints().data(), true, aColor );
  116. } );
  117. TEXT_ATTRIBUTES attributes;
  118. attributes.m_Angle = aOrient;
  119. attributes.m_StrokeWidth = aWidth;
  120. attributes.m_Italic = aItalic;
  121. attributes.m_Bold = aBold;
  122. attributes.m_Halign = aH_justify;
  123. attributes.m_Valign = aV_justify;
  124. attributes.m_Size = aSize;
  125. aFont->Draw( &callback_gal, aText, aPos, attributes, aFontMetrics );
  126. }