/* Copyright (C) 2019-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: WximgszFrame.wxc */ /** @file WximgszFrame.cpp The WximgszFrame module. */ #line 375 "WximgszFrame.wxc" #include "wximgsz.h" #if !defined(__WXMSW__) #include "gui-img/icons/dkicon.xpm" #endif #include "gui-img/shared/toolbar/run-conversion.xpm" #line 388 "WximgszFrame.wxc" /* __CHANGE__ 017: Add further events. */ /* Hint: Window IDs for main frame members are defined in an enum in the frame class. IDs defined in this enum should have WximgszFrame:: prepended for an optical distinction from predefined window IDs (i.e. from wxWidgets). */ /* __CHANGE__ 008: Remove OnIdle if no idle processing required. When removing the table entry here, remove the entire OnIdle() method. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(WximgszFrame,wxFrame) #else BEGIN_EVENT_TABLE(WximgszFrame,wxFrame) #endif EVT_MENU(\ wxID_OPEN,\ WximgszFrame::OnFileOpen\ ) EVT_MENU(\ wxID_EXIT,\ WximgszFrame::OnQuit\ ) EVT_MENU(\ WximgszFrame::ID_HELP_ABOUT,\ WximgszFrame::OnAbout\ ) EVT_MENU(\ WximgszFrame::ID_HELP_TOC,\ WximgszFrame::OnHelpContents\ ) EVT_BUTTON(\ WximgszFrame::ID_BUTTON_RUN,\ WximgszFrame::OnButtonRun\ ) EVT_CHOICE(\ WximgszFrame::ID_CHOICE_OP,\ WximgszFrame::OnChoiceOperation\ ) EVT_IDLE(\ WximgszFrame::OnIdle\ ) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif /** Image file types we can handle. */ static wxChar const image_files_to_open[] = { wxT("All files (*.*)|*.*") #if wxUSE_LIBPNG wxT("|PNG files (*.png)|*.png") #endif #if wxUSE_LIBJPEG wxT("|JPEG files (*.jpeg)|*.jpeg") wxT("|JPEG files (*.jpg)|*.jpg") #endif #if wxUSE_LIBTIFF wxT("|TIFF files (*.tiff)|*.tiff") wxT("|TIFF files (*.tif)|*.tif") #endif #if wxUSE_GIF wxT("|GIF files (*.gif)|*.gif") #endif #if wxUSE_PCX wxT("|PCX files (*.pcx)|*.pcx") #endif wxT("|BMP files (*.bmp)|*.bmp") #if wxUSE_ICO_CUR wxT("|ICO files (*.ico)|*.ico") wxT("|CUR files (*.cur)|*.cur") #endif #if wxUSE_XPM wxT("|XPM files (*.xpm)|*.xpm") wxT("|XBM files (*.xbm)|*.xbm") #endif #if wxUSE_TGA wxT("|TGA files (*.tga)|*.tga") #endif #if wxUSE_IFF wxT("|IFF files (*.iff)|*.iff") #endif wxT("|ANI files (*.ani)|*.ani") #if wxUSE_PNM wxT("|NetPBM files (*.pam)|*.pam") wxT("|NetPBM files (*.pnm)|*.pnm") wxT("|NetPBM files (*.ppm)|*.ppm") wxT("|NetPBM files (*.pgm)|*.pgm") wxT("|NetPBM files (*.pbm)|*.pbm") #endif }; /** Suffix and bitmap type relationship. */ typedef struct { wxChar const *s; /**< File name suffix. */ wxBitmapType t; /**< Bitmap type. */ } Suffix_and_type_t; /** Array to assign file name suffixes to file types. */ Suffix_and_type_t suffix_and_type[] = { #if wxUSE_LIBPNG { wxT(".png"), wxBITMAP_TYPE_PNG }, #endif #if wxUSE_LIBJPEG { wxT(".jpeg"), wxBITMAP_TYPE_JPEG }, { wxT(".jpg"), wxBITMAP_TYPE_JPEG }, #endif #if wxUSE_LIBTIFF { wxT(".tiff"), wxBITMAP_TYPE_TIFF }, { wxT(".tif"), wxBITMAP_TYPE_TIF }, #endif #if wxUSE_PNM { wxT(".pam"), wxBITMAP_TYPE_PNM }, { wxT(".pnm"), wxBITMAP_TYPE_PNM }, { wxT(".ppm"), wxBITMAP_TYPE_PNM }, { wxT(".pgm"), wxBITMAP_TYPE_PNM }, { wxT(".pbm"), wxBITMAP_TYPE_PNM }, #endif #if wxUSE_XPM { wxT(".xpm"), wxBITMAP_TYPE_XPM }, { wxT(".xbm"), wxBITMAP_TYPE_XBM }, #endif #if wxUSE_ICO_CUR { wxT(".ico"), wxBITMAP_TYPE_ICO }, { wxT(".cur"), wxBITMAP_TYPE_CUR }, #endif #if wxUSE_GIF { wxT(".gif"), wxBITMAP_TYPE_GIF }, #endif #if wxUSE_PCX { wxT(".pcx"), wxBITMAP_TYPE_PCX }, #endif { wxT(".bmp"), wxBITMAP_TYPE_BMP }, #if wxUSE_TGA { wxT(".tga"), wxBITMAP_TYPE_TGA }, #endif #if wxUSE_IFF { wxT(".iff"), wxBITMAP_TYPE_IFF }, #endif { wxT(".ani"), wxBITMAP_TYPE_ANI }, { NULL, wxBITMAP_TYPE_INVALID } }; static wxBitmapType bitmap_type_for_name(wxString & fn) { wxChar const *ptr = NULL; Suffix_and_type_t *sat = NULL; wxBitmapType back = wxBITMAP_TYPE_INVALID; wxCStrData strdata = fn.c_str(); ptr = (wxChar const *)strdata; if (NULL != ptr) { ptr = dk4strx_get_path_suffix(ptr, NULL); if (NULL != ptr) { sat = suffix_and_type; while((NULL != sat->s) && (wxBITMAP_TYPE_INVALID == back)) { if (0 == dk4strx_casecmp(sat->s, ptr)) { back = sat->t; } else { sat++; } } } } return back; } #line 577 "WximgszFrame.wxc" WximgszFrame::WximgszFrame( int wxid, Dk4WxApplicationHelper *applicationHelper, Dk4WxHelpController *hc, int argc, wxChar **argv, wxChar const * const *localizedTexts, wxChar const * const *nlWx, dkChar const * const *nlDk ) : Dk4WxFrame(nlWx[0], applicationHelper, hc, wxid), cas(), cLabelRed(127, 0, 0), cRed(255, 91, 91), cGreen(127, 255, 127), cYellow(255, 255, 0), cBlack(0, 0, 0), sImageFileName((1 < argc)?(argv[1]):(wxT(""))), sDirectory(wxEmptyString) { wxString saOperation[] = { wxString(localizedTexts[21]), wxString(localizedTexts[22]), wxString(localizedTexts[23]) }; #line 602 "WximgszFrame.wxc" /* __CHANGE__ 012: Add further local variables. */ /* __CHANGE__ 012: Initialize further local variables. */ sTexts = localizedTexts; sNlWx = nlWx; sNlDk = nlDk; #if defined(__WXMSW__) wxIcon wximgsz_icon(sNlWx[4]); #else wxIcon wximgsz_icon(xpm_dkicon); #endif /* __CHANGE__ 011: Initialize further class members. */ maxpass = MAXPASS; bActive = false; bImageFileName = false; if (1 < argc) { bImageFileName = true; cas.SetAutoStart(); } dkctGUILayoutOK = false; dkctGUIContentsPanel = NULL; mainSizer = NULL; mbMain = NULL; menuFile = NULL; menuHelp = NULL; miFileOpen = NULL; miFileExit = NULL; miHelpAbout = NULL; miHelpContents = NULL; verticalSizer = NULL; contentsSizer = NULL; inputSizer = NULL; runButtonSizer = NULL; resultSizer = NULL; lInput = NULL; lInputWidth = NULL; spInputWidth = NULL; lInputHeight = NULL; spInputHeight = NULL; lChange = NULL; lOperation = NULL; cbOperation = NULL; lOperationMin = NULL; spOperationMin = NULL; lOperationMax = NULL; spOperationMax = NULL; bRun = NULL; lResults = NULL; tResult = NULL; dkctGUIContentsPanel = new wxPanel(this); if(!(dkctGUIContentsPanel)) { goto dkctGUILayoutFinished; } #if wxUSE_MENUS mbMain = new wxMenuBar( ); if(!(mbMain)) { goto dkctGUILayoutFinished; } menuFile = new wxMenu( ); if(!(menuFile)) { goto dkctGUILayoutFinished; } miFileOpen = menuFile->Append( wxID_OPEN, sTexts[40], sTexts[41] ); if(!(miFileOpen)) { goto dkctGUILayoutFinished; } miFileExit = menuFile->Append( wxID_EXIT, sTexts[1], sTexts[2] ); if(!(miFileExit)) { goto dkctGUILayoutFinished; } mbMain->Append(menuFile, sTexts[0]); menuHelp = new wxMenu( ); if(!(menuHelp)) { goto dkctGUILayoutFinished; } miHelpAbout = menuHelp->Append( WximgszFrame::ID_HELP_ABOUT, sTexts[4], sTexts[5] ); if(!(miHelpAbout)) { goto dkctGUILayoutFinished; } miHelpContents = menuHelp->Append( WximgszFrame::ID_HELP_TOC, sTexts[6], sTexts[7] ); if(!(miHelpContents)) { goto dkctGUILayoutFinished; } mbMain->Append(menuHelp, sTexts[3]); SetMenuBar(mbMain); #endif mainSizer = new wxBoxSizer( wxHORIZONTAL ); if(!(mainSizer)) { goto dkctGUILayoutFinished; } mainSizer->Add(10, 10, 0); verticalSizer = new wxBoxSizer( wxVERTICAL ); if(!(verticalSizer)) { goto dkctGUILayoutFinished; } verticalSizer->Add(10, 10, 0); contentsSizer = new wxBoxSizer( wxHORIZONTAL ); if(!(contentsSizer)) { goto dkctGUILayoutFinished; } inputSizer = new wxGridBagSizer( 5, 5 ); if(!(inputSizer)) { goto dkctGUILayoutFinished; } lInput = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[13] ); if(!(lInput)) { goto dkctGUILayoutFinished; } inputSizer->Add( lInput, wxGBPosition(0, 0), wxGBSpan(1, 2), wxALIGN_LEFT ); lInputWidth = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[14] ); if(!(lInputWidth)) { goto dkctGUILayoutFinished; } inputSizer->Add( lInputWidth, wxGBPosition(1, 0), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ); spInputWidth = new wxSpinCtrl( dkctGUIContentsPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 1, 65535, 1 ); if(!(spInputWidth)) { goto dkctGUILayoutFinished; } spInputWidth->SetToolTip(sTexts[16]); inputSizer->Add( spInputWidth, wxGBPosition(1, 1), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL ); lInputHeight = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[15] ); if(!(lInputHeight)) { goto dkctGUILayoutFinished; } inputSizer->Add( lInputHeight, wxGBPosition(2, 0), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ); spInputHeight = new wxSpinCtrl( dkctGUIContentsPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 1, 65535, 1 ); if(!(spInputHeight)) { goto dkctGUILayoutFinished; } spInputHeight->SetToolTip(sTexts[17]); inputSizer->Add( spInputHeight, wxGBPosition(2, 1), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL ); inputSizer->Add(10, 10, wxGBPosition(3, 0), wxGBSpan(1, 1)); lChange = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[18] ); if(!(lChange)) { goto dkctGUILayoutFinished; } inputSizer->Add( lChange, wxGBPosition(4, 0), wxGBSpan(1, 2), wxALIGN_LEFT ); lOperation = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[19] ); if(!(lOperation)) { goto dkctGUILayoutFinished; } inputSizer->Add( lOperation, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ); cbOperation = new wxChoice( dkctGUIContentsPanel, ID_CHOICE_OP, wxDefaultPosition, wxDefaultSize, 3, saOperation ); if(!(cbOperation)) { goto dkctGUILayoutFinished; } cbOperation->SetToolTip(sTexts[20]); inputSizer->Add( cbOperation, wxGBPosition(5, 1), wxGBSpan(1, 1), wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL ); lOperationMin = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[24] ); if(!(lOperationMin)) { goto dkctGUILayoutFinished; } inputSizer->Add( lOperationMin, wxGBPosition(6, 0), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ); spOperationMin = new wxSpinCtrl( dkctGUIContentsPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 1, 65535, 1 ); if(!(spOperationMin)) { goto dkctGUILayoutFinished; } spOperationMin->SetToolTip(sTexts[26]); inputSizer->Add( spOperationMin, wxGBPosition(6, 1), wxGBSpan(1, 1), wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL ); lOperationMax = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[25] ); if(!(lOperationMax)) { goto dkctGUILayoutFinished; } inputSizer->Add( lOperationMax, wxGBPosition(7, 0), wxGBSpan(1, 1), wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL ); spOperationMax = new wxSpinCtrl( dkctGUIContentsPanel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 1, 65535, 1 ); if(!(spOperationMax)) { goto dkctGUILayoutFinished; } spOperationMax->SetToolTip(sTexts[27]); inputSizer->Add( spOperationMax, wxGBPosition(7, 1), wxGBSpan(1, 1), wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL ); contentsSizer->Add( inputSizer ); contentsSizer->Add(20, 20, 0); runButtonSizer = new wxBoxSizer( wxVERTICAL ); if(!(runButtonSizer)) { goto dkctGUILayoutFinished; } runButtonSizer->Add(10, 10, 1); bRun = new wxBitmapButton( dkctGUIContentsPanel, ID_BUTTON_RUN, xpm_run_conversion ); if(!(bRun)) { goto dkctGUILayoutFinished; } bRun->SetToolTip(sTexts[29]); runButtonSizer->Add( bRun ); runButtonSizer->Add(10, 10, 1); contentsSizer->Add( runButtonSizer, 0, wxGROW ); contentsSizer->Add(20, 20, 0); resultSizer = new wxBoxSizer( wxVERTICAL ); if(!(resultSizer)) { goto dkctGUILayoutFinished; } lResults = new wxStaticText( dkctGUIContentsPanel, wxID_ANY, sTexts[28] ); if(!(lResults)) { goto dkctGUILayoutFinished; } resultSizer->Add( lResults, 0, wxALIGN_LEFT ); tResult = new wxGrid( dkctGUIContentsPanel, wxID_ANY ); if(!(tResult)) { goto dkctGUILayoutFinished; } tResult->CreateGrid(4, 4); tResult->SetColLabelValue(0, sTexts[30]); tResult->SetColLabelValue(1, sTexts[31]); tResult->SetColLabelValue(2, sTexts[32]); tResult->SetColLabelValue(3, sTexts[33]); tResult->EnableEditing(false); resultSizer->Add( tResult, 1, wxALIGN_LEFT|wxGROW ); contentsSizer->Add( resultSizer, 1, wxGROW ); verticalSizer->Add( contentsSizer, 1, wxGROW ); verticalSizer->Add(10, 10, 0); mainSizer->Add( verticalSizer, 1, wxGROW ); mainSizer->Add(10, 10, 0); dkctGUIContentsPanel->SetSizer(mainSizer); SetIcon(wximgsz_icon); dkctGUILayoutOK = true; dkctGUILayoutFinished: #if wxUSE_STATUSBAR if(dkctGUILayoutOK) { CreateStatusBar(1); SetStatusText(sTexts[8]); } #endif if(dkctGUILayoutOK) { mainSizer->Fit(this); mainSizer->SetSizeHints(this); } #line 628 "WximgszFrame.wxc" if(dkctGUILayoutOK) { lInput->SetForegroundColour(cLabelRed); lChange->SetForegroundColour(cLabelRed); lResults->SetForegroundColour(cLabelRed); #if 0 spInputWidth->SetRange(1, INT_MAX); spInputHeight->SetRange(1, INT_MAX); spOperationMin->SetRange(1, INT_MAX); spOperationMax->SetRange(1, INT_MAX); inputSizer->Fit(spInputWidth); inputSizer->Fit(spInputHeight); inputSizer->Fit(spOperationMin); inputSizer->Fit(spOperationMax); mainSizer->Layout(); #endif cbOperation->SetSelection(0); spOperationMin->Enable(false); spOperationMax->Enable(false); SetTitle(nlWx[0]); #if 0 RestorePosition(); #endif } /* __CHANGE__ 012: Release resources allocated by local variables. */ #line 656 "WximgszFrame.wxc" } #line 659 "WximgszFrame.wxc" WximgszFrame::~WximgszFrame() { #line 665 "WximgszFrame.wxc" /* __CHANGE__ 011: Release resources allocated by further class members. */ #line 670 "WximgszFrame.wxc" } bool WximgszFrame::CanClose(bool WXUNUSED(isLast)) { bool back = true; #line 679 "WximgszFrame.wxc" /* __CHANGE__ 013: Check for unsaved data. And probably change parameter to "bool WXUNUSED(isLast)" */ #line 685 "WximgszFrame.wxc" return back; } void WximgszFrame::OnFileOpen(wxCommandEvent & WXUNUSED(event)) { dkChar buf[DK4_MAX_PATH]; dk4_bif_t *pbif; const wxChar *ptrFilePath; bool success = false; int dke; int wxe; int res; #if wxCHECK_VERSION(2, 9, 0) wxFileDialog dlg( this, sTexts[42], sDirectory, wxEmptyString, image_files_to_open, (wxFD_OPEN | wxFD_FILE_MUST_EXIST) ); #else wxFileDialog dlg( this, sTexts[42], sDirectory, wxEmptyString, image_files_to_open, wxOPEN ); #endif #line 712 "WximgszFrame.wxc" if(wxID_OK == dlg.ShowModal()) { wxString pa = dlg.GetPath(); wxFileName wxfn(pa); if (wxfn.FileExists() && wxfn.IsFileReadable()) { sDirectory = dlg.GetDirectory(); { wxCStrData sFilePath = pa.c_str(); ptrFilePath = (wxChar const *)sFilePath; if (NULL != ptrFilePath) { dke = pAppHelp->GetDkEncoding(); wxe = pAppHelp->GetWxEncoding(); res = dk4recwx_wxchar_to_dkchar( buf, DK4_SIZEOF(buf,dkChar), dke, ptrFilePath, wxe, NULL ); if (0 != res) { pbif = dk4bif_open(buf, 1, NULL, NULL); if (NULL != pbif) { dk4_bif_dim_t w = dk4bif_get_width(pbif); dk4_bif_dim_t h = dk4bif_get_height(pbif); if ( ((dk4_im_t)0L < (dk4_im_t)w) && ((dk4_im_t)0L < (dk4_im_t)h) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)w) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)h) ) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } dk4bif_close(pbif); } } } } if (!(success)) { #line 747 "WximgszFrame.wxc" wxBitmapType t = bitmap_type_for_name(pa); if (wxBITMAP_TYPE_INVALID != t) { #line 749 "WximgszFrame.wxc" wxBitmap bm(pa, t); if (bm.IsOk()) { int w = bm.GetWidth(); int h = bm.GetHeight(); if ((0 < w) && (0 < h)) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } else { #line 759 "WximgszFrame.wxc" wxMessageBox( sTexts[44], sTexts[43], (wxOK | wxCENTRE | wxICON_ERROR) ); } } else { #line 766 "WximgszFrame.wxc" wxMessageBox( sTexts[44], sTexts[43], (wxOK | wxCENTRE | wxICON_ERROR) ); } } else { wxString s(sTexts[49]); s.Append(pa); s.Append(sTexts[50]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); } } if(success) { Calculations(); } } else { if (!(wxfn.FileExists())) { #line 787 "WximgszFrame.wxc" wxString s(sTexts[45]); s.Append(pa); s.Append(sTexts[46]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); } else { if (!(wxfn.IsFileReadable())) { #line 796 "WximgszFrame.wxc" wxString s(sTexts[47]); s.Append(pa); s.Append(sTexts[48]); wxMessageBox( s,wxString(sTexts[43]),(wxOK | wxCENTRE | wxICON_ERROR) ); } } } } #line 807 "WximgszFrame.wxc" Refresh(); Update(); } void WximgszFrame::OnQuit(wxCommandEvent & WXUNUSED(event)) { #line 816 "WximgszFrame.wxc" bActive = false; #line 818 "WximgszFrame.wxc" Close(); } void WximgszFrame::OnAbout(wxCommandEvent & WXUNUSED(event)) { wxString text(wxT("")); wxString title(wxT("")); #line 829 "WximgszFrame.wxc" /* Construct message text. */ text.Append(sNlWx[0]); text.Append(sNlWx[7]); #if 0 text.Append(sNlWx[1]); #endif text.Append(DKT_VERSION_WX); text.Append(sNlWx[8]); text.Append(sTexts[9]); text.Append(sNlWx[2]); text.Append(sNlWx[8]); text.Append(sNlWx[8]); text.Append(sTexts[11]); text.Append(sNlWx[8]); text.Append(sNlWx[9]); text.Append(sNlWx[8]); text.Append(sNlWx[8]); text.Append(sTexts[12]); text.Append(sNlWx[8]); text.Append(sNlWx[10]); text.Append(sNlWx[8]); text.Append(sNlWx[11]); text.Append(sNlWx[8]); text.Append(sNlWx[12]); text.Append(sNlWx[8]); text.Append(sNlWx[13]); text.Append(sNlWx[8]); text.Append(sNlWx[14]); text.Append(sNlWx[8]); text.Append(sNlWx[15]); text.Append(sNlWx[8]); /* Construct dialog box title. */ title.Append(sTexts[10]); title.Append(sNlWx[0]); /* Show dialog box. */ wxMessageBox(text, title); /* __CHANGE__ 019: Create better about box. */ #line 871 "WximgszFrame.wxc" } void WximgszFrame::OnHelpContents(wxCommandEvent & WXUNUSED(event)) { #line 879 "WximgszFrame.wxc" DisplayContents(); #line 881 "WximgszFrame.wxc" } static int bits_in_int(int x) { int back = 0; int test = 1; int done = 0; while (0 == done) { if (0 != (x & test)) { if (1 < ++back) { done = 1; } } if ((INT_MAX / 2) >= test) { test = test * 2; if (test > x) { done = 1; } } else { done = 1; } } return back; } static int is_power_of_2(int x) { int back = 0; if (1 == bits_in_int(x)) { back = 1; } return back; } static int quality_for_fraction(int counter, int denom) { int back = 0; if (1 == denom) { back = 1; if (0 != is_power_of_2(counter)) { back = 2; } } else { if (1 == counter) { back = 1; if (0 != is_power_of_2(denom)) { back = 2; } } } return back; } static int gcd(int a, int b) { int h; #line 956 "WximgszFrame.wxc" while (0 < b) { h = a % b; a = b; b = h; } #line 961 "WximgszFrame.wxc" return a; } /* __CHANGE__ 017: Event handlers for further events. */ void WximgszFrame::Calculations(void) { wxString s1; /* Width */ wxString s2; /* Height */ wxString s3; /* Factor */ wxString m2(sTexts[36]); wxString m1(sTexts[35]); wxString m0(sTexts[34]); int w_ori; /* Original width */ int h_ori; /* Original height */ int w_min; /* Minimum width */ int h_min; /* Minimum height */ int gcd_ori; /* Greatest common divisor original width height */ int min; /* Destination range minimum */ int max; /* Destination range maximum */ int opsel; /* Operation selection */ int f_min; /* Minimum factor */ int f_max; /* Maximum factor */ int nrows; /* Number of table rows */ int passno; /* Current pass number (table row index) */ int f; /* Current factor */ int w; /* Current width */ int h; /* Current height */ int counter; /* Fraction counter */ int denom; /* Fraction denominator */ int gcd_fr; /* Fraction greatest common divisor */ int q; /* Fraction quality */ int i; /* Walk through the columns */ bool bDidSkip; /* Flag: Restricted output to 2000 columns */ #line 999 "WximgszFrame.wxc" bDidSkip = false; w_ori = spInputWidth->GetValue(); h_ori = spInputHeight->GetValue(); min = spOperationMin->GetValue(); max = spOperationMax->GetValue(); opsel = cbOperation->GetSelection(); if (0 >= w_ori) { w_ori = 1; } if (0 >= h_ori) { h_ori = 1; } if (0 >= min) { min = 1; } if (0 >= max) { max = 1; } gcd_ori = gcd(w_ori, h_ori); w_min = w_ori / gcd_ori; h_min = h_ori / gcd_ori; f_min = 1; f_max = gcd_ori; switch (opsel) { case 1: { f_min = min / w_min; f_max = max / w_min; if (0 >= f_min) { f_min = 1; } if (0 >= f_max) { f_max = 1; } } break; case 2: { f_min = min / h_min; f_max = max / h_min; if (0 >= f_min) { f_min = 1; } if (0 >= f_max) { f_max = 1; } } break; } nrows = f_max - f_min + 1; if (nrows > maxpass) { nrows = maxpass; bDidSkip = true; } /* Delete old table columns, allocate new columns */ passno = tResult->GetNumberRows(); tResult->DeleteRows(0, passno); tResult->AppendRows(nrows); /* Fill table */ passno = 0; f = f_min; while (passno < nrows) { w = f * w_min; h = f * h_min; gcd_fr = gcd(f, gcd_ori); counter = f / gcd_fr; denom = gcd_ori / gcd_fr; q = quality_for_fraction(counter, denom); s1.Printf(wxT("%d"), w); s2.Printf(wxT("%d"), h); if (1 == denom) { s3.Printf(wxT("%d"), counter); } else { s3.Printf(wxT("%d / %d"), counter, denom); } for (i = 0; i < 4; i++) { tResult->SetCellTextColour(passno, i, cBlack); } tResult->SetCellValue(passno, 0, s1); tResult->SetCellValue(passno, 1, s2); tResult->SetCellValue(passno, 2, s3); switch (q) { case 2: { tResult->SetCellValue(passno, 3, m2); for (i = 0; i < 4; i++) { tResult->SetCellBackgroundColour( passno, i, cGreen ); } } break; case 1: { tResult->SetCellValue(passno, 3, m1); for (i = 0; i < 4; i++) { tResult->SetCellBackgroundColour( passno, i, cYellow ); } } break; case 0: { tResult->SetCellValue(passno, 3, m0); for (i = 0; i < 4; i++) { tResult->SetCellBackgroundColour( passno, i, cRed ); } } break; } tResult->SetCellAlignment(passno, 0, wxALIGN_CENTRE, wxALIGN_CENTRE); tResult->SetCellAlignment(passno, 1, wxALIGN_CENTRE, wxALIGN_CENTRE); tResult->SetCellAlignment(passno, 2, wxALIGN_CENTRE, wxALIGN_CENTRE); tResult->SetCellAlignment(passno, 3, wxALIGN_CENTRE, wxALIGN_CENTRE); passno++; f++; } tResult->AutoSizeColumns(); tResult->EnableDragColSize(true); if (bDidSkip) { wxMessageBox( sTexts[39], sTexts[38], (wxOK | wxCENTRE | wxICON_ERROR)); } #line 1101 "WximgszFrame.wxc" } void WximgszFrame::OnButtonRun(wxCommandEvent & WXUNUSED(event)) { #line 1109 "WximgszFrame.wxc" Calculations(); #line 1111 "WximgszFrame.wxc" Refresh(); Update(); } void WximgszFrame::OnChoiceOperation(wxCommandEvent & WXUNUSED(event)) { #line 1121 "WximgszFrame.wxc" switch (cbOperation->GetSelection()) { case 2 : case 1 : { spOperationMin->Enable(); spOperationMax->Enable(); } break; default : { spOperationMin->Enable(false); spOperationMax->Enable(false); } break; } #line 1132 "WximgszFrame.wxc" Refresh(); Update(); } /* __CHANGE__ 014: Implementation of further methods. */ void WximgszFrame::ActivateIdleProcessing(bool fl) { bActive = fl; } void WximgszFrame::ProcessSpecifiedFileName(void) { dkChar buf[DK4_MAX_PATH]; wxChar const *ptrImageFileName; dk4_bif_t *pbif; int dke; int wxe; int res; bool success; #line 1159 "WximgszFrame.wxc" success = false; wxFileName wxfn(sImageFileName); if (wxfn.FileExists() && wxfn.IsFileReadable()) { wxCStrData csImageFileName = sImageFileName.c_str(); ptrImageFileName = (wxChar const *)csImageFileName; if (NULL != ptrImageFileName) { #line 1165 "WximgszFrame.wxc" dke = pAppHelp->GetDkEncoding(); wxe = pAppHelp->GetWxEncoding(); res = dk4recwx_wxchar_to_dkchar( buf, DK4_SIZEOF(buf,dkChar), dke, ptrImageFileName, wxe, NULL ); if (0 != res) { #line 1171 "WximgszFrame.wxc" pbif = dk4bif_open(buf, 1, NULL, NULL); if (NULL != pbif) { dk4_bif_dim_t w = dk4bif_get_width(pbif); dk4_bif_dim_t h = dk4bif_get_height(pbif); if ( ((dk4_im_t)0L < (dk4_im_t)w) && ((dk4_im_t)0L < (dk4_im_t)h) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)w) && ((dk4_im_t)(MAXIMGDIM) >= (dk4_im_t)h) ) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } #if TRACE_DEBUG else { #line 1187 "WximgszFrame.wxc" } #endif dk4bif_close(pbif); } #if TRACE_DEBUG else { #line 1193 "WximgszFrame.wxc" } #endif } #if TRACE_DEBUG else { #line 1198 "WximgszFrame.wxc" } #endif } #if TRACE_DEBUG else { #line 1203 "WximgszFrame.wxc" } #endif if (!(success)) { #line 1206 "WximgszFrame.wxc" wxBitmapType t = bitmap_type_for_name(sImageFileName); if (wxBITMAP_TYPE_INVALID != t) { #line 1208 "WximgszFrame.wxc" wxBitmap bm(sImageFileName, t); if (bm.IsOk()) { int w = bm.GetWidth(); int h = bm.GetHeight(); if ((0 < w) && (0 < h)) { spInputWidth->SetValue(w); spInputHeight->SetValue(h); success = true; } else { #line 1218 "WximgszFrame.wxc" #if 0 wxMessageBox( sTexts[44], sTexts[43], (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } else { #line 1227 "WximgszFrame.wxc" #if 0 wxMessageBox( sTexts[44],sTexts[43],(wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } else { #line 1235 "WximgszFrame.wxc" #if 0 wxString s(sTexts[49]); s.Append(sImageFileName); s.Append(sTexts[50]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } if (success) { Calculations(); } } else { if (!(wxfn.FileExists())) { #line 1251 "WximgszFrame.wxc" #if 0 wxString s(sTexts[45]); s.Append(sImageFileName); s.Append(sTexts[46]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } else { if (!(wxfn.IsFileReadable())) { #line 1262 "WximgszFrame.wxc" #if 0 wxString s(sTexts[47]); s.Append(sImageFileName); s.Append(sTexts[48]); wxMessageBox( s, wxString(sTexts[43]), (wxOK | wxCENTRE | wxICON_ERROR) ); #endif } } } #line 1274 "WximgszFrame.wxc" } /* __CHANGE__ 008: Remove OnIdle if no idle processing required. */ /* __CHANGE__ 008: Remove the request for more events if not needed. */ /* __CHANGE__ 008: Decide about Skip() call. The function name is irritating: Skip() or Skip(true) will continue to process the event, calling default handlers. Skip(false) or handlers without Skip() will skip further processing of the event. From the wxWidgets documenation: Skip() should be called for all non-command events to allow the default handling to take place. The command events are, however, normally not skipped as usually a single command such as a button click or menu item selection must only be processed by one handler. So my recommendation is to have a Skip() call in the idle event handler. */ void WximgszFrame::OnIdle(wxIdleEvent & event) { bool rqm = false; #line 1302 "WximgszFrame.wxc" /* __CHANGE__ */ if (bActive) { switch (cas.GetReaction()) { case Dk4WxAutostartController::REACTION_START : { cas.StartProcessing(); ProcessSpecifiedFileName(); cas.EndProcessing(); Refresh(); Update(); } break; } if (rqm) { event.RequestMore(); } } #line 1317 "WximgszFrame.wxc" event.Skip(); } /* vim: set ai sw=4 ts=4 : */