15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2012, Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/peerconnection/client/main_wnd.h"
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <math.h>
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h"
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h"
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/peerconnection/client/defaults.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgATOM MainWnd::wnd_class_ = 0;
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst wchar_t MainWnd::kClassName[] = L"WebRTC_MainWnd";
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace {
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst char kConnecting[] = "Connecting... ";
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst char kNoVideoStreams[] = "(no video streams either way)";
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst char kNoIncomingStream[] = "(no incoming video)";
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid CalculateWindowSizeForText(HWND wnd, const wchar_t* text,
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                size_t* width, size_t* height) {
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  HDC dc = ::GetDC(wnd);
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  RECT text_rc = {0};
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::DrawText(dc, text, -1, &text_rc, DT_CALCRECT | DT_SINGLELINE);
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::ReleaseDC(wnd, dc);
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  RECT client, window;
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::GetClientRect(wnd, &client);
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::GetWindowRect(wnd, &window);
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *width = text_rc.right - text_rc.left;
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *width += (window.right - window.left) -
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            (client.right - client.left);
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *height = text_rc.bottom - text_rc.top;
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *height += (window.bottom - window.top) -
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org             (client.bottom - client.top);
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgHFONT GetDefaultFont() {
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static HFONT font = reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT));
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return font;
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string GetWindowText(HWND wnd) {
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  char text[MAX_PATH] = {0};
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::GetWindowTextA(wnd, &text[0], ARRAYSIZE(text));
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return text;
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid AddListBoxItem(HWND listbox, const std::string& str, LPARAM item_data) {
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LRESULT index = ::SendMessageA(listbox, LB_ADDSTRING, 0,
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      reinterpret_cast<LPARAM>(str.c_str()));
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SendMessageA(listbox, LB_SETITEMDATA, index, item_data);
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::MainWnd()
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  : ui_(CONNECT_TO_SERVER), wnd_(NULL), edit1_(NULL), edit2_(NULL),
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    label1_(NULL), label2_(NULL), button_(NULL), listbox_(NULL),
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    destroyed_(false), callback_(NULL), nested_msg_(NULL) {
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::~MainWnd() {
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(!IsWindow());
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::Create() {
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(wnd_ == NULL);
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!RegisterWindowClass())
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ui_thread_id_ = ::GetCurrentThreadId();
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wnd_ = ::CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, kClassName, L"WebRTC",
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      NULL, NULL, GetModuleHandle(NULL), this);
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SendMessage(wnd_, WM_SETFONT, reinterpret_cast<WPARAM>(GetDefaultFont()),
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                TRUE);
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindows();
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  SwitchToConnectUI();
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return wnd_ != NULL;
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::Destroy() {
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  BOOL ret = FALSE;
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (IsWindow()) {
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ret = ::DestroyWindow(wnd_);
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return ret != FALSE;
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::RegisterObserver(MainWndCallback* callback) {
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  callback_ = callback;
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::IsWindow() {
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return wnd_ && ::IsWindow(wnd_) != FALSE;
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::PreTranslateMessage(MSG* msg) {
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool ret = false;
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (msg->message == WM_CHAR) {
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (msg->wParam == VK_TAB) {
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HandleTabbing();
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ret = true;
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    } else if (msg->wParam == VK_RETURN) {
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      OnDefaultAction();
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ret = true;
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    } else if (msg->wParam == VK_ESCAPE) {
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (callback_) {
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        if (ui_ == STREAMING) {
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          callback_->DisconnectFromCurrentPeer();
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        } else {
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          callback_->DisconnectFromServer();
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        }
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else if (msg->hwnd == NULL && msg->message == UI_THREAD_CALLBACK) {
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    callback_->UIThreadCallback(static_cast<int>(msg->wParam),
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                reinterpret_cast<void*>(msg->lParam));
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ret = true;
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return ret;
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::SwitchToConnectUI() {
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(IsWindow());
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LayoutPeerListUI(false);
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ui_ = CONNECT_TO_SERVER;
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LayoutConnectUI(true);
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SetFocus(edit1_);
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::SwitchToPeerList(const Peers& peers) {
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LayoutConnectUI(false);
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SendMessage(listbox_, LB_RESETCONTENT, 0, 0);
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AddListBoxItem(listbox_, "List of currently connected peers:", -1);
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Peers::const_iterator i = peers.begin();
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  for (; i != peers.end(); ++i)
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AddListBoxItem(listbox_, i->second.c_str(), i->first);
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ui_ = LIST_PEERS;
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LayoutPeerListUI(true);
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SetFocus(listbox_);
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::SwitchToStreamingUI() {
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LayoutConnectUI(false);
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LayoutPeerListUI(false);
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ui_ = STREAMING;
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::MessageBox(const char* caption, const char* text, bool is_error) {
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  DWORD flags = MB_OK;
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (is_error)
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    flags |= MB_ICONERROR;
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::MessageBoxA(handle(), text, caption, flags);
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StartLocalRenderer(webrtc::VideoTrackInterface* local_video) {
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  local_renderer_.reset(new VideoRenderer(handle(), 1, 1, local_video));
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StopLocalRenderer() {
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  local_renderer_.reset();
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StartRemoteRenderer(webrtc::VideoTrackInterface* remote_video) {
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  remote_renderer_.reset(new VideoRenderer(handle(), 1, 1, remote_video));
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StopRemoteRenderer() {
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  remote_renderer_.reset();
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::QueueUIThreadCallback(int msg_id, void* data) {
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::PostThreadMessage(ui_thread_id_, UI_THREAD_CALLBACK,
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      static_cast<WPARAM>(msg_id), reinterpret_cast<LPARAM>(data));
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::OnPaint() {
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  PAINTSTRUCT ps;
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::BeginPaint(handle(), &ps);
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  RECT rc;
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::GetClientRect(handle(), &rc);
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoRenderer* local_renderer = local_renderer_.get();
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  VideoRenderer* remote_renderer = remote_renderer_.get();
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (ui_ == STREAMING && remote_renderer && local_renderer) {
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AutoLock<VideoRenderer> local_lock(local_renderer);
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AutoLock<VideoRenderer> remote_lock(remote_renderer);
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const BITMAPINFO& bmi = remote_renderer->bmi();
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int height = abs(bmi.bmiHeader.biHeight);
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int width = bmi.bmiHeader.biWidth;
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const uint8* image = remote_renderer->image();
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (image != NULL) {
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HDC dc_mem = ::CreateCompatibleDC(ps.hdc);
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::SetStretchBltMode(dc_mem, HALFTONE);
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // Set the map mode so that the ratio will be maintained for us.
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HDC all_dc[] = { ps.hdc, dc_mem };
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      for (int i = 0; i < ARRAY_SIZE(all_dc); ++i) {
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        SetMapMode(all_dc[i], MM_ISOTROPIC);
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        SetWindowExtEx(all_dc[i], width, height, NULL);
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        SetViewportExtEx(all_dc[i], rc.right, rc.bottom, NULL);
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HBITMAP bmp_mem = ::CreateCompatibleBitmap(ps.hdc, rc.right, rc.bottom);
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HGDIOBJ bmp_old = ::SelectObject(dc_mem, bmp_mem);
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      POINT logical_area = { rc.right, rc.bottom };
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      DPtoLP(ps.hdc, &logical_area, 1);
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HBRUSH brush = ::CreateSolidBrush(RGB(0, 0, 0));
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      RECT logical_rect = {0, 0, logical_area.x, logical_area.y };
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::FillRect(dc_mem, &logical_rect, brush);
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::DeleteObject(brush);
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      int x = (logical_area.x / 2) - (width / 2);
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      int y = (logical_area.y / 2) - (height / 2);
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      StretchDIBits(dc_mem, x, y, width, height,
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    0, 0, width, height, image, &bmi, DIB_RGB_COLORS, SRCCOPY);
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if ((rc.right - rc.left) > 200 && (rc.bottom - rc.top) > 200) {
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        const BITMAPINFO& bmi = local_renderer->bmi();
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        image = local_renderer->image();
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        int thumb_width = bmi.bmiHeader.biWidth / 4;
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        int thumb_height = abs(bmi.bmiHeader.biHeight) / 4;
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        StretchDIBits(dc_mem,
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            logical_area.x - thumb_width - 10,
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            logical_area.y - thumb_height - 10,
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            thumb_width, thumb_height,
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            0, 0, bmi.bmiHeader.biWidth, -bmi.bmiHeader.biHeight,
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            image, &bmi, DIB_RGB_COLORS, SRCCOPY);
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      BitBlt(ps.hdc, 0, 0, logical_area.x, logical_area.y,
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org             dc_mem, 0, 0, SRCCOPY);
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // Cleanup.
2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::SelectObject(dc_mem, bmp_old);
2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::DeleteObject(bmp_mem);
2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::DeleteDC(dc_mem);
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    } else {
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // We're still waiting for the video stream to be initialized.
2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HBRUSH brush = ::CreateSolidBrush(RGB(0, 0, 0));
2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::FillRect(ps.hdc, &rc, brush);
2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::DeleteObject(brush);
2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HGDIOBJ old_font = ::SelectObject(ps.hdc, GetDefaultFont());
2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::SetTextColor(ps.hdc, RGB(0xff, 0xff, 0xff));
2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::SetBkMode(ps.hdc, TRANSPARENT);
2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      std::string text(kConnecting);
2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (!local_renderer->image()) {
2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        text += kNoVideoStreams;
2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      } else {
2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        text += kNoIncomingStream;
2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::DrawTextA(ps.hdc, text.c_str(), -1, &rc,
2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::SelectObject(ps.hdc, old_font);
3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    HBRUSH brush = ::CreateSolidBrush(::GetSysColor(COLOR_WINDOW));
3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::FillRect(ps.hdc, &rc, brush);
3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::DeleteObject(brush);
3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::EndPaint(handle(), &ps);
3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::OnDestroyed() {
3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  PostQuitMessage(0);
3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::OnDefaultAction() {
3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!callback_)
3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (ui_ == CONNECT_TO_SERVER) {
3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::string server(GetWindowText(edit1_));
3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    std::string port_str(GetWindowText(edit2_));
3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    int port = port_str.length() ? atoi(port_str.c_str()) : 0;
3215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    callback_->StartLogin(server, port);
3225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else if (ui_ == LIST_PEERS) {
3235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    LRESULT sel = ::SendMessage(listbox_, LB_GETCURSEL, 0, 0);
3245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (sel != LB_ERR) {
3255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      LRESULT peer_id = ::SendMessage(listbox_, LB_GETITEMDATA, sel, 0);
3265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (peer_id != -1 && callback_) {
3275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        callback_->ConnectToPeer(peer_id);
3285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
3295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
3305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    MessageBoxA(wnd_, "OK!", "Yeah", MB_OK);
3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result) {
3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  switch (msg) {
3375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_ERASEBKGND:
3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      *result = TRUE;
3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_PAINT:
3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      OnPaint();
3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
3445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_SETFOCUS:
3465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (ui_ == CONNECT_TO_SERVER) {
3475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        SetFocus(edit1_);
3485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      } else if (ui_ == LIST_PEERS) {
3495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        SetFocus(listbox_);
3505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
3515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
3525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_SIZE:
3545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (ui_ == CONNECT_TO_SERVER) {
3555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        LayoutConnectUI(true);
3565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      } else if (ui_ == LIST_PEERS) {
3575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        LayoutPeerListUI(true);
3585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
3595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
3605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_CTLCOLORSTATIC:
3625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      *result = reinterpret_cast<LRESULT>(GetSysColorBrush(COLOR_WINDOW));
3635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
3645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_COMMAND:
3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (button_ == reinterpret_cast<HWND>(lp)) {
3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        if (BN_CLICKED == HIWORD(wp))
3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          OnDefaultAction();
3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      } else if (listbox_ == reinterpret_cast<HWND>(lp)) {
3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        if (LBN_DBLCLK == HIWORD(wp)) {
3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          OnDefaultAction();
3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        }
3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return true;
3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    case WM_CLOSE:
3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (callback_)
3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        callback_->Close();
3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return false;
3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// static
3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgLRESULT CALLBACK MainWnd::WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MainWnd* me = reinterpret_cast<MainWnd*>(
3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::GetWindowLongPtr(hwnd, GWLP_USERDATA));
3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!me && WM_CREATE == msg) {
3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lp);
3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    me = reinterpret_cast<MainWnd*>(cs->lpCreateParams);
3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    me->wnd_ = hwnd;
3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(me));
3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  LRESULT result = 0;
3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (me) {
3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    void* prev_nested_msg = me->nested_msg_;
3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    me->nested_msg_ = &msg;
3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    bool handled = me->OnMessage(msg, wp, lp, &result);
4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (WM_NCDESTROY == msg) {
4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      me->destroyed_ = true;
4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    } else if (!handled) {
4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      result = ::DefWindowProc(hwnd, msg, wp, lp);
4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (me->destroyed_ && prev_nested_msg == NULL) {
4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      me->OnDestroyed();
4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      me->wnd_ = NULL;
4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      me->destroyed_ = false;
4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    me->nested_msg_ = prev_nested_msg;
4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    result = ::DefWindowProc(hwnd, msg, wp, lp);
4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return result;
4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// static
4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::RegisterWindowClass() {
4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (wnd_class_)
4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wcex.style = CS_DBLCLKS;
4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wcex.hInstance = GetModuleHandle(NULL);
4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW);
4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wcex.lpfnWndProc = &WndProc;
4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wcex.lpszClassName = kClassName;
4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  wnd_class_ = ::RegisterClassEx(&wcex);
4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(wnd_class_ != 0);
4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  return wnd_class_ != 0;
4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::CreateChildWindow(HWND* wnd, MainWnd::ChildWindowID id,
4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                const wchar_t* class_name, DWORD control_style,
4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                DWORD ex_style) {
4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (::IsWindow(*wnd))
4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Child windows are invisible at first, and shown after being resized.
4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  DWORD style = WS_CHILD | control_style;
4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  *wnd = ::CreateWindowEx(ex_style, class_name, L"", style,
4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                          100, 100, 100, 100, wnd_,
4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                          reinterpret_cast<HMENU>(id),
4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                          GetModuleHandle(NULL), NULL);
4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT(::IsWindow(*wnd) != FALSE);
4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SendMessage(*wnd, WM_SETFONT, reinterpret_cast<WPARAM>(GetDefaultFont()),
4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                TRUE);
4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::CreateChildWindows() {
4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Create the child windows in tab order.
4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindow(&label1_, LABEL1_ID, L"Static", ES_CENTER | ES_READONLY, 0);
4585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindow(&edit1_, EDIT_ID, L"Edit",
4595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, WS_EX_CLIENTEDGE);
4605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindow(&label2_, LABEL2_ID, L"Static", ES_CENTER | ES_READONLY, 0);
4615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindow(&edit2_, EDIT_ID, L"Edit",
4625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, WS_EX_CLIENTEDGE);
4635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindow(&button_, BUTTON_ID, L"Button", BS_CENTER | WS_TABSTOP, 0);
4645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  CreateChildWindow(&listbox_, LISTBOX_ID, L"ListBox",
4665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    LBS_HASSTRINGS | LBS_NOTIFY, WS_EX_CLIENTEDGE);
4675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SetWindowTextA(edit1_, GetDefaultServerName().c_str());
4695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SetWindowTextA(edit2_, "8888");
4705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
4715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::LayoutConnectUI(bool show) {
4735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  struct Windows {
4745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    HWND wnd;
4755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const wchar_t* text;
4765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    size_t width;
4775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    size_t height;
4785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } windows[] = {
4795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    { label1_, L"Server" },
4805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    { edit1_, L"XXXyyyYYYgggXXXyyyYYYggg" },
4815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    { label2_, L":" },
4825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    { edit2_, L"XyXyX" },
4835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    { button_, L"Connect" },
4845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  };
4855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (show) {
4875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    const size_t kSeparator = 5;
4885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    size_t total_width = (ARRAYSIZE(windows) - 1) * kSeparator;
4895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (size_t i = 0; i < ARRAYSIZE(windows); ++i) {
4915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      CalculateWindowSizeForText(windows[i].wnd, windows[i].text,
4925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                 &windows[i].width, &windows[i].height);
4935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      total_width += windows[i].width;
4945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
4955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
4965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    RECT rc;
4975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::GetClientRect(wnd_, &rc);
4985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    size_t x = (rc.right / 2) - (total_width / 2);
4995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    size_t y = rc.bottom / 2;
5005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (size_t i = 0; i < ARRAYSIZE(windows); ++i) {
5015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      size_t top = y - (windows[i].height / 2);
502b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org      ::MoveWindow(windows[i].wnd, static_cast<int>(x), static_cast<int>(top),
503b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org                   static_cast<int>(windows[i].width),
504b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org                   static_cast<int>(windows[i].height),
5055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                   TRUE);
5065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      x += kSeparator + windows[i].width;
5075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (windows[i].text[0] != 'X')
5085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        ::SetWindowText(windows[i].wnd, windows[i].text);
5095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::ShowWindow(windows[i].wnd, SW_SHOWNA);
5105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
5115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
5125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (size_t i = 0; i < ARRAYSIZE(windows); ++i) {
5135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ::ShowWindow(windows[i].wnd, SW_HIDE);
5145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
5155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
5165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::LayoutPeerListUI(bool show) {
5195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (show) {
5205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    RECT rc;
5215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::GetClientRect(wnd_, &rc);
5225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::MoveWindow(listbox_, 0, 0, rc.right, rc.bottom, TRUE);
5235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::ShowWindow(listbox_, SW_SHOWNA);
5245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } else {
5255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ::ShowWindow(listbox_, SW_HIDE);
5265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    InvalidateRect(wnd_, NULL, TRUE);
5275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
5285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::HandleTabbing() {
5315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool shift = ((::GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0);
5325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UINT next_cmd = shift ? GW_HWNDPREV : GW_HWNDNEXT;
5335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  UINT loop_around_cmd = shift ? GW_HWNDLAST : GW_HWNDFIRST;
5345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  HWND focus = GetFocus(), next;
5355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  do {
5365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next = ::GetWindow(focus, next_cmd);
5375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (IsWindowVisible(next) &&
5385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        (GetWindowLong(next, GWL_STYLE) & WS_TABSTOP)) {
5395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
5405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
5415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!next) {
5435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      next = ::GetWindow(focus, loop_around_cmd);
5445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (IsWindowVisible(next) &&
5455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          (GetWindowLong(next, GWL_STYLE) & WS_TABSTOP)) {
5465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        break;
5475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
5485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
5495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    focus = next;
5505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  } while (true);
5515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::SetFocus(next);
5525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
5555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// MainWnd::VideoRenderer
5565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
5575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::VideoRenderer::VideoRenderer(
5595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    HWND wnd, int width, int height,
5605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    webrtc::VideoTrackInterface* track_to_render)
5615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    : wnd_(wnd), rendered_track_(track_to_render) {
5625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::InitializeCriticalSection(&buffer_lock_);
5635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ZeroMemory(&bmi_, sizeof(bmi_));
5645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
5655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biPlanes = 1;
5665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biBitCount = 32;
5675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biCompression = BI_RGB;
5685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biWidth = width;
5695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biHeight = -height;
5705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biSizeImage = width * height *
5715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              (bmi_.bmiHeader.biBitCount >> 3);
5725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  rendered_track_->AddRenderer(this);
5735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::VideoRenderer::~VideoRenderer() {
5765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  rendered_track_->RemoveRenderer(this);
5775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ::DeleteCriticalSection(&buffer_lock_);
5785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::VideoRenderer::SetSize(int width, int height) {
5815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  AutoLock<VideoRenderer> lock(this);
5825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biWidth = width;
5845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biHeight = -height;
5855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bmi_.bmiHeader.biSizeImage = width * height *
5865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                               (bmi_.bmiHeader.biBitCount >> 3);
5875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  image_.reset(new uint8[bmi_.bmiHeader.biSizeImage]);
5885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
5895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::VideoRenderer::RenderFrame(const cricket::VideoFrame* frame) {
5915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  if (!frame)
5925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return;
5935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  {
5955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    AutoLock<VideoRenderer> lock(this);
5965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
5975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(image_.get() != NULL);
5985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    frame->ConvertToRgbBuffer(cricket::FOURCC_ARGB,
5995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              image_.get(),
6005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              bmi_.bmiHeader.biSizeImage,
6015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              bmi_.bmiHeader.biWidth *
6025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                              bmi_.bmiHeader.biBitCount / 8);
6035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
6045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  InvalidateRect(wnd_, NULL, TRUE);
6055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
606