Zijie He af5686a229 Implement scaling detection in WindowCapturerWin
WindowCapturerWin wrongly calculate the image size if the application it target
does not support high DPI. It causes part of the output frame black. See bug for
details.

Bug: webrtc:8112
Change-Id: I33c66dfa977ec08a29c56ff86ae37320b1459c87
Reviewed-on: https://chromium-review.googlesource.com/634383
Commit-Queue: Zijie He <zijiehe@chromium.org>
Reviewed-by: Jamie Walch <jamiewalch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#19531}
2017-08-26 00:48:06 +00:00

80 lines
2.1 KiB
C++

/*
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/modules/desktop_capture/desktop_geometry.h"
#include <algorithm>
namespace webrtc {
bool DesktopRect::Contains(const DesktopVector& point) const {
return point.x() >= left() && point.x() < right() &&
point.y() >= top() && point.y() < bottom();
}
bool DesktopRect::ContainsRect(const DesktopRect& rect) const {
return rect.left() >= left() && rect.right() <= right() &&
rect.top() >= top() && rect.bottom() <= bottom();
}
void DesktopRect::IntersectWith(const DesktopRect& rect) {
left_ = std::max(left(), rect.left());
top_ = std::max(top(), rect.top());
right_ = std::min(right(), rect.right());
bottom_ = std::min(bottom(), rect.bottom());
if (is_empty()) {
left_ = 0;
top_ = 0;
right_ = 0;
bottom_ = 0;
}
}
void DesktopRect::UnionWith(const DesktopRect& rect) {
if (is_empty()) {
*this = rect;
return;
}
if (rect.is_empty()) {
return;
}
left_ = std::min(left(), rect.left());
top_ = std::min(top(), rect.top());
right_ = std::max(right(), rect.right());
bottom_ = std::max(bottom(), rect.bottom());
}
void DesktopRect::Translate(int32_t dx, int32_t dy) {
left_ += dx;
top_ += dy;
right_ += dx;
bottom_ += dy;
}
void DesktopRect::Extend(int32_t left_offset,
int32_t top_offset,
int32_t right_offset,
int32_t bottom_offset) {
left_ -= left_offset;
top_ -= top_offset;
right_ += right_offset;
bottom_ += bottom_offset;
}
void DesktopRect::Scale(double horizontal, double vertical) {
right_ += width() * (horizontal - 1);
bottom_ += height() * (vertical - 1);
}
} // namespace webrtc