Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(995)

Unified Diff: remoting/base/util.cc

Issue 23440046: Remove dependency on Skia from chromoting client. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/base/util.h ('k') | remoting/base/util_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/base/util.cc
diff --git a/remoting/base/util.cc b/remoting/base/util.cc
index 0a0a52969940be00d546d57ce88ee7064ae5096c..d27b651e4f2fb555f207a9945b9c392467daf8b5 100644
--- a/remoting/base/util.cc
+++ b/remoting/base/util.cc
@@ -12,7 +12,7 @@
#include "media/base/video_frame.h"
#include "media/base/yuv_convert.h"
#include "third_party/libyuv/include/libyuv/convert.h"
-#include "third_party/skia/include/core/SkRegion.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_region.h"
#if defined(OS_POSIX)
#include <pwd.h>
@@ -73,54 +73,56 @@ void ConvertRGB32ToYUVWithRect(const uint8* rgb_plane,
width, height);
}
-void ConvertAndScaleYUVToRGB32Rect(const uint8* source_yplane,
- const uint8* source_uplane,
- const uint8* source_vplane,
- int source_ystride,
- int source_uvstride,
- const SkISize& source_size,
- const SkIRect& source_buffer_rect,
- uint8* dest_buffer,
- int dest_stride,
- const SkISize& dest_size,
- const SkIRect& dest_buffer_rect,
- const SkIRect& dest_rect) {
+void ConvertAndScaleYUVToRGB32Rect(
+ const uint8* source_yplane,
+ const uint8* source_uplane,
+ const uint8* source_vplane,
+ int source_ystride,
+ int source_uvstride,
+ const webrtc::DesktopSize& source_size,
+ const webrtc::DesktopRect& source_buffer_rect,
+ uint8* dest_buffer,
+ int dest_stride,
+ const webrtc::DesktopSize& dest_size,
+ const webrtc::DesktopRect& dest_buffer_rect,
+ const webrtc::DesktopRect& dest_rect) {
// N.B. It is caller's responsibility to check if strides are large enough. We
// cannot do it here anyway.
- DCHECK(SkIRect::MakeSize(source_size).contains(source_buffer_rect));
- DCHECK(SkIRect::MakeSize(dest_size).contains(dest_buffer_rect));
- DCHECK(dest_buffer_rect.contains(dest_rect));
- DCHECK(ScaleRect(source_buffer_rect, source_size, dest_size).
- contains(dest_rect));
+ DCHECK(DoesRectContain(webrtc::DesktopRect::MakeSize(source_size),
+ source_buffer_rect));
+ DCHECK(DoesRectContain(webrtc::DesktopRect::MakeSize(dest_size),
+ dest_buffer_rect));
+ DCHECK(DoesRectContain(dest_buffer_rect, dest_rect));
+ DCHECK(DoesRectContain(ScaleRect(source_buffer_rect, source_size, dest_size),
+ dest_rect));
// If the source and/or destination buffers don't start at (0, 0)
// offset the pointers to pretend we have complete buffers.
- int y_offset = - CalculateYOffset(source_buffer_rect.x(),
- source_buffer_rect.y(),
+ int y_offset = - CalculateYOffset(source_buffer_rect.left(),
+ source_buffer_rect.top(),
source_ystride);
- int uv_offset = - CalculateUVOffset(source_buffer_rect.x(),
- source_buffer_rect.y(),
+ int uv_offset = - CalculateUVOffset(source_buffer_rect.left(),
+ source_buffer_rect.top(),
source_uvstride);
- int rgb_offset = - CalculateRGBOffset(dest_buffer_rect.x(),
- dest_buffer_rect.y(),
+ int rgb_offset = - CalculateRGBOffset(dest_buffer_rect.left(),
+ dest_buffer_rect.top(),
dest_stride);
// See if scaling is needed.
- if (source_size == dest_size) {
+ if (source_size.equals(dest_size)) {
// Calculate the inner rectangle that can be copied by the optimized
// libyuv::I420ToARGB().
- SkIRect inner_rect =
- SkIRect::MakeLTRB(RoundToTwosMultiple(dest_rect.left() + 1),
- RoundToTwosMultiple(dest_rect.top() + 1),
- dest_rect.right(),
- dest_rect.bottom());
+ webrtc::DesktopRect inner_rect =
+ webrtc::DesktopRect::MakeLTRB(RoundToTwosMultiple(dest_rect.left() + 1),
+ RoundToTwosMultiple(dest_rect.top() + 1),
+ dest_rect.right(), dest_rect.bottom());
// Offset pointers to point to the top left corner of the inner rectangle.
- y_offset += CalculateYOffset(inner_rect.x(), inner_rect.y(),
+ y_offset += CalculateYOffset(inner_rect.left(), inner_rect.top(),
source_ystride);
- uv_offset += CalculateUVOffset(inner_rect.x(), inner_rect.y(),
+ uv_offset += CalculateUVOffset(inner_rect.left(), inner_rect.top(),
source_uvstride);
- rgb_offset += CalculateRGBOffset(inner_rect.x(), inner_rect.y(),
+ rgb_offset += CalculateRGBOffset(inner_rect.left(), inner_rect.top(),
dest_stride);
libyuv::I420ToARGB(source_yplane + y_offset, source_ystride,
@@ -130,15 +132,14 @@ void ConvertAndScaleYUVToRGB32Rect(const uint8* source_yplane,
inner_rect.width(), inner_rect.height());
// Now see if some pixels weren't copied due to alignment.
- if (dest_rect != inner_rect) {
- SkIRect outer_rect =
- SkIRect::MakeLTRB(RoundToTwosMultiple(dest_rect.left()),
- RoundToTwosMultiple(dest_rect.top()),
- dest_rect.right(),
- dest_rect.bottom());
+ if (!dest_rect.equals(inner_rect)) {
+ webrtc::DesktopRect outer_rect =
+ webrtc::DesktopRect::MakeLTRB(RoundToTwosMultiple(dest_rect.left()),
+ RoundToTwosMultiple(dest_rect.top()),
+ dest_rect.right(), dest_rect.bottom());
- SkIPoint offset = SkIPoint::Make(outer_rect.x() - inner_rect.x(),
- outer_rect.y() - inner_rect.y());
+ webrtc::DesktopVector offset(outer_rect.left() - inner_rect.left(),
+ outer_rect.top() - inner_rect.top());
// Offset the pointers to point to the top left corner of the outer
// rectangle.
@@ -147,11 +148,12 @@ void ConvertAndScaleYUVToRGB32Rect(const uint8* source_yplane,
rgb_offset += CalculateRGBOffset(offset.x(), offset.y(), dest_stride);
// Draw unaligned edges.
- SkRegion edges(dest_rect);
- edges.op(inner_rect, SkRegion::kDifference_Op);
- for (SkRegion::Iterator i(edges); !i.done(); i.next()) {
- SkIRect rect(i.rect());
- rect.offset(- outer_rect.left(), - outer_rect.top());
+ webrtc::DesktopRegion edges(dest_rect);
+ edges.Subtract(inner_rect);
+ for (webrtc::DesktopRegion::Iterator i(edges); !i.IsAtEnd();
+ i.Advance()) {
+ webrtc::DesktopRect rect = i.rect();
+ rect.Translate(-outer_rect.left(), -outer_rect.top());
media::ScaleYUVToRGB32WithRect(source_yplane + y_offset,
source_uplane + uv_offset,
source_vplane + uv_offset,
@@ -192,43 +194,45 @@ int RoundToTwosMultiple(int x) {
return x & (~1);
}
-SkIRect AlignRect(const SkIRect& rect) {
+webrtc::DesktopRect AlignRect(const webrtc::DesktopRect& rect) {
int x = RoundToTwosMultiple(rect.left());
int y = RoundToTwosMultiple(rect.top());
int right = RoundToTwosMultiple(rect.right() + 1);
int bottom = RoundToTwosMultiple(rect.bottom() + 1);
- return SkIRect::MakeLTRB(x, y, right, bottom);
+ return webrtc::DesktopRect::MakeLTRB(x, y, right, bottom);
}
-SkIRect ScaleRect(const SkIRect& rect,
- const SkISize& in_size,
- const SkISize& out_size) {
+webrtc::DesktopRect ScaleRect(const webrtc::DesktopRect& rect,
+ const webrtc::DesktopSize& in_size,
+ const webrtc::DesktopSize& out_size) {
int left = (rect.left() * out_size.width()) / in_size.width();
int top = (rect.top() * out_size.height()) / in_size.height();
int right = (rect.right() * out_size.width() + in_size.width() - 1) /
in_size.width();
int bottom = (rect.bottom() * out_size.height() + in_size.height() - 1) /
in_size.height();
- return SkIRect::MakeLTRB(left, top, right, bottom);
+ return webrtc::DesktopRect::MakeLTRB(left, top, right, bottom);
}
void CopyRGB32Rect(const uint8* source_buffer,
int source_stride,
- const SkIRect& source_buffer_rect,
+ const webrtc::DesktopRect& source_buffer_rect,
uint8* dest_buffer,
int dest_stride,
- const SkIRect& dest_buffer_rect,
- const SkIRect& dest_rect) {
- DCHECK(dest_buffer_rect.contains(dest_rect));
- DCHECK(source_buffer_rect.contains(dest_rect));
+ const webrtc::DesktopRect& dest_buffer_rect,
+ const webrtc::DesktopRect& dest_rect) {
+ DCHECK(DoesRectContain(dest_buffer_rect, dest_rect));
+ DCHECK(DoesRectContain(source_buffer_rect, dest_rect));
// Get the address of the starting point.
- source_buffer += CalculateRGBOffset(dest_rect.x() - source_buffer_rect.x(),
- dest_rect.y() - source_buffer_rect.y(),
- source_stride);
- dest_buffer += CalculateRGBOffset(dest_rect.x() - dest_buffer_rect.x(),
- dest_rect.y() - dest_buffer_rect.y(),
- source_stride);
+ source_buffer += CalculateRGBOffset(
+ dest_rect.left() - source_buffer_rect.left(),
+ dest_rect.top() - source_buffer_rect.top(),
+ source_stride);
+ dest_buffer += CalculateRGBOffset(
+ dest_rect.left() - dest_buffer_rect.left(),
+ dest_rect.top() - dest_buffer_rect.top(),
+ source_stride);
// Copy pixels in the rectangle line by line.
const int bytes_per_line = kBytesPerPixelRGB32 * dest_rect.width();
@@ -328,4 +332,11 @@ std::string GetUsername() {
#endif // defined(OS_POSIX)
}
+bool DoesRectContain(const webrtc::DesktopRect& a,
+ const webrtc::DesktopRect& b) {
+ webrtc::DesktopRect intersection(a);
+ intersection.IntersectWith(b);
+ return intersection.equals(b);
+}
+
} // namespace remoting
« no previous file with comments | « remoting/base/util.h ('k') | remoting/base/util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698