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

Side by Side Diff: content/renderer/pepper/ppb_image_data_impl.cc

Issue 61813003: Allow PPB_ImageData_Impl to be created in a way that is compatible with unittests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « content/renderer/pepper/ppb_image_data_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/pepper/ppb_image_data_impl.h" 5 #include "content/renderer/pepper/ppb_image_data_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "content/common/view_messages.h" 12 #include "content/common/view_messages.h"
13 #include "content/renderer/pepper/common.h" 13 #include "content/renderer/pepper/common.h"
14 #include "content/renderer/render_thread_impl.h" 14 #include "content/renderer/render_thread_impl.h"
15 #include "ppapi/c/pp_errors.h" 15 #include "ppapi/c/pp_errors.h"
16 #include "ppapi/c/pp_instance.h" 16 #include "ppapi/c/pp_instance.h"
17 #include "ppapi/c/pp_resource.h" 17 #include "ppapi/c/pp_resource.h"
18 #include "ppapi/c/ppb_image_data.h" 18 #include "ppapi/c/ppb_image_data.h"
19 #include "ppapi/thunk/thunk.h" 19 #include "ppapi/thunk/thunk.h"
20 #include "skia/ext/platform_canvas.h" 20 #include "skia/ext/platform_canvas.h"
21 #include "third_party/skia/include/core/SkColorPriv.h" 21 #include "third_party/skia/include/core/SkColorPriv.h"
22 #include "ui/surface/transport_dib.h" 22 #include "ui/surface/transport_dib.h"
23 23
24 using ppapi::thunk::PPB_ImageData_API; 24 using ppapi::thunk::PPB_ImageData_API;
25 25
26 namespace content { 26 namespace content {
27 27
28 namespace {
29 // Returns true if the ImageData shared memory should be allocated in the
30 // browser process for the current platform.
31 bool IsBrowserAllocated() {
32 #if defined(OS_POSIX) && !defined(TOOLKIT_GTK) && !defined(OS_ANDROID)
33 // On the Mac, shared memory has to be created in the browser in order to
34 // work in the sandbox.
35 return true;
36 #endif
37 return false;
38 }
39 } // namespace
40
28 PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance, 41 PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
29 PPB_ImageData_Shared::ImageDataType type) 42 PPB_ImageData_Shared::ImageDataType type)
30 : Resource(ppapi::OBJECT_IS_IMPL, instance), 43 : Resource(ppapi::OBJECT_IS_IMPL, instance),
31 format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL), 44 format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL),
32 width_(0), 45 width_(0),
33 height_(0) { 46 height_(0) {
34 switch (type) { 47 switch (type) {
35 case PPB_ImageData_Shared::PLATFORM: 48 case PPB_ImageData_Shared::PLATFORM:
36 backend_.reset(new ImageDataPlatformBackend); 49 backend_.reset(new ImageDataPlatformBackend(IsBrowserAllocated()));
37 return; 50 return;
38 case PPB_ImageData_Shared::SIMPLE: 51 case PPB_ImageData_Shared::SIMPLE:
39 backend_.reset(new ImageDataSimpleBackend); 52 backend_.reset(new ImageDataSimpleBackend);
40 return; 53 return;
41 // No default: so that we get a compiler warning if any types are added. 54 // No default: so that we get a compiler warning if any types are added.
42 } 55 }
43 NOTREACHED(); 56 NOTREACHED();
44 } 57 }
45 58
59 PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
60 ForTest)
61 : Resource(ppapi::OBJECT_IS_IMPL, instance),
62 format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL),
63 width_(0),
64 height_(0) {
65 backend_.reset(new ImageDataPlatformBackend(false));
66 }
67
46 PPB_ImageData_Impl::~PPB_ImageData_Impl() { 68 PPB_ImageData_Impl::~PPB_ImageData_Impl() {
47 } 69 }
48 70
49 bool PPB_ImageData_Impl::Init(PP_ImageDataFormat format, 71 bool PPB_ImageData_Impl::Init(PP_ImageDataFormat format,
50 int width, int height, 72 int width, int height,
51 bool init_to_zero) { 73 bool init_to_zero) {
52 // TODO(brettw) this should be called only on the main thread! 74 // TODO(brettw) this should be called only on the main thread!
53 if (!IsImageDataFormatSupported(format)) 75 if (!IsImageDataFormatSupported(format))
54 return false; // Only support this one format for now. 76 return false; // Only support this one format for now.
55 if (width <= 0 || height <= 0) 77 if (width <= 0 || height <= 0)
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 void PPB_ImageData_Impl::SetIsCandidateForReuse() { 142 void PPB_ImageData_Impl::SetIsCandidateForReuse() {
121 // Nothing to do since we don't support image data re-use in-process. 143 // Nothing to do since we don't support image data re-use in-process.
122 } 144 }
123 145
124 const SkBitmap* PPB_ImageData_Impl::GetMappedBitmap() const { 146 const SkBitmap* PPB_ImageData_Impl::GetMappedBitmap() const {
125 return backend_->GetMappedBitmap(); 147 return backend_->GetMappedBitmap();
126 } 148 }
127 149
128 // ImageDataPlatformBackend ---------------------------------------------------- 150 // ImageDataPlatformBackend ----------------------------------------------------
129 151
130 ImageDataPlatformBackend::ImageDataPlatformBackend() 152 ImageDataPlatformBackend::ImageDataPlatformBackend(bool is_browser_allocated)
131 : width_(0), 153 : width_(0),
132 height_(0) { 154 height_(0),
155 is_browser_allocated_(is_browser_allocated) {
133 } 156 }
134 157
135 // On POSIX, we have to tell the browser to free the transport DIB. 158 // On POSIX, we have to tell the browser to free the transport DIB.
136 ImageDataPlatformBackend::~ImageDataPlatformBackend() { 159 ImageDataPlatformBackend::~ImageDataPlatformBackend() {
137 #if defined(OS_POSIX) && !defined(TOOLKIT_GTK) && !defined(OS_ANDROID) 160 if (is_browser_allocated_) {
138 if (dib_) { 161 #if defined(OS_POSIX)
139 RenderThreadImpl::current()->Send( 162 if (dib_) {
140 new ViewHostMsg_FreeTransportDIB(dib_->id())); 163 RenderThreadImpl::current()->Send(
164 new ViewHostMsg_FreeTransportDIB(dib_->id()));
165 }
166 #endif
141 } 167 }
142 #endif
143 } 168 }
144 169
145 bool ImageDataPlatformBackend::Init(PPB_ImageData_Impl* impl, 170 bool ImageDataPlatformBackend::Init(PPB_ImageData_Impl* impl,
146 PP_ImageDataFormat format, 171 PP_ImageDataFormat format,
147 int width, int height, 172 int width, int height,
148 bool init_to_zero) { 173 bool init_to_zero) {
149 // TODO(brettw) use init_to_zero when we implement caching. 174 // TODO(brettw) use init_to_zero when we implement caching.
150 width_ = width; 175 width_ = width;
151 height_ = height; 176 height_ = height;
152 uint32 buffer_size = width_ * height_ * 4; 177 uint32 buffer_size = width_ * height_ * 4;
153 178
154 // Allocate the transport DIB and the PlatformCanvas pointing to it. 179 // Allocate the transport DIB and the PlatformCanvas pointing to it.
155 #if defined(OS_POSIX) && !defined(TOOLKIT_GTK) && !defined(OS_ANDROID) 180 TransportDIB* dib = NULL;
156 // On the Mac, shared memory has to be created in the browser in order to 181 if (is_browser_allocated_) {
157 // work in the sandbox. Do this by sending a message to the browser 182 #if defined(OS_POSIX)
158 // requesting a TransportDIB (see also 183 // Allocate the image data by sending a message to the browser requesting a
159 // chrome/renderer/webplugin_delegate_proxy.cc, method 184 // TransportDIB (see also chrome/renderer/webplugin_delegate_proxy.cc,
160 // WebPluginDelegateProxy::CreateBitmap() for similar code). The TransportDIB 185 // method WebPluginDelegateProxy::CreateBitmap() for similar code). The
161 // is cached in the browser, and is freed (in typical cases) by the 186 // TransportDIB is cached in the browser, and is freed (in typical cases) by
162 // TransportDIB's destructor. 187 // the TransportDIB's destructor.
163 TransportDIB::Handle dib_handle; 188 TransportDIB::Handle dib_handle;
164 IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(buffer_size, 189 IPC::Message* msg = new ViewHostMsg_AllocTransportDIB(buffer_size,
165 true, 190 true,
166 &dib_handle); 191 &dib_handle);
167 if (!RenderThreadImpl::current()->Send(msg)) 192 if (!RenderThreadImpl::current()->Send(msg))
168 return false; 193 return false;
169 if (!TransportDIB::is_valid_handle(dib_handle)) 194 if (!TransportDIB::is_valid_handle(dib_handle))
170 return false; 195 return false;
171 196
172 TransportDIB* dib = TransportDIB::CreateWithHandle(dib_handle); 197 dib = TransportDIB::CreateWithHandle(dib_handle);
173 #else
174 static int next_dib_id = 0;
175 TransportDIB* dib = TransportDIB::Create(buffer_size, next_dib_id++);
176 if (!dib)
177 return false;
178 #endif 198 #endif
199 } else {
200 static int next_dib_id = 0;
201 dib = TransportDIB::Create(buffer_size, next_dib_id++);
202 if (!dib)
203 return false;
204 }
205 DCHECK(dib);
179 dib_.reset(dib); 206 dib_.reset(dib);
180 return true; 207 return true;
181 } 208 }
182 209
183 bool ImageDataPlatformBackend::IsMapped() const { 210 bool ImageDataPlatformBackend::IsMapped() const {
184 return !!mapped_canvas_.get(); 211 return !!mapped_canvas_.get();
185 } 212 }
186 213
187 TransportDIB* ImageDataPlatformBackend::GetTransportDIB() const { 214 TransportDIB* ImageDataPlatformBackend::GetTransportDIB() const {
188 return dib_.get(); 215 return dib_.get();
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 return skia_canvas_.get(); 335 return skia_canvas_.get();
309 } 336 }
310 337
311 const SkBitmap* ImageDataSimpleBackend::GetMappedBitmap() const { 338 const SkBitmap* ImageDataSimpleBackend::GetMappedBitmap() const {
312 if (!IsMapped()) 339 if (!IsMapped())
313 return NULL; 340 return NULL;
314 return &skia_bitmap_; 341 return &skia_bitmap_;
315 } 342 }
316 343
317 } // namespace content 344 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/pepper/ppb_image_data_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698