void clAuiGlossyTabArt::DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect) { wxUnusedVar(wnd); #ifdef __WXGTK__ wxDC &gdc = dc; #else wxGCDC gdc; if ( !DrawingUtils::GetGCDC(dc, gdc) ) return; #endif wxColour bgColour, penColour; DoGetTabAreaBackgroundColour(bgColour, penColour); m_bgColour = bgColour; // Allow the plugins to override the default colours clColourEvent colourEvent( wxEVT_GET_TAB_BORDER_COLOUR ); if ( EventNotifier::Get()->ProcessEvent( colourEvent ) ) { penColour = colourEvent.GetBorderColour(); } gdc.SetPen(bgColour); gdc.SetBrush( bgColour ); gdc.GradientFillLinear(rect, bgColour, bgColour, wxSOUTH); gdc.SetPen( penColour ); wxPoint ptBottomLeft = rect.GetBottomLeft(); wxPoint ptBottomRight = rect.GetBottomRight(); gdc.DrawLine(ptBottomLeft, ptBottomRight); }
void wxRibbonMetroArtProvider::DrawPanelBorder(wxDC& dc, const wxRect& rect, wxPen& primary_colour, wxPen& secondary_colour) { dc.SetPen(m_panel_border_pen); dc.DrawLine(rect.GetTopRight(), rect.GetBottomRight()); }
wxRect FenetreZoom::RepereEcranImage(wxRect &r) { wxPoint p1(r.GetLeftTop()),p2(r.GetBottomRight()); wxPoint p1Img=RepereEcranImage(p1); wxPoint p2Img=RepereEcranImage(p2); return wxRect(p1Img,p2Img); }
wxRect FenetreZoom::RepereImageEcran(wxRect &r) { wxPoint p1Img(r.GetLeftTop()),p2Img(r.GetBottomRight()); wxPoint p1=RepereImageEcran(p1Img); wxPoint p2=RepereImageEcran(p2Img); return wxRect(p1,p2); }
void clAuiMainNotebookTabArt::DrawBackground(wxDC& dc, wxWindow* wnd, const wxRect& rect) { wxUnusedVar(wnd); #ifdef __WXGTK__ wxDC& gdc = dc; #else wxGCDC gdc; if(!DrawingUtils::GetGCDC(dc, gdc)) return; #endif DoSetColours(); gdc.SetPen(m_activeTabPenColour); wxBrush brush = DrawingUtils::GetStippleBrush(); brush.SetColour(m_bgColour); gdc.SetBrush(brush); gdc.GradientFillLinear(rect, m_bgColour, m_bgColour, wxSOUTH); wxPoint ptBottomLeft = rect.GetBottomLeft(); wxPoint ptBottomRight = rect.GetBottomRight(); gdc.SetPen(m_activeTabBgColour); gdc.DrawLine(ptBottomLeft, ptBottomRight); ptBottomLeft.y -= 1; ptBottomRight.y -= 1; gdc.SetPen(m_activeTabPenColour); gdc.DrawLine(ptBottomLeft, ptBottomRight); }
void clTabRendererCurved::DrawBottomRect( clTabInfo::Ptr_t activeTab, const wxRect& clientRect, wxDC& dc, const clTabColours& colours, size_t style) { #ifdef __WXOSX__ if(!IS_VERTICAL_TABS(style)) { wxPoint pt1, pt2; dc.SetPen(colours.activeTabBgColour); if(style & kNotebook_BottomTabs) { // bottom tabs pt1 = clientRect.GetTopLeft(); pt2 = clientRect.GetTopRight(); DRAW_LINE(pt1, pt2); } else { // Top tabs pt1 = clientRect.GetBottomLeft(); pt2 = clientRect.GetBottomRight(); pt1.y -= 1; pt2.y -= 1; DRAW_LINE(pt1, pt2); } } #else if(!IS_VERTICAL_TABS(style)) { wxPoint pt1, pt2; dc.SetPen(colours.activeTabPenColour); if(style & kNotebook_BottomTabs) { // bottom tabs pt1 = clientRect.GetTopLeft(); pt2 = clientRect.GetTopRight(); DRAW_LINE(pt1, pt2); } else { // Top tabs pt1 = clientRect.GetBottomLeft(); pt2 = clientRect.GetBottomRight(); DRAW_LINE(pt1, pt2); } } #endif }
void SkinRegion::Stroke(wxDC& dc, wxGraphicsContext* gc, const wxRect& rect, int /*n*/) { if (!has_border) return; int penw = border.GetWidth() / 2.0f; wxRect r(rect); r.Deflate(penw, penw); //border.SetCap(wxCAP_PROJECTING); if (rounded) { bool needsDelete = false; if (!gc) { gc = wxGraphicsContext::Create((wxWindowDC&)dc); needsDelete = true; } gc->SetBrush(*wxTRANSPARENT_BRUSH); gc->SetPen(border); gc->DrawRoundedRectangle(rect.x, rect.y, rect.width, rect.height, rounded * .97); rect.Inflate(penw, penw); if (needsDelete) delete gc; } else { dc.SetPen(border); int offset = (int)(border.GetWidth() % 2 == 0); wxPoint x(offset, 0); wxPoint y(0, offset); dc.DrawLine(rect.GetTopLeft(), rect.GetBottomLeft() + y); dc.DrawLine(rect.GetBottomLeft() + y, rect.GetBottomRight() + y + x); dc.DrawLine(rect.GetBottomRight() + y + x, rect.GetTopRight() + x); dc.DrawLine(rect.GetTopRight() + x, rect.GetTopLeft()); } }
wxPoint GetWindowOriginSoThatItFits(int display, const wxRect& windowRect) { wxPoint pos = windowRect.GetTopLeft(); wxRect desktop = wxDisplay(display).GetClientArea(); if (!desktop.Contains(windowRect)) { if (pos.x < desktop.x) pos.x = desktop.x; if (pos.y < desktop.y) pos.y = desktop.y; wxPoint bottomRightDiff = windowRect.GetBottomRight() - desktop.GetBottomRight(); if (bottomRightDiff.x > 0) pos.x -= bottomRightDiff.x; if (bottomRightDiff.y > 0) pos.y -= bottomRightDiff.y; } return pos; }
void clTabRendererClassic::FinaliseBackground(wxWindow* parent, wxDC& dc, const wxRect& clientRect, const clTabColours& colours, size_t style) { wxUnusedVar(parent); clTabColours c = colours; if(DrawingUtils::IsDark(c.activeTabBgColour)) { InitDarkColours(c, c.activeTabBgColour); } else { InitLightColours(c, c.activeTabBgColour); } dc.SetPen(c.activeTabPenColour); if(style & kNotebook_BottomTabs) { dc.DrawLine(clientRect.GetTopLeft(), clientRect.GetTopRight()); } else { dc.DrawLine(clientRect.GetBottomLeft(), clientRect.GetBottomRight()); } }
void Canvas::zoom_to( wxRect rect ) { wxSize window_size = wxWindow::GetClientSize(); float ratio = std::max( float(rect.GetWidth()) / window_size.GetWidth(), float(rect.GetHeight()) / window_size.GetHeight() ); int zoom; if ( ratio < 1 ) { /* Zoom in. */ zoom = round( 1 / ratio ) - 1; } else { /* Zoom out. */ zoom = - round( ratio ); } zoom = std::max( -16, std::min( zoom, 16 ) ); wxPoint sumPoint = (rect.GetTopLeft() + rect.GetBottomRight()); wxPoint centerPoint( sumPoint.x/2, sumPoint.y/2); set_zoom( zoom, centerPoint ); }
void clAuiMainNotebookTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& page, const wxRect& in_rect, int close_button_state, wxRect* out_tab_rect, wxRect* out_button_rect, int* x_extent) { if(in_rect.GetHeight() == 0) return; // Tabs are not visible int curx = 0; wxGCDC gdc; if(!DrawingUtils::GetGCDC(dc, gdc)) return; wxColour penColour = page.active ? m_activeTabPenColour : m_penColour; wxGraphicsPath path = gdc.GetGraphicsContext()->CreatePath(); gdc.SetPen(penColour); wxSize sz = GetTabSize(gdc, wnd, page.caption, page.bitmap, page.active, close_button_state, x_extent); wxRect rr(in_rect.GetTopLeft(), sz); rr.y += TAB_Y_OFFSET; rr.width -= 1; #ifndef __WXMAC__ if(page.active) { rr.y -= 2; rr.height += 2; } #endif #ifndef __WXGTK__ rr.height += 4; #endif /// the tab start position (x) curx = rr.x + 7; // Set clipping region int clip_width = rr.width; if(rr.x + clip_width > in_rect.x + in_rect.width) clip_width = (in_rect.x + in_rect.width) - rr.x; gdc.SetClippingRegion(rr.x, rr.y, clip_width, rr.height); gdc.SetBrush(m_bgColour); gdc.SetPen(penColour); if(page.active) { gdc.SetBrush(m_activeTabBgColour); path.AddRoundedRectangle(rr.x, rr.y, rr.width - 1, rr.height, m_tabRadius); gdc.GetGraphicsContext()->FillPath(path); gdc.GetGraphicsContext()->StrokePath(path); } else { wxGraphicsPath outerPath = gdc.GetGraphicsContext()->CreatePath(); gdc.SetPen(penColour); outerPath.AddRoundedRectangle(rr.x, rr.y, rr.width - 1, rr.height, m_tabRadius); gdc.GetGraphicsContext()->StrokePath(outerPath); gdc.SetPen(m_innerPenColour); path.AddRoundedRectangle(rr.x + 1, rr.y + 1, rr.width - 3, rr.height - 1, m_tabRadius); gdc.GetGraphicsContext()->StrokePath(path); gdc.SetBrush(m_tabBgColour); gdc.GetGraphicsContext()->StrokePath(path); gdc.GetGraphicsContext()->FillPath(path); gdc.SetPen(penColour); } if(!page.active) { // Draw a line at the bottom rect gdc.SetPen(m_activeTabPenColour); gdc.DrawLine(in_rect.GetBottomLeft(), in_rect.GetBottomRight()); } wxString caption = page.caption; if(caption.IsEmpty()) { caption = "Tp"; } wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); gdc.SetFont(fnt); wxSize ext = gdc.GetTextExtent(caption); if(caption == "Tp") caption.Clear(); /// Draw the bitmap if(page.bitmap.IsOk()) { int bmpy = (rr.y + (rr.height - page.bitmap.GetHeight()) / 2) - TAB_Y_OFFSET + BMP_Y_SPACER; gdc.GetGraphicsContext()->DrawBitmap(page.bitmap, curx, bmpy, page.bitmap.GetWidth(), page.bitmap.GetHeight()); curx += page.bitmap.GetWidth(); curx += 3; } /// Draw the text wxColour textColour = page.active ? m_activeTabTextColour : m_tabTextColour; gdc.SetTextForeground(textColour); wxDouble textYOffCorrd = (rr.y + (rr.height - ext.y) / 2) - TAB_Y_OFFSET + TEXT_Y_SPACER; gdc.GetGraphicsContext()->DrawText(page.caption, curx, textYOffCorrd); // advance the X offset curx += ext.x; curx += 3; /// Draw the X button on the tab if(close_button_state != wxAUI_BUTTON_STATE_HIDDEN) { curx += 1; wxBitmap xBmp = m_bmpClose; switch(close_button_state) { case wxAUI_BUTTON_STATE_HOVER: xBmp = m_bmpCloseHover; break; case wxAUI_BUTTON_STATE_PRESSED: xBmp = m_bmpClosePressed; break; } int btny = (rr.y + (rr.height - x_button_height) / 2) - TAB_Y_OFFSET + BMP_Y_SPACER; gdc.GetGraphicsContext()->DrawBitmap(xBmp, curx, btny, x_button_height, x_button_height); *out_button_rect = wxRect(curx, btny, x_button_height, x_button_height); curx += x_button_height; } *out_tab_rect = rr; gdc.DestroyClippingRegion(); }
void clAuiGlossyTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& page, const wxRect& in_rect, int close_button_state, wxRect* out_tab_rect, wxRect* out_button_rect, int* x_extent) { wxColour bgColour = wxColour(EditorConfigST::Get()->GetCurrentOutputviewBgColour()); wxColour penColour; wxColour textColour; bool isBgColourDark = DrawingUtils::IsDark(bgColour); if ( isBgColourDark ) { penColour = DrawingUtils::LightColour(bgColour, 4.0); } else { bgColour = *wxWHITE; penColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); } textColour = EditorConfigST::Get()->GetCurrentOutputviewFgColour(); int curx = 0; // Allow the plugins to override the default colours clColourEvent colourEvent( wxEVT_COLOUR_TAB ); colourEvent.SetIsActiveTab( page.active ); colourEvent.SetPage( page.window ); if ( EventNotifier::Get()->ProcessEvent( colourEvent ) ) { bgColour = colourEvent.GetBgColour(); textColour = colourEvent.GetFgColour(); } // Allow the plugins to override the border colour wxColour originalPenColour = penColour; clColourEvent borderColourEvent( wxEVT_GET_TAB_BORDER_COLOUR ); if ( EventNotifier::Get()->ProcessEvent( borderColourEvent ) ) { penColour = borderColourEvent.GetBorderColour(); } wxGCDC gdc; if ( !DrawingUtils::GetGCDC(dc, gdc) ) return; m_penColour = penColour; wxGraphicsPath path = gdc.GetGraphicsContext()->CreatePath(); gdc.SetPen( penColour ); wxSize sz = GetTabSize(gdc, wnd, page.caption, page.bitmap, page.active, close_button_state, x_extent); wxRect rr (in_rect.GetTopLeft(), sz); rr.y += TAB_Y_OFFSET; rr.width -= 1; #ifndef __WXMAC__ if ( page.active ) { rr.y -= 2; rr.height += 2; } #endif #ifdef __WXGTK__ rr.height += TAB_HEIGHT_SPACER; #else rr.height += 4; #endif /// the tab start position (x) curx = rr.x + 7; // Set clipping region int clip_width = rr.width; if (rr.x + clip_width > in_rect.x + in_rect.width) clip_width = (in_rect.x + in_rect.width) - rr.x; // since the above code above doesn't play well with WXDFB or WXCOCOA, // we'll just use a rectangle for the clipping region for now -- gdc.SetClippingRegion(rr.x, rr.y, clip_width, rr.height); gdc.SetBrush( bgColour ); gdc.SetPen( penColour ); if ( page.active ) { path.AddRoundedRectangle(rr.x, rr.y, rr.width-1, rr.height, 6.5); gdc.GetGraphicsContext()->FillPath( path ); gdc.GetGraphicsContext()->StrokePath( path ); } else { if ( !m_bgColour.IsOk() ) { wxColour b, p; DoGetTabAreaBackgroundColour(b, p); m_bgColour = b; } DoDrawInactiveTabSeparator(gdc, rr); } if ( !page.active ) { // Draw a line at the bottom rect gdc.SetPen(penColour); gdc.DrawLine(in_rect.GetBottomLeft(), in_rect.GetBottomRight()); } wxString caption = page.caption; if ( caption.IsEmpty() ) { caption = "Tp"; } wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); if ( page.active ) { fnt.SetWeight(wxFONTWEIGHT_BOLD); } gdc.SetFont( fnt ); wxSize ext = gdc.GetTextExtent( caption ); if ( caption == "Tp" ) caption.Clear(); /// Draw the bitmap if ( page.bitmap.IsOk() ) { int bmpy = (rr.y + (rr.height - page.bitmap.GetHeight())/2)-TAB_Y_OFFSET; gdc.GetGraphicsContext()->DrawBitmap( page.bitmap, curx, bmpy, page.bitmap.GetWidth(), page.bitmap.GetHeight()); curx += page.bitmap.GetWidth(); curx += 3; } /// Draw the text gdc.SetTextForeground( textColour ); gdc.GetGraphicsContext()->DrawText( page.caption, curx, (rr.y + (rr.height - ext.y)/2)-TAB_Y_OFFSET+TEXT_Y_SPACER); // advance the X offset curx += ext.x; curx += 3; /// Draw the X button on the tab if ( close_button_state != wxAUI_BUTTON_STATE_HIDDEN ) { int btny = (rr.y + (rr.height/2))-TAB_Y_OFFSET+TEXT_Y_SPACER; if ( close_button_state == wxAUI_BUTTON_STATE_PRESSED ) { curx += 1; btny += 1; } /// Defines the rectangle surrounding the X button wxRect xRect = wxRect(curx, btny - X_RADIUS, X_DIAMETER, X_DIAMETER); *out_button_rect = xRect; /// Defines the 'x' inside the circle wxPoint circleCenter( curx + X_RADIUS, btny); wxDouble xx_width = ::sqrt( ::pow(X_DIAMETER, 2.0) /2.0 ); wxDouble x_square = (circleCenter.x - (xx_width/2.0)); wxDouble y_square = (circleCenter.y - (xx_width/2.0)); wxPoint2DDouble ptXTopLeft(x_square, y_square); wxRect2DDouble insideRect(ptXTopLeft.m_x, ptXTopLeft.m_y, xx_width, xx_width); insideRect.Inset(1.0 , 1.0); // Shrink it by 1 pixle /// Draw the 'x' itself wxGraphicsPath xpath = gdc.GetGraphicsContext()->CreatePath(); xpath.MoveToPoint( insideRect.GetLeftTop() ); xpath.AddLineToPoint( insideRect.GetRightBottom()); xpath.MoveToPoint( insideRect.GetRightTop() ); xpath.AddLineToPoint( insideRect.GetLeftBottom() ); gdc.SetPen( wxPen(textColour, 1) ); gdc.GetGraphicsContext()->StrokePath( xpath ); curx += X_DIAMETER; } *out_tab_rect = rr; gdc.DestroyClippingRegion(); }
bool wxRect::Contains(const wxRect& rect) const { return Contains(rect.GetTopLeft()) && Contains(rect.GetBottomRight()); }
void clAuiMainNotebookTabArt::DrawTab(wxDC& dc, wxWindow* wnd, const wxAuiNotebookPage& page, const wxRect& in_rect, int close_button_state, wxRect* out_tab_rect, wxRect* out_button_rect, int* x_extent) { int curx = 0; wxGCDC gdc; if(!DrawingUtils::GetGCDC(dc, gdc)) return; wxColour penColour = page.active ? m_activeTabPenColour : m_penColour; wxGraphicsPath path = gdc.GetGraphicsContext()->CreatePath(); gdc.SetPen(penColour); wxSize sz = GetTabSize(gdc, wnd, page.caption, page.bitmap, page.active, close_button_state, x_extent); wxRect rr(in_rect.GetTopLeft(), sz); rr.y += TAB_Y_OFFSET; rr.width -= 1; #ifndef __WXMAC__ if(page.active) { rr.y -= 2; rr.height += 2; } #endif #ifdef __WXGTK__ rr.height += TAB_HEIGHT_SPACER; #else rr.height += 4; #endif /// the tab start position (x) curx = rr.x + 7; // Set clipping region int clip_width = rr.width; if(rr.x + clip_width > in_rect.x + in_rect.width) clip_width = (in_rect.x + in_rect.width) - rr.x; gdc.SetClippingRegion(rr.x, rr.y, clip_width, rr.height); gdc.SetBrush(m_bgColour); gdc.SetPen(penColour); if(page.active) { gdc.SetBrush(m_activeTabBgColour); path.AddRoundedRectangle(rr.x, rr.y, rr.width - 1, rr.height, TAB_RADIUS); gdc.GetGraphicsContext()->FillPath(path); gdc.GetGraphicsContext()->StrokePath(path); } else { wxGraphicsPath outerPath = gdc.GetGraphicsContext()->CreatePath(); gdc.SetPen(penColour); outerPath.AddRoundedRectangle(rr.x, rr.y, rr.width - 1, rr.height, TAB_RADIUS); gdc.GetGraphicsContext()->StrokePath(outerPath); gdc.SetPen(m_innerPenColour); path.AddRoundedRectangle(rr.x + 1, rr.y + 1, rr.width - 3, rr.height - 1, TAB_RADIUS); gdc.GetGraphicsContext()->StrokePath(path); gdc.SetBrush(m_tabBgColour); gdc.GetGraphicsContext()->StrokePath(path); gdc.GetGraphicsContext()->FillPath(path); gdc.SetPen(penColour); } if(!page.active) { // Draw a line at the bottom rect gdc.SetPen(m_activeTabPenColour); gdc.DrawLine(in_rect.GetBottomLeft(), in_rect.GetBottomRight()); } wxString caption = page.caption; if(caption.IsEmpty()) { caption = "Tp"; } wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); if(page.active) { fnt.SetWeight(wxFONTWEIGHT_BOLD); } gdc.SetFont(fnt); wxSize ext = gdc.GetTextExtent(caption); if(caption == "Tp") caption.Clear(); /// Draw the bitmap if(page.bitmap.IsOk()) { int bmpy = (rr.y + (rr.height - page.bitmap.GetHeight()) / 2) - TAB_Y_OFFSET; gdc.GetGraphicsContext()->DrawBitmap(page.bitmap, curx, bmpy, page.bitmap.GetWidth(), page.bitmap.GetHeight()); curx += page.bitmap.GetWidth(); curx += 3; } /// Draw the text wxColour textColour = page.active ? m_activeTabTextColour : m_tabTextColour; gdc.SetTextForeground(textColour); gdc.GetGraphicsContext()->DrawText( page.caption, curx, (rr.y + (rr.height - ext.y) / 2) - TAB_Y_OFFSET + TEXT_Y_SPACER); // advance the X offset curx += ext.x; curx += 3; /// Draw the X button on the tab if(close_button_state != wxAUI_BUTTON_STATE_HIDDEN) { int btny = (rr.y + (rr.height / 2)) - TAB_Y_OFFSET + TEXT_Y_SPACER; if(close_button_state == wxAUI_BUTTON_STATE_PRESSED) { curx += 1; btny += 1; } /// Defines the rectangle surrounding the X button wxRect xRect = wxRect(curx, btny - X_RADIUS, X_DIAMETER, X_DIAMETER); *out_button_rect = xRect; /// Defines the 'x' inside the circle wxPoint circleCenter(curx + X_RADIUS, btny); wxDouble xx_width = ::sqrt(::pow(X_DIAMETER, 2.0) / 2.0); wxDouble x_square = (circleCenter.x - (xx_width / 2.0)); wxDouble y_square = (circleCenter.y - (xx_width / 2.0)); wxPoint2DDouble ptXTopLeft(x_square, y_square); wxRect2DDouble insideRect(ptXTopLeft.m_x, ptXTopLeft.m_y, xx_width, xx_width); insideRect.Inset(1.0, 1.0); // Shrink it by 1 pixle /// Draw the 'x' itself wxGraphicsPath xpath = gdc.GetGraphicsContext()->CreatePath(); xpath.MoveToPoint(insideRect.GetLeftTop()); xpath.AddLineToPoint(insideRect.GetRightBottom()); xpath.MoveToPoint(insideRect.GetRightTop()); xpath.AddLineToPoint(insideRect.GetLeftBottom()); gdc.SetPen(wxPen(textColour, 1)); gdc.GetGraphicsContext()->StrokePath(xpath); curx += X_DIAMETER; } *out_tab_rect = rr; gdc.DestroyClippingRegion(); }
// draw the continuity starting at a specific offset void DrawCont(wxDC& dc, const CC_textline_list& print_continuity, const wxRect& bounding, bool landscape) { SaveAndRestore_DeviceOrigin orig_dev(dc); SaveAndRestore_UserScale orig_scale(dc); SaveAndRestore_TextForeground orig_text(dc); SaveAndRestore_Font orig_font(dc); #if DEBUG dc.DrawRectangle(bounding); #endif dc.SetTextForeground(*wxBLACK); int pageMiddle = (bounding.GetWidth()/2); size_t numLines = 0; for (auto text = print_continuity.begin(); text != print_continuity.end(); ++text) { if (text->GetOnSheet()) { ++numLines; } } int font_size = ((bounding.GetBottom() - bounding.GetTop()) - (numLines - 1)*2)/(numLines ? numLines : 1); //font size, we scale to be no more than 256 pixels. font_size = std::min(font_size, 10); wxFont *contPlainFont = wxTheFontList->FindOrCreateFont(font_size, wxMODERN, wxNORMAL, wxNORMAL); wxFont *contBoldFont = wxTheFontList->FindOrCreateFont(font_size, wxMODERN, wxNORMAL, wxBOLD); wxFont *contItalFont = wxTheFontList->FindOrCreateFont(font_size, wxMODERN, wxITALIC, wxNORMAL); wxFont *contBoldItalFont = wxTheFontList->FindOrCreateFont(font_size, wxMODERN, wxITALIC, wxBOLD); dc.SetFont(*contPlainFont); const wxCoord maxtexth = contPlainFont->GetPointSize()+2; float y = bounding.GetTop(); const wxCoord charWidth = dc.GetCharWidth(); for (auto& cont : print_continuity) { float x = bounding.GetLeft(); // Determine how to center the text if (cont.GetCenter()) { x += pageMiddle; auto chunks = cont.GetChunks(); for (auto& c : chunks) { bool do_tab = false; switch (c.font) { case PSFONT_SYMBOL: { wxCoord textw, texth; dc.GetTextExtent(wxT("O"), &textw, &texth); x += textw * c.text.length(); } break; case PSFONT_NORM: dc.SetFont(*contPlainFont); break; case PSFONT_BOLD: dc.SetFont(*contBoldFont); break; case PSFONT_ITAL: dc.SetFont(*contItalFont); break; case PSFONT_BOLDITAL: dc.SetFont(*contBoldItalFont); break; case PSFONT_TAB: do_tab = true; break; } if (!do_tab && (c.font != PSFONT_SYMBOL)) { wxCoord textw, texth; dc.GetTextExtent(c.text, &textw, &texth); x -= textw/2; } } } // now draw the text unsigned tabnum = 0; auto chunks = cont.GetChunks(); for (auto& c : chunks) { bool do_tab = false; switch (c.font) { case PSFONT_NORM: case PSFONT_SYMBOL: dc.SetFont(*contPlainFont); break; case PSFONT_BOLD: dc.SetFont(*contBoldFont); break; case PSFONT_ITAL: dc.SetFont(*contItalFont); break; case PSFONT_BOLDITAL: dc.SetFont(*contBoldItalFont); break; case PSFONT_TAB: { tabnum++; wxCoord textw = bounding.GetLeft() + charWidth * TabStops(tabnum, landscape); if (textw >= x) x = textw; else x += charWidth; do_tab = true; } break; default: break; } if (c.font == PSFONT_SYMBOL) { wxCoord textw, texth, textd; dc.GetTextExtent(wxT("O"), &textw, &texth, &textd); const float d = textw; const float top_y = y + texth - textd - textw; for (std::string::const_iterator s = c.text.begin(); s != c.text.end(); s++) { { dc.SetPen(*wxBLACK_PEN); SYMBOL_TYPE sym = (SYMBOL_TYPE)(*s - 'A'); switch (sym) { case SYMBOL_SOL: case SYMBOL_SOLBKSL: case SYMBOL_SOLSL: case SYMBOL_SOLX: dc.SetBrush(*wxBLACK_BRUSH); break; default: dc.SetBrush(*wxTRANSPARENT_BRUSH); } dc.DrawEllipse(x, top_y, d, d); switch (sym) { case SYMBOL_SL: case SYMBOL_X: case SYMBOL_SOLSL: case SYMBOL_SOLX: dc.DrawLine(x-1, top_y + d+1, x + d+1, top_y-1); break; default: break; } switch (sym) { case SYMBOL_BKSL: case SYMBOL_X: case SYMBOL_SOLBKSL: case SYMBOL_SOLX: dc.DrawLine(x-1, top_y-1, x + d+1, top_y + d+1); break; default: break; } } x += d; } } else { if (!do_tab) { wxCoord textw, texth; dc.GetTextExtent(c.text, &textw, &texth); dc.DrawText(c.text, x, y); x += textw; } } } y += maxtexth; } #if DEBUG char buffer[100]; snprintf(buffer, sizeof(buffer), "TopLeft %d, %d", bounding.GetTopLeft().x, bounding.GetTopLeft().y); dc.DrawText(buffer, bounding.GetTopLeft()); snprintf(buffer, sizeof(buffer), "BottomRight %d, %d", bounding.GetBottomRight().x, bounding.GetBottomRight().y); dc.DrawText(buffer, bounding.GetBottomRight()); #endif }