Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(716)

Side by Side Diff: chrome/browser/browser_theme_provider.cc

Issue 272033: Misc. cleanup for theme provider code, including:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/browser_theme_provider.h ('k') | chrome/browser/browser_theme_provider_gtk.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/browser_theme_provider.h" 5 #include "chrome/browser/browser_theme_provider.h"
6 6
7 #include "app/gfx/codec/png_codec.h" 7 #include "app/gfx/codec/png_codec.h"
8 #include "app/gfx/skbitmap_operations.h" 8 #include "app/gfx/skbitmap_operations.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/stl_util-inl.h"
10 #include "base/string_util.h" 11 #include "base/string_util.h"
11 #include "base/thread.h" 12 #include "base/thread.h"
12 #include "base/values.h" 13 #include "base/values.h"
13 #include "chrome/browser/browser_list.h" 14 #include "chrome/browser/browser_list.h"
14 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/browser_window.h" 16 #include "chrome/browser/browser_window.h"
16 #include "chrome/browser/metrics/user_metrics.h" 17 #include "chrome/browser/metrics/user_metrics.h"
17 #include "chrome/browser/profile.h" 18 #include "chrome/browser/profile.h"
18 #include "chrome/browser/theme_resources_util.h" 19 #include "chrome/browser/theme_resources_util.h"
19 #include "chrome/common/chrome_constants.h" 20 #include "chrome/common/chrome_constants.h"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 IDR_THEME_TAB_BACKGROUND_V, 188 IDR_THEME_TAB_BACKGROUND_V,
188 IDR_THEME_NTP_BACKGROUND, 189 IDR_THEME_NTP_BACKGROUND,
189 IDR_THEME_FRAME_OVERLAY, 190 IDR_THEME_FRAME_OVERLAY,
190 IDR_THEME_FRAME_OVERLAY_INACTIVE, 191 IDR_THEME_FRAME_OVERLAY_INACTIVE,
191 IDR_THEME_BUTTON_BACKGROUND, 192 IDR_THEME_BUTTON_BACKGROUND,
192 IDR_THEME_NTP_ATTRIBUTION, 193 IDR_THEME_NTP_ATTRIBUTION,
193 IDR_THEME_WINDOW_CONTROL_BACKGROUND 194 IDR_THEME_WINDOW_CONTROL_BACKGROUND
194 }; 195 };
195 196
196 // A map for kThemeableImages. 197 // A map for kThemeableImages.
197 static std::map<const int, bool> themeable_images_; 198 static std::map<const int, bool> themeable_images;
198 199
199 // A map of frame image IDs to the tints for those ids. 200 // A map of frame image IDs to the tints for those ids.
200 static std::map<const int, int> frame_tints_; 201 typedef std::map<const int, int> FrameTintMap;
202 static FrameTintMap frame_tints;
201 203
202 Lock BrowserThemeProvider::themed_image_cache_lock_; 204 Lock BrowserThemeProvider::themed_image_cache_lock_;
203 205
204 namespace { 206 namespace {
205 207
206 class WriteImagesToDiskTask : public Task { 208 class WriteImagesToDiskTask : public Task {
207 public: 209 public:
208 WriteImagesToDiskTask( 210 WriteImagesToDiskTask(
209 const BrowserThemeProvider::ImagesDiskCache& images_disk_cache, 211 const BrowserThemeProvider::ImagesDiskCache& images_disk_cache,
210 const BrowserThemeProvider::ImageCache& themed_image_cache) : 212 const BrowserThemeProvider::ImageCache& themed_image_cache) :
211 images_disk_cache_(images_disk_cache), 213 images_disk_cache_(images_disk_cache),
212 themed_image_cache_(themed_image_cache) { 214 themed_image_cache_(themed_image_cache) {
213 } 215 }
214 216
215 virtual void Run() { 217 virtual void Run() {
216 AutoLock lock(BrowserThemeProvider::themed_image_cache_lock_); 218 AutoLock lock(BrowserThemeProvider::themed_image_cache_lock_);
217 BrowserThemeProvider::ImagesDiskCache::const_iterator iter; 219 for (BrowserThemeProvider::ImagesDiskCache::const_iterator iter(
218 for (iter = images_disk_cache_.begin(); 220 images_disk_cache_.begin()); iter != images_disk_cache_.end();
219 iter != images_disk_cache_.end(); 221 ++iter) {
220 iter++) { 222 FilePath image_path = iter->first;
221 FilePath image_path = (*iter).first; 223 BrowserThemeProvider::ImageCache::const_iterator themed_iter =
222 BrowserThemeProvider::ImageCache::const_iterator found = 224 themed_image_cache_.find(iter->second);
223 themed_image_cache_.find((*iter).second); 225 if (themed_iter != themed_image_cache_.end()) {
224 if (found != themed_image_cache_.end()) { 226 SkBitmap* bitmap = themed_iter->second;
225 SkBitmap* bitmap = found->second;
226 std::vector<unsigned char> image_data; 227 std::vector<unsigned char> image_data;
227 if (!gfx::PNGCodec::EncodeBGRASkBitmap(*bitmap, false, &image_data)) { 228 if (!gfx::PNGCodec::EncodeBGRASkBitmap(*bitmap, false, &image_data)) {
228 NOTREACHED() << "Image file could not be encoded."; 229 NOTREACHED() << "Image file could not be encoded.";
229 return; 230 return;
230 } 231 }
231 const char* image_data_ptr = 232 const char* image_data_ptr =
232 reinterpret_cast<const char*>(&image_data[0]); 233 reinterpret_cast<const char*>(&image_data[0]);
233 if (!file_util::WriteFile(image_path, 234 if (!file_util::WriteFile(image_path,
234 image_data_ptr, image_data.size())) { 235 image_data_ptr, image_data.size())) {
235 NOTREACHED() << "Image file could not be written to disk."; 236 NOTREACHED() << "Image file could not be written to disk.";
(...skipping 12 matching lines...) Expand all
248 const BrowserThemeProvider::ImageCache& themed_image_cache_; 249 const BrowserThemeProvider::ImageCache& themed_image_cache_;
249 }; 250 };
250 } 251 }
251 252
252 BrowserThemeProvider::BrowserThemeProvider() 253 BrowserThemeProvider::BrowserThemeProvider()
253 : rb_(ResourceBundle::GetSharedInstance()), 254 : rb_(ResourceBundle::GetSharedInstance()),
254 profile_(NULL), 255 profile_(NULL),
255 process_images_(false) { 256 process_images_(false) {
256 static bool initialized = false; 257 static bool initialized = false;
257 if (!initialized) { 258 if (!initialized) {
258 for (size_t i = 0; i < arraysize(kToolbarButtonIDs); ++i) { 259 for (size_t i = 0; i < arraysize(kToolbarButtonIDs); ++i)
259 button_images_[kToolbarButtonIDs[i]] = true; 260 button_images_[kToolbarButtonIDs[i]] = true;
260 } 261 for (size_t i = 0; i < arraysize(kThemeableImages); ++i)
261 for (size_t i = 0; i < arraysize(kThemeableImages); ++i) { 262 themeable_images[kThemeableImages[i]] = true;
262 themeable_images_[kThemeableImages[i]] = true; 263 frame_tints[IDR_THEME_FRAME] = TINT_FRAME;
263 } 264 frame_tints[IDR_THEME_FRAME_INACTIVE] = TINT_FRAME_INACTIVE;
264 frame_tints_[IDR_THEME_FRAME] = TINT_FRAME; 265 frame_tints[IDR_THEME_FRAME_OVERLAY] = TINT_FRAME;
265 frame_tints_[IDR_THEME_FRAME_INACTIVE] = TINT_FRAME_INACTIVE; 266 frame_tints[IDR_THEME_FRAME_OVERLAY_INACTIVE] = TINT_FRAME_INACTIVE;
266 frame_tints_[IDR_THEME_FRAME_OVERLAY] = TINT_FRAME; 267 frame_tints[IDR_THEME_FRAME_INCOGNITO] = TINT_FRAME_INCOGNITO;
267 frame_tints_[IDR_THEME_FRAME_OVERLAY_INACTIVE] = TINT_FRAME_INACTIVE; 268 frame_tints[IDR_THEME_FRAME_INCOGNITO_INACTIVE] =
268 frame_tints_[IDR_THEME_FRAME_INCOGNITO] = TINT_FRAME_INCOGNITO;
269 frame_tints_[IDR_THEME_FRAME_INCOGNITO_INACTIVE] =
270 TINT_FRAME_INCOGNITO_INACTIVE; 269 TINT_FRAME_INCOGNITO_INACTIVE;
271 270
272 resource_names_[IDR_THEME_FRAME] = "theme_frame"; 271 resource_names_[IDR_THEME_FRAME] = "theme_frame";
273 resource_names_[IDR_THEME_FRAME_INACTIVE] = "theme_frame_inactive"; 272 resource_names_[IDR_THEME_FRAME_INACTIVE] = "theme_frame_inactive";
274 resource_names_[IDR_THEME_FRAME_OVERLAY] = "theme_frame_overlay"; 273 resource_names_[IDR_THEME_FRAME_OVERLAY] = "theme_frame_overlay";
275 resource_names_[IDR_THEME_FRAME_OVERLAY_INACTIVE] = 274 resource_names_[IDR_THEME_FRAME_OVERLAY_INACTIVE] =
276 "theme_frame_overlay_inactive"; 275 "theme_frame_overlay_inactive";
277 resource_names_[IDR_THEME_FRAME_INCOGNITO] = "theme_frame_incognito"; 276 resource_names_[IDR_THEME_FRAME_INCOGNITO] = "theme_frame_incognito";
278 resource_names_[IDR_THEME_FRAME_INCOGNITO_INACTIVE] = 277 resource_names_[IDR_THEME_FRAME_INCOGNITO_INACTIVE] =
279 "theme_frame_incognito_inactive"; 278 "theme_frame_incognito_inactive";
(...skipping 23 matching lines...) Expand all
303 file_util::CreateDirectory(image_dir_); 302 file_util::CreateDirectory(image_dir_);
304 303
305 LoadThemePrefs(); 304 LoadThemePrefs();
306 } 305 }
307 306
308 SkBitmap* BrowserThemeProvider::GetBitmapNamed(int id) { 307 SkBitmap* BrowserThemeProvider::GetBitmapNamed(int id) {
309 DCHECK(CalledOnValidThread()); 308 DCHECK(CalledOnValidThread());
310 309
311 // First check to see if the Skia image is in the themed cache. The themed 310 // First check to see if the Skia image is in the themed cache. The themed
312 // cache is not changed in this method, so it can remain unlocked. 311 // cache is not changed in this method, so it can remain unlocked.
313 ImageCache::const_iterator t_found = themed_image_cache_.find(id); 312 ImageCache::const_iterator themed_iter = themed_image_cache_.find(id);
314 if (t_found != themed_image_cache_.end()) 313 if (themed_iter != themed_image_cache_.end())
315 return t_found->second; 314 return themed_iter->second;
316 315
317 // If Skia image is not in themed cache, check regular cache, and possibly 316 // If Skia image is not in themed cache, check regular cache, and possibly
318 // generate and store. 317 // generate and store.
319 ImageCache::const_iterator found = image_cache_.find(id); 318 ImageCache::const_iterator image_iter = image_cache_.find(id);
320 if (found != image_cache_.end()) 319 if (image_iter != image_cache_.end())
321 return found->second; 320 return image_iter->second;
322 321
323 scoped_ptr<SkBitmap> result; 322 scoped_ptr<SkBitmap> result;
324 323
325 // Try to load the image from the extension. 324 // Try to load the image from the extension.
326 result.reset(LoadThemeBitmap(id)); 325 result.reset(LoadThemeBitmap(id));
327 326
328 // If we still don't have an image, load it from resourcebundle. 327 // If we still don't have an image, load it from resourcebundle.
329 if (!result.get()) 328 if (!result.get())
330 result.reset(new SkBitmap(*rb_.GetBitmapNamed(id))); 329 result.reset(new SkBitmap(*rb_.GetBitmapNamed(id)));
331 330
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 370
372 if (id == COLOR_NTP_LINK_UNDERLINE) { 371 if (id == COLOR_NTP_LINK_UNDERLINE) {
373 if (colors_.find(kColorNTPLinkUnderline) != colors_.end()) 372 if (colors_.find(kColorNTPLinkUnderline) != colors_.end())
374 return colors_[kColorNTPLinkUnderline]; 373 return colors_[kColorNTPLinkUnderline];
375 SkColor color_link = GetColor(COLOR_NTP_LINK); 374 SkColor color_link = GetColor(COLOR_NTP_LINK);
376 return SkColorSetA(color_link, SkColorGetA(color_link) / 3); 375 return SkColorSetA(color_link, SkColorGetA(color_link) / 3);
377 } 376 }
378 377
379 // TODO(glen): Figure out if we need to tint these. http://crbug.com/11578 378 // TODO(glen): Figure out if we need to tint these. http://crbug.com/11578
380 ColorMap::iterator color_iter = colors_.find(GetColorKey(id)); 379 ColorMap::iterator color_iter = colors_.find(GetColorKey(id));
381 if (color_iter != colors_.end()) 380 return (color_iter == colors_.end()) ?
382 return color_iter->second; 381 GetDefaultColor(id) : color_iter->second;
383 else
384 return GetDefaultColor(id);
385 } 382 }
386 383
387 bool BrowserThemeProvider::GetDisplayProperty(int id, int* result) { 384 bool BrowserThemeProvider::GetDisplayProperty(int id, int* result) {
388 switch (id) { 385 switch (id) {
389 case NTP_BACKGROUND_ALIGNMENT: 386 case NTP_BACKGROUND_ALIGNMENT: {
390 if (display_properties_.find(kDisplayPropertyNTPAlignment) != 387 DisplayPropertyMap::const_iterator display_iter =
391 display_properties_.end()) { 388 display_properties_.find(kDisplayPropertyNTPAlignment);
392 *result = display_properties_[kDisplayPropertyNTPAlignment]; 389 *result = (display_iter == display_properties_.end()) ?
393 } else { 390 kDefaultDisplayPropertyNTPAlignment : display_iter->second;
394 *result = kDefaultDisplayPropertyNTPAlignment;
395 }
396 return true; 391 return true;
397 case NTP_BACKGROUND_TILING: 392 }
398 if (display_properties_.find(kDisplayPropertyNTPTiling) != 393 case NTP_BACKGROUND_TILING: {
399 display_properties_.end()) { 394 DisplayPropertyMap::const_iterator display_iter =
400 *result = display_properties_[kDisplayPropertyNTPTiling]; 395 display_properties_.find(kDisplayPropertyNTPTiling);
401 } else { 396 *result = (display_iter == display_properties_.end()) ?
402 *result = kDefaultDisplayPropertyNTPTiling; 397 kDefaultDisplayPropertyNTPTiling : display_iter->second;
403 }
404 return true; 398 return true;
405 case NTP_LOGO_ALTERNATE: 399 }
406 if (display_properties_.find(kDisplayPropertyNTPInverseLogo) != 400 case NTP_LOGO_ALTERNATE: {
407 display_properties_.end()) { 401 DisplayPropertyMap::const_iterator display_iter =
408 *result = display_properties_[kDisplayPropertyNTPInverseLogo]; 402 display_properties_.find(kDisplayPropertyNTPInverseLogo);
409 } else { 403 *result = (display_iter == display_properties_.end()) ?
410 *result = kDefaultDisplayPropertyNTPInverseLogo; 404 kDefaultDisplayPropertyNTPInverseLogo : display_iter->second;
411 }
412 return true; 405 return true;
406 }
413 default: 407 default:
414 NOTREACHED() << "Unknown property requested"; 408 NOTREACHED() << "Unknown property requested";
415 } 409 }
416 return false; 410 return false;
417 } 411 }
418 412
419 bool BrowserThemeProvider::ShouldUseNativeFrame() { 413 bool BrowserThemeProvider::ShouldUseNativeFrame() {
420 if (HasCustomImage(IDR_THEME_FRAME)) 414 if (HasCustomImage(IDR_THEME_FRAME))
421 return false; 415 return false;
422 #if defined(OS_WIN) 416 #if defined(OS_WIN)
423 return win_util::ShouldUseVistaFrame(); 417 return win_util::ShouldUseVistaFrame();
424 #else 418 #else
425 return false; 419 return false;
426 #endif 420 #endif
427 } 421 }
428 422
429 bool BrowserThemeProvider::HasCustomImage(int id) { 423 bool BrowserThemeProvider::HasCustomImage(int id) {
430 if (!themeable_images_[id]) 424 if (!themeable_images[id])
431 return false; 425 return false;
432 426
433 // A custom image = base name is NOT equal to resource name. See note in 427 // A custom image = base name is NOT equal to resource name. See note in
434 // SaveThemeBitmap describing the process by which an original image is 428 // SaveThemeBitmap describing the process by which an original image is
435 // tagged. 429 // tagged.
436 if (images_.find(id) != images_.end() && 430 if ((images_.find(id) == images_.end()) ||
437 resource_names_.find(id) != resource_names_.end()) 431 (resource_names_.find(id) == resource_names_.end()))
438 return !EndsWith(UTF8ToWide(images_[id]),
439 UTF8ToWide(resource_names_[id]), false);
440 else
441 return false; 432 return false;
433 return !EndsWith(UTF8ToWide(images_[id]),
434 UTF8ToWide(resource_names_[id]), false);
442 } 435 }
443 436
444 bool BrowserThemeProvider::GetRawData(int id, 437 bool BrowserThemeProvider::GetRawData(int id,
445 std::vector<unsigned char>* raw_data) { 438 std::vector<unsigned char>* raw_data) {
446 // Check to see whether we should substitute some images. 439 // Check to see whether we should substitute some images.
447 int ntp_alternate; 440 int ntp_alternate;
448 GetDisplayProperty(NTP_LOGO_ALTERNATE, &ntp_alternate); 441 GetDisplayProperty(NTP_LOGO_ALTERNATE, &ntp_alternate);
449 if (id == IDR_PRODUCT_LOGO && ntp_alternate != 0) 442 if (id == IDR_PRODUCT_LOGO && ntp_alternate != 0)
450 id = IDR_PRODUCT_LOGO_WHITE; 443 id = IDR_PRODUCT_LOGO_WHITE;
451 444
452 if (raw_data_.find(id) != raw_data_.end()) { 445 if (raw_data_.find(id) != raw_data_.end()) {
453 *raw_data = raw_data_[id]; 446 *raw_data = raw_data_[id];
454 return true; 447 return true;
455 } 448 }
456 449
457 if (!ReadThemeFileData(id, raw_data)) { 450 if (!ReadThemeFileData(id, raw_data) &&
458 if (!rb_.LoadImageResourceBytes(id, raw_data)) 451 !rb_.LoadImageResourceBytes(id, raw_data))
459 return false; 452 return false;
460 }
461 453
462 raw_data_[id] = *raw_data; 454 raw_data_[id] = *raw_data;
463 return true; 455 return true;
464 } 456 }
465 457
466 void BrowserThemeProvider::SetTheme(Extension* extension) { 458 void BrowserThemeProvider::SetTheme(Extension* extension) {
467 // Clear our image cache. 459 // Clear our image cache.
468 ClearCaches(); 460 ClearCaches();
469 461
470 DCHECK(extension); 462 DCHECK(extension);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 if (alignment & BrowserThemeProvider::ALIGN_TOP) 538 if (alignment & BrowserThemeProvider::ALIGN_TOP)
547 vertical_string = kAlignmentTop; 539 vertical_string = kAlignmentTop;
548 else if (alignment & BrowserThemeProvider::ALIGN_BOTTOM) 540 else if (alignment & BrowserThemeProvider::ALIGN_BOTTOM)
549 vertical_string = kAlignmentBottom; 541 vertical_string = kAlignmentBottom;
550 542
551 if (alignment & BrowserThemeProvider::ALIGN_LEFT) 543 if (alignment & BrowserThemeProvider::ALIGN_LEFT)
552 horizontal_string = kAlignmentLeft; 544 horizontal_string = kAlignmentLeft;
553 else if (alignment & BrowserThemeProvider::ALIGN_RIGHT) 545 else if (alignment & BrowserThemeProvider::ALIGN_RIGHT)
554 horizontal_string = kAlignmentRight; 546 horizontal_string = kAlignmentRight;
555 547
556 if (!vertical_string.empty() && !horizontal_string.empty()) 548 if (vertical_string.empty())
557 return vertical_string + " " + horizontal_string;
558 else if (vertical_string.empty())
559 return horizontal_string; 549 return horizontal_string;
560 else 550 if (horizontal_string.empty())
561 return vertical_string; 551 return vertical_string;
552 return vertical_string + " " + horizontal_string;
562 } 553 }
563 554
564 // static 555 // static
565 int BrowserThemeProvider::StringToAlignment(const std::string& alignment) { 556 int BrowserThemeProvider::StringToAlignment(const std::string& alignment) {
566 std::vector<std::wstring> split; 557 std::vector<std::wstring> split;
567 SplitStringAlongWhitespace(UTF8ToWide(alignment), &split); 558 SplitStringAlongWhitespace(UTF8ToWide(alignment), &split);
568 559
569 std::vector<std::wstring>::iterator alignments = split.begin();
570 int alignment_mask = 0; 560 int alignment_mask = 0;
571 while (alignments != split.end()) { 561 for (std::vector<std::wstring>::iterator alignments(split.begin());
562 alignments != split.end(); ++alignments) {
572 std::string comp = WideToUTF8(*alignments); 563 std::string comp = WideToUTF8(*alignments);
573 const char* component = comp.c_str(); 564 const char* component = comp.c_str();
574 565
575 if (base::strcasecmp(component, kAlignmentTop) == 0) 566 if (base::strcasecmp(component, kAlignmentTop) == 0)
576 alignment_mask |= BrowserThemeProvider::ALIGN_TOP; 567 alignment_mask |= BrowserThemeProvider::ALIGN_TOP;
577 else if (base::strcasecmp(component, kAlignmentBottom) == 0) 568 else if (base::strcasecmp(component, kAlignmentBottom) == 0)
578 alignment_mask |= BrowserThemeProvider::ALIGN_BOTTOM; 569 alignment_mask |= BrowserThemeProvider::ALIGN_BOTTOM;
579 570
580 if (base::strcasecmp(component, kAlignmentLeft) == 0) 571 if (base::strcasecmp(component, kAlignmentLeft) == 0)
581 alignment_mask |= BrowserThemeProvider::ALIGN_LEFT; 572 alignment_mask |= BrowserThemeProvider::ALIGN_LEFT;
582 else if (base::strcasecmp(component, kAlignmentRight) == 0) 573 else if (base::strcasecmp(component, kAlignmentRight) == 0)
583 alignment_mask |= BrowserThemeProvider::ALIGN_RIGHT; 574 alignment_mask |= BrowserThemeProvider::ALIGN_RIGHT;
584 alignments++;
585 } 575 }
586 return alignment_mask; 576 return alignment_mask;
587 } 577 }
588 578
589 // static 579 // static
590 std::string BrowserThemeProvider::TilingToString(int tiling) { 580 std::string BrowserThemeProvider::TilingToString(int tiling) {
591 // Convert from a TilingProperty back into a string. 581 // Convert from a TilingProperty back into a string.
592 if (tiling == BrowserThemeProvider::REPEAT_X) 582 if (tiling == BrowserThemeProvider::REPEAT_X)
593 return kTilingRepeatX; 583 return kTilingRepeatX;
594 else if (tiling == BrowserThemeProvider::REPEAT_Y) 584 if (tiling == BrowserThemeProvider::REPEAT_Y)
595 return kTilingRepeatY; 585 return kTilingRepeatY;
596 else if (tiling == BrowserThemeProvider::REPEAT) 586 if (tiling == BrowserThemeProvider::REPEAT)
597 return kTilingRepeat; 587 return kTilingRepeat;
598 else 588 return kTilingNoRepeat;
599 return kTilingNoRepeat;
600 } 589 }
601 590
602 // static 591 // static
603 int BrowserThemeProvider::StringToTiling(const std::string &tiling) { 592 int BrowserThemeProvider::StringToTiling(const std::string &tiling) {
604 const char* component = tiling.c_str(); 593 const char* component = tiling.c_str();
605 594
606 if (base::strcasecmp(component, kTilingRepeatX) == 0) 595 if (base::strcasecmp(component, kTilingRepeatX) == 0)
607 return BrowserThemeProvider::REPEAT_X; 596 return BrowserThemeProvider::REPEAT_X;
608 else if (base::strcasecmp(component, kTilingRepeatY) == 0) 597 if (base::strcasecmp(component, kTilingRepeatY) == 0)
609 return BrowserThemeProvider::REPEAT_Y; 598 return BrowserThemeProvider::REPEAT_Y;
610 else if (base::strcasecmp(component, kTilingRepeat) == 0) 599 if (base::strcasecmp(component, kTilingRepeat) == 0)
611 return BrowserThemeProvider::REPEAT; 600 return BrowserThemeProvider::REPEAT;
612 // NO_REPEAT is the default choice. 601 // NO_REPEAT is the default choice.
613 return BrowserThemeProvider::NO_REPEAT; 602 return BrowserThemeProvider::NO_REPEAT;
614 } 603 }
615 604
616 void BrowserThemeProvider::SetColor(const char* key, const SkColor& color) { 605 void BrowserThemeProvider::SetColor(const char* key, const SkColor& color) {
617 colors_[key] = color; 606 colors_[key] = color;
618 } 607 }
619 608
620 void BrowserThemeProvider::SetTint(const char* key, 609 void BrowserThemeProvider::SetTint(const char* key,
(...skipping 22 matching lines...) Expand all
643 colors_[kColorFrameIncognito] = 632 colors_[kColorFrameIncognito] =
644 HSLShift(frame, GetTint(TINT_FRAME_INCOGNITO)); 633 HSLShift(frame, GetTint(TINT_FRAME_INCOGNITO));
645 } 634 }
646 if (colors_.find(kColorFrameIncognitoInactive) == colors_.end()) { 635 if (colors_.find(kColorFrameIncognitoInactive) == colors_.end()) {
647 colors_[kColorFrameIncognitoInactive] = 636 colors_[kColorFrameIncognitoInactive] =
648 HSLShift(frame, GetTint(TINT_FRAME_INCOGNITO_INACTIVE)); 637 HSLShift(frame, GetTint(TINT_FRAME_INCOGNITO_INACTIVE));
649 } 638 }
650 } 639 }
651 640
652 void BrowserThemeProvider::GenerateFrameImages() { 641 void BrowserThemeProvider::GenerateFrameImages() {
653 std::map<const int, int>::iterator iter = frame_tints_.begin(); 642 for (FrameTintMap::iterator iter(frame_tints.begin());
654 while (iter != frame_tints_.end()) { 643 iter != frame_tints.end(); ++iter) {
655 int id = iter->first; 644 int id = iter->first;
656 scoped_ptr<SkBitmap> frame; 645 scoped_ptr<SkBitmap> frame;
657 // If there's no frame image provided for the specified id, then load 646 // If there's no frame image provided for the specified id, then load
658 // the default provided frame. If that's not provided, skip this whole 647 // the default provided frame. If that's not provided, skip this whole
659 // thing and just use the default images. 648 // thing and just use the default images.
660 int base_id; 649 int base_id;
661 std::string resource_name; 650 std::string resource_name;
662 651
663 // If we've already processed the images for this theme, they're all 652 // If we've already processed the images for this theme, they're all
664 // waiting on disk -- just load them in. 653 // waiting on disk -- just load them in.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 // the default frame. 686 // the default frame.
698 frame.reset(new SkBitmap(*rb_.GetBitmapNamed(IDR_THEME_FRAME))); 687 frame.reset(new SkBitmap(*rb_.GetBitmapNamed(IDR_THEME_FRAME)));
699 } 688 }
700 689
701 if (frame.get()) { 690 if (frame.get()) {
702 SkBitmap* tinted = new SkBitmap(TintBitmap(*frame, iter->second)); 691 SkBitmap* tinted = new SkBitmap(TintBitmap(*frame, iter->second));
703 themed_image_cache_[id] = tinted; 692 themed_image_cache_[id] = tinted;
704 SaveThemeBitmap(resource_name, id); 693 SaveThemeBitmap(resource_name, id);
705 } 694 }
706 } 695 }
707 ++iter;
708 } 696 }
709 } 697 }
710 698
711 void BrowserThemeProvider::GenerateTabImages() { 699 void BrowserThemeProvider::GenerateTabImages() {
712 GenerateTabBackgroundBitmap(IDR_THEME_TAB_BACKGROUND); 700 GenerateTabBackgroundBitmap(IDR_THEME_TAB_BACKGROUND);
713 GenerateTabBackgroundBitmap(IDR_THEME_TAB_BACKGROUND_INCOGNITO); 701 GenerateTabBackgroundBitmap(IDR_THEME_TAB_BACKGROUND_INCOGNITO);
714 } 702 }
715 703
716 void BrowserThemeProvider::ClearAllThemeData() { 704 void BrowserThemeProvider::ClearAllThemeData() {
717 // Clear our image cache. 705 // Clear our image cache.
718 ClearCaches(); 706 ClearCaches();
719 707
720 images_.clear(); 708 images_.clear();
721 colors_.clear(); 709 colors_.clear();
722 tints_.clear(); 710 tints_.clear();
723 display_properties_.clear(); 711 display_properties_.clear();
724 raw_data_.clear(); 712 raw_data_.clear();
725 713
726 SaveImageData(NULL); 714 SaveImageData(NULL);
727 SaveColorData(); 715 SaveColorData();
728 SaveTintData(); 716 SaveTintData();
729 SaveDisplayPropertyData(); 717 SaveDisplayPropertyData();
730 SaveThemeID(kDefaultThemeID); 718 SaveThemeID(kDefaultThemeID);
731 } 719 }
732 720
733 void BrowserThemeProvider::LoadThemePrefs() { 721 void BrowserThemeProvider::LoadThemePrefs() {
734 process_images_ = false; 722 process_images_ = false;
735 PrefService* prefs = profile_->GetPrefs(); 723 PrefService* prefs = profile_->GetPrefs();
736 724
737 // TODO(glen): Figure out if any custom prefs were loaded, and if so 725 // TODO(glen): Figure out if any custom prefs were loaded, and if so UMA-log
738 // UMA-log the fact that a theme was loaded. 726 // the fact that a theme was loaded.
739 if (prefs->HasPrefPath(prefs::kCurrentThemeImages) || 727 if (!prefs->HasPrefPath(prefs::kCurrentThemeImages) &&
740 prefs->HasPrefPath(prefs::kCurrentThemeColors) || 728 !prefs->HasPrefPath(prefs::kCurrentThemeColors) &&
741 prefs->HasPrefPath(prefs::kCurrentThemeTints)) { 729 !prefs->HasPrefPath(prefs::kCurrentThemeTints))
742 // Our prefs already have the extension path baked in, so we don't need 730 return;
743 // to provide it.
744 SetImageData(prefs->GetMutableDictionary(prefs::kCurrentThemeImages),
745 FilePath());
746 SetColorData(prefs->GetMutableDictionary(prefs::kCurrentThemeColors));
747 SetTintData(prefs->GetMutableDictionary(prefs::kCurrentThemeTints));
748 SetDisplayPropertyData(
749 prefs->GetMutableDictionary(prefs::kCurrentThemeDisplayProperties));
750 731
751 // If we're not loading the frame from the cached image dir, we are using 732 // Our prefs already have the extension path baked in, so we don't need to
752 // an old preferences file, or the processed images were not saved 733 // provide it.
753 // correctly. Force image reprocessing and caching. 734 SetImageData(prefs->GetMutableDictionary(prefs::kCurrentThemeImages),
754 if (images_.count(IDR_THEME_FRAME) > 0) { 735 FilePath());
736 SetColorData(prefs->GetMutableDictionary(prefs::kCurrentThemeColors));
737 SetTintData(prefs->GetMutableDictionary(prefs::kCurrentThemeTints));
738 SetDisplayPropertyData(
739 prefs->GetMutableDictionary(prefs::kCurrentThemeDisplayProperties));
740
741 // If we're not loading the frame from the cached image dir, we are using an
742 // old preferences file, or the processed images were not saved correctly.
743 // Force image reprocessing and caching.
744 if (images_.count(IDR_THEME_FRAME) > 0) {
755 #if defined(OS_WIN) 745 #if defined(OS_WIN)
756 FilePath cache_path = FilePath(UTF8ToWide(images_[IDR_THEME_FRAME])); 746 FilePath cache_path = FilePath(UTF8ToWide(images_[IDR_THEME_FRAME]));
757 #else 747 #else
758 FilePath cache_path = FilePath(images_[IDR_THEME_FRAME]); 748 FilePath cache_path = FilePath(images_[IDR_THEME_FRAME]);
759 #endif 749 #endif
760 process_images_ = !file_util::ContainsPath(image_dir_, cache_path); 750 process_images_ = !file_util::ContainsPath(image_dir_, cache_path);
761 } 751 }
762 752
763 GenerateFrameColors(); 753 GenerateFrameColors();
764 // Scope for AutoLock on themed_image_cache. 754 // Scope for AutoLock on themed_image_cache.
765 { 755 {
766 AutoLock lock(themed_image_cache_lock_); 756 AutoLock lock(themed_image_cache_lock_);
767 GenerateFrameImages(); 757 GenerateFrameImages();
768 GenerateTabImages(); 758 GenerateTabImages();
769 } 759 }
770 760
771 if (process_images_) { 761 if (process_images_) {
772 WriteImagesToDisk(); 762 WriteImagesToDisk();
773 UserMetrics::RecordAction(L"Migrated noncached to cached theme.", 763 UserMetrics::RecordAction(L"Migrated noncached to cached theme.", profile_);
774 profile_);
775 }
776 UserMetrics::RecordAction(L"Themes_loaded", profile_);
777 } 764 }
765 UserMetrics::RecordAction(L"Themes_loaded", profile_);
778 } 766 }
779 767
780 void BrowserThemeProvider::NotifyThemeChanged() { 768 void BrowserThemeProvider::NotifyThemeChanged() {
781 // Redraw! 769 // Redraw!
782 NotificationService* service = NotificationService::current(); 770 NotificationService* service = NotificationService::current();
783 service->Notify(NotificationType::BROWSER_THEME_CHANGED, 771 service->Notify(NotificationType::BROWSER_THEME_CHANGED,
784 Source<BrowserThemeProvider>(this), 772 Source<BrowserThemeProvider>(this),
785 NotificationService::NoDetails()); 773 NotificationService::NoDetails());
786 } 774 }
787 775
788 SkBitmap* BrowserThemeProvider::LoadThemeBitmap(int id) { 776 SkBitmap* BrowserThemeProvider::LoadThemeBitmap(int id) {
789 DCHECK(CalledOnValidThread()); 777 DCHECK(CalledOnValidThread());
790 778
791 if (!themeable_images_[id]) 779 if (!themeable_images[id])
792 return NULL; 780 return NULL;
793 781
794 // Attempt to find the image in our theme bundle. 782 // Attempt to find the image in our theme bundle.
795 std::vector<unsigned char> raw_data, png_data; 783 std::vector<unsigned char> raw_data, png_data;
796 if (ReadThemeFileData(id, &raw_data)) { 784 if (ReadThemeFileData(id, &raw_data)) {
797 // Decode the PNG. 785 // Decode the PNG.
798 int image_width = 0; 786 int image_width = 0;
799 int image_height = 0; 787 int image_height = 0;
800 788
801 if (!gfx::PNGCodec::Decode(&raw_data.front(), raw_data.size(), 789 if (!gfx::PNGCodec::Decode(&raw_data.front(), raw_data.size(),
802 gfx::PNGCodec::FORMAT_BGRA, &png_data, 790 gfx::PNGCodec::FORMAT_BGRA, &png_data,
803 &image_width, &image_height)) { 791 &image_width, &image_height)) {
804 NOTREACHED() << "Unable to decode theme image resource " << id; 792 NOTREACHED() << "Unable to decode theme image resource " << id;
805 return NULL; 793 return NULL;
806 } 794 }
807 795
808 return gfx::PNGCodec::CreateSkBitmapFromBGRAFormat(png_data, 796 return gfx::PNGCodec::CreateSkBitmapFromBGRAFormat(png_data,
809 image_width, 797 image_width,
810 image_height); 798 image_height);
811 } else { 799 } else {
812 // TODO(glen): File no-longer exists, we're out of date. We should 800 // TODO(glen): File no-longer exists, we're out of date. We should
813 // clear the theme (or maybe just the pref that points to this 801 // clear the theme (or maybe just the pref that points to this
(...skipping 29 matching lines...) Expand all
843 images_disk_cache_[image_path] = id; 831 images_disk_cache_[image_path] = id;
844 } 832 }
845 833
846 #if defined(OS_WIN) 834 #if defined(OS_WIN)
847 void BrowserThemeProvider::FreePlatformCaches() { 835 void BrowserThemeProvider::FreePlatformCaches() {
848 // Views (Skia) has no platform image cache to clear. 836 // Views (Skia) has no platform image cache to clear.
849 } 837 }
850 #endif 838 #endif
851 839
852 SkBitmap* BrowserThemeProvider::GenerateTabBackgroundBitmapImpl(int id) { 840 SkBitmap* BrowserThemeProvider::GenerateTabBackgroundBitmapImpl(int id) {
853 int base_id; 841 int base_id = (id == IDR_THEME_TAB_BACKGROUND) ?
854 if (id == IDR_THEME_TAB_BACKGROUND) { 842 IDR_THEME_FRAME : IDR_THEME_FRAME_INCOGNITO;
855 base_id = IDR_THEME_FRAME; 843 // According to Miranda, it is safe to read from the themed_image_cache_ here
856 } else {
857 base_id = IDR_THEME_FRAME_INCOGNITO;
858 }
859 // According to Miranda, it is safe to read from the themed-image_cache_ here
860 // because we only lock to write on the UI thread, and we only lock to read 844 // because we only lock to write on the UI thread, and we only lock to read
861 // on the cache writing thread. 845 // on the cache writing thread.
862 std::map<int, SkBitmap*>::iterator it = themed_image_cache_.find(base_id); 846 ImageCache::iterator it = themed_image_cache_.find(base_id);
863 if (it != themed_image_cache_.end()) { 847 if (it != themed_image_cache_.end())
864 SkBitmap bg_tint = TintBitmap(*(it->second), TINT_BACKGROUND_TAB); 848 return NULL;
865 int vertical_offset = HasCustomImage(id) ?
866 kRestoredTabVerticalOffset : 0;
867 SkBitmap* bg_tab = new SkBitmap(SkBitmapOperations::CreateTiledBitmap(
868 bg_tint, 0, vertical_offset, bg_tint.width(), bg_tint.height()));
869 849
870 // If they've provided a custom image, overlay it. 850 SkBitmap bg_tint = TintBitmap(*(it->second), TINT_BACKGROUND_TAB);
871 if (HasCustomImage(id)) { 851 int vertical_offset = HasCustomImage(id) ? kRestoredTabVerticalOffset : 0;
872 SkBitmap* overlay = LoadThemeBitmap(id); 852 SkBitmap* bg_tab = new SkBitmap(SkBitmapOperations::CreateTiledBitmap(
873 if (overlay) { 853 bg_tint, 0, vertical_offset, bg_tint.width(), bg_tint.height()));
874 SkCanvas canvas(*bg_tab); 854
875 for (int x = 0; x < bg_tab->width(); x += overlay->width()) 855 // If they've provided a custom image, overlay it.
876 canvas.drawBitmap(*overlay, static_cast<SkScalar>(x), 0, NULL); 856 if (HasCustomImage(id)) {
877 } 857 SkBitmap* overlay = LoadThemeBitmap(id);
858 if (overlay) {
859 SkCanvas canvas(*bg_tab);
860 for (int x = 0; x < bg_tab->width(); x += overlay->width())
861 canvas.drawBitmap(*overlay, static_cast<SkScalar>(x), 0, NULL);
878 } 862 }
879
880 return bg_tab;
881 } 863 }
882 864
883 return NULL; 865 return bg_tab;
884 } 866 }
885 867
886 const std::string BrowserThemeProvider::GetTintKey(int id) { 868 const std::string BrowserThemeProvider::GetTintKey(int id) {
887 switch (id) { 869 switch (id) {
888 case TINT_FRAME: 870 case TINT_FRAME:
889 return kTintFrame; 871 return kTintFrame;
890 case TINT_FRAME_INACTIVE: 872 case TINT_FRAME_INACTIVE:
891 return kTintFrameInactive; 873 return kTintFrameInactive;
892 case TINT_FRAME_INCOGNITO: 874 case TINT_FRAME_INCOGNITO:
893 return kTintFrameIncognito; 875 return kTintFrameIncognito;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 return SkBitmapOperations::CreateHSLShiftedBitmap(bitmap, GetTint(hsl_id)); 997 return SkBitmapOperations::CreateHSLShiftedBitmap(bitmap, GetTint(hsl_id));
1016 } 998 }
1017 999
1018 void BrowserThemeProvider::SetImageData(DictionaryValue* images_value, 1000 void BrowserThemeProvider::SetImageData(DictionaryValue* images_value,
1019 FilePath images_path) { 1001 FilePath images_path) {
1020 images_.clear(); 1002 images_.clear();
1021 1003
1022 if (!images_value) 1004 if (!images_value)
1023 return; 1005 return;
1024 1006
1025 DictionaryValue::key_iterator iter = images_value->begin_keys(); 1007 for (DictionaryValue::key_iterator iter(images_value->begin_keys());
1026 while (iter != images_value->end_keys()) { 1008 iter != images_value->end_keys(); ++iter) {
1027 std::string val; 1009 std::string val;
1028 if (images_value->GetString(*iter, &val)) { 1010 if (images_value->GetString(*iter, &val)) {
1029 int id = ThemeResourcesUtil::GetId(WideToUTF8(*iter)); 1011 int id = ThemeResourcesUtil::GetId(WideToUTF8(*iter));
1030 if (id != -1) { 1012 if (id != -1) {
1031 if (!images_path.empty()) { 1013 if (!images_path.empty()) {
1032 images_[id] = WideToUTF8(images_path.AppendASCII(val) 1014 images_[id] = WideToUTF8(images_path.AppendASCII(val)
1033 .ToWStringHack()); 1015 .ToWStringHack());
1034 resource_names_[id] = WideToASCII(*iter); 1016 resource_names_[id] = WideToASCII(*iter);
1035 } else { 1017 } else {
1036 images_[id] = val; 1018 images_[id] = val;
1037 } 1019 }
1038 } 1020 }
1039 } 1021 }
1040 ++iter;
1041 } 1022 }
1042 } 1023 }
1043 1024
1044 void BrowserThemeProvider::SetColorData(DictionaryValue* colors_value) { 1025 void BrowserThemeProvider::SetColorData(DictionaryValue* colors_value) {
1045 colors_.clear(); 1026 colors_.clear();
1046 1027
1047 if (!colors_value) 1028 if (!colors_value)
1048 return; 1029 return;
1049 1030
1050 DictionaryValue::key_iterator iter = colors_value->begin_keys(); 1031 for (DictionaryValue::key_iterator iter(colors_value->begin_keys());
1051 while (iter != colors_value->end_keys()) { 1032 iter != colors_value->end_keys(); ++iter) {
1052 ListValue* color_list; 1033 ListValue* color_list;
1053 if (colors_value->GetList(*iter, &color_list) && 1034 if (colors_value->GetList(*iter, &color_list) &&
1054 (color_list->GetSize() == 3 || color_list->GetSize() == 4)) { 1035 ((color_list->GetSize() == 3) || (color_list->GetSize() == 4))) {
1055 int r, g, b; 1036 int r, g, b;
1056 color_list->GetInteger(0, &r); 1037 color_list->GetInteger(0, &r);
1057 color_list->GetInteger(1, &g); 1038 color_list->GetInteger(1, &g);
1058 color_list->GetInteger(2, &b); 1039 color_list->GetInteger(2, &b);
1059 if (color_list->GetSize() == 4) { 1040 if (color_list->GetSize() == 4) {
1060 double alpha; 1041 double alpha;
1061 int alpha_int; 1042 int alpha_int;
1062 if (color_list->GetReal(3, &alpha)) { 1043 if (color_list->GetReal(3, &alpha)) {
1063 colors_[WideToUTF8(*iter)] = SkColorSetARGB( 1044 colors_[WideToUTF8(*iter)] =
1064 static_cast<int>(alpha * 255), r, g, b); 1045 SkColorSetARGB(static_cast<int>(alpha * 255), r, g, b);
1065 } else if (color_list->GetInteger(3, &alpha_int)) { 1046 } else if (color_list->GetInteger(3, &alpha_int)) {
1066 colors_[WideToUTF8(*iter)] = SkColorSetARGB( 1047 colors_[WideToUTF8(*iter)] =
1067 alpha_int * 255, r, g, b); 1048 SkColorSetARGB(alpha_int * 255, r, g, b);
1068 } 1049 }
1069 } else { 1050 } else {
1070 colors_[WideToUTF8(*iter)] = SkColorSetRGB(r, g, b); 1051 colors_[WideToUTF8(*iter)] = SkColorSetRGB(r, g, b);
1071 } 1052 }
1072 } 1053 }
1073 ++iter;
1074 } 1054 }
1075 } 1055 }
1076 1056
1077 void BrowserThemeProvider::SetTintData(DictionaryValue* tints_value) { 1057 void BrowserThemeProvider::SetTintData(DictionaryValue* tints_value) {
1078 tints_.clear(); 1058 tints_.clear();
1079 1059
1080 if (!tints_value) 1060 if (!tints_value)
1081 return; 1061 return;
1082 1062
1083 DictionaryValue::key_iterator iter = tints_value->begin_keys(); 1063 for (DictionaryValue::key_iterator iter(tints_value->begin_keys());
1084 while (iter != tints_value->end_keys()) { 1064 iter != tints_value->end_keys(); ++iter) {
1085 ListValue* tint_list; 1065 ListValue* tint_list;
1086 if (tints_value->GetList(*iter, &tint_list) && 1066 if (tints_value->GetList(*iter, &tint_list) &&
1087 tint_list->GetSize() == 3) { 1067 (tint_list->GetSize() == 3)) {
1088 color_utils::HSL hsl = { -1, -1, -1 }; 1068 color_utils::HSL hsl = { -1, -1, -1 };
1089 int value = 0; 1069 int value = 0;
1090 if (!tint_list->GetReal(0, &hsl.h) && tint_list->GetInteger(0, &value)) 1070 if (!tint_list->GetReal(0, &hsl.h) && tint_list->GetInteger(0, &value))
1091 hsl.h = value; 1071 hsl.h = value;
1092 if (!tint_list->GetReal(1, &hsl.s) && tint_list->GetInteger(1, &value)) 1072 if (!tint_list->GetReal(1, &hsl.s) && tint_list->GetInteger(1, &value))
1093 hsl.s = value; 1073 hsl.s = value;
1094 if (!tint_list->GetReal(2, &hsl.l) && tint_list->GetInteger(2, &value)) 1074 if (!tint_list->GetReal(2, &hsl.l) && tint_list->GetInteger(2, &value))
1095 hsl.l = value; 1075 hsl.l = value;
1096 1076
1097 tints_[WideToUTF8(*iter)] = hsl; 1077 tints_[WideToUTF8(*iter)] = hsl;
1098 } 1078 }
1099 ++iter;
1100 } 1079 }
1101 } 1080 }
1102 1081
1103 void BrowserThemeProvider::SetDisplayPropertyData( 1082 void BrowserThemeProvider::SetDisplayPropertyData(
1104 DictionaryValue* display_properties_value) { 1083 DictionaryValue* display_properties_value) {
1105 display_properties_.clear(); 1084 display_properties_.clear();
1106 1085
1107 if (!display_properties_value) 1086 if (!display_properties_value)
1108 return; 1087 return;
1109 1088
1110 DictionaryValue::key_iterator iter = display_properties_value->begin_keys(); 1089 for (DictionaryValue::key_iterator iter(
1111 while (iter != display_properties_value->end_keys()) { 1090 display_properties_value->begin_keys());
1091 iter != display_properties_value->end_keys(); ++iter) {
1112 // New tab page alignment and background tiling. 1092 // New tab page alignment and background tiling.
1113 if (base::strcasecmp(WideToUTF8(*iter).c_str(), 1093 if (base::strcasecmp(WideToUTF8(*iter).c_str(),
1114 kDisplayPropertyNTPAlignment) == 0) { 1094 kDisplayPropertyNTPAlignment) == 0) {
1115 std::string val; 1095 std::string val;
1116 if (display_properties_value->GetString(*iter, &val)) 1096 if (display_properties_value->GetString(*iter, &val)) {
1117 display_properties_[kDisplayPropertyNTPAlignment] = 1097 display_properties_[kDisplayPropertyNTPAlignment] =
1118 StringToAlignment(val); 1098 StringToAlignment(val);
1099 }
1119 } else if (base::strcasecmp(WideToUTF8(*iter).c_str(), 1100 } else if (base::strcasecmp(WideToUTF8(*iter).c_str(),
1120 kDisplayPropertyNTPTiling) == 0) { 1101 kDisplayPropertyNTPTiling) == 0) {
1121 std::string val; 1102 std::string val;
1122 if (display_properties_value->GetString(*iter, &val)) 1103 if (display_properties_value->GetString(*iter, &val)) {
1123 display_properties_[kDisplayPropertyNTPTiling] = 1104 display_properties_[kDisplayPropertyNTPTiling] =
1124 StringToTiling(val); 1105 StringToTiling(val);
1106 }
1125 } 1107 }
1126 if (base::strcasecmp(WideToUTF8(*iter).c_str(), 1108 if (base::strcasecmp(WideToUTF8(*iter).c_str(),
1127 kDisplayPropertyNTPInverseLogo) == 0) { 1109 kDisplayPropertyNTPInverseLogo) == 0) {
1128 int val = 0; 1110 int val = 0;
1129 if (display_properties_value->GetInteger(*iter, &val)) 1111 if (display_properties_value->GetInteger(*iter, &val))
1130 display_properties_[kDisplayPropertyNTPInverseLogo] = val; 1112 display_properties_[kDisplayPropertyNTPInverseLogo] = val;
1131 } 1113 }
1132 ++iter;
1133 } 1114 }
1134 } 1115 }
1135 1116
1136 SkBitmap* BrowserThemeProvider::GenerateTabBackgroundBitmap(int id) { 1117 SkBitmap* BrowserThemeProvider::GenerateTabBackgroundBitmap(int id) {
1137 if (id == IDR_THEME_TAB_BACKGROUND || 1118 if (id == IDR_THEME_TAB_BACKGROUND ||
1138 id == IDR_THEME_TAB_BACKGROUND_INCOGNITO) { 1119 id == IDR_THEME_TAB_BACKGROUND_INCOGNITO) {
1139 // The requested image is a background tab. Get a frame to create the 1120 // The requested image is a background tab. Get a frame to create the
1140 // tab against. As themes don't use the glass frame, we don't have to 1121 // tab against. As themes don't use the glass frame, we don't have to
1141 // worry about compositing them together, as our default theme provides 1122 // worry about compositing them together, as our default theme provides
1142 // the necessary bitmaps. 1123 // the necessary bitmaps.
1143 if (!process_images_) { 1124 if (!process_images_) {
1144 scoped_ptr<SkBitmap> frame; 1125 scoped_ptr<SkBitmap> frame;
1145 frame.reset(LoadThemeBitmap(id)); 1126 frame.reset(LoadThemeBitmap(id));
1146 if (frame.get()) 1127 if (frame.get())
1147 themed_image_cache_[id] = new SkBitmap(*frame.get()); 1128 themed_image_cache_[id] = new SkBitmap(*frame.get());
1148 } else { 1129 } else {
1149 SkBitmap* bg_tab = GenerateTabBackgroundBitmapImpl(id); 1130 SkBitmap* bg_tab = GenerateTabBackgroundBitmapImpl(id);
1150 1131
1151 if (bg_tab) { 1132 if (bg_tab) {
1152 std::string resource_name; 1133 std::string resource_name((id == IDR_THEME_TAB_BACKGROUND) ?
1153 if (id == IDR_THEME_TAB_BACKGROUND) { 1134 "theme_tab_background" : "theme_tab_background_incognito");
1154 resource_name = "theme_tab_background";
1155 } else {
1156 resource_name = "theme_tab_background_incognito";
1157 }
1158 1135
1159 themed_image_cache_[id] = bg_tab; 1136 themed_image_cache_[id] = bg_tab;
1160 SaveThemeBitmap(resource_name, id); 1137 SaveThemeBitmap(resource_name, id);
1161 return bg_tab; 1138 return bg_tab;
1162 } 1139 }
1163 } 1140 }
1164 } 1141 }
1165 return NULL; 1142 return NULL;
1166 } 1143 }
1167 1144
1168 void BrowserThemeProvider::SaveImageData(DictionaryValue* images_value) { 1145 void BrowserThemeProvider::SaveImageData(DictionaryValue* images_value) {
1169 // Save our images data. 1146 // Save our images data.
1170 DictionaryValue* pref_images = 1147 DictionaryValue* pref_images =
1171 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeImages); 1148 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeImages);
1172 pref_images->Clear(); 1149 pref_images->Clear();
1173 1150
1174 if (images_value) { 1151 if (!images_value)
1175 DictionaryValue::key_iterator iter = images_value->begin_keys(); 1152 return;
1176 while (iter != images_value->end_keys()) { 1153
1177 std::string val; 1154 for (DictionaryValue::key_iterator iter(images_value->begin_keys());
1178 if (images_value->GetString(*iter, &val)) { 1155 iter != images_value->end_keys(); ++iter) {
1179 int id = ThemeResourcesUtil::GetId(WideToUTF8(*iter)); 1156 std::string val;
1180 if (id != -1) 1157 if (images_value->GetString(*iter, &val)) {
1181 pref_images->SetString(*iter, images_[id]); 1158 int id = ThemeResourcesUtil::GetId(WideToUTF8(*iter));
1182 } 1159 if (id != -1)
1183 ++iter; 1160 pref_images->SetString(*iter, images_[id]);
1184 } 1161 }
1185 } 1162 }
1186 } 1163 }
1187 1164
1188 void BrowserThemeProvider::SaveColorData() { 1165 void BrowserThemeProvider::SaveColorData() {
1189 // Save our color data. 1166 // Save our color data.
1190 DictionaryValue* pref_colors = 1167 DictionaryValue* pref_colors =
1191 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeColors); 1168 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeColors);
1192 pref_colors->Clear(); 1169 pref_colors->Clear();
1193 if (colors_.size()) { 1170
1194 ColorMap::iterator iter = colors_.begin(); 1171 if (colors_.empty())
1195 while (iter != colors_.end()) { 1172 return;
1196 SkColor rgba = (*iter).second; 1173
1197 ListValue* rgb_list = new ListValue(); 1174 for (ColorMap::iterator iter(colors_.begin()); iter != colors_.end();
1198 rgb_list->Set(0, Value::CreateIntegerValue(SkColorGetR(rgba))); 1175 ++iter) {
1199 rgb_list->Set(1, Value::CreateIntegerValue(SkColorGetG(rgba))); 1176 SkColor rgba = iter->second;
1200 rgb_list->Set(2, Value::CreateIntegerValue(SkColorGetB(rgba))); 1177 ListValue* rgb_list = new ListValue();
1201 if (SkColorGetA(rgba) != 255) 1178 rgb_list->Set(0, Value::CreateIntegerValue(SkColorGetR(rgba)));
1202 rgb_list->Set(3, Value::CreateRealValue(SkColorGetA(rgba) / 255.0)); 1179 rgb_list->Set(1, Value::CreateIntegerValue(SkColorGetG(rgba)));
1203 pref_colors->Set(UTF8ToWide((*iter).first), rgb_list); 1180 rgb_list->Set(2, Value::CreateIntegerValue(SkColorGetB(rgba)));
1204 ++iter; 1181 if (SkColorGetA(rgba) != 255)
1205 } 1182 rgb_list->Set(3, Value::CreateRealValue(SkColorGetA(rgba) / 255.0));
1183 pref_colors->Set(UTF8ToWide(iter->first), rgb_list);
1206 } 1184 }
1207 } 1185 }
1208 1186
1209 void BrowserThemeProvider::SaveTintData() { 1187 void BrowserThemeProvider::SaveTintData() {
1210 // Save our tint data. 1188 // Save our tint data.
1211 DictionaryValue* pref_tints = 1189 DictionaryValue* pref_tints =
1212 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeTints); 1190 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeTints);
1213 pref_tints->Clear(); 1191 pref_tints->Clear();
1214 if (tints_.size()) { 1192
1215 TintMap::iterator iter = tints_.begin(); 1193 if (tints_.empty())
1216 while (iter != tints_.end()) { 1194 return;
1217 color_utils::HSL hsl = (*iter).second; 1195
1218 ListValue* hsl_list = new ListValue(); 1196 for (TintMap::iterator iter(tints_.begin()); iter != tints_.end(); ++iter) {
1219 hsl_list->Set(0, Value::CreateRealValue(hsl.h)); 1197 color_utils::HSL hsl = iter->second;
1220 hsl_list->Set(1, Value::CreateRealValue(hsl.s)); 1198 ListValue* hsl_list = new ListValue();
1221 hsl_list->Set(2, Value::CreateRealValue(hsl.l)); 1199 hsl_list->Set(0, Value::CreateRealValue(hsl.h));
1222 pref_tints->Set(UTF8ToWide((*iter).first), hsl_list); 1200 hsl_list->Set(1, Value::CreateRealValue(hsl.s));
1223 ++iter; 1201 hsl_list->Set(2, Value::CreateRealValue(hsl.l));
1224 } 1202 pref_tints->Set(UTF8ToWide(iter->first), hsl_list);
1225 } 1203 }
1226 } 1204 }
1227 1205
1228 void BrowserThemeProvider::SaveDisplayPropertyData() { 1206 void BrowserThemeProvider::SaveDisplayPropertyData() {
1229 // Save our display property data. 1207 // Save our display property data.
1230 DictionaryValue* pref_display_properties = 1208 DictionaryValue* pref_display_properties =
1231 profile_->GetPrefs()-> 1209 profile_->GetPrefs()->
1232 GetMutableDictionary(prefs::kCurrentThemeDisplayProperties); 1210 GetMutableDictionary(prefs::kCurrentThemeDisplayProperties);
1233 pref_display_properties->Clear(); 1211 pref_display_properties->Clear();
1234 1212
1235 if (display_properties_.size()) { 1213 if (display_properties_.empty())
1236 DisplayPropertyMap::iterator iter = display_properties_.begin(); 1214 return;
1237 while (iter != display_properties_.end()) { 1215
1238 if (base::strcasecmp((*iter).first.c_str(), 1216 for (DisplayPropertyMap::iterator iter(display_properties_.begin());
1239 kDisplayPropertyNTPAlignment) == 0) { 1217 iter != display_properties_.end(); ++iter) {
1240 pref_display_properties-> 1218 if (base::strcasecmp(iter->first.c_str(),
1241 SetString(UTF8ToWide((*iter).first), AlignmentToString( 1219 kDisplayPropertyNTPAlignment) == 0) {
1242 (*iter).second)); 1220 pref_display_properties->SetString(UTF8ToWide(iter->first),
1243 } else if (base::strcasecmp((*iter).first.c_str(), 1221 AlignmentToString(iter->second));
1244 kDisplayPropertyNTPTiling) == 0) { 1222 } else if (base::strcasecmp(iter->first.c_str(),
1245 pref_display_properties-> 1223 kDisplayPropertyNTPTiling) == 0) {
1246 SetString(UTF8ToWide((*iter).first), TilingToString( 1224 pref_display_properties->SetString(UTF8ToWide(iter->first),
1247 (*iter).second)); 1225 TilingToString(iter->second));
1248 } 1226 }
1249 if (base::strcasecmp((*iter).first.c_str(), 1227 if (base::strcasecmp(iter->first.c_str(),
1250 kDisplayPropertyNTPInverseLogo) == 0) { 1228 kDisplayPropertyNTPInverseLogo) == 0) {
1251 pref_display_properties-> 1229 pref_display_properties->SetInteger(UTF8ToWide(iter->first),
1252 SetInteger(UTF8ToWide((*iter).first), (*iter).second); 1230 iter->second);
1253 }
1254 ++iter;
1255 } 1231 }
1256 } 1232 }
1257 } 1233 }
1258 1234
1259 void BrowserThemeProvider::SaveCachedImageData() { 1235 void BrowserThemeProvider::SaveCachedImageData() {
1260 DictionaryValue* pref_images = 1236 DictionaryValue* pref_images =
1261 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeImages); 1237 profile_->GetPrefs()->GetMutableDictionary(prefs::kCurrentThemeImages);
1262 1238
1263 for (ImagesDiskCache::iterator it = images_disk_cache_.begin(); 1239 for (ImagesDiskCache::iterator it(images_disk_cache_.begin());
1264 it != images_disk_cache_.end(); it++) { 1240 it != images_disk_cache_.end(); ++it) {
1265 std::wstring disk_path = it->first.ToWStringHack(); 1241 std::wstring disk_path = it->first.ToWStringHack();
1266 std::string pref_name = resource_names_[it->second]; 1242 std::string pref_name = resource_names_[it->second];
1267 pref_images->SetString(UTF8ToWide(pref_name), 1243 pref_images->SetString(UTF8ToWide(pref_name), WideToUTF8(disk_path));
1268 WideToUTF8(disk_path));
1269 } 1244 }
1270 profile_->GetPrefs()->SavePersistentPrefs(); 1245 profile_->GetPrefs()->SavePersistentPrefs();
1271 } 1246 }
1272 1247
1273 void BrowserThemeProvider::SaveThemeID(const std::string& id) { 1248 void BrowserThemeProvider::SaveThemeID(const std::string& id) {
1274 profile_->GetPrefs()->SetString(prefs::kCurrentThemeID, UTF8ToWide(id)); 1249 profile_->GetPrefs()->SetString(prefs::kCurrentThemeID, UTF8ToWide(id));
1275 } 1250 }
1276 1251
1277 void BrowserThemeProvider::ClearCaches() { 1252 void BrowserThemeProvider::ClearCaches() {
1278 FreePlatformCaches(); 1253 FreePlatformCaches();
1279 for (ImageCache::iterator i = image_cache_.begin(); 1254 STLDeleteValues(&image_cache_);
1280 i != image_cache_.end(); i++) {
1281 delete i->second;
1282 }
1283 1255
1284 // Scope for AutoLock on themed_image_cache. 1256 // Scope for AutoLock on themed_image_cache.
1285 { 1257 {
1286 AutoLock lock(themed_image_cache_lock_); 1258 AutoLock lock(themed_image_cache_lock_);
1287 for (ImageCache::iterator i = themed_image_cache_.begin(); 1259 STLDeleteValues(&themed_image_cache_);
1288 i != themed_image_cache_.end(); i++) {
1289 delete i->second;
1290 }
1291 themed_image_cache_.clear();
1292 } 1260 }
1293 image_cache_.clear(); 1261
1294 images_disk_cache_.clear(); 1262 images_disk_cache_.clear();
1295 } 1263 }
1296 1264
1297 void BrowserThemeProvider::WriteImagesToDisk() { 1265 void BrowserThemeProvider::WriteImagesToDisk() {
1298 g_browser_process->file_thread()->message_loop()->PostTask(FROM_HERE, 1266 g_browser_process->file_thread()->message_loop()->PostTask(FROM_HERE,
1299 new WriteImagesToDiskTask(images_disk_cache_, themed_image_cache_)); 1267 new WriteImagesToDiskTask(images_disk_cache_, themed_image_cache_));
1300 SaveCachedImageData(); 1268 SaveCachedImageData();
1301 } 1269 }
1302 1270
1303 bool BrowserThemeProvider::ShouldTintFrames() { 1271 bool BrowserThemeProvider::ShouldTintFrames() {
1304 return (HasCustomImage(IDR_THEME_FRAME) || 1272 return (HasCustomImage(IDR_THEME_FRAME) ||
1305 tints_.find(GetTintKey(TINT_BACKGROUND_TAB)) != tints_.end() || 1273 tints_.find(GetTintKey(TINT_BACKGROUND_TAB)) != tints_.end() ||
1306 tints_.find(GetTintKey(TINT_FRAME)) != tints_.end() || 1274 tints_.find(GetTintKey(TINT_FRAME)) != tints_.end() ||
1307 tints_.find(GetTintKey(TINT_FRAME_INACTIVE)) != tints_.end() || 1275 tints_.find(GetTintKey(TINT_FRAME_INACTIVE)) != tints_.end() ||
1308 tints_.find(GetTintKey(TINT_FRAME_INCOGNITO)) != tints_.end() || 1276 tints_.find(GetTintKey(TINT_FRAME_INCOGNITO)) != tints_.end() ||
1309 tints_.find(GetTintKey(TINT_FRAME_INCOGNITO_INACTIVE)) != tints_.end()); 1277 tints_.find(GetTintKey(TINT_FRAME_INCOGNITO_INACTIVE)) != tints_.end());
1310 } 1278 }
OLDNEW
« no previous file with comments | « chrome/browser/browser_theme_provider.h ('k') | chrome/browser/browser_theme_provider_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698