Mercurial > mercurial > hgweb_searcher03.cgi
view src/preview.cpp @ 22:92188f60323d default tip
Implement Masking function on Preview Dialog.
author | pyon@macmini |
---|---|
date | Sat, 04 Apr 2015 17:23:46 +0900 |
parents | de222bc84e48 |
children |
line wrap: on
line source
// Filename : preview.cpp // Last Change: 2015-04-03 11:57:55. // #include "marksheet.h" #include "preview.h" #define THUMB_W 60 #define THUMB_H 75 // サムネイルパネル PThumbnailPanel::PThumbnailPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { m_parent = (PreviewDialog*)parent; wxBoxSizer* bSizer = new wxBoxSizer( wxVERTICAL ); this->SetBackgroundColour( wxColour( 192, 192, 192 ) ); wxString thumb = wxGetCwd() + wxFILE_SEP_PATH + wxT("image") + wxFILE_SEP_PATH + wxT("thumbnail.png"); wxBitmap bmp = wxBitmap( thumb, wxBITMAP_TYPE_PNG ); m_bitmap0 = new wxStaticBitmap( this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 ); bSizer->Add( m_bitmap0, 0, wxALL|wxALIGN_CENTER, 5 ); m_bitmap0->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick0 ), NULL, this ); m_bitmap1 = new wxStaticBitmap(this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 ); bSizer->Add( m_bitmap1, 0, wxALL|wxALIGN_CENTER, 5 ); m_bitmap1->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick1 ), NULL, this ); m_bitmap2 = new wxStaticBitmap( this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 ); bSizer->Add( m_bitmap2, 0, wxALL|wxALIGN_CENTER, 5 ); m_bitmap2->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick2 ), NULL, this ); m_bitmap3 = new wxStaticBitmap(this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 ); bSizer->Add( m_bitmap3, 0, wxALL|wxALIGN_CENTER, 5 ); m_bitmap3->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick3 ), NULL, this ); m_bitmap4 = new wxStaticBitmap( this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 ); bSizer->Add( m_bitmap4, 0, wxALL|wxALIGN_CENTER, 5 ); m_bitmap4->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick4 ), NULL, this ); m_bitmap5 = new wxStaticBitmap(this, wxID_ANY, bmp, wxDefaultPosition, wxSize( THUMB_W, THUMB_H ), 0 ); bSizer->Add( m_bitmap5, 0, wxALL|wxALIGN_CENTER, 5 ); m_bitmap5->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick5 ), NULL, this ); this->SetSizer( bSizer ); this->Layout(); } PThumbnailPanel::~PThumbnailPanel() { m_bitmap0->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick0 ), NULL, this ); m_bitmap1->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick1 ), NULL, this ); m_bitmap2->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick2 ), NULL, this ); m_bitmap3->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick3 ), NULL, this ); m_bitmap4->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick4 ), NULL, this ); m_bitmap5->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( PThumbnailPanel::OnClick5 ), NULL, this ); } // Functions /* サムネイル画像作成 */ void PThumbnailPanel::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select ) { m_imagefiles = imagefiles; wxBitmap bmp; m_imageList.Create( THUMB_W, THUMB_H ); bmp.LoadFile( cachefiles[0], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp ); bmp.LoadFile( cachefiles[1], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp ); bmp.LoadFile( cachefiles[2], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp ); bmp.LoadFile( cachefiles[3], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp ); bmp.LoadFile( cachefiles[4], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp ); bmp.LoadFile( cachefiles[5], wxBITMAP_TYPE_PNG ); m_imageList.Add( bmp ); SetImageList( select ); } /* 画像クリックで拡大表示 */ void PThumbnailPanel::OnClick0( wxMouseEvent& WXUNUSED(event) ) { Preview( 0 ); } void PThumbnailPanel::OnClick1( wxMouseEvent& WXUNUSED(event) ) { Preview( 1 ); } void PThumbnailPanel::OnClick2( wxMouseEvent& WXUNUSED(event) ) { Preview( 2 ); } void PThumbnailPanel::OnClick3( wxMouseEvent& WXUNUSED(event) ) { Preview( 3 ); } void PThumbnailPanel::OnClick4( wxMouseEvent& WXUNUSED(event) ) { Preview( 4 ); } void PThumbnailPanel::OnClick5( wxMouseEvent& WXUNUSED(event) ) { Preview( 5 ); } void PThumbnailPanel::Preview( int n ) { if ( n == 0 ) m_parent->EnableMaskButton( true ); else m_parent->EnableMaskButton( false ); if ( m_imagefiles.GetCount() < n + 1 ) return; SetImageList( n ); m_parent->SetPreviewImage( n ); } /* サムネイル表示 */ void PThumbnailPanel::SetImageList( int selected ) { m_bitmap0->SetBitmap( m_imageList.GetBitmap(0) ); m_bitmap1->SetBitmap( m_imageList.GetBitmap(1) ); m_bitmap2->SetBitmap( m_imageList.GetBitmap(2) ); m_bitmap3->SetBitmap( m_imageList.GetBitmap(3) ); m_bitmap4->SetBitmap( m_imageList.GetBitmap(4) ); m_bitmap5->SetBitmap( m_imageList.GetBitmap(5) ); wxImage image = m_imageList.GetBitmap( selected ).ConvertToImage(); unsigned char *data = image.GetData(); for ( int y = 0; y < THUMB_H; y++ ) for ( int x = 0; x <THUMB_W; x++ ) data[ ( y * THUMB_W + x ) * 3 + 2 ] = 255; // 文字色:黒(0,0,0)->青(0,0,255) wxBitmap bmp_mask( image ); switch ( selected ) { case 0: m_bitmap0->SetBitmap( bmp_mask ); break; case 1: m_bitmap1->SetBitmap( bmp_mask ); break; case 2: m_bitmap2->SetBitmap( bmp_mask ); break; case 3: m_bitmap3->SetBitmap( bmp_mask ); break; case 4: m_bitmap4->SetBitmap( bmp_mask ); break; case 5: m_bitmap5->SetBitmap( bmp_mask ); break; } } //////////////////////////////////////////////////////// // プレビューダイアログ PreviewDialog::PreviewDialog( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { wxBoxSizer* bSizerTop = new wxBoxSizer( wxHORIZONTAL ); m_scrolledWindow = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL|wxALWAYS_SHOW_SB ); m_scrolledWindow->Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this ); m_bitmap = new wxStaticBitmap( m_scrolledWindow, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); m_bitmap->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this ); m_bitmap->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PreviewDialog::OnStartRGesture ), NULL, this ); m_bitmap->Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( PreviewDialog::OnEndRGesture ), NULL, this ); bSizerTop->Add( m_scrolledWindow, 1, wxALL|wxEXPAND, 5 ); wxBoxSizer* bSizerMenu = new wxBoxSizer( wxVERTICAL ); m_thumbPanel = new PThumbnailPanel( this, wxID_ANY, wxDefaultPosition, wxSize( 100, -1 ), wxSUNKEN_BORDER ); bSizerMenu->Add( m_thumbPanel, 0, wxALL|wxEXPAND, 5 ); m_textInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, 80 ), wxTE_MULTILINE|wxTE_READONLY|wxTE_NO_VSCROLL ); m_textInfo->SetBackgroundColour( wxColour( 192, 192, 192 ) ); bSizerMenu->Add( m_textInfo, 0, wxRIGHT|wxLEFT|wxBOTTOM, 5 ); m_buttonPrint = new wxButton( this, ID_PRINT, wxT("印刷"), wxDefaultPosition, wxDefaultSize, 0 ); bSizerMenu->Add( m_buttonPrint, 0, wxALL, 5 ); m_buttonMaskPrint = new wxButton( this, ID_MPRINT, wxT("マスク印刷"), wxDefaultPosition, wxDefaultSize, 0 ); bSizerMenu->Add( m_buttonMaskPrint, 0, wxALL, 5 ); m_buttonMaskPrint->Enable( false ); bSizerMenu->Add( 0, 0, 0, 0, 5 ); m_buttonClose = new wxButton( this, wxID_CANCEL, wxT("閉じる"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonClose->SetDefault(); bSizerMenu->Add( m_buttonClose, 0, wxALL, 5 ); bSizerTop->Add( bSizerMenu, 0, wxALL|wxEXPAND, 5 ); this->SetSizer( bSizerTop ); this->Layout(); } PreviewDialog::~PreviewDialog() { m_scrolledWindow->Disconnect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( PreviewDialog::OnWheel ), NULL, this ); m_bitmap->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( PreviewDialog::OnDClick ), NULL, this ); m_bitmap->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( PreviewDialog::OnStartRGesture ), NULL, this ); m_bitmap->Disconnect( wxEVT_RIGHT_UP, wxMouseEventHandler( PreviewDialog::OnEndRGesture ), NULL, this ); } // Event Table BEGIN_EVENT_TABLE( PreviewDialog, wxDialog ) EVT_BUTTON( ID_PRINT, PreviewDialog::OnPrint ) EVT_BUTTON( ID_MPRINT, PreviewDialog::OnMaskPrint ) END_EVENT_TABLE() #define WIDTH 2480 #define HEIGHT 3509 /* プレビューするファイルをセット */ void PreviewDialog::SetPreviewImage( int n ) { m_preview = n; m_zoom = 1.0; SetZoom( m_zoom ); // file info float z; long l; GetScore( &z, &l, m_imagefiles[n] ); wxString info = m_imagefiles[n].AfterLast( wxFILE_SEP_PATH ); info += wxString::Format( wxT("\n%z = %f"), z ); info += wxString::Format( wxT("\n%l = %ld"), l ); m_textInfo->SetValue( info ); } /* 倍率を指定しロード */ void PreviewDialog::SetZoom( float zoom ) { int w, h; m_scrolledWindow->GetSize( &w, &h ); w = (int)( zoom * h * WIDTH / HEIGHT ); h = (int)( zoom * h ); m_bitmap->SetBitmap( wxNullBitmap ); wxImage img; img.LoadFile( m_imagefiles[m_preview], wxBITMAP_TYPE_JPEG ); wxBitmap bmp( img.Scale( w, h, wxIMAGE_QUALITY_HIGH ) ); m_bitmap->SetBitmap( bmp ); m_bitmap->Centre( wxHORIZONTAL ); m_scrolledWindow->Scroll( 0, 0 ); m_scrolledWindow->SetScrollbars( 10, 10, 0, h/10 ); } /* ファイル名を保持 */ void PreviewDialog::SetFiles( wxArrayString imagefiles, wxArrayString cachefiles, int select ) { m_imagefiles = imagefiles; m_cachefiles = cachefiles; m_thumbPanel->SetFiles( m_imagefiles, m_cachefiles, select ); wxString title = wxT("プレビュー @ ") + m_imagefiles[0].BeforeLast( wxFILE_SEP_PATH ); this->SetTitle( title ); } /* コントロールキー + マウスホイール で画像を拡大・縮小 */ void PreviewDialog::OnWheel( wxMouseEvent& event ) { if ( event.ControlDown() ) { if ( event.GetWheelRotation() < 0 ) { if ( m_zoom > 2.1 ) return; m_zoom *= 1.3; } else { if ( m_zoom <= 1.0 ) return; m_zoom /= 1.3; } SetZoom( m_zoom ); return; } event.Skip(); } /* 画像のダブルクリックで倍率変更 */ void PreviewDialog::OnDClick( wxMouseEvent& WXUNUSED(event) ) { if ( m_zoom > 2.1 ) m_zoom = 1.0; else m_zoom *= 1.3; SetZoom( m_zoom ); } /* 右ジェスチャー検知開始 */ void PreviewDialog::OnStartRGesture( wxMouseEvent& event ) { event.GetPosition( &cx, &cy ); } /* 右ジェスチャー判定 */ void PreviewDialog::OnEndRGesture( wxMouseEvent& event ) { int x, y; event.GetPosition( &x, &y ); int dx = x - cx; int dy = y - cy; float rad = fabs( atan2( dy, dx ) ); float pi = 3.14159; // 右へジェスチャー if ( rad < pi/8 && dx > 0 ) { if ( m_preview < m_imagefiles.GetCount() - 1 ) m_preview++; else return; m_thumbPanel->Preview( m_preview ); } // 左へジェスチャー else if ( rad > pi/8*7 && rad < pi && dx < 0 ) { if ( m_preview > 0 ) m_preview--; else return; m_thumbPanel->Preview( m_preview ); } // 右上ヘジェスチャー else if ( rad > pi/8 && rad < pi/8*3 && dx > 0 ) { Close(); } } /* 印刷 */ void PreviewDialog::OnPrint( wxCommandEvent& WXUNUSED(event) ) { wxString html; html = html + wxT("<html><body>\n"); wxString tmpjpg = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("preview.jpg"); wxCopyFile( m_imagefiles[m_preview], tmpjpg, true ); html = html + wxT("<img src=\"") + tmpjpg + wxT("\" width=\"750\" height=\"1060\"/>"); html = html + wxT("</body></html>"); // start printing wxHtmlPrintout hpout( wxT("Searcher03") ); hpout.SetMargins( 0, 0, 0, 0, 0 ); wxPrintDialogData pd; wxPrinter p( &pd ); hpout.SetHtmlText( html, wxEmptyString, false ); p.Print( NULL, &hpout, true ); } /* マスク印刷 */ void PreviewDialog::OnMaskPrint( wxCommandEvent& WXUNUSED(event) ) { wxString html; html = html + wxT("<html><body>\n"); wxString tmpjpg = wxGetCwd() + wxFILE_SEP_PATH + wxT("tmp") + wxFILE_SEP_PATH + wxT("preview.jpg"); wxImage img_org( m_imagefiles[m_preview], wxBITMAP_TYPE_JPEG ); int ver = GetMarksheetVersion( m_imagefiles[m_preview] ); if ( ver == 2 ) { img_org.SetRGB( m_mask1, 255, 255, 255 ); // cm name img_org.SetRGB( m_mask2, 255, 255, 255 ); // cm no. img_org.SetRGB( m_mask3, 255, 255, 255 ); // barcode } else { // 古いマークシート ver == 1 img_org.SetRGB( m_mask1old, 255, 255, 255 ); // cm name img_org.SetRGB( m_mask2old, 255, 255, 255 ); // cm no. img_org.SetRGB( m_mask3old, 255, 255, 255 ); // barcode } img_org.SaveFile( tmpjpg ); html = html + wxT("<img src=\"") + tmpjpg + wxT("\" width=\"750\" height=\"1060\"/>"); html = html + wxT("</body></html>"); // start printing wxHtmlPrintout hpout( wxT("Searcher03") ); hpout.SetMargins( 0, 0, 0, 0, 0 ); wxPrintDialogData pd; wxPrinter p( &pd ); hpout.SetHtmlText( html, wxEmptyString, false ); p.Print( NULL, &hpout, true ); } void PreviewDialog::EnableMaskButton( bool flag ) { if ( flag ) m_buttonMaskPrint->Enable( true ); else m_buttonMaskPrint->Enable( false ); }