1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2017 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <preview_items/preview_utils.h>
#include <gal/graphics_abstraction_layer.h>
#include <base_units.h>
#include <pcb_painter.h>
#include <view/view.h>
double KIGFX::PREVIEW::PreviewOverlayDeemphAlpha( bool aDeemph )
{
return aDeemph ? 0.5 : 1.0;
}
static wxString getDimensionUnit( EDA_UNITS_T aUnits )
{
switch( aUnits )
{
case INCHES:
return _( "\"" );
case MILLIMETRES:
return _( "mm" );
case DEGREES:
return _( "deg" );
case UNSCALED_UNITS:
break;
// no default: handle all cases
}
return wxEmptyString;
}
static wxString formatPreviewDimension( double aVal, EDA_UNITS_T aUnits )
{
int precision = 4;
// show a sane precision for the preview, which doesn't need to
// be accurate down to the nanometre
switch( aUnits )
{
case MILLIMETRES:
precision = 2; // 10um
break;
case INCHES:
precision = 4; // 1mil
break;
case DEGREES:
precision = 1; // 0.1deg (limit of formats anyway)
break;
case UNSCALED_UNITS:
break;
}
const wxString fmtStr = wxString::Format( "%%.%df", precision );
wxString str = wxString::Format( fmtStr, To_User_Unit( aUnits, aVal ) );
const wxString symbol = getDimensionUnit( aUnits );
if( symbol.size() )
str << " " << symbol;
return str;
}
wxString KIGFX::PREVIEW::DimensionLabel( const wxString& prefix,
double aVal, EDA_UNITS_T aUnits )
{
wxString str;
if( prefix.size() )
str << prefix << ": ";
str << formatPreviewDimension( aVal, aUnits );
return str;
}
void KIGFX::PREVIEW::SetConstantGlyphHeight( KIGFX::GAL& aGal, double aHeight )
{
aHeight /= aGal.GetWorldScale();
auto glyphSize = aGal.GetGlyphSize();
glyphSize = glyphSize * ( aHeight / glyphSize.y );
aGal.SetGlyphSize( glyphSize );
}
void KIGFX::PREVIEW::DrawTextNextToCursor( KIGFX::VIEW* aView,
const VECTOR2D& aCursorPos, const VECTOR2D& aTextQuadrant,
const std::vector<wxString>& aStrings )
{
auto gal = aView->GetGAL();
auto glyphSize = gal->GetGlyphSize();
auto rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( aView->GetPainter()->GetSettings() );
const auto lineSpace = glyphSize.y * 0.2;
auto linePitch = glyphSize.y + lineSpace;
// radius string goes on the right of the cursor centre line
// with a small horizontal offset (enough to keep clear of a
// system cursor if present)
auto textPos = aCursorPos;
// if the text goes above the cursor, shift it up
if( aTextQuadrant.y > 0 )
{
textPos.y -= linePitch * ( aStrings.size() + 1 );
}
if( aTextQuadrant.x < 0 )
{
gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
textPos.x += 15.0 / gal->GetWorldScale();
}
else
{
gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_RIGHT );
textPos.x -= 15.0 / gal->GetWorldScale();
}
gal->SetStrokeColor( rs->GetLayerColor( LAYER_AUX_ITEMS ).WithAlpha(
PreviewOverlayDeemphAlpha( true ) ) );
gal->SetIsFill( false );
// write strings top-to-bottom
for( const auto& str : aStrings )
{
textPos.y += linePitch;
gal->BitmapText( str, textPos, 0.0 );
}
}
|