OSDN Git Service

キャプチャ部分のバグ修正。
[winaudioj/wasapi2.git] / wasapi2 / seq_tab_dialog.cpp
1 /*
2 ==============================================================================
3
4 Copyright 2005-11 by Satoshi Fujiwara.
5
6 async can be redistributed and/or modified under the terms of the
7 GNU General Public License, as published by the Free Software Foundation;
8 either version 2 of the License, or (at your option) any later version.
9
10 async is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with async; if not, visit www.gnu.org/licenses or write to the
17 Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
18 Boston, MA 02111-1307 USA
19
20 ==============================================================================
21 */
22 /* ToDo
23
24 TODO: リサイズに対応する
25
26 */
27
28 #include "stdafx.h"
29 #include "resource.h"
30 #define BOOST_ASSIGN_MAX_PARAMS 7
31 #include <boost/assign.hpp>
32 #include <boost/assign/ptr_list_of.hpp>
33 #include <boost/assign/ptr_list_inserter.hpp>
34 #include <boost/foreach.hpp>
35
36 #if _DEBUG
37 #define _CRTDBG_MAP_ALLOC
38 #include <crtdbg.h>
39 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
40 #endif
41
42 #include "sf_windows.h"
43 #include "CommDlg.h"
44 #include "icon.h"
45 #include "timer.h"
46 #include "exception.h"
47 #include "application.h"
48 #include "seq_tab_dialog.h"
49
50 #define THROW_IFERR(hres) \
51   if (FAILED(hres)) { throw sf::win32_error_exception(hres); }
52
53 #ifndef HINST_THISCOMPONENT
54 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
55 #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
56 #endif
57
58 namespace sf 
59 {
60   seq_tab_dialog::seq_tab_dialog
61     (sequencer& seq,base_window& parent_window,
62     HWND tab_hwnd,int tab_id,const std::wstring& menu_name,
63     const std::wstring& name,HINSTANCE inst,LPCTSTR temp)
64     : seq_(seq),tab_dialog_base(parent_window,tab_hwnd,tab_id,menu_name,name,inst,temp)
65   {
66     create_device_independent_resources();
67     create();
68     hide();
69   }
70
71   seq_tab_dialog::~seq_tab_dialog()
72   {
73     discard_device();
74     safe_release(factory_);
75     safe_release(write_factory_);
76   };
77
78   LRESULT seq_tab_dialog::window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)
79   {
80     switch(message)
81     {
82     case WM_INITDIALOG:
83       create_device();
84       break;
85     case WM_SIZE:
86       //resize();
87       break;
88     case WM_CTLCOLORDLG:
89     case WM_CTLCOLORSTATIC:
90     case WM_CTLCOLOREDIT:
91     case WM_CTLCOLORLISTBOX:
92     case WM_CTLCOLORBTN:
93       SetBkMode((HDC)wParam,TRANSPARENT);
94       return  (LRESULT)GetStockObject( NULL_BRUSH ); ;
95     case WM_ERASEBKGND:
96       return FALSE;
97     case WM_PAINT:
98       {
99
100         { 
101           paint_struct begin_paint(hwnd);
102           //CloseHandle(cb);
103           // 描画コードの呼び出し
104           render();
105
106         }
107       }
108       break;
109     case WM_CLOSE:
110       discard_device();
111       return FALSE;
112     }
113     return FALSE;
114
115   };
116
117   //void wm_
118
119   void seq_tab_dialog::create_device_independent_resources()
120   {
121     // Direct2DFactory の生成
122     if(!factory_){
123 #if defined(DEBUG) || defined(_DEBUG)
124       D2D1_FACTORY_OPTIONS options;
125       options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION ;
126       THROW_IFERR(D2D1CreateFactory(
127         D2D1_FACTORY_TYPE_SINGLE_THREADED,
128         options,
129         factory_.GetAddressOf()
130         ));
131 #else
132       THROW_IFERR(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory_));
133 #endif
134
135     }
136
137     if(!write_factory_){
138       THROW_IFERR(::DWriteCreateFactory(
139         DWRITE_FACTORY_TYPE_SHARED,
140         __uuidof(IDWriteFactory),
141         reinterpret_cast<IUnknown**>(write_factory_.GetAddressOf())
142         ));
143     }
144
145
146     //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory);
147
148     //thunk_proc_ = (WNDPROC)thunk_.getCode();
149     layout_rect_ = D2D1::RectF(0.0f,100.0f,400.0f,100.0f);
150     // Text Formatの作成
151     THROW_IFERR(write_factory_->CreateTextFormat(
152       L"MS GOTHIC",                // Font family name.
153       NULL,                       // Font collection (NULL sets it to use the system font collection).
154       DWRITE_FONT_WEIGHT_BOLD,
155       DWRITE_FONT_STYLE_NORMAL,
156       DWRITE_FONT_STRETCH_NORMAL,
157       12.0f,
158       L"ja-jp",
159       &write_text_format_
160       ));
161
162   }
163
164   void seq_tab_dialog::create_device()
165   {
166     if(!render_target_)
167     {
168
169       HWND waveform_hwnd = GetDlgItem(hwnd_,IDC_SEQ_AREA);
170       RECT rc;
171       GetClientRect(waveform_hwnd, &rc);
172       //  GetClientRect(hwnd_, &rc);
173
174       D2D1_SIZE_U size = D2D1::SizeU(
175         rc.right - rc.left,
176         rc.bottom - rc.top
177         );
178
179       const D2D1_PIXEL_FORMAT format =
180         D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
181         D2D1_ALPHA_MODE_PREMULTIPLIED);
182
183       const D2D1_RENDER_TARGET_PROPERTIES target_prop = 
184         D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,format);
185
186       THROW_IFERR(factory_->CreateHwndRenderTarget(
187         target_prop,
188         D2D1::HwndRenderTargetProperties(waveform_hwnd, size,D2D1_PRESENT_OPTIONS_IMMEDIATELY),
189         &render_target_
190         ));
191       //D2D1::HwndRenderTargetProperties(hwnd_, size,D2D1_PRESENT_OPTIONS_IMMEDIATELY),
192       //&render_target_
193       //));
194     }
195   }
196
197   void seq_tab_dialog::discard_device()
198   {
199     //safe_release(sampler_state_);
200     //safe_release(shader_res_view_);
201     //safe_release(cb_changes_every_frame_);
202     //safe_release(cb_change_on_resize_);
203     //safe_release(cb_never_changes_);
204     //safe_release(i_buffer_);
205     //safe_release(v_buffer_);
206     //safe_release(p_shader_);
207     //safe_release(input_layout_);
208     //safe_release(v_shader_);
209     // discard_swap_chain_dependent_resources();
210     safe_release(render_target_);
211     /*   safe_release(swap_chain_);
212     safe_release(d3d_context_);
213     safe_release(d3d_device_);
214     safe_release(adapter_);
215     */ 
216   }
217
218   void seq_tab_dialog::render()
219   {
220     create_device();
221
222     if (render_target_ && !(render_target_->CheckWindowState() & D2D1_WINDOW_STATE_OCCLUDED) )
223     {
224       // Retrieve the size of the render target.
225       D2D1_SIZE_F renderTargetSize = render_target_->GetSize();
226       try {
227         render_target_->BeginDraw();
228         //        render_target_->PushAxisAlignedClip(layout_rect_,D2D1_ANTIALIAS_MODE_ALIASED);
229         //  render_target_->Clear(D2D1::ColorF(D2D1::ColorF::AliceBlue));
230         //render_target_->FillRectangle(D2D1::RectF(0.0f,0.0f,renderTargetSize.width,renderTargetSize.height),);
231         render_target_->SetTransform(D2D1::Matrix3x2F::Identity());
232         ID2D1SolidColorBrushPtr brush;
233         render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::OrangeRed), &brush);
234
235         std::wstring m(L"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzアイウエオカキクケコ\n1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzアイウエオカキクケコ\n");
236         render_target_->DrawTextW(
237           m.c_str(),
238           m.size(),
239           write_text_format_.Get(),
240           layout_rect_, 
241           brush.Get());
242         //       render_target_->PopAxisAlignedClip();
243         THROW_IFERR(render_target_->EndDraw());
244
245       } catch(sf::win32_error_exception& err)
246       {
247         if(err.hresult() == D2DERR_RECREATE_TARGET)
248         {
249           discard_device();
250  //         create_device();
251         } else {
252           throw;
253         }
254       } catch(...) {
255         throw;
256       }
257     }
258   }
259
260   void seq_tab_dialog::resize()
261   {
262     discard_device();
263     tab_dialog_base::resize();
264     HWND hwnd_seq = GetDlgItem(hwnd_,IDC_SEQ_AREA);
265     
266     RECT rect_dlg,rect_win;
267     GetClientRect(hwnd_,&rect_dlg);
268     //InflateRect(&rect_dlg,-2,-2);
269     GetWindowRect(hwnd_,&rect_win);
270
271     SetWindowPos(hwnd_seq,0,
272       0,0,
273       rect_dlg.right - rect_dlg.left,
274       rect_dlg.bottom - rect_dlg.top,
275       SWP_NOZORDER);
276     layout_rect_ = D2D1::RectF(rect_dlg.left,rect_dlg.top,rect_dlg.right,rect_dlg.bottom);
277   };
278
279
280 }
281