OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_LIST_H_ | 5 #ifndef CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_LIST_H_ |
6 #define CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_LIST_H_ | 6 #define CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_LIST_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/strings/string16.h" | 9 #include "base/strings/string16.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
11 #include "content/public/browser/desktop_media_id.h" | 11 #include "content/public/browser/desktop_media_id.h" |
12 #include "ui/gfx/image/image.h" | |
12 #include "ui/gfx/image/image_skia.h" | 13 #include "ui/gfx/image/image_skia.h" |
13 | 14 |
14 class DesktopMediaListObserver; | 15 class DesktopMediaListObserver; |
15 | 16 |
16 // DesktopMediaList provides the list of desktop media source (screens, windows, | 17 // DesktopMediaList provides the list of desktop media source (screens, windows, |
17 // tabs), and their thumbnails, to the desktop media picker dialog. It | 18 // tabs), and their thumbnails, to the desktop media picker dialog. It |
18 // transparently updates the list in the background, and notifies the desktop | 19 // transparently updates the list in the background, and notifies the desktop |
19 // media picker when something changes. | 20 // media picker when something changes. |
20 class DesktopMediaList { | 21 class DesktopMediaList { |
21 public: | 22 public: |
23 enum SourceTypes { SCREENS = 1, WINDOWS = 2, TABS = 4 }; | |
22 // Struct used to represent each entry in the list. | 24 // Struct used to represent each entry in the list. |
23 struct Source { | 25 struct Source { |
24 // Id of the source. | 26 // Id of the source. |
25 content::DesktopMediaID id; | 27 content::DesktopMediaID id; |
26 | 28 |
27 // Name of the source that should be shown to the user. | 29 // Name of the source that should be shown to the user. |
28 base::string16 name; | 30 base::string16 name; |
29 | 31 |
30 // The thumbnail for the source. | 32 // The thumbnail for the source. |
31 gfx::ImageSkia thumbnail; | 33 gfx::ImageSkia thumbnail; |
(...skipping 17 matching lines...) Expand all Loading... | |
49 | 51 |
50 // Starts updating the model. The model is initially empty, so OnSourceAdded() | 52 // Starts updating the model. The model is initially empty, so OnSourceAdded() |
51 // notifications will be generated for each existing source as it is | 53 // notifications will be generated for each existing source as it is |
52 // enumerated. After the initial enumeration the model will be refreshed based | 54 // enumerated. After the initial enumeration the model will be refreshed based |
53 // on the update period, and notifications generated only for changes in the | 55 // on the update period, and notifications generated only for changes in the |
54 // model. | 56 // model. |
55 virtual void StartUpdating(DesktopMediaListObserver* observer) = 0; | 57 virtual void StartUpdating(DesktopMediaListObserver* observer) = 0; |
56 | 58 |
57 virtual int GetSourceCount() const = 0; | 59 virtual int GetSourceCount() const = 0; |
58 virtual const Source& GetSource(int index) const = 0; | 60 virtual const Source& GetSource(int index) const = 0; |
61 | |
62 protected: | |
63 // Create a image with an enlarged favicon on its center and black boundary. | |
64 // If fails, an empty image will return. | |
65 // The function is used to create a thumbnail for chrome tab preview. | |
66 static gfx::ImageSkia CreateImageEncloseFavicon(gfx::Size size, | |
qiangchen
2015/12/07 22:45:56
Better to separate the definition from declaration
GeorgeZ
2015/12/09 19:36:37
Done.
| |
67 gfx::Image& favicon) { | |
68 // Enlarge scale for favicon. | |
69 int scale = 3; | |
qiangchen
2015/12/07 22:45:56
const?
GeorgeZ
2015/12/09 19:36:37
Done.
| |
70 // Thickness of image boundary. | |
71 int thick = 5; | |
qiangchen
2015/12/07 22:45:56
const?
GeorgeZ
2015/12/09 19:36:37
Done.
| |
72 | |
73 // Sanity check. If failed, return a empty image. | |
74 if (size.width() < favicon.Width() * scale || | |
75 size.height() < favicon.Height() * scale) | |
76 return gfx::ImageSkia(); | |
77 | |
78 // Create a SkBitmap for faviocn. | |
79 SkBitmap icon = favicon.AsBitmap(); | |
80 | |
81 // Create a bitmap. | |
82 SkBitmap result; | |
83 result.allocN32Pixels(size.width(), size.height(), true); | |
84 | |
85 // Two SkBitmaps' color type need match to merge. | |
86 if (icon.colorType() != result.colorType()) | |
87 return gfx::ImageSkia(); | |
88 | |
89 result.lockPixels(); | |
90 uint8* pixels_data = reinterpret_cast<uint8*>(result.getPixels()); | |
91 | |
92 // Set background. | |
93 int span = result.rowBytes(); | |
94 int bpp = result.bytesPerPixel(); | |
qiangchen
2015/12/07 22:45:56
Again my question, the follow code seems to assume
GeorgeZ
2015/12/09 19:36:37
result.allocN32Pixels() guarantees result image's
| |
95 for (int y = 0; y < result.height(); ++y) { | |
96 for (int x = 0; x < result.width(); ++x) { | |
97 if (y < thick || y >= result.height() - thick || x < thick || | |
98 x >= result.width() - thick) { | |
99 pixels_data[span * y + x * bpp] = 0; | |
100 pixels_data[span * y + x * bpp + 1] = 0; | |
101 pixels_data[span * y + x * bpp + 2] = 0; | |
102 } else { | |
103 pixels_data[span * y + x * bpp] = 0xff; | |
104 pixels_data[span * y + x * bpp + 1] = 0xff; | |
105 pixels_data[span * y + x * bpp + 2] = 0xff; | |
106 } | |
107 pixels_data[span * y + x * bpp + 3] = 0xff; | |
108 } | |
109 } | |
110 | |
111 // Copy enlarged favicon into center of result image. | |
112 icon.lockPixels(); | |
113 uint8* icon_data = reinterpret_cast<uint8*>(icon.getPixels()); | |
114 | |
115 int icon_span = icon.rowBytes(); | |
116 int icon_bpp = icon.bytesPerPixel(); | |
117 int offsety = (result.height() - icon.height() * scale) / 2; | |
118 int offsetx = (result.width() - icon.width() * scale) / 2; | |
119 for (int y = 0; y < icon.height() * scale; ++y) { | |
120 for (int x = 0; x < icon.width() * scale; ++x) { | |
121 pixels_data[span * (y + offsety) + (x + offsetx) * bpp] = | |
122 icon_data[icon_span * (y / scale) + (x / scale) * icon_bpp]; | |
123 pixels_data[span * (y + offsety) + (x + offsetx) * bpp + 1] = | |
124 icon_data[icon_span * (y / scale) + (x / scale) * icon_bpp + 1]; | |
125 pixels_data[span * (y + offsety) + (x + offsetx) * bpp + 2] = | |
126 icon_data[icon_span * (y / scale) + (x / scale) * icon_bpp + 2]; | |
127 } | |
128 } | |
129 icon.unlockPixels(); | |
130 result.unlockPixels(); | |
131 | |
132 // Create a skia image. | |
133 return gfx::ImageSkia::CreateFrom1xBitmap(result); | |
134 } | |
59 }; | 135 }; |
60 | 136 |
61 #endif // CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_LIST_H_ | 137 #endif // CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_LIST_H_ |
OLD | NEW |