| Index: remoting/client/rectangle_update_decoder.cc | 
| diff --git a/remoting/client/rectangle_update_decoder.cc b/remoting/client/rectangle_update_decoder.cc | 
| index 3ce8b651bb7a3eafa10d86ac0ab55440041e1e05..673c2a037061f78d23afbd4c916b6c5995e750a7 100644 | 
| --- a/remoting/client/rectangle_update_decoder.cc | 
| +++ b/remoting/client/rectangle_update_decoder.cc | 
| @@ -140,7 +140,7 @@ void RectangleUpdateDecoder::SetOutputSize(const SkISize& size) { | 
| // TODO(wez): Refresh the frame only if the ratio has changed. | 
| if (frame_) { | 
| SkIRect frame_rect = SkIRect::MakeWH(frame_->width(), frame_->height()); | 
| -    refresh_rects_.push_back(frame_rect); | 
| +    refresh_region_.op(frame_rect, SkRegion::kUnion_Op); | 
| } | 
|  | 
| // TODO(hclam): If the scale ratio has changed we should reallocate a | 
| @@ -166,7 +166,7 @@ void RectangleUpdateDecoder::UpdateClipRect(const SkIRect& new_clip_rect) { | 
| // TODO(wez): Only refresh newly-exposed portions of the frame. | 
| if (frame_) { | 
| SkIRect frame_rect = SkIRect::MakeWH(frame_->width(), frame_->height()); | 
| -    refresh_rects_.push_back(frame_rect); | 
| +    refresh_region_.op(frame_rect, SkRegion::kUnion_Op); | 
| } | 
|  | 
| clip_rect_ = new_clip_rect; | 
| @@ -188,9 +188,9 @@ void RectangleUpdateDecoder::RefreshFullFrame() { | 
| if (!frame_ || !decoder_.get()) | 
| return; | 
|  | 
| -  refresh_rects_.push_back( | 
| -      SkIRect::MakeWH(static_cast<int>(frame_->width()), | 
| -                      static_cast<int>(frame_->height()))); | 
| +  SkIRect frame_rect = SkIRect::MakeWH(frame_->width(), frame_->height()); | 
| +  refresh_region_.op(frame_rect, SkRegion::kUnion_Op); | 
| + | 
| DoRefresh(); | 
| } | 
|  | 
| @@ -200,33 +200,33 @@ void RectangleUpdateDecoder::SubmitToConsumer() { | 
| if (!frame_) | 
| return; | 
|  | 
| -  RectVector* dirty_rects = new RectVector(); | 
| -  decoder_->GetUpdatedRects(dirty_rects); | 
| +  SkRegion* dirty_region = new SkRegion; | 
| +  decoder_->GetUpdatedRegion(dirty_region); | 
|  | 
| -  consumer_->OnPartialFrameOutput(frame_, dirty_rects, base::Bind( | 
| -      &RectangleUpdateDecoder::OnFrameConsumed, this, dirty_rects)); | 
| +  consumer_->OnPartialFrameOutput(frame_, dirty_region, base::Bind( | 
| +      &RectangleUpdateDecoder::OnFrameConsumed, this, dirty_region)); | 
| } | 
|  | 
| void RectangleUpdateDecoder::DoRefresh() { | 
| DCHECK(message_loop_->BelongsToCurrentThread()); | 
|  | 
| -  if (refresh_rects_.empty()) | 
| +  if (refresh_region_.isEmpty()) | 
| return; | 
|  | 
| -  decoder_->RefreshRects(refresh_rects_); | 
| -  refresh_rects_.clear(); | 
| +  decoder_->RefreshRegion(refresh_region_); | 
| +  refresh_region_.setEmpty(); | 
| SubmitToConsumer(); | 
| } | 
|  | 
| -void RectangleUpdateDecoder::OnFrameConsumed(RectVector* rects) { | 
| +void RectangleUpdateDecoder::OnFrameConsumed(SkRegion* region) { | 
| if (!message_loop_->BelongsToCurrentThread()) { | 
| message_loop_->PostTask( | 
| FROM_HERE, base::Bind(&RectangleUpdateDecoder::OnFrameConsumed, | 
| -                              this, rects)); | 
| +                              this, region)); | 
| return; | 
| } | 
|  | 
| -  delete rects; | 
| +  delete region; | 
|  | 
| DoRefresh(); | 
| } | 
|  |