Home | History | Annotate | Download | only in resources
      1 // Copyright 2013 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 "cc/resources/shared_bitmap.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/numerics/safe_math.h"
      9 #include "base/rand_util.h"
     10 
     11 namespace cc {
     12 
     13 SharedBitmap::SharedBitmap(
     14     base::SharedMemory* memory,
     15     const SharedBitmapId& id,
     16     const base::Callback<void(SharedBitmap* bitmap)>& free_callback)
     17     : memory_(memory),
     18       pixels_(static_cast<uint8*>(memory_->memory())),
     19       id_(id),
     20       free_callback_(free_callback) {
     21 }
     22 
     23 SharedBitmap::SharedBitmap(
     24     uint8* pixels,
     25     const SharedBitmapId& id,
     26     const base::Callback<void(SharedBitmap* bitmap)>& free_callback)
     27     : memory_(NULL), pixels_(pixels), id_(id), free_callback_(free_callback) {
     28 }
     29 
     30 SharedBitmap::~SharedBitmap() { free_callback_.Run(this); }
     31 
     32 // static
     33 bool SharedBitmap::SizeInBytes(const gfx::Size& size, size_t* size_in_bytes) {
     34   if (size.IsEmpty())
     35     return false;
     36   base::CheckedNumeric<size_t> s = 4;
     37   s *= size.width();
     38   s *= size.height();
     39   if (!s.IsValid())
     40     return false;
     41   *size_in_bytes = s.ValueOrDie();
     42   return true;
     43 }
     44 
     45 // static
     46 size_t SharedBitmap::CheckedSizeInBytes(const gfx::Size& size) {
     47   CHECK(!size.IsEmpty());
     48   base::CheckedNumeric<size_t> s = 4;
     49   s *= size.width();
     50   s *= size.height();
     51   return s.ValueOrDie();
     52 }
     53 
     54 // static
     55 size_t SharedBitmap::UncheckedSizeInBytes(const gfx::Size& size) {
     56   DCHECK(VerifySizeInBytes(size));
     57   size_t s = 4;
     58   s *= size.width();
     59   s *= size.height();
     60   return s;
     61 }
     62 
     63 // static
     64 bool SharedBitmap::VerifySizeInBytes(const gfx::Size& size) {
     65   if (size.IsEmpty())
     66     return false;
     67   base::CheckedNumeric<size_t> s = 4;
     68   s *= size.width();
     69   s *= size.height();
     70   return s.IsValid();
     71 }
     72 
     73 // static
     74 SharedBitmapId SharedBitmap::GenerateId() {
     75   SharedBitmapId id;
     76   // Needs cryptographically-secure random numbers.
     77   base::RandBytes(id.name, sizeof(id.name));
     78   return id;
     79 }
     80 
     81 }  // namespace cc
     82