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

Side by Side Diff: chromecast/ui/gfx/gfx_plane.cc

Issue 223143003: Initial checkin of chromecast content embedder (cast_shell) and related build scripts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add an additional function in gl_surface_cast.cc Created 6 years, 8 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chromecast/ui/gfx/gfx_plane.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9
10 namespace gfx {
11 namespace chromecast {
12
13 Osd::Osd(Surface* arg_surface)
14 : surface_(arg_surface) {
15 DCHECK(surface_.get());
16 }
17
18 Osd::~Osd() {
19 }
20
21 // static
22 GfxPlane* GfxPlane::primary_ = NULL;
23
24 GfxPlane::GfxPlane()
25 : num_surfaces_(0),
26 current_surface_(NULL) {
27 }
28
29 GfxPlane::~GfxPlane() {
30 // Make sure we haven't leaked any surfaces
31 LOG_IF(DFATAL, num_surfaces_ != 0)
32 << num_surfaces_ << " of surfaces are not released.";
33 if (this == primary_) {
34 primary_ = NULL;
35 }
36 }
37
38 void GfxPlane::Display(Surface* surface, const Rect& rect,
39 const Point& frame_buffer_point) {
40 DCHECK(frame_buffer_.get());
41 DCHECK(surface);
42
43 // Keeps track of current surface to restore original bitmap when OSD
44 // surfaces are gone. Since all backing store surfaces are full screen,
45 // it's enough to remember only one (last) surface which displays something.
46 current_surface_ = surface;
47
48 if (osd_and_rects_.empty()) { // Fast display for most cases.
49 frame_buffer_->Blit(surface, rect, frame_buffer_point);
50 return;
51 }
52
53 Rect frame_buffer_rect(frame_buffer_point, rect.size());
54 scoped_ptr<Surface> composite;
55 // Draws lowest priority OSD surfaces first.
56 for (std::list<OsdAndRect>::const_reverse_iterator
57 it = osd_and_rects_.rbegin(); it != osd_and_rects_.rend(); ++it) {
58 if (frame_buffer_rect.Intersects(it->rect)) {
59 // Creates a temporary composite surface and copies the original bitmap.
60 if (composite.get() == NULL) {
61 composite.reset(CreateSurface(rect.size()));
62 composite->Blit(surface, rect, Point(0, 0));
63 }
64
65 Rect overlapped_in_frame_buffer = gfx::IntersectRects(frame_buffer_rect,
66 it->rect);
67 Point overlapped_origin_in_composite(
68 overlapped_in_frame_buffer.origin() -
69 frame_buffer_point.OffsetFromOrigin());
70 Rect overlapped_in_osd(
71 overlapped_in_frame_buffer.origin() -
72 it->rect.origin().OffsetFromOrigin(),
73 overlapped_in_frame_buffer.size());
74 composite->Composite(it->osd->surface(), overlapped_in_osd,
75 overlapped_origin_in_composite);
76 }
77 }
78
79 // Blits composite surface if created.
80 if (composite.get() == NULL) {
81 frame_buffer_->Blit(surface, rect, frame_buffer_point);
82 } else {
83 frame_buffer_->Blit(composite.get(), Rect(composite->size()),
84 frame_buffer_point);
85 }
86 }
87
88 void GfxPlane::OnRemoved(Surface* surface) {
89 if (surface == current_surface_) {
90 current_surface_ = NULL;
91 }
92 }
93
94 bool GfxPlane::IsOsdPlane() const {
95 return false;
96 }
97
98 Osd* GfxPlane::CreateOsd(const Size& size) {
99 return new Osd(CreateSurface(size));
100 }
101
102 void GfxPlane::AddOsd(Osd* osd, const Point& frame_buffer_point) {
103 OsdAndRect osd_rect;
104 osd_rect.rect = Rect(frame_buffer_point, osd->size());
105 osd_rect.osd = osd;
106 osd_and_rects_.push_front(osd_rect);
107 Refresh(osd_rect.rect);
108 }
109
110 void GfxPlane::RemoveOsd(Osd* osd, const Point& frame_buffer_point) {
111 for (std::list<OsdAndRect>::iterator it = osd_and_rects_.begin();
112 it != osd_and_rects_.end(); ++it) {
113 if (it->osd == osd
114 && it->rect.origin() == frame_buffer_point) {
115 Rect overlaid_rect(it->rect);
116 osd_and_rects_.erase(it);
117 Refresh(overlaid_rect);
118 return;
119 }
120 }
121 }
122
123 void GfxPlane::Refresh(const Rect& frame_buffer_rect) {
124 if (current_surface_) {
125 DCHECK(frame_buffer_.get());
126 DCHECK(current_surface_->size() == frame_buffer_->size());
127 current_surface_->Display(frame_buffer_rect, frame_buffer_rect.origin());
128 }
129 }
130
131 const Size GfxPlane::size() const {
132 if (frame_buffer_.get()) {
133 return frame_buffer_->size();
134 } else {
135 return Size(0, 0);
136 }
137 }
138
139 } // namespace chromecast
140 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698