// Copyright 2014 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 "cc/test/test_shared_bitmap_manager.h"

#include "base/memory/shared_memory.h"

namespace cc {

namespace {
class OwnedSharedBitmap : public SharedBitmap {
 public:
  OwnedSharedBitmap(scoped_ptr<base::SharedMemory> shared_memory,
                    const SharedBitmapId& id)
      : SharedBitmap(static_cast<uint8*>(shared_memory->memory()), id),
        shared_memory_(shared_memory.Pass()) {}

  ~OwnedSharedBitmap() override {}

  base::SharedMemory* memory() override { return shared_memory_.get(); }

 private:
  scoped_ptr<base::SharedMemory> shared_memory_;
};

class UnownedSharedBitmap : public SharedBitmap {
 public:
  UnownedSharedBitmap(base::SharedMemory* shared_memory,
                      const SharedBitmapId& id)
      : SharedBitmap(static_cast<uint8*>(shared_memory->memory()), id),
        shared_memory_(shared_memory) {}

  ~UnownedSharedBitmap() override {}

  base::SharedMemory* memory() override { return shared_memory_; }

 private:
  base::SharedMemory* shared_memory_;
};
}  // namespace

TestSharedBitmapManager::TestSharedBitmapManager() {}

TestSharedBitmapManager::~TestSharedBitmapManager() {}

scoped_ptr<SharedBitmap> TestSharedBitmapManager::AllocateSharedBitmap(
    const gfx::Size& size) {
  base::AutoLock lock(lock_);
  scoped_ptr<base::SharedMemory> memory(new base::SharedMemory);
  memory->CreateAndMapAnonymous(size.GetArea() * 4);
  SharedBitmapId id = SharedBitmap::GenerateId();
  bitmap_map_[id] = memory.get();
  return make_scoped_ptr(new OwnedSharedBitmap(memory.Pass(), id));
}

scoped_ptr<SharedBitmap> TestSharedBitmapManager::GetSharedBitmapFromId(
    const gfx::Size&,
    const SharedBitmapId& id) {
  base::AutoLock lock(lock_);
  if (bitmap_map_.find(id) == bitmap_map_.end())
    return nullptr;
  return make_scoped_ptr(new UnownedSharedBitmap(bitmap_map_[id], id));
}

scoped_ptr<SharedBitmap> TestSharedBitmapManager::GetBitmapForSharedMemory(
    base::SharedMemory* memory) {
  base::AutoLock lock(lock_);
  SharedBitmapId id = SharedBitmap::GenerateId();
  bitmap_map_[id] = memory;
  return make_scoped_ptr(new UnownedSharedBitmap(memory, id));
}

}  // namespace cc
