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
SharedBitmap(base::SharedMemory * memory,const SharedBitmapId & id,const base::Callback<void (SharedBitmap * bitmap)> & free_callback)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
SharedBitmap(uint8 * pixels,const SharedBitmapId & id,const base::Callback<void (SharedBitmap * bitmap)> & free_callback)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
~SharedBitmap()30 SharedBitmap::~SharedBitmap() { free_callback_.Run(this); }
31
32 // static
SizeInBytes(const gfx::Size & size,size_t * size_in_bytes)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
CheckedSizeInBytes(const gfx::Size & size)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
UncheckedSizeInBytes(const gfx::Size & size)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
VerifySizeInBytes(const gfx::Size & size)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
GenerateId()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