2 ==============================================================================
4 Copyright 2005-11 by Satoshi Fujiwara.
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.
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.
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
20 ==============================================================================
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>
37 #define _CRTDBG_MAP_ALLOC
39 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
42 #include "sf_windows.h"
46 #include "exception.h"
47 #include "application.h"
48 #include "seq_tab_dialog.h"
50 #define THROW_IFERR(hres) \
51 if (FAILED(hres)) { throw sf::win32_error_exception(hres); }
53 #ifndef HINST_THISCOMPONENT
54 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
55 #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
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)
66 create_device_independent_resources();
71 seq_tab_dialog::~seq_tab_dialog()
74 safe_release(factory_);
75 safe_release(write_factory_);
78 LRESULT seq_tab_dialog::window_proc(HWND hwnd,uint32_t message, WPARAM wParam, LPARAM lParam)
89 case WM_CTLCOLORSTATIC:
91 case WM_CTLCOLORLISTBOX:
93 SetBkMode((HDC)wParam,TRANSPARENT);
94 return (LRESULT)GetStockObject( NULL_BRUSH ); ;
101 paint_struct begin_paint(hwnd);
119 void seq_tab_dialog::create_device_independent_resources()
121 // Direct2DFactory の生成
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,
129 factory_.GetAddressOf()
132 THROW_IFERR(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory_));
138 THROW_IFERR(::DWriteCreateFactory(
139 DWRITE_FACTORY_TYPE_SHARED,
140 __uuidof(IDWriteFactory),
141 reinterpret_cast<IUnknown**>(write_factory_.GetAddressOf())
146 //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory);
148 //thunk_proc_ = (WNDPROC)thunk_.getCode();
149 layout_rect_ = D2D1::RectF(0.0f,100.0f,400.0f,100.0f);
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,
164 void seq_tab_dialog::create_device()
169 HWND waveform_hwnd = GetDlgItem(hwnd_,IDC_SEQ_AREA);
171 GetClientRect(waveform_hwnd, &rc);
172 // GetClientRect(hwnd_, &rc);
174 D2D1_SIZE_U size = D2D1::SizeU(
179 const D2D1_PIXEL_FORMAT format =
180 D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
181 D2D1_ALPHA_MODE_PREMULTIPLIED);
183 const D2D1_RENDER_TARGET_PROPERTIES target_prop =
184 D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,format);
186 THROW_IFERR(factory_->CreateHwndRenderTarget(
188 D2D1::HwndRenderTargetProperties(waveform_hwnd, size,D2D1_PRESENT_OPTIONS_IMMEDIATELY),
191 //D2D1::HwndRenderTargetProperties(hwnd_, size,D2D1_PRESENT_OPTIONS_IMMEDIATELY),
197 void seq_tab_dialog::discard_device()
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_);
218 void seq_tab_dialog::render()
222 if (render_target_ && !(render_target_->CheckWindowState() & D2D1_WINDOW_STATE_OCCLUDED) )
224 // Retrieve the size of the render target.
225 D2D1_SIZE_F renderTargetSize = render_target_->GetSize();
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);
235 std::wstring m(L"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzアイウエオカキクケコ\n1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzアイウエオカキクケコ\n");
236 render_target_->DrawTextW(
239 write_text_format_.Get(),
242 // render_target_->PopAxisAlignedClip();
243 THROW_IFERR(render_target_->EndDraw());
245 } catch(sf::win32_error_exception& err)
247 if(err.hresult() == D2DERR_RECREATE_TARGET)
260 void seq_tab_dialog::resize()
263 tab_dialog_base::resize();
264 HWND hwnd_seq = GetDlgItem(hwnd_,IDC_SEQ_AREA);
266 RECT rect_dlg,rect_win;
267 GetClientRect(hwnd_,&rect_dlg);
268 //InflateRect(&rect_dlg,-2,-2);
269 GetWindowRect(hwnd_,&rect_win);
271 SetWindowPos(hwnd_seq,0,
273 rect_dlg.right - rect_dlg.left,
274 rect_dlg.bottom - rect_dlg.top,
276 layout_rect_ = D2D1::RectF(rect_dlg.left,rect_dlg.top,rect_dlg.right,rect_dlg.bottom);