115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org/*
215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *
415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  Use of this source code is governed by a BSD-style license
515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  that can be found in the LICENSE file in the root of the source
615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  tree. An additional intellectual property rights grant can be found
715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  in the file PATENTS.  All contributing project authors may
815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org *  be found in the AUTHORS file in the root of the source tree.
915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org */
1015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_frame_win.h"
1215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1398f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/logging.h"
146a5cc9d8998ec979ea3be1b3378b7b47d6c765e9sergeyu@chromium.org
1515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgnamespace webrtc {
1615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
1715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgDesktopFrameWin::DesktopFrameWin(DesktopSize size,
1815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                 int stride,
1915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                 uint8_t* data,
2015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                 SharedMemory* shared_memory,
2115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                 HBITMAP bitmap)
2215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    : DesktopFrame(size, stride, data, shared_memory),
2315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org      bitmap_(bitmap),
2415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org      owned_shared_memory_(shared_memory_) {
2515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org}
2615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
2715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgDesktopFrameWin::~DesktopFrameWin() {
2815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  DeleteObject(bitmap_);
2915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org}
3015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
3115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org// static
3215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgDesktopFrameWin* DesktopFrameWin::Create(DesktopSize size,
3315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                         SharedMemory* shared_memory,
3415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                         HDC hdc) {
3515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  int bytes_per_row = size.width() * kBytesPerPixel;
3615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
3715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  // Describe a device independent bitmap (DIB) that is the size of the desktop.
38a771bf8ee84f293c166d3e377d852e9705c12725dcheng  BITMAPINFO bmi = {};
3915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bmi.bmiHeader.biHeight = -size.height();
4015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bmi.bmiHeader.biWidth = size.width();
4115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bmi.bmiHeader.biPlanes = 1;
4215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bmi.bmiHeader.biBitCount = DesktopFrameWin::kBytesPerPixel * 8;
4315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
4415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  bmi.bmiHeader.biSizeImage = bytes_per_row * size.height();
4515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
4615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  HANDLE section_handle = NULL;
4715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  if (shared_memory)
4815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    section_handle = shared_memory->handle();
4915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  void* data = NULL;
5015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  HBITMAP bitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &data,
5115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                                    section_handle, 0);
5215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  if (!bitmap) {
536a5cc9d8998ec979ea3be1b3378b7b47d6c765e9sergeyu@chromium.org    LOG(LS_WARNING) << "Failed to allocate new window frame " << GetLastError();
5415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    delete shared_memory;
5515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org    return NULL;
5615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  }
5715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
5815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org  return new DesktopFrameWin(size, bytes_per_row,
5915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                             reinterpret_cast<uint8_t*>(data),
6015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org                             shared_memory, bitmap);
6115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org}
6215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org
6315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org}  // namespace webrtc
64