1 // Direct2DBurn.cpp : アプリケーションのエントリ ポイントを定義します。
\r
4 #define BOOST_ASSIGN_MAX_PARAMS 7
\r
5 #include <boost/assign.hpp>
\r
6 #include <boost/assign/ptr_list_of.hpp>
\r
7 #include <boost/assign/ptr_list_inserter.hpp>
\r
8 #include <boost/foreach.hpp>
\r
9 #include "sf_windows.h"
\r
10 #include "exception.h"
\r
12 #define EXCEPTION_ON_ERROR(hres) \
\r
13 if (FAILED(hres)) { throw sf::win32_error_exception(hres); }
\r
15 #ifndef HINST_THISCOMPONENT
\r
16 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
\r
17 #define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)
\r
20 #define SAFE_RELEASE(x) if(x) x.Release();
\r
24 LRESULT base_window::window_proc(HWND hwnd,boost::uint32_t message, WPARAM wParam, LPARAM lParam)
\r
38 //if (render_target_)
\r
40 // D2D1_SIZE_U size;
\r
41 // size.width = lParam & 0xFFFF;
\r
42 // size.height = (lParam >> 16) & 0xFFFF; ;
\r
44 // // Note: This method can fail, but it's okay to ignore the
\r
45 // // error here -- it will be repeated on the next call to
\r
47 // //render_target_->Resize(size);
\r
54 paint_struct begin_paint(hwnd);
\r
56 //if (!(render_target_->CheckWindowState() & D2D1_WINDOW_STATE_OCCLUDED))
\r
58 // // Retrieve the size of the render target.
\r
59 // D2D1_SIZE_F renderTargetSize = render_target_->GetSize();
\r
61 // //render_target_->BeginDraw();
\r
62 // base_->on_render();
\r
63 // //EXCEPTION_ON_ERROR(render_target_->EndDraw());
\r
64 // } catch (sf::win32_error_exception& e )
\r
66 // if(e.hresult() == D2DERR_RECREATE_TARGET)
\r
68 // discard_device();
\r
76 case WM_DISPLAYCHANGE:
\r
78 ::InvalidateRect(hwnd, NULL, FALSE);
\r
86 // on_mouse_move(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),wParam);
\r
88 case WM_LBUTTONDOWN:
\r
92 return ::DefWindowProcW(hwnd,message,wParam,lParam);
\r
96 void base_window::create_device_independent_resources()
\r
99 // Direct2DFactory の生成
\r
102 #if defined(DEBUG) || defined(_DEBUG)
\r
103 D2D1_FACTORY_OPTIONS options;
\r
104 options.debugLevel = D2D1_DEBUG_LEVEL_INFORMATION ;
\r
105 EXCEPTION_ON_ERROR(D2D1CreateFactory(
\r
106 D2D1_FACTORY_TYPE_SINGLE_THREADED,
\r
111 EXCEPTION_ON_ERROR(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory_));
\r
116 if(!write_factory_){
\r
117 EXCEPTION_ON_ERROR(::DWriteCreateFactory(
\r
118 DWRITE_FACTORY_TYPE_SHARED,
\r
119 __uuidof(IDWriteFactory),
\r
120 reinterpret_cast<IUnknown**>(&write_factory_)
\r
125 //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory);
\r
127 //thunk_proc_ = (WNDPROC)thunk_.getCode();
\r
131 void base_window::register_class (
\r
132 wchar_t * menu_name,
\r
133 boost::uint32_t style ,
\r
134 boost::int32_t cbClsExtra,
\r
137 HBRUSH hbrBackground ,
\r
141 wnd_class_.reset(new sf::window_class_ex(menu_name,name_,HINST_THISCOMPONENT,thunk_proc_,style,cbClsExtra,hIcon,hCursor,hbrBackground,hIconSm));
\r
145 void base_window::register_class()
\r
147 wnd_class_.reset(new sf::window_class_ex(0,name_,HINST_THISCOMPONENT,thunk_proc_));
\r
150 void base_window::create_window()
\r
152 // Create the application window.
\r
154 // Because the CreateWindow function takes its size in pixels, we
\r
155 // obtain the system DPI and use it to scale the window size.
\r
157 //factory_->GetDesktopDpi(&dpiX, &dpiY);
\r
164 WS_OVERLAPPEDWINDOW,
\r
167 static_cast<boost::uint32_t>(ceil(width_ /** dpiX / 96.f*/)),
\r
168 static_cast<boost::uint32_t>(ceil(height_ /** dpiY / 96.f*/)),
\r
171 HINST_THISCOMPONENT,
\r
176 void base_window::create_device()
\r
179 // input_.reset(new input(HINST_THISCOMPONENT,hwnd_));
\r
183 //ウィンドウの現在の幅、高さを求める
\r
185 GetClientRect( hwnd_, &rc );
\r
186 boost::uint32_t width = rc.right - rc.left;
\r
187 boost::uint32_t height = rc.bottom - rc.top;
\r
190 //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory);
\r
191 // bitmap_ = load_bitmap_from_file(render_target_,wic_imaging_factory_,L"myship.png");
\r
194 if(!render_target_)
\r
197 GetClientRect(hwnd_, &rc);
\r
199 D2D1_SIZE_U size = D2D1::SizeU(
\r
200 rc.right - rc.left,
\r
204 EXCEPTION_ON_ERROR(factory_->CreateHwndRenderTarget(
\r
205 D2D1::RenderTargetProperties(),
\r
206 D2D1::HwndRenderTargetProperties(hwnd_, size,D2D1_PRESENT_OPTIONS_IMMEDIATELY),
\r
209 // Create a DC render target
\r
210 //D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
\r
211 // D2D1_RENDER_TARGET_TYPE_DEFAULT,
\r
212 // D2D1::PixelFormat(
\r
213 // DXGI_FORMAT_B8G8R8A8_UNORM,
\r
214 // D2D1_ALPHA_MODE_IGNORE
\r
216 // D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE
\r
219 //EXCEPTION_ON_ERROR(factory_->CreateDCRenderTarget(
\r
227 void base_window::discard_device()
\r
229 /* if(render_target_)
\r
231 render_target_.Release();
\r
235 void base_window::show(boost::uint32_t show_flag)
\r
237 //HRESULT hr = S_OK;
\r
239 //DwmIsCompositionEnabled (&enable);
\r
241 // //Create and populate the BlurBehind structre
\r
242 // DWM_BLURBEHIND bb = {0};
\r
243 // //Enable Blur Behind and Blur Region;
\r
244 // bb.dwFlags = DWM_BB_ENABLE;
\r
245 // bb.fEnable = true;
\r
246 // bb.hRgnBlur = NULL;
\r
248 // //Enable Blur Behind
\r
249 // hr = DwmEnableBlurBehindWindow(hwnd_, &bb);
\r
251 ::ShowWindow(hwnd_,show_flag);
\r
253 void base_window::update() {::UpdateWindow(hwnd_);}
\r
255 base_window::~base_window()
\r
257 safe_release(factory_);
\r
258 safe_release(write_factory_);
\r
263 base_window::base_window(const std::wstring& title,const std::wstring& name,bool fit_to_display,float width,float height)
\r
264 : title_(title),name_(name),fit_to_display_(fit_to_display),
\r
265 width_(width),height_(height),thunk_(this,base_window::WndProc),hwnd_(0)
\r
267 thunk_proc_ = (WNDPROC)thunk_.getCode();
\r
268 //create_device_independent_resources();
\r
273 base_window::operator HWND()
\r
278 //ID2D1FactoryPtr base_window::factory() { return impl_->factory();};
\r
279 //ID2D1HwndRenderTargetPtr base_window::render_target() { return impl_->render_target();};
\r
280 //IDWriteFactoryPtr base_window::write_factory() {return impl_->write_factory();};
\r
282 // toplevel_window_ptr create_toplevel_window
\r
284 // const std::wstring& menu_name,
\r
285 // const std::wstring& name,
\r
286 // const boost::uint32_t show_flag,
\r
287 // bool fit_to_display,
\r
292 // toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,width,height);
\r
293 // p->register_class();
\r
294 // p->create_window();
\r
295 // p->show(show_flag);
\r
297 // return toplevel_window_ptr(p);
\r
300 // LRESULT toplevel_window::window_proc(HWND hwnd,boost::uint32_t message, WPARAM wParam, LPARAM lParam)
\r
304 // switch (message)
\r
309 // create_device();
\r
314 // //if (render_target_)
\r
316 // // D2D1_SIZE_U size;
\r
317 // // size.width = lParam & 0xFFFF;
\r
318 // // size.height = (lParam >> 16) & 0xFFFF; ;
\r
320 // // // Note: This method can fail, but it's okay to ignore the
\r
321 // // // error here -- it will be repeated on the next call to
\r
323 // // render_target_->Resize(size);
\r
328 // //create_device();
\r
330 // paint_struct begin_paint(hwnd);
\r
336 // case WM_DISPLAYCHANGE:
\r
338 // ::InvalidateRect(hwnd, NULL, FALSE);
\r
340 // case WM_ERASEBKGND:
\r
344 // case WM_MOUSEMOVE:
\r
346 //// on_mouse_move(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),wParam);
\r
348 // case WM_LBUTTONDOWN:
\r
353 // if(message == WM_CLOSE)
\r
355 // BOOL ret(::DestroyWindow(hwnd));
\r
356 // BOOST_ASSERT(ret != 0);
\r
359 // if(message == WM_DESTROY)
\r
361 // ::PostQuitMessage(0);
\r
365 // return ::DefWindowProcW(hwnd,message,wParam,lParam);
\r
368 // void toplevel_window::main_loop()
\r
373 // void toplevel_window::render()
\r
376 // static float t = 0.0f;
\r
378 // if (render_target_)
\r
380 // // Retrieve the size of the render target.
\r
381 // D2D1_SIZE_F renderTargetSize = render_target_->GetSize();
\r
383 // render_target_->BeginDraw();
\r
384 // render_target_->Clear(D2D1::ColorF(D2D1::ColorF::White));
\r
385 // render_target_->SetTransform(D2D1::Matrix3x2F::Identity());
\r
386 // //render_target_->Clear(D2D1::ColorF(D2D1::ColorF::White));
\r
387 // ID2D1SolidColorBrushPtr brush;
\r
388 // render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &brush);
\r
389 // ID2D1SolidColorBrushPtr brushr;
\r
390 // render_target_->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red), &brushr);
\r
392 // D2D1_RECT_F layoutRect = D2D1::RectF(50.f, 50.f, 600.f, 200.f);
\r
393 // IDWriteTextFormatPtr write_text_format;
\r
394 // // Text Formatの作成
\r
395 // EXCEPTION_ON_ERROR(write_factory_->CreateTextFormat(
\r
396 // L"メイリオ", // Font family name.
\r
397 // NULL, // Font collection (NULL sets it to use the system font collection).
\r
398 // DWRITE_FONT_WEIGHT_REGULAR,
\r
399 // DWRITE_FONT_STYLE_NORMAL,
\r
400 // DWRITE_FONT_STRETCH_NORMAL,
\r
403 // &write_text_format
\r
405 // // Actually draw the text at the origin.
\r
406 // render_target_->DrawTextW(
\r
407 // L"こんにちは、世界!By S.F.",
\r
408 // wcslen(L"こんにちは、世界!By S.F."),
\r
409 // write_text_format,
\r
412 //// render_target_->DrawBitmap(bitmap_,D2D1::Rect<float>(40.0f,200.0f,64.0f + 40.0f,64.0f + 200.0f),1.0f,D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,D2D1::Rect<float>(0.0f,0.0f,64.0f,64.0f));
\r
414 // IDWriteTextFormatPtr write_text_format2;
\r
415 // // Text Formatの作成
\r
416 // EXCEPTION_ON_ERROR(write_factory_->CreateTextFormat(
\r
417 // L"メイリオ", // Font family name.
\r
418 // NULL, // Font collection (NULL sets it to use the system font collection).
\r
419 // DWRITE_FONT_WEIGHT_REGULAR,
\r
420 // DWRITE_FONT_STYLE_NORMAL,
\r
421 // DWRITE_FONT_STRETCH_NORMAL,
\r
424 // &write_text_format2
\r
426 // std::wstring lbl1(L"Direct2D");
\r
427 // render_target_->DrawTextW(lbl1.c_str(),lbl1.size(),write_text_format2,D2D1::RectF(40.0f,270.0f,64.0f+40.0f,64.0f + 270.0f),brushr);
\r
428 // std::wstring lbl2(L"D3DX10Sprite");
\r
429 // render_target_->DrawTextW(lbl2.c_str(),lbl2.size(),write_text_format2,D2D1::RectF(140.0f,270.0f,96.0f+140.0f,128.0f + 270.0f),brushr);
\r
431 //// std::wstring lbl3(L"DirectWrite+Direct2D");
\r
432 // render_target_->DrawTextW(lbl3.c_str(),lbl3.size(),write_text_format2,D2D1::RectF(60.0f,40.0f,280.0f,128.0f),brushr);
\r
434 // std::wstring lbl4(L"Direct3D");
\r
435 // render_target_->DrawTextW(lbl4.c_str(),lbl4.size(),write_text_format2,D2D1::RectF(280.0f,160.0f,380.0f,190.0f),brushr);
\r
437 // EXCEPTION_ON_ERROR(render_target_->EndDraw());
\r
446 // Creates a Direct2D bitmap from the specified
\r
449 ID2D1BitmapPtr load_bitmap_from_file(
\r
450 ID2D1HwndRenderTargetPtr render_target,
\r
451 IWICImagingFactoryPtr wic_factory,
\r
453 boost::uint32_t destination_width,
\r
454 boost::uint32_t destination_height
\r
459 IWICBitmapDecoderPtr decoder;
\r
460 IWICBitmapFrameDecodePtr decoder_source;
\r
461 IWICStreamPtr stream;
\r
462 IWICFormatConverterPtr converter;
\r
463 IWICBitmapScalerPtr scaler;
\r
464 ID2D1BitmapPtr bitmap;
\r
466 EXCEPTION_ON_ERROR(wic_factory->CreateDecoderFromFilename(
\r
470 WICDecodeMetadataCacheOnLoad,
\r
474 // Create the initial frame.
\r
475 EXCEPTION_ON_ERROR(decoder->GetFrame(0, &decoder_source));
\r
477 // Convert the image format to 32bppPBGRA
\r
478 // (DXGI_FORMAT_B8G8R8A8_UNORM + D2D1_ALPHA_MODE_PREMULTIPLIED).
\r
479 EXCEPTION_ON_ERROR(hr = wic_factory->CreateFormatConverter(&converter));
\r
481 // If a new width or height was specified, create an
\r
482 // IWICBitmapScaler and use it to resize the image.
\r
483 if (destination_width != 0 || destination_height != 0)
\r
485 boost::uint32_t originalWidth, originalHeight;
\r
486 EXCEPTION_ON_ERROR(decoder_source->GetSize((UINT*)&originalWidth, (UINT*)&originalHeight));
\r
487 if (destination_width == 0)
\r
489 FLOAT scalar = static_cast<FLOAT>(destination_height) / static_cast<FLOAT>(originalHeight);
\r
490 destination_width = static_cast<boost::uint32_t>(scalar * static_cast<FLOAT>(originalWidth));
\r
492 else if (destination_height == 0)
\r
494 FLOAT scalar = static_cast<FLOAT>(destination_width) / static_cast<FLOAT>(originalWidth);
\r
495 destination_height = static_cast<boost::uint32_t>(scalar * static_cast<FLOAT>(originalHeight));
\r
498 EXCEPTION_ON_ERROR(wic_factory->CreateBitmapScaler(&scaler));
\r
499 EXCEPTION_ON_ERROR(scaler->Initialize(
\r
502 destination_height,
\r
503 WICBitmapInterpolationModeCubic
\r
505 EXCEPTION_ON_ERROR(converter->Initialize(
\r
506 scaler.GetInterfacePtr(),
\r
507 GUID_WICPixelFormat32bppPBGRA,
\r
508 WICBitmapDitherTypeNone,
\r
511 WICBitmapPaletteTypeMedianCut
\r
514 else // Don't scale the image.
\r
516 EXCEPTION_ON_ERROR(converter->Initialize(
\r
517 decoder_source.GetInterfacePtr(),
\r
518 GUID_WICPixelFormat32bppPBGRA,
\r
519 WICBitmapDitherTypeNone,
\r
522 WICBitmapPaletteTypeMedianCut
\r
526 // Create a Direct2D bitmap from the WIC bitmap.
\r
527 EXCEPTION_ON_ERROR(render_target->CreateBitmapFromWicBitmap(
\r
528 converter.GetInterfacePtr(),
\r