diff options
author | cevans@chromium.org <cevans@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-05 20:50:42 +0000 |
---|---|---|
committer | cevans@chromium.org <cevans@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-05 20:50:42 +0000 |
commit | cb75116ab624dd0df65508653119afdc081e7800 (patch) | |
tree | a7c7cedeb5fd7c5e3e137e029cd18f070fee382d /ui/surface/transport_dib_posix.cc | |
parent | 7c194f4763833ae85b83fed6786a26789768f542 (diff) | |
download | chromium_src-cb75116ab624dd0df65508653119afdc081e7800.zip chromium_src-cb75116ab624dd0df65508653119afdc081e7800.tar.gz chromium_src-cb75116ab624dd0df65508653119afdc081e7800.tar.bz2 |
Simplify the transport dib situation across our various platforms, as a
pre-cursor to moving Chrome OS + Aura away from legacy GTK+X11 dibs. Now, we
have just:
- Windows style dibs
- POSIX style dibs
- Legacy GTK+X11 style dibs.
There's some ifdef hoops that will be removed in a follow-up CL when
Chrome OS + Aura will be moved away from legacy GTK+X11 dibs and on to POSIX
dibs.
BUG=147622
Review URL: https://codereview.chromium.org/13582008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@192629 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface/transport_dib_posix.cc')
-rw-r--r-- | ui/surface/transport_dib_posix.cc | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/ui/surface/transport_dib_posix.cc b/ui/surface/transport_dib_posix.cc new file mode 100644 index 0000000..fcb935d --- /dev/null +++ b/ui/surface/transport_dib_posix.cc @@ -0,0 +1,118 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/surface/transport_dib.h" + +// Desktop GTK Linux builds use the old-style SYSV SHM based DIBs. +// Linux Aura and Chrome OS do too. This will change very soon. +#if !defined(TOOLKIT_GTK) && !(defined(OS_LINUX) && defined(USE_AURA)) + +#include <sys/stat.h> +#include <unistd.h> + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/shared_memory.h" +#include "base/posix/eintr_wrapper.h" +#include "skia/ext/platform_canvas.h" + +TransportDIB::TransportDIB() + : size_(0) { +} + +TransportDIB::TransportDIB(TransportDIB::Handle dib) + : shared_memory_(dib, false /* read write */), + size_(0) { +} + +TransportDIB::~TransportDIB() { +} + +// static +TransportDIB* TransportDIB::Create(size_t size, uint32 sequence_num) { + TransportDIB* dib = new TransportDIB; + if (!dib->shared_memory_.CreateAndMapAnonymous(size)) { + delete dib; + return NULL; + } + + dib->size_ = size; + return dib; +} + +// static +TransportDIB* TransportDIB::Map(Handle handle) { + scoped_ptr<TransportDIB> dib(CreateWithHandle(handle)); + if (!dib->Map()) + return NULL; + return dib.release(); +} + +// static +TransportDIB* TransportDIB::CreateWithHandle(Handle handle) { + return new TransportDIB(handle); +} + +// static +bool TransportDIB::is_valid_handle(Handle dib) { + return dib.fd >= 0; +} + +// static +bool TransportDIB::is_valid_id(Id id) { +#if defined(OS_ANDROID) + return is_valid_handle(id); +#else + return id != 0; +#endif +} + +skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { + if ((!memory() && !Map()) || !VerifyCanvasSize(w, h)) + return NULL; + return skia::CreatePlatformCanvas(w, h, true, + reinterpret_cast<uint8_t*>(memory()), + skia::RETURN_NULL_ON_FAILURE); +} + +bool TransportDIB::Map() { + if (!is_valid_handle(handle())) + return false; +#if defined(OS_ANDROID) + if (!shared_memory_.Map(0)) + return false; + size_ = shared_memory_.mapped_size(); +#else + if (memory()) + return true; + + struct stat st; + if ((fstat(shared_memory_.handle().fd, &st) != 0) || + (!shared_memory_.Map(st.st_size))) { + return false; + } + + size_ = st.st_size; +#endif + return true; +} + +void* TransportDIB::memory() const { + return shared_memory_.memory(); +} + +TransportDIB::Id TransportDIB::id() const { +#if defined(OS_ANDROID) + return handle(); +#else + return shared_memory_.id(); +#endif +} + +TransportDIB::Handle TransportDIB::handle() const { + return shared_memory_.handle(); +} + +#endif // !defined(TOOLKIT_GTK) && !(defined(OS_LINUX) && defined(USE_AURA)) + |