OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/chromeos/login/user_image.h" | |
6 | |
7 #include "third_party/skia/include/core/SkBitmap.h" | |
8 #include "ui/gfx/codec/jpeg_codec.h" | |
9 | |
10 #include "base/debug/trace_event.h" | |
11 | |
12 namespace chromeos { | |
13 | |
14 namespace { | |
15 | |
16 // Default quality for encoding user images. | |
17 const int kDefaultEncodingQuality = 90; | |
18 | |
19 bool IsAnimatedImage(const UserImage::RawImage& data) { | |
20 const char kGIFStamp[] = "GIF"; | |
21 const size_t kGIFStampLength = sizeof(kGIFStamp) - 1; | |
22 | |
23 if (data.size() >= kGIFStampLength && | |
24 memcmp(&data[0], kGIFStamp, kGIFStampLength) == 0) { | |
25 return true; | |
26 } | |
27 return false; | |
28 } | |
29 | |
30 bool EncodeImageSkia(const gfx::ImageSkia& image, | |
31 std::vector<unsigned char>* output) { | |
32 TRACE_EVENT2("oobe", "EncodeImageSkia", | |
33 "width", image.width(), "height", image.height()); | |
34 if (image.isNull()) | |
35 return false; | |
36 const SkBitmap& bitmap = *image.bitmap(); | |
37 SkAutoLockPixels lock_image(bitmap); | |
38 return gfx::JPEGCodec::Encode( | |
39 reinterpret_cast<unsigned char*>(bitmap.getAddr32(0, 0)), | |
40 gfx::JPEGCodec::FORMAT_SkBitmap, | |
41 bitmap.width(), | |
42 bitmap.height(), | |
43 bitmap.width() * bitmap.bytesPerPixel(), | |
44 kDefaultEncodingQuality, output); | |
45 } | |
46 | |
47 } // namespace | |
48 | |
49 // static | |
50 UserImage UserImage::CreateAndEncode(const gfx::ImageSkia& image) { | |
51 RawImage raw_image; | |
52 if (EncodeImageSkia(image, &raw_image)) { | |
53 UserImage result(image, raw_image); | |
54 result.MarkAsSafe(); | |
55 return result; | |
56 } | |
57 return UserImage(image); | |
58 } | |
59 | |
60 UserImage::UserImage() | |
61 : has_raw_image_(false), | |
62 has_animated_image_(false), | |
63 is_safe_format_(false) { | |
64 } | |
65 | |
66 UserImage::UserImage(const gfx::ImageSkia& image) | |
67 : image_(image), | |
68 has_raw_image_(false), | |
69 has_animated_image_(false), | |
70 is_safe_format_(false) { | |
71 } | |
72 | |
73 UserImage::UserImage(const gfx::ImageSkia& image, | |
74 const RawImage& raw_image) | |
75 : image_(image), | |
76 has_raw_image_(false), | |
77 has_animated_image_(false), | |
78 is_safe_format_(false) { | |
79 if (IsAnimatedImage(raw_image)) { | |
80 has_animated_image_ = true; | |
81 animated_image_ = raw_image; | |
82 if (EncodeImageSkia(image_, &raw_image_)) { | |
83 has_raw_image_ = true; | |
84 MarkAsSafe(); | |
85 } | |
86 } else { | |
87 has_raw_image_ = true; | |
88 raw_image_ = raw_image; | |
89 } | |
90 } | |
91 | |
92 UserImage::~UserImage() {} | |
93 | |
94 void UserImage::DiscardRawImage() { | |
95 RawImage().swap(raw_image_); // Clear |raw_image_|. | |
96 } | |
97 | |
98 void UserImage::MarkAsSafe() { | |
99 is_safe_format_ = true; | |
100 } | |
101 | |
102 } // namespace chromeos | |
OLD | NEW |