void GRSetBrush( wxDC* DC, EDA_COLOR_T Color, bool fill ) { if( s_ForceBlackPen ) Color = BLACK; if( s_DC_lastbrushcolor != Color || s_DC_lastbrushfill != fill || s_DC_lastDC != DC ) { wxBrush brush; brush.SetColour( MakeColour( Color ) ); if( fill ) brush.SetStyle( wxBRUSHSTYLE_SOLID ); else brush.SetStyle( wxBRUSHSTYLE_TRANSPARENT ); DC->SetBrush( brush ); s_DC_lastbrushcolor = Color; s_DC_lastbrushfill = fill; s_DC_lastDC = DC; } }
/** * Function GRSetColorPen * sets a pen style, width, color, and alpha into the given device context. */ void GRSetColorPen( wxDC* DC, EDA_COLOR_T Color, int width, wxPenStyle style ) { // Under OSX and while printing when wxPen is set to 0, renderer follows the request drawing // nothing & in the bitmap world the minimum is enough to light a pixel, in vectorial one not if( width <= 1 ) width = DC->DeviceToLogicalXRel( 1 ); if( s_ForceBlackPen ) { Color = BLACK; } if( s_DC_lastcolor != Color || s_DC_lastwidth != width || s_DC_lastpenstyle != style || s_DC_lastDC != DC || s_ForceBlackPen ) { wxPen pen; wxColour wx_color = MakeColour( Color ); pen.SetColour( wx_color ); pen.SetWidth( width ); pen.SetStyle( style ); DC->SetPen( pen ); s_DC_lastcolor = Color; s_DC_lastwidth = width; s_DC_lastpenstyle = style; s_DC_lastDC = DC; } }
/** * Function GRSetColorPen * sets a pen style, width, color, and alpha into the given device context. */ void GRSetColorPen( wxDC* DC, EDA_COLOR_T Color, int width, wxPenStyle style ) { // Under OSX and while printing when wxPen is set to 0, renderer follows the request drawing // nothing & in the bitmap world the minimum is enough to light a pixel, in vectorial one not if( width <= 1 ) width = DC->DeviceToLogicalXRel( 1 ); if( s_ForceBlackPen ) Color = BLACK; wxColour wx_color = MakeColour( Color ); const wxPen& curr_pen = DC->GetPen(); if( !curr_pen.IsOk() || curr_pen.GetColour() != wx_color || curr_pen.GetWidth() != width || curr_pen.GetStyle() != style ) { wxPen pen; pen.SetColour( wx_color ); pen.SetWidth( width ); pen.SetStyle( style ); DC->SetPen( pen ); } else // Should be not needed, but on Linux, in printing process // the curr pen settings needs to be sometimes re-initialized // Clearly, this is due to a bug, related to SetBrush(), // but we have to live with it, at least on wxWidgets 3.0 DC->SetPen( curr_pen ); }
EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id, const wxPoint& pos, const wxSize& size ) : wxScrolledWindow( parent, id, pos, size, wxBORDER | wxHSCROLL | wxVSCROLL ) { wxASSERT( parent ); ShowScrollbars( wxSHOW_SB_ALWAYS, wxSHOW_SB_ALWAYS ); DisableKeyboardScrolling(); m_scrollIncrementX = std::min( size.x / 8, 10 ); m_scrollIncrementY = std::min( size.y / 8, 10 ); SetBackgroundColour( MakeColour( parent->GetDrawBgColor() ) ); #if KICAD_USE_BUFFERED_DC || KICAD_USE_BUFFERED_PAINTDC SetBackgroundStyle( wxBG_STYLE_CUSTOM ); #endif m_ClipBox.SetSize( size ); m_ClipBox.SetX( 0 ); m_ClipBox.SetY( 0 ); m_canStartBlock = -1; // Command block can start if >= 0 m_abortRequest = false; m_enableMiddleButtonPan = true; m_enableZoomNoCenter = false; m_panScrollbarLimits = false; m_enableAutoPan = true; m_ignoreMouseEvents = false; m_ignoreNextLeftButtonRelease = false; m_mouseCaptureCallback = NULL; m_endMouseCaptureCallback = NULL; wxConfigBase* cfg = Kiface().KifaceSettings(); if( cfg ) { cfg->Read( ENBL_MIDDLE_BUTT_PAN_KEY, &m_enableMiddleButtonPan, true ); cfg->Read( ENBL_ZOOM_NO_CENTER_KEY, &m_enableZoomNoCenter, false ); cfg->Read( MIDDLE_BUTT_PAN_LIMITED_KEY, &m_panScrollbarLimits, false ); cfg->Read( ENBL_AUTO_PAN_KEY, &m_enableAutoPan, true ); } m_requestAutoPan = false; m_enableBlockCommands = false; m_minDragEventCount = 0; #ifdef __WXMAC__ m_defaultCursor = m_currentCursor = wxCURSOR_CROSS; m_showCrossHair = false; #else m_defaultCursor = m_currentCursor = wxCURSOR_ARROW; m_showCrossHair = true; #endif m_cursorLevel = 0; m_PrintIsMirrored = false; }
wxBitmap DIALOG_COPPER_ZONE::makeLayerBitmap( EDA_COLOR_T aColor ) { wxBitmap bitmap( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y ); wxBrush brush; wxMemoryDC iconDC; iconDC.SelectObject( bitmap ); brush.SetColour( MakeColour( aColor ) ); brush.SetStyle( wxSOLID ); iconDC.SetBrush( brush ); iconDC.DrawRectangle( 0, 0, LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y ); return bitmap; }
DIALOG_LIB_EDIT_PIN::DIALOG_LIB_EDIT_PIN( EDA_DRAW_FRAME* parent, LIB_PIN* aPin ) : DIALOG_LIB_EDIT_PIN_BASE( parent ) { // Creates a dummy pin to show on a panel, inside this dialog: m_dummyPin = new LIB_PIN( *aPin ); // m_dummyPin changes do not propagate to other pins of the current lib component, // so set parent to null and clear flags m_dummyPin->SetParent( NULL ); m_dummyPin->ClearFlags(); m_panelShowPin->SetBackgroundColour( MakeColour( parent->GetDrawBgColor() ) ); // Set tab order m_textPadName->MoveAfterInTabOrder(m_textPinName); m_sdbSizerButtonsOK->SetDefault(); }
void EDA_MSG_PANEL::showItem( wxDC& aDC, const MSG_PANEL_ITEM& aItem ) { EDA_COLOR_T color = aItem.m_Color; if( color >= 0 ) { color = ColorGetBase( color ); aDC.SetTextForeground( MakeColour( color ) ); } if( !aItem.m_UpperText.IsEmpty() ) { aDC.DrawText( aItem.m_UpperText, aItem.m_X, aItem.m_UpperY ); } if( !aItem.m_LowerText.IsEmpty() ) { aDC.DrawText( aItem.m_LowerText, aItem.m_X, aItem.m_LowerY ); } }
wxBitmap DIALOG_NON_COPPER_ZONES_EDITOR::makeLayerBitmap( EDA_COLOR_T aColor ) { wxBitmap bitmap( LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y ); wxBrush brush; wxMemoryDC iconDC; iconDC.SelectObject( bitmap ); brush.SetColour( MakeColour( aColor ) ); #if wxCHECK_VERSION( 3, 0, 0 ) brush.SetStyle( wxBRUSHSTYLE_SOLID ); #else brush.SetStyle( wxSOLID ); #endif iconDC.SetBrush( brush ); iconDC.DrawRectangle( 0, 0, LAYER_BITMAP_SIZE_X, LAYER_BITMAP_SIZE_Y ); return bitmap; }
void GRSetBrush( wxDC* DC, EDA_COLOR_T Color, bool fill ) { if( s_ForceBlackPen ) Color = BLACK; if( s_DC_lastbrushcolor != Color || s_DC_lastbrushfill != fill || s_DC_lastDC != DC ) { wxBrush brush; brush.SetColour( MakeColour( Color ) ); if( fill ) #if wxCHECK_VERSION( 3, 0, 0 ) brush.SetStyle( wxBRUSHSTYLE_SOLID ); else brush.SetStyle( wxBRUSHSTYLE_TRANSPARENT ); #else brush.SetStyle( wxSOLID ); else
EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType, const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize, long aStyle, const wxString & aFrameName ) : KIWAY_PLAYER( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName ) { m_file_checker = NULL; m_drawToolBar = NULL; m_optionsToolBar = NULL; m_gridSelectBox = NULL; m_zoomSelectBox = NULL; m_HotkeysZoomAndGridList = NULL; m_canvas = NULL; m_galCanvas = NULL; m_galCanvasActive = false; m_messagePanel = NULL; m_currentScreen = NULL; m_toolId = ID_NO_TOOL_SELECTED; m_lastDrawToolId = ID_NO_TOOL_SELECTED; m_showAxis = false; // true to draw axis. m_showBorderAndTitleBlock = false; // true to display reference sheet. m_showGridAxis = false; // true to draw the grid axis m_showOriginAxis = false; // true to draw the grid origin m_cursorShape = 0; m_LastGridSizeId = 0; m_drawGrid = true; // hide/Show grid. default = show m_gridColor = DARKGRAY; // Default grid color m_showPageLimits = false; m_drawBgColor = BLACK; // the background color of the draw canvas: // BLACK for Pcbnew, BLACK or WHITE for eeschema m_snapToGrid = true; m_MsgFrameHeight = EDA_MSG_PANEL::GetRequiredHeight(); m_movingCursorWithKeyboard = false; m_auimgr.SetFlags(wxAUI_MGR_DEFAULT|wxAUI_MGR_LIVE_RESIZE); CreateStatusBar( 6 ); // set the size of the status bar subwindows: wxWindow* stsbar = GetStatusBar(); int dims[] = { // remainder of status bar on far left is set to a default or whatever is left over. -1, // When using GetTextSize() remember the width of character '1' is not the same // as the width of '0' unless the font is fixed width, and it usually won't be. // zoom: GetTextSize( wxT( "Z 762000" ), stsbar ).x + 10, // cursor coords GetTextSize( wxT( "X 0234.567890 Y 0234.567890" ), stsbar ).x + 10, // delta distances GetTextSize( wxT( "dx 0234.567890 dx 0234.567890 d 0234.567890" ), stsbar ).x + 10, // units display, Inches is bigger than mm GetTextSize( _( "Inches" ), stsbar ).x + 10, // Size for the panel used as "Current tool in play": will take longest string from // void PCB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent ) in pcbnew/edit.cpp GetTextSize( wxT( "Add layer alignment target" ), stsbar ).x + 10, }; SetStatusWidths( DIM( dims ), dims ); // Create child subwindows. GetClientSize( &m_FrameSize.x, &m_FrameSize.y ); m_FramePos.x = m_FramePos.y = 0; m_FrameSize.y -= m_MsgFrameHeight; m_canvas = new EDA_DRAW_PANEL( this, -1, wxPoint( 0, 0 ), m_FrameSize ); m_messagePanel = new EDA_MSG_PANEL( this, -1, wxPoint( 0, m_FrameSize.y ), wxSize( m_FrameSize.x, m_MsgFrameHeight ) ); m_messagePanel->SetBackgroundColour( MakeColour( LIGHTGRAY ) ); }
void EDA_DRAW_PANEL::DrawGrid( wxDC* aDC ) { #define MIN_GRID_SIZE 10 // min grid size in pixels to allow drawing BASE_SCREEN* screen = GetScreen(); wxRealPoint gridSize; wxSize screenSize; wxPoint org; wxRealPoint screenGridSize; /* The grid must be visible. this is possible only is grid value * and zoom value are sufficient */ gridSize = screen->GetGridSize(); screen->m_StartVisu = CalcUnscrolledPosition( wxPoint( 0, 0 ) ); screenSize = GetClientSize(); screenGridSize.x = aDC->LogicalToDeviceXRel( KiROUND( gridSize.x ) ); screenGridSize.y = aDC->LogicalToDeviceYRel( KiROUND( gridSize.y ) ); org = m_ClipBox.GetPosition(); if( screenGridSize.x < MIN_GRID_SIZE || screenGridSize.y < MIN_GRID_SIZE ) { screenGridSize.x *= 2.0; screenGridSize.y *= 2.0; gridSize.x *= 2.0; gridSize.y *= 2.0; } if( screenGridSize.x < MIN_GRID_SIZE || screenGridSize.y < MIN_GRID_SIZE ) return; org = GetParent()->GetNearestGridPosition( org, &gridSize ); // Setting the nearest grid position can select grid points outside the clip box. // Incrementing the start point by one grid step should prevent drawing grid points // outside the clip box. if( org.x < m_ClipBox.GetX() ) org.x += KiROUND( gridSize.x ); if( org.y < m_ClipBox.GetY() ) org.y += KiROUND( gridSize.y ); #if ( defined( __WXMAC__ ) || 1 ) // Use a pixel based draw to display grid. There are a lot of calls, so the cost is // high and grid is slowly drawn on some platforms. Please note that this should // always be enabled until the bitmap based solution below is fixed. #ifndef __WXMAC__ GRSetColorPen( aDC, GetParent()->GetGridColor() ); #else // On mac (Cocoa), a point isn't a pixel and being of size 1 don't survive to antialiasing GRSetColorPen( aDC, GetParent()->GetGridColor(), aDC->DeviceToLogicalXRel(2) ); #endif int xpos; double right = ( double ) m_ClipBox.GetRight(); double bottom = ( double ) m_ClipBox.GetBottom(); for( double x = (double) org.x; x <= right; x += gridSize.x ) { xpos = KiROUND( x ); for( double y = (double) org.y; y <= bottom; y += gridSize.y ) { aDC->DrawPoint( xpos, KiROUND( y ) ); } } #else /* This is fast only if the Blit function is fast. Not true on all platforms. * * A first grid column is drawn in a temporary bitmap, and after is duplicated using * the Blit function (copy from a screen area to an other screen area). */ wxMemoryDC tmpDC; wxBitmap tmpBM( 1, aDC->LogicalToDeviceYRel( m_ClipBox.GetHeight() ) ); tmpDC.SelectObject( tmpBM ); tmpDC.SetLogicalFunction( wxCOPY ); tmpDC.SetBackground( wxBrush( GetBackgroundColour() ) ); tmpDC.Clear(); tmpDC.SetPen( MakeColour( GetParent()->GetGridColor() ) ); double usx, usy; int lox, loy, dox, doy; aDC->GetUserScale( &usx, &usy ); aDC->GetLogicalOrigin( &lox, &loy ); aDC->GetDeviceOrigin( &dox, &doy ); // Create a dummy DC for coordinate translation because the actual DC scale and origin // must be reset in order to work correctly. wxBitmap tmpBitmap( 1, 1 ); wxMemoryDC scaleDC( tmpBitmap ); scaleDC.SetUserScale( usx, usy ); scaleDC.SetLogicalOrigin( lox, loy ); scaleDC.SetDeviceOrigin( dox, doy ); double bottom = ( double ) m_ClipBox.GetBottom(); // Draw a column of grid points. for( double y = (double) org.y; y <= bottom; y += gridSize.y ) { tmpDC.DrawPoint( 0, scaleDC.LogicalToDeviceY( KiROUND( y ) ) ); } // Reset the device context scale and origin and restore on exit. EDA_BLIT_NORMALIZER blitNorm( aDC ); // Mask of everything but the grid points. tmpDC.SelectObject( wxNullBitmap ); tmpBM.SetMask( new wxMask( tmpBM, GetBackgroundColour() ) ); tmpDC.SelectObject( tmpBM ); double right = m_ClipBox.GetRight(); // Blit the column for each row of the damaged region. for( double x = (double) org.x; x <= right; x += gridSize.x ) { aDC->Blit( scaleDC.LogicalToDeviceX( KiROUND( x ) ), scaleDC.LogicalToDeviceY( m_ClipBox.GetY() ), 1, tmpBM.GetHeight(), &tmpDC, 0, 0, wxCOPY, true ); } #endif }
void PCB_EDIT_FRAME::PrepareLayerIndicator() { int ii, jj; EDA_COLOR_T active_layer_color, Route_Layer_TOP_color, Route_Layer_BOTTOM_color, via_color; bool change = false; bool first_call = LayerPairBitmap == NULL; static int previous_active_layer_color, previous_Route_Layer_TOP_color, previous_Route_Layer_BOTTOM_color, previous_via_color; /* get colors, and redraw bitmap button only on changes */ active_layer_color = GetBoard()->GetLayerColor(GetActiveLayer()); if( previous_active_layer_color != active_layer_color ) { previous_active_layer_color = active_layer_color; change = true; } Route_Layer_TOP_color = g_ColorsSettings.GetLayerColor( GetScreen()->m_Route_Layer_TOP ); if( previous_Route_Layer_TOP_color != Route_Layer_TOP_color ) { previous_Route_Layer_TOP_color = Route_Layer_TOP_color; change = true; } Route_Layer_BOTTOM_color = g_ColorsSettings.GetLayerColor( GetScreen()->m_Route_Layer_BOTTOM ); if( previous_Route_Layer_BOTTOM_color != Route_Layer_BOTTOM_color ) { previous_Route_Layer_BOTTOM_color = Route_Layer_BOTTOM_color; change = true; } int via_type = GetDesignSettings().m_CurrentViaType; via_color = GetBoard()->GetVisibleElementColor(VIAS_VISIBLE+via_type); if( previous_via_color != via_color ) { previous_via_color = via_color; change = true; } if( !change && (LayerPairBitmap != NULL) ) return; /* Create the bitmap and its Memory DC, if not already made */ if( LayerPairBitmap == NULL ) { LayerPairBitmap = new wxBitmap( 24, 24 ); } /* Draw the icon, with colors according to the active layer and layer * pairs for via command (change layer) */ wxMemoryDC iconDC; iconDC.SelectObject( *LayerPairBitmap ); wxPen pen; int buttonColor = -1; for( ii = 0; ii < BM_LAYERICON_SIZE; ii++ ) { for( jj = 0; jj < BM_LAYERICON_SIZE; jj++ ) { if( s_BitmapLayerIcon[ii][jj] != buttonColor ) { switch( s_BitmapLayerIcon[ii][jj] ) { default: case 0: pen.SetColour( MakeColour( active_layer_color ) ); break; case 1: pen.SetColour( MakeColour( Route_Layer_TOP_color) ); break; case 2: pen.SetColour( MakeColour( Route_Layer_BOTTOM_color ) ); break; case 3: pen.SetColour( MakeColour( via_color ) ); break; } buttonColor = s_BitmapLayerIcon[ii][jj]; iconDC.SetPen( pen ); } iconDC.DrawPoint( jj, ii ); } } /* Deselect the Tool Bitmap from DC, * in order to delete the MemoryDC safely without deleting the bitmap */ iconDC.SelectObject( wxNullBitmap ); if( m_mainToolBar && ! first_call ) { m_mainToolBar->SetToolBitmap( ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR, *LayerPairBitmap ); m_mainToolBar->Refresh(); } }