OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 #include "chrome/browser/themes/browser_theme_pack.h" | 5 #include "chrome/browser/themes/browser_theme_pack.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/memory/ref_counted_memory.h" | 9 #include "base/memory/ref_counted_memory.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 #include "ui/gfx/skia_util.h" | 36 #include "ui/gfx/skia_util.h" |
37 | 37 |
38 using content::BrowserThread; | 38 using content::BrowserThread; |
39 using extensions::Extension; | 39 using extensions::Extension; |
40 | 40 |
41 namespace { | 41 namespace { |
42 | 42 |
43 // Version number of the current theme pack. We just throw out and rebuild | 43 // Version number of the current theme pack. We just throw out and rebuild |
44 // theme packs that aren't int-equal to this. Increment this number if you | 44 // theme packs that aren't int-equal to this. Increment this number if you |
45 // change default theme assets. | 45 // change default theme assets. |
46 const int kThemePackVersion = 31; | 46 const int kThemePackVersion = 32; |
47 | 47 |
48 // IDs that are in the DataPack won't clash with the positive integer | 48 // IDs that are in the DataPack won't clash with the positive integer |
49 // uint16. kHeaderID should always have the maximum value because we want the | 49 // uint16. kHeaderID should always have the maximum value because we want the |
50 // "header" to be written last. That way we can detect whether the pack was | 50 // "header" to be written last. That way we can detect whether the pack was |
51 // successfully written and ignore and regenerate if it was only partially | 51 // successfully written and ignore and regenerate if it was only partially |
52 // written (i.e. chrome crashed on a different thread while writing the pack). | 52 // written (i.e. chrome crashed on a different thread while writing the pack). |
53 const int kMaxID = 0x0000FFFF; // Max unsigned 16-bit int. | 53 const int kMaxID = 0x0000FFFF; // Max unsigned 16-bit int. |
54 const int kHeaderID = kMaxID - 1; | 54 const int kHeaderID = kMaxID - 1; |
55 const int kTintsID = kMaxID - 2; | 55 const int kTintsID = kMaxID - 2; |
56 const int kColorsID = kMaxID - 3; | 56 const int kColorsID = kMaxID - 3; |
57 const int kDisplayPropertiesID = kMaxID - 4; | 57 const int kDisplayPropertiesID = kMaxID - 4; |
58 const int kSourceImagesID = kMaxID - 5; | 58 const int kSourceImagesID = kMaxID - 5; |
59 const int kScaleFactorsID = kMaxID - 6; | 59 const int kScaleFactorsID = kMaxID - 6; |
60 | 60 |
61 // The sum of kFrameBorderThickness and kNonClientRestoredExtraThickness from | |
62 // OpaqueBrowserFrameView. | |
63 const int kRestoredTabVerticalOffset = 15; | |
64 | |
65 // Persistent constants for the main images that we need. These have the same | 61 // Persistent constants for the main images that we need. These have the same |
66 // names as their IDR_* counterparts but these values will always stay the | 62 // names as their IDR_* counterparts but these values will always stay the |
67 // same. | 63 // same. |
68 const int PRS_THEME_FRAME = 1; | 64 const int PRS_THEME_FRAME = 1; |
69 const int PRS_THEME_FRAME_INACTIVE = 2; | 65 const int PRS_THEME_FRAME_INACTIVE = 2; |
70 const int PRS_THEME_FRAME_INCOGNITO = 3; | 66 const int PRS_THEME_FRAME_INCOGNITO = 3; |
71 const int PRS_THEME_FRAME_INCOGNITO_INACTIVE = 4; | 67 const int PRS_THEME_FRAME_INCOGNITO_INACTIVE = 4; |
72 const int PRS_THEME_TOOLBAR = 5; | 68 const int PRS_THEME_TOOLBAR = 5; |
73 const int PRS_THEME_TAB_BACKGROUND = 6; | 69 const int PRS_THEME_TAB_BACKGROUND_OVERLAY = 6; |
74 const int PRS_THEME_TAB_BACKGROUND_INCOGNITO = 7; | 70 const int PRS_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY = 7; |
75 const int PRS_THEME_TAB_BACKGROUND_V = 8; | 71 const int PRS_THEME_TAB_BACKGROUND_V_OVERLAY = 8; |
76 const int PRS_THEME_NTP_BACKGROUND = 9; | 72 const int PRS_THEME_NTP_BACKGROUND = 9; |
77 const int PRS_THEME_FRAME_OVERLAY = 10; | 73 const int PRS_THEME_FRAME_OVERLAY = 10; |
78 const int PRS_THEME_FRAME_OVERLAY_INACTIVE = 11; | 74 const int PRS_THEME_FRAME_OVERLAY_INACTIVE = 11; |
79 const int PRS_THEME_BUTTON_BACKGROUND = 12; | 75 const int PRS_THEME_BUTTON_BACKGROUND = 12; |
80 const int PRS_THEME_NTP_ATTRIBUTION = 13; | 76 const int PRS_THEME_NTP_ATTRIBUTION = 13; |
81 const int PRS_THEME_WINDOW_CONTROL_BACKGROUND = 14; | 77 const int PRS_THEME_WINDOW_CONTROL_BACKGROUND = 14; |
| 78 const int PRS_THEME_TAB_BACKGROUND = 15; |
| 79 const int PRS_THEME_TAB_BACKGROUND_INCOGNITO = 16; |
82 | 80 |
83 struct PersistingImagesTable { | 81 struct PersistingImagesTable { |
84 // A non-changing integer ID meant to be saved in theme packs. This ID must | 82 // A non-changing integer ID meant to be saved in theme packs. This ID must |
85 // not change between versions of chrome. | 83 // not change between versions of chrome. |
86 int persistent_id; | 84 int persistent_id; |
87 | 85 |
88 // The IDR that depends on the whims of GRIT and therefore changes whenever | 86 // The IDR that depends on the whims of GRIT and therefore changes whenever |
89 // someone adds a new resource. | 87 // someone adds a new resource. |
90 int idr_id; | 88 int idr_id; |
91 | 89 |
92 // String to check for when parsing theme manifests or NULL if this isn't | 90 // String to check for when parsing theme manifests or NULL if this isn't |
93 // supposed to be changeable by the user. | 91 // supposed to be changeable by the user. |
94 const char* key; | 92 const char* key; |
95 }; | 93 }; |
96 | 94 |
97 // IDR_* resource names change whenever new resources are added; use persistent | 95 // IDR_* resource names change whenever new resources are added; use persistent |
98 // IDs when storing to a cached pack. | 96 // IDs when storing to a cached pack. |
99 PersistingImagesTable kPersistingImages[] = { | 97 PersistingImagesTable kPersistingImages[] = { |
100 { PRS_THEME_FRAME, IDR_THEME_FRAME, | 98 { PRS_THEME_FRAME, IDR_THEME_FRAME, |
101 "theme_frame" }, | 99 "theme_frame" }, |
102 { PRS_THEME_FRAME_INACTIVE, IDR_THEME_FRAME_INACTIVE, | 100 { PRS_THEME_FRAME_INACTIVE, IDR_THEME_FRAME_INACTIVE, |
103 "theme_frame_inactive" }, | 101 "theme_frame_inactive" }, |
104 { PRS_THEME_FRAME_INCOGNITO, IDR_THEME_FRAME_INCOGNITO, | 102 { PRS_THEME_FRAME_INCOGNITO, IDR_THEME_FRAME_INCOGNITO, |
105 "theme_frame_incognito" }, | 103 "theme_frame_incognito" }, |
106 { PRS_THEME_FRAME_INCOGNITO_INACTIVE, IDR_THEME_FRAME_INCOGNITO_INACTIVE, | 104 { PRS_THEME_FRAME_INCOGNITO_INACTIVE, IDR_THEME_FRAME_INCOGNITO_INACTIVE, |
107 "theme_frame_incognito_inactive" }, | 105 "theme_frame_incognito_inactive" }, |
108 { PRS_THEME_TOOLBAR, IDR_THEME_TOOLBAR, | 106 { PRS_THEME_TOOLBAR, IDR_THEME_TOOLBAR, |
109 "theme_toolbar" }, | 107 "theme_toolbar" }, |
110 { PRS_THEME_TAB_BACKGROUND, IDR_THEME_TAB_BACKGROUND, | 108 { PRS_THEME_TAB_BACKGROUND_OVERLAY, IDR_THEME_TAB_BACKGROUND_OVERLAY, |
111 "theme_tab_background" }, | 109 "theme_tab_background" }, |
112 { PRS_THEME_TAB_BACKGROUND_INCOGNITO, IDR_THEME_TAB_BACKGROUND_INCOGNITO, | 110 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY, |
| 111 IDR_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY, |
113 "theme_tab_background_incognito" }, | 112 "theme_tab_background_incognito" }, |
114 { PRS_THEME_TAB_BACKGROUND_V, IDR_THEME_TAB_BACKGROUND_V, | 113 { PRS_THEME_TAB_BACKGROUND_V_OVERLAY, IDR_THEME_TAB_BACKGROUND_V_OVERLAY, |
115 "theme_tab_background_v"}, | 114 "theme_tab_background_v"}, |
116 { PRS_THEME_NTP_BACKGROUND, IDR_THEME_NTP_BACKGROUND, | 115 { PRS_THEME_NTP_BACKGROUND, IDR_THEME_NTP_BACKGROUND, |
117 "theme_ntp_background" }, | 116 "theme_ntp_background" }, |
118 { PRS_THEME_FRAME_OVERLAY, IDR_THEME_FRAME_OVERLAY, | 117 { PRS_THEME_FRAME_OVERLAY, IDR_THEME_FRAME_OVERLAY, |
119 "theme_frame_overlay" }, | 118 "theme_frame_overlay" }, |
120 { PRS_THEME_FRAME_OVERLAY_INACTIVE, IDR_THEME_FRAME_OVERLAY_INACTIVE, | 119 { PRS_THEME_FRAME_OVERLAY_INACTIVE, IDR_THEME_FRAME_OVERLAY_INACTIVE, |
121 "theme_frame_overlay_inactive" }, | 120 "theme_frame_overlay_inactive" }, |
122 { PRS_THEME_BUTTON_BACKGROUND, IDR_THEME_BUTTON_BACKGROUND, | 121 { PRS_THEME_BUTTON_BACKGROUND, IDR_THEME_BUTTON_BACKGROUND, |
123 "theme_button_background" }, | 122 "theme_button_background" }, |
124 { PRS_THEME_NTP_ATTRIBUTION, IDR_THEME_NTP_ATTRIBUTION, | 123 { PRS_THEME_NTP_ATTRIBUTION, IDR_THEME_NTP_ATTRIBUTION, |
125 "theme_ntp_attribution" }, | 124 "theme_ntp_attribution" }, |
126 { PRS_THEME_WINDOW_CONTROL_BACKGROUND, IDR_THEME_WINDOW_CONTROL_BACKGROUND, | 125 { PRS_THEME_WINDOW_CONTROL_BACKGROUND, IDR_THEME_WINDOW_CONTROL_BACKGROUND, |
127 "theme_window_control_background"}, | 126 "theme_window_control_background"}, |
128 | 127 |
129 // The rest of these entries have no key because they can't be overridden | 128 // The rest of these entries have no key because they can't be overridden |
130 // from the json manifest. | 129 // from the json manifest. |
131 { 15, IDR_BACK, NULL }, | 130 { PRS_THEME_TAB_BACKGROUND, IDR_THEME_TAB_BACKGROUND, NULL }, |
132 { 16, IDR_BACK_D, NULL }, | 131 { PRS_THEME_TAB_BACKGROUND_INCOGNITO, |
133 { 17, IDR_BACK_H, NULL }, | 132 IDR_THEME_TAB_BACKGROUND_INCOGNITO, NULL }, |
134 { 18, IDR_BACK_P, NULL }, | 133 { 17, IDR_BACK, NULL }, |
135 { 19, IDR_FORWARD, NULL }, | 134 { 18, IDR_BACK_D, NULL }, |
136 { 20, IDR_FORWARD_D, NULL }, | 135 { 19, IDR_BACK_H, NULL }, |
137 { 21, IDR_FORWARD_H, NULL }, | 136 { 20, IDR_BACK_P, NULL }, |
138 { 22, IDR_FORWARD_P, NULL }, | 137 { 21, IDR_FORWARD, NULL }, |
139 { 23, IDR_HOME, NULL }, | 138 { 22, IDR_FORWARD_D, NULL }, |
140 { 24, IDR_HOME_H, NULL }, | 139 { 23, IDR_FORWARD_H, NULL }, |
141 { 25, IDR_HOME_P, NULL }, | 140 { 24, IDR_FORWARD_P, NULL }, |
142 { 26, IDR_RELOAD, NULL }, | 141 { 25, IDR_HOME, NULL }, |
143 { 27, IDR_RELOAD_H, NULL }, | 142 { 26, IDR_HOME_H, NULL }, |
144 { 28, IDR_RELOAD_P, NULL }, | 143 { 27, IDR_HOME_P, NULL }, |
145 { 29, IDR_STOP, NULL }, | 144 { 28, IDR_RELOAD, NULL }, |
146 { 30, IDR_STOP_D, NULL }, | 145 { 29, IDR_RELOAD_H, NULL }, |
147 { 31, IDR_STOP_H, NULL }, | 146 { 30, IDR_RELOAD_P, NULL }, |
148 { 32, IDR_STOP_P, NULL }, | 147 { 31, IDR_STOP, NULL }, |
149 { 33, IDR_BROWSER_ACTIONS_OVERFLOW, NULL }, | 148 { 32, IDR_STOP_D, NULL }, |
150 { 34, IDR_BROWSER_ACTIONS_OVERFLOW_H, NULL }, | 149 { 33, IDR_STOP_H, NULL }, |
151 { 35, IDR_BROWSER_ACTIONS_OVERFLOW_P, NULL }, | 150 { 34, IDR_STOP_P, NULL }, |
152 { 36, IDR_TOOLS, NULL }, | 151 { 35, IDR_BROWSER_ACTIONS_OVERFLOW, NULL }, |
153 { 37, IDR_TOOLS_H, NULL }, | 152 { 36, IDR_BROWSER_ACTIONS_OVERFLOW_H, NULL }, |
154 { 38, IDR_TOOLS_P, NULL }, | 153 { 37, IDR_BROWSER_ACTIONS_OVERFLOW_P, NULL }, |
155 { 39, IDR_MENU_DROPARROW, NULL }, | 154 { 38, IDR_TOOLS, NULL }, |
156 { 40, IDR_THROBBER, NULL }, | 155 { 39, IDR_TOOLS_H, NULL }, |
157 { 41, IDR_THROBBER_WAITING, NULL }, | 156 { 40, IDR_TOOLS_P, NULL }, |
158 { 42, IDR_THROBBER_LIGHT, NULL }, | 157 { 41, IDR_MENU_DROPARROW, NULL }, |
159 { 43, IDR_TOOLBAR_BEZEL_HOVER, NULL }, | 158 { 42, IDR_THROBBER, NULL }, |
160 { 44, IDR_TOOLBAR_BEZEL_PRESSED, NULL }, | 159 { 43, IDR_THROBBER_WAITING, NULL }, |
161 { 45, IDR_TOOLS_BAR, NULL }, | 160 { 44, IDR_THROBBER_LIGHT, NULL }, |
| 161 { 45, IDR_TOOLBAR_BEZEL_HOVER, NULL }, |
| 162 { 46, IDR_TOOLBAR_BEZEL_PRESSED, NULL }, |
| 163 { 47, IDR_TOOLS_BAR, NULL }, |
162 }; | 164 }; |
163 const size_t kPersistingImagesLength = arraysize(kPersistingImages); | 165 const size_t kPersistingImagesLength = arraysize(kPersistingImages); |
164 | 166 |
165 #if defined(OS_WIN) && defined(USE_AURA) | 167 #if defined(OS_WIN) && defined(USE_AURA) |
166 // Persistent theme ids for Windows AURA. | 168 // Persistent theme ids for Windows AURA. |
167 const int PRS_THEME_FRAME_WIN = 100; | 169 const int PRS_THEME_FRAME_WIN = 100; |
168 const int PRS_THEME_FRAME_INACTIVE_WIN = 101; | 170 const int PRS_THEME_FRAME_INACTIVE_WIN = 101; |
169 const int PRS_THEME_FRAME_INCOGNITO_WIN = 102; | 171 const int PRS_THEME_FRAME_INCOGNITO_WIN = 102; |
170 const int PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN = 103; | 172 const int PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN = 103; |
171 const int PRS_THEME_TOOLBAR_WIN = 104; | 173 const int PRS_THEME_TOOLBAR_WIN = 104; |
172 const int PRS_THEME_TAB_BACKGROUND_WIN = 105; | 174 const int PRS_THEME_TAB_BACKGROUND_OVERLAY_WIN = 105; |
173 const int PRS_THEME_TAB_BACKGROUND_INCOGNITO_WIN = 106; | 175 const int PRS_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY_WIN = 106; |
| 176 const int PRS_THEME_TAB_BACKGROUND_WIN = 107; |
| 177 const int PRS_THEME_TAB_BACKGROUND_INCOGNITO_WIN = 108; |
174 | 178 |
175 // Persistent theme to resource id mapping for Windows AURA. | 179 // Persistent theme to resource id mapping for Windows AURA. |
176 PersistingImagesTable kPersistingImagesWinDesktopAura[] = { | 180 PersistingImagesTable kPersistingImagesWinDesktopAura[] = { |
177 { PRS_THEME_FRAME_WIN, IDR_THEME_FRAME_WIN, | 181 { PRS_THEME_FRAME_WIN, IDR_THEME_FRAME_WIN, |
178 "theme_frame" }, | 182 "theme_frame" }, |
179 { PRS_THEME_FRAME_INACTIVE_WIN, IDR_THEME_FRAME_INACTIVE_WIN, | 183 { PRS_THEME_FRAME_INACTIVE_WIN, IDR_THEME_FRAME_INACTIVE_WIN, |
180 "theme_frame_inactive" }, | 184 "theme_frame_inactive" }, |
181 { PRS_THEME_FRAME_INCOGNITO_WIN, IDR_THEME_FRAME_INCOGNITO_WIN, | 185 { PRS_THEME_FRAME_INCOGNITO_WIN, IDR_THEME_FRAME_INCOGNITO_WIN, |
182 "theme_frame_incognito" }, | 186 "theme_frame_incognito" }, |
183 { PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN, | 187 { PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN, |
184 IDR_THEME_FRAME_INCOGNITO_INACTIVE_WIN, | 188 IDR_THEME_FRAME_INCOGNITO_INACTIVE_WIN, |
185 "theme_frame_incognito_inactive" }, | 189 "theme_frame_incognito_inactive" }, |
186 { PRS_THEME_TOOLBAR_WIN, IDR_THEME_TOOLBAR_WIN, | 190 { PRS_THEME_TOOLBAR_WIN, IDR_THEME_TOOLBAR_WIN, |
187 "theme_toolbar" }, | 191 "theme_toolbar" }, |
188 { PRS_THEME_TAB_BACKGROUND_WIN, IDR_THEME_TAB_BACKGROUND_WIN, | 192 { PRS_THEME_TAB_BACKGROUND_OVERLAY_WIN, IDR_THEME_TAB_BACKGROUND_OVERLAY_WIN, |
189 "theme_tab_background" }, | 193 "theme_tab_background" }, |
190 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_WIN, | 194 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY_WIN, |
191 IDR_THEME_TAB_BACKGROUND_INCOGNITO_WIN, | 195 IDR_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY_WIN, |
192 "theme_tab_background_incognito" }, | 196 "theme_tab_background_incognito" }, |
193 }; | 197 }; |
194 const size_t kPersistingImagesWinDesktopAuraLength = | 198 const size_t kPersistingImagesWinDesktopAuraLength = |
195 arraysize(kPersistingImagesWinDesktopAura); | 199 arraysize(kPersistingImagesWinDesktopAura); |
196 #endif | 200 #endif |
197 | 201 |
198 int GetPersistentIDByNameHelper(const std::string& key, | 202 int GetPersistentIDByNameHelper(const std::string& key, |
199 const PersistingImagesTable* image_table, | 203 const PersistingImagesTable* image_table, |
200 size_t image_table_size) { | 204 size_t image_table_size) { |
201 for (size_t i = 0; i < image_table_size; ++i) { | 205 for (size_t i = 0; i < image_table_size; ++i) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, | 347 ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, |
344 #if defined(OS_WIN) && defined(USE_AURA) | 348 #if defined(OS_WIN) && defined(USE_AURA) |
345 { PRS_THEME_FRAME_WIN, ThemeProperties::TINT_FRAME }, | 349 { PRS_THEME_FRAME_WIN, ThemeProperties::TINT_FRAME }, |
346 { PRS_THEME_FRAME_INACTIVE_WIN, ThemeProperties::TINT_FRAME_INACTIVE }, | 350 { PRS_THEME_FRAME_INACTIVE_WIN, ThemeProperties::TINT_FRAME_INACTIVE }, |
347 { PRS_THEME_FRAME_INCOGNITO_WIN, ThemeProperties::TINT_FRAME_INCOGNITO }, | 351 { PRS_THEME_FRAME_INCOGNITO_WIN, ThemeProperties::TINT_FRAME_INCOGNITO }, |
348 { PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN, | 352 { PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN, |
349 ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, | 353 ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, |
350 #endif | 354 #endif |
351 }; | 355 }; |
352 | 356 |
353 // Mapping used in GenerateTabBackgroundImages() to associate what frame image | 357 // Mapping used in CreateTabBackgroundImages() to associate what frame image |
354 // goes with which tab background. | 358 // goes with which tab background. |
355 IntToIntTable kTabBackgroundMap[] = { | 359 IntToIntTable kTabBackgroundMap[] = { |
356 { PRS_THEME_TAB_BACKGROUND, PRS_THEME_FRAME }, | 360 { PRS_THEME_TAB_BACKGROUND, PRS_THEME_FRAME }, |
357 { PRS_THEME_TAB_BACKGROUND_INCOGNITO, PRS_THEME_FRAME_INCOGNITO }, | 361 { PRS_THEME_TAB_BACKGROUND_INCOGNITO, PRS_THEME_FRAME_INCOGNITO }, |
358 #if defined(OS_WIN) && defined(USE_AURA) | 362 #if defined(OS_WIN) && defined(USE_AURA) |
359 { PRS_THEME_TAB_BACKGROUND_WIN, PRS_THEME_FRAME_WIN }, | 363 { PRS_THEME_TAB_BACKGROUND_WIN, PRS_THEME_FRAME_WIN }, |
360 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_WIN, PRS_THEME_FRAME_INCOGNITO_WIN }, | 364 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_WIN, PRS_THEME_FRAME_INCOGNITO_WIN }, |
361 #endif | 365 #endif |
362 }; | 366 }; |
363 | 367 |
364 struct CropEntry { | 368 struct CropEntry { |
365 int prs_id; | 369 int prs_id; |
366 | 370 |
367 // The maximum useful height of the image at |prs_id|. | 371 // The maximum useful height of the image at |prs_id|. |
368 int max_height; | 372 int max_height; |
369 | 373 |
370 // Whether cropping the image at |prs_id| should be skipped on OSes which | 374 // Whether cropping the image at |prs_id| should be skipped on OSes which |
371 // have a frame border to the left and right of the web contents. | 375 // have a frame border to the left and right of the web contents. |
372 // This should be true for images which can be used to decorate the border to | 376 // This should be true for images which can be used to decorate the border to |
373 // the left and the right of the web contents. | 377 // the left and the right of the web contents. |
374 bool skip_if_frame_border; | 378 bool skip_if_frame_border; |
375 }; | 379 }; |
376 | 380 |
377 // The images which should be cropped before being saved to the data pack. The | 381 // The images which should be cropped before being saved to the data pack. The |
378 // maximum heights are meant to be conservative as to give room for the UI to | 382 // maximum heights are meant to be conservative as to give room for the UI to |
379 // change without the maximum heights having to be modified. | 383 // change without the maximum heights having to be modified. |
380 // |kThemePackVersion| must be incremented if any of the maximum heights below | 384 // |kThemePackVersion| must be incremented if any of the maximum heights below |
381 // are modified. | 385 // are modified. |
382 struct CropEntry kImagesToCrop[] = { | 386 CropEntry kImagesToCrop[] = { |
383 { PRS_THEME_FRAME, 120, true }, | 387 { PRS_THEME_FRAME, 120, true }, |
384 { PRS_THEME_FRAME_INACTIVE, 120, true }, | 388 { PRS_THEME_FRAME_INACTIVE, 120, true }, |
385 { PRS_THEME_FRAME_INCOGNITO, 120, true }, | 389 { PRS_THEME_FRAME_INCOGNITO, 120, true }, |
386 { PRS_THEME_FRAME_INCOGNITO_INACTIVE, 120, true }, | 390 { PRS_THEME_FRAME_INCOGNITO_INACTIVE, 120, true }, |
387 { PRS_THEME_FRAME_OVERLAY, 120, true }, | 391 { PRS_THEME_FRAME_OVERLAY, 120, true }, |
388 { PRS_THEME_FRAME_OVERLAY_INACTIVE, 120, true }, | 392 { PRS_THEME_FRAME_OVERLAY_INACTIVE, 120, true }, |
389 { PRS_THEME_TOOLBAR, 200, false }, | 393 { PRS_THEME_TOOLBAR, 200, false }, |
| 394 { PRS_THEME_TAB_BACKGROUND_OVERLAY, 80, false }, |
| 395 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY, 80, false }, |
| 396 { PRS_THEME_TAB_BACKGROUND_V_OVERLAY, 80, false }, |
| 397 { PRS_THEME_TAB_BACKGROUND, 120, false }, |
| 398 { PRS_THEME_TAB_BACKGROUND_INCOGNITO, 120, false }, |
390 { PRS_THEME_BUTTON_BACKGROUND, 60, false }, | 399 { PRS_THEME_BUTTON_BACKGROUND, 60, false }, |
391 { PRS_THEME_WINDOW_CONTROL_BACKGROUND, 50, false }, | 400 { PRS_THEME_WINDOW_CONTROL_BACKGROUND, 50, false }, |
392 #if defined(OS_WIN) && defined(USE_AURA) | 401 #if defined(OS_WIN) && defined(USE_AURA) |
393 { PRS_THEME_TOOLBAR_WIN, 200, false } | 402 { PRS_THEME_TOOLBAR_WIN, 200, false }, |
| 403 { PRS_THEME_TAB_BACKGROUND_OVERLAY_WIN, 80, false }, |
| 404 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_OVERLAY_WIN, 80, false }, |
| 405 { PRS_THEME_TAB_BACKGROUND_WIN, 120, false }, |
| 406 { PRS_THEME_TAB_BACKGROUND_INCOGNITO_WIN, 120, false } |
394 #endif | 407 #endif |
395 }; | 408 }; |
396 | 409 |
397 | |
398 // A list of images that don't need tinting or any other modification and can | 410 // A list of images that don't need tinting or any other modification and can |
399 // be byte-copied directly into the finished DataPack. This should contain the | 411 // be byte-copied directly into the finished DataPack. This should contain the |
400 // persistent IDs for all themeable image IDs that aren't in kFrameTintMap, | 412 // persistent IDs for all themeable image IDs that aren't in kFrameTintMap, |
401 // kTabBackgroundMap or kImagesToCrop. | 413 // kTabBackgroundMap or kImagesToCrop. |
402 const int kPreloadIDs[] = { | 414 const int kPreloadIDs[] = { |
403 PRS_THEME_NTP_BACKGROUND, | 415 PRS_THEME_NTP_BACKGROUND, |
404 PRS_THEME_NTP_ATTRIBUTION, | 416 PRS_THEME_NTP_ATTRIBUTION, |
405 }; | 417 }; |
406 | 418 |
407 // Returns true if this OS uses a browser frame which has a non zero width to | 419 // Returns true if this OS uses a browser frame which has a non zero width to |
(...skipping 20 matching lines...) Expand all Loading... |
428 char* data = reinterpret_cast<char*>(&(raw_data.front())); | 440 char* data = reinterpret_cast<char*>(&(raw_data.front())); |
429 if (file.ReadUntilComplete(data, size) == avail) | 441 if (file.ReadUntilComplete(data, size) == avail) |
430 return base::RefCountedBytes::TakeVector(&raw_data); | 442 return base::RefCountedBytes::TakeVector(&raw_data); |
431 } | 443 } |
432 } | 444 } |
433 } | 445 } |
434 | 446 |
435 return NULL; | 447 return NULL; |
436 } | 448 } |
437 | 449 |
438 // Shifts an image's HSL values. The caller is responsible for deleting | 450 // Returns an image which is cropped based on the maximum height for |
439 // the returned image. | 451 // |destination_prs_id|. This method is a no-op if there is no |
440 gfx::Image CreateHSLShiftedImage(const gfx::Image& image, | 452 // cropping is necessary. |
441 const color_utils::HSL& hsl_shift) { | 453 gfx::Image CreateCroppedImage(const gfx::Image& source_image, |
442 const gfx::ImageSkia* src_image = image.ToImageSkia(); | 454 int destination_prs_id) { |
| 455 bool has_frame_border = HasFrameBorder(); |
| 456 for (size_t i = 0; i < arraysize(kImagesToCrop); ++i) { |
| 457 if (has_frame_border && kImagesToCrop[i].skip_if_frame_border) |
| 458 continue; |
| 459 |
| 460 if (kImagesToCrop[i].prs_id != destination_prs_id) |
| 461 continue; |
| 462 |
| 463 int crop_height = kImagesToCrop[i].max_height; |
| 464 gfx::ImageSkia image_skia = source_image.AsImageSkia(); |
| 465 return gfx::Image(gfx::ImageSkiaOperations::ExtractSubset( |
| 466 image_skia, gfx::Rect(0, 0, image_skia.width(), crop_height))); |
| 467 } |
| 468 return source_image; |
| 469 } |
| 470 |
| 471 // Retuns an image which is cropped based on the maximum height for |
| 472 // |destination_prs_id| and which is shifted by |hsl_shift|. |
| 473 gfx::Image CreateHSLShiftedAndCroppedImage(const gfx::Image& image, |
| 474 const color_utils::HSL& hsl_shift, |
| 475 int destination_prs_id) { |
| 476 gfx::Image cropped = CreateCroppedImage(image, destination_prs_id); |
443 return gfx::Image(gfx::ImageSkiaOperations::CreateHSLShiftedImage( | 477 return gfx::Image(gfx::ImageSkiaOperations::CreateHSLShiftedImage( |
444 *src_image, hsl_shift)); | 478 cropped.AsImageSkia(), hsl_shift)); |
445 } | 479 } |
446 | 480 |
447 // Computes a bitmap at one scale from a bitmap at a different scale. | 481 // Computes a bitmap at one scale from a bitmap at a different scale. |
448 SkBitmap CreateLowQualityResizedBitmap(const SkBitmap& source_bitmap, | 482 SkBitmap CreateLowQualityResizedBitmap(const SkBitmap& source_bitmap, |
449 ui::ScaleFactor source_scale_factor, | 483 ui::ScaleFactor source_scale_factor, |
450 ui::ScaleFactor desired_scale_factor) { | 484 ui::ScaleFactor desired_scale_factor) { |
451 gfx::Size scaled_size = gfx::ToCeiledSize( | 485 gfx::Size scaled_size = gfx::ToCeiledSize( |
452 gfx::ScaleSize(gfx::Size(source_bitmap.width(), | 486 gfx::ScaleSize(gfx::Size(source_bitmap.width(), |
453 source_bitmap.height()), | 487 source_bitmap.height()), |
454 ui::GetScaleFactorScale(desired_scale_factor) / | 488 ui::GetScaleFactorScale(desired_scale_factor) / |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 } | 608 } |
575 | 609 |
576 PngMap png_map_; | 610 PngMap png_map_; |
577 | 611 |
578 typedef std::map<ui::ScaleFactor, SkBitmap> BitmapMap; | 612 typedef std::map<ui::ScaleFactor, SkBitmap> BitmapMap; |
579 BitmapMap bitmap_map_; | 613 BitmapMap bitmap_map_; |
580 | 614 |
581 DISALLOW_COPY_AND_ASSIGN(ThemeImagePngSource); | 615 DISALLOW_COPY_AND_ASSIGN(ThemeImagePngSource); |
582 }; | 616 }; |
583 | 617 |
584 class TabBackgroundImageSource: public gfx::CanvasImageSource { | |
585 public: | |
586 TabBackgroundImageSource(const gfx::ImageSkia& image_to_tint, | |
587 const gfx::ImageSkia& overlay, | |
588 const color_utils::HSL& hsl_shift, | |
589 int vertical_offset) | |
590 : gfx::CanvasImageSource(image_to_tint.size(), false), | |
591 image_to_tint_(image_to_tint), | |
592 overlay_(overlay), | |
593 hsl_shift_(hsl_shift), | |
594 vertical_offset_(vertical_offset) { | |
595 } | |
596 | |
597 virtual ~TabBackgroundImageSource() { | |
598 } | |
599 | |
600 // Overridden from CanvasImageSource: | |
601 virtual void Draw(gfx::Canvas* canvas) OVERRIDE { | |
602 gfx::ImageSkia bg_tint = | |
603 gfx::ImageSkiaOperations::CreateHSLShiftedImage(image_to_tint_, | |
604 hsl_shift_); | |
605 canvas->TileImageInt(bg_tint, 0, vertical_offset_, 0, 0, | |
606 size().width(), size().height()); | |
607 | |
608 // If they've provided a custom image, overlay it. | |
609 if (!overlay_.isNull()) { | |
610 canvas->TileImageInt(overlay_, 0, 0, size().width(), | |
611 overlay_.height()); | |
612 } | |
613 } | |
614 | |
615 private: | |
616 const gfx::ImageSkia image_to_tint_; | |
617 const gfx::ImageSkia overlay_; | |
618 const color_utils::HSL hsl_shift_; | |
619 const int vertical_offset_; | |
620 | |
621 DISALLOW_COPY_AND_ASSIGN(TabBackgroundImageSource); | |
622 }; | |
623 | |
624 } // namespace | 618 } // namespace |
625 | 619 |
626 BrowserThemePack::~BrowserThemePack() { | 620 BrowserThemePack::~BrowserThemePack() { |
627 if (!data_pack_.get()) { | 621 if (!data_pack_.get()) { |
628 delete header_; | 622 delete header_; |
629 delete [] tints_; | 623 delete [] tints_; |
630 delete [] colors_; | 624 delete [] colors_; |
631 delete [] display_properties_; | 625 delete [] display_properties_; |
632 delete [] source_images_; | 626 delete [] source_images_; |
633 } | 627 } |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 } | 1293 } |
1300 | 1294 |
1301 void BrowserThemePack::CreateImages(ImageCache* images) const { | 1295 void BrowserThemePack::CreateImages(ImageCache* images) const { |
1302 CropImages(images); | 1296 CropImages(images); |
1303 CreateFrameImages(images); | 1297 CreateFrameImages(images); |
1304 CreateTintedButtons(GetTintInternal(ThemeProperties::TINT_BUTTONS), images); | 1298 CreateTintedButtons(GetTintInternal(ThemeProperties::TINT_BUTTONS), images); |
1305 CreateTabBackgroundImages(images); | 1299 CreateTabBackgroundImages(images); |
1306 } | 1300 } |
1307 | 1301 |
1308 void BrowserThemePack::CropImages(ImageCache* images) const { | 1302 void BrowserThemePack::CropImages(ImageCache* images) const { |
1309 bool has_frame_border = HasFrameBorder(); | 1303 ImageCache temp_output; |
1310 for (size_t i = 0; i < arraysize(kImagesToCrop); ++i) { | 1304 for (ImageCache::const_iterator it = images->begin(); |
1311 if (has_frame_border && kImagesToCrop[i].skip_if_frame_border) | 1305 it != images->end(); ++it) { |
1312 continue; | 1306 temp_output[it->first] = CreateCroppedImage(it->second, it->first); |
1313 | |
1314 int prs_id = kImagesToCrop[i].prs_id; | |
1315 ImageCache::iterator it = images->find(prs_id); | |
1316 if (it == images->end()) | |
1317 continue; | |
1318 | |
1319 int crop_height = kImagesToCrop[i].max_height; | |
1320 gfx::ImageSkia image_skia = it->second.AsImageSkia(); | |
1321 (*images)[prs_id] = gfx::Image(gfx::ImageSkiaOperations::ExtractSubset( | |
1322 image_skia, gfx::Rect(0, 0, image_skia.width(), crop_height))); | |
1323 } | 1307 } |
| 1308 MergeImageCaches(temp_output, images); |
1324 } | 1309 } |
1325 | 1310 |
1326 void BrowserThemePack::CreateFrameImages(ImageCache* images) const { | 1311 void BrowserThemePack::CreateFrameImages(ImageCache* images) const { |
1327 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 1312 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
1328 | 1313 |
1329 // Create all the output images in a separate cache and move them back into | 1314 // Create all the output images in a separate cache and move them back into |
1330 // the input images because there can be name collisions. | 1315 // the input images because there can be name collisions. |
1331 ImageCache temp_output; | 1316 ImageCache temp_output; |
1332 | 1317 |
1333 for (size_t i = 0; i < arraysize(kFrameTintMap); ++i) { | 1318 for (size_t i = 0; i < arraysize(kFrameTintMap); ++i) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1384 // the default frame. | 1369 // the default frame. |
1385 frame = rb.GetImageNamed(IDR_THEME_FRAME); | 1370 frame = rb.GetImageNamed(IDR_THEME_FRAME); |
1386 #if defined(OS_WIN) && defined(USE_AURA) | 1371 #if defined(OS_WIN) && defined(USE_AURA) |
1387 if (prs_id >= PRS_THEME_FRAME_WIN && | 1372 if (prs_id >= PRS_THEME_FRAME_WIN && |
1388 prs_id <= PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN) { | 1373 prs_id <= PRS_THEME_FRAME_INCOGNITO_INACTIVE_WIN) { |
1389 frame = rb.GetImageNamed(IDR_THEME_FRAME_WIN); | 1374 frame = rb.GetImageNamed(IDR_THEME_FRAME_WIN); |
1390 } | 1375 } |
1391 #endif | 1376 #endif |
1392 } | 1377 } |
1393 if (!frame.IsEmpty()) { | 1378 if (!frame.IsEmpty()) { |
1394 temp_output[prs_id] = CreateHSLShiftedImage( | 1379 temp_output[prs_id] = CreateHSLShiftedAndCroppedImage( |
1395 frame, GetTintInternal(kFrameTintMap[i].value)); | 1380 frame, GetTintInternal(kFrameTintMap[i].value), prs_id); |
1396 } | 1381 } |
1397 } | 1382 } |
1398 MergeImageCaches(temp_output, images); | 1383 MergeImageCaches(temp_output, images); |
1399 } | 1384 } |
1400 | 1385 |
1401 void BrowserThemePack::CreateTintedButtons( | 1386 void BrowserThemePack::CreateTintedButtons( |
1402 const color_utils::HSL& button_tint, | 1387 const color_utils::HSL& button_tint, |
1403 ImageCache* processed_images) const { | 1388 ImageCache* processed_images) const { |
1404 if (button_tint.h != -1 || button_tint.s != -1 || button_tint.l != -1) { | 1389 if (button_tint.h != -1 || button_tint.s != -1 || button_tint.l != -1) { |
1405 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 1390 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
1406 const std::set<int>& idr_ids = | 1391 const std::set<int>& idr_ids = |
1407 ThemeProperties::GetTintableToolbarButtons(); | 1392 ThemeProperties::GetTintableToolbarButtons(); |
1408 for (std::set<int>::const_iterator it = idr_ids.begin(); | 1393 for (std::set<int>::const_iterator it = idr_ids.begin(); |
1409 it != idr_ids.end(); ++it) { | 1394 it != idr_ids.end(); ++it) { |
1410 int prs_id = GetPersistentIDByIDR(*it); | 1395 int prs_id = GetPersistentIDByIDR(*it); |
1411 DCHECK(prs_id > 0); | 1396 DCHECK(prs_id > 0); |
1412 | 1397 |
1413 // Fetch the image by IDR... | 1398 // Fetch the image by IDR... |
1414 gfx::Image& button = rb.GetImageNamed(*it); | 1399 gfx::Image& button = rb.GetImageNamed(*it); |
1415 | 1400 |
1416 // but save a version with the persistent ID. | 1401 // but save a version with the persistent ID. |
1417 (*processed_images)[prs_id] = | 1402 (*processed_images)[prs_id] = |
1418 CreateHSLShiftedImage(button, button_tint); | 1403 CreateHSLShiftedAndCroppedImage(button, button_tint, prs_id); |
1419 } | 1404 } |
1420 } | 1405 } |
1421 } | 1406 } |
1422 | 1407 |
1423 void BrowserThemePack::CreateTabBackgroundImages(ImageCache* images) const { | 1408 void BrowserThemePack::CreateTabBackgroundImages(ImageCache* images) const { |
1424 ImageCache temp_output; | 1409 ImageCache temp_output; |
1425 for (size_t i = 0; i < arraysize(kTabBackgroundMap); ++i) { | 1410 for (size_t i = 0; i < arraysize(kTabBackgroundMap); ++i) { |
1426 int prs_id = kTabBackgroundMap[i].key; | 1411 int prs_frame_id = kTabBackgroundMap[i].value; |
1427 int prs_base_id = kTabBackgroundMap[i].value; | 1412 ImageCache::const_iterator frame_it = images->find(prs_frame_id); |
| 1413 if (frame_it == images->end()) { |
| 1414 // There is no image to tint. |
| 1415 continue; |
| 1416 } |
1428 | 1417 |
1429 // We only need to generate the background tab images if we were provided | 1418 int prs_dest_id = kTabBackgroundMap[i].key; |
1430 // with a PRS_THEME_FRAME. | 1419 color_utils::HSL tint = GetTintInternal( |
1431 ImageCache::const_iterator it = images->find(prs_base_id); | 1420 ThemeProperties::TINT_BACKGROUND_TAB); |
1432 if (it != images->end()) { | 1421 temp_output[prs_dest_id] = CreateHSLShiftedAndCroppedImage( |
1433 gfx::ImageSkia image_to_tint = (it->second).AsImageSkia(); | 1422 frame_it->second, tint, prs_dest_id); |
1434 color_utils::HSL hsl_shift = GetTintInternal( | |
1435 ThemeProperties::TINT_BACKGROUND_TAB); | |
1436 int vertical_offset = images->count(prs_id) | |
1437 ? kRestoredTabVerticalOffset : 0; | |
1438 | |
1439 gfx::ImageSkia overlay; | |
1440 ImageCache::const_iterator overlay_it = images->find(prs_id); | |
1441 if (overlay_it != images->end()) | |
1442 overlay = overlay_it->second.AsImageSkia(); | |
1443 | |
1444 gfx::ImageSkiaSource* source = new TabBackgroundImageSource( | |
1445 image_to_tint, overlay, hsl_shift, vertical_offset); | |
1446 // ImageSkia takes ownership of |source|. | |
1447 temp_output[prs_id] = gfx::Image(gfx::ImageSkia(source, | |
1448 image_to_tint.size())); | |
1449 } | |
1450 } | 1423 } |
1451 MergeImageCaches(temp_output, images); | 1424 MergeImageCaches(temp_output, images); |
1452 } | 1425 } |
1453 | 1426 |
1454 void BrowserThemePack::RepackImages(const ImageCache& images, | 1427 void BrowserThemePack::RepackImages(const ImageCache& images, |
1455 RawImages* reencoded_images) const { | 1428 RawImages* reencoded_images) const { |
1456 typedef std::vector<ui::ScaleFactor> ScaleFactors; | 1429 typedef std::vector<ui::ScaleFactor> ScaleFactors; |
1457 for (ImageCache::const_iterator it = images.begin(); | 1430 for (ImageCache::const_iterator it = images.begin(); |
1458 it != images.end(); ++it) { | 1431 it != images.end(); ++it) { |
1459 gfx::ImageSkia image_skia = *it->second.ToImageSkia(); | 1432 gfx::ImageSkia image_skia = *it->second.ToImageSkia(); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1604 false, | 1577 false, |
1605 &bitmap_data)) { | 1578 &bitmap_data)) { |
1606 NOTREACHED() << "Unable to encode theme image for prs_id=" | 1579 NOTREACHED() << "Unable to encode theme image for prs_id=" |
1607 << prs_id << " for scale_factor=" << scale_factors_[i]; | 1580 << prs_id << " for scale_factor=" << scale_factors_[i]; |
1608 break; | 1581 break; |
1609 } | 1582 } |
1610 image_memory_[scaled_raw_id] = | 1583 image_memory_[scaled_raw_id] = |
1611 base::RefCountedBytes::TakeVector(&bitmap_data); | 1584 base::RefCountedBytes::TakeVector(&bitmap_data); |
1612 } | 1585 } |
1613 } | 1586 } |
OLD | NEW |