Chromium Code Reviews| 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 "ui/base/resource/resource_bundle.h" | 5 #include "ui/base/resource/resource_bundle.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 UnloadLocaleResources(); | 400 UnloadLocaleResources(); |
| 401 return LoadLocaleResources(pref_locale); | 401 return LoadLocaleResources(pref_locale); |
| 402 } | 402 } |
| 403 | 403 |
| 404 gfx::ImageSkia* ResourceBundle::GetImageSkiaNamed(int resource_id) { | 404 gfx::ImageSkia* ResourceBundle::GetImageSkiaNamed(int resource_id) { |
| 405 const gfx::ImageSkia* image = GetImageNamed(resource_id).ToImageSkia(); | 405 const gfx::ImageSkia* image = GetImageNamed(resource_id).ToImageSkia(); |
| 406 return const_cast<gfx::ImageSkia*>(image); | 406 return const_cast<gfx::ImageSkia*>(image); |
| 407 } | 407 } |
| 408 | 408 |
| 409 gfx::Image& ResourceBundle::GetImageNamed(int resource_id) { | 409 gfx::Image& ResourceBundle::GetImageNamed(int resource_id) { |
| 410 DCHECK(sequence_checker_.CalledOnValidSequence()); | |
| 411 | |
| 410 // Check to see if the image is already in the cache. | 412 // Check to see if the image is already in the cache. |
| 411 { | 413 if (images_.count(resource_id)) |
| 412 base::AutoLock lock_scope(*images_and_fonts_lock_); | 414 return images_[resource_id]; |
| 413 if (images_.count(resource_id)) | |
| 414 return images_[resource_id]; | |
| 415 } | |
| 416 | 415 |
| 417 gfx::Image image; | 416 gfx::Image image; |
| 418 if (delegate_) | 417 if (delegate_) |
| 419 image = delegate_->GetImageNamed(resource_id); | 418 image = delegate_->GetImageNamed(resource_id); |
| 420 | 419 |
| 421 if (image.IsEmpty()) { | 420 if (image.IsEmpty()) { |
| 422 DCHECK(!data_packs_.empty()) << | 421 DCHECK(!data_packs_.empty()) << |
| 423 "Missing call to SetResourcesDataDLL?"; | 422 "Missing call to SetResourcesDataDLL?"; |
| 424 | 423 |
| 425 #if defined(OS_CHROMEOS) | 424 #if defined(OS_CHROMEOS) |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 443 LOG(WARNING) << "Unable to load image with id " << resource_id; | 442 LOG(WARNING) << "Unable to load image with id " << resource_id; |
| 444 NOTREACHED(); // Want to assert in debug mode. | 443 NOTREACHED(); // Want to assert in debug mode. |
| 445 // The load failed to retrieve the image; show a debugging red square. | 444 // The load failed to retrieve the image; show a debugging red square. |
| 446 return GetEmptyImage(); | 445 return GetEmptyImage(); |
| 447 } | 446 } |
| 448 image_skia.SetReadOnly(); | 447 image_skia.SetReadOnly(); |
| 449 image = gfx::Image(image_skia); | 448 image = gfx::Image(image_skia); |
| 450 } | 449 } |
| 451 | 450 |
| 452 // The load was successful, so cache the image. | 451 // The load was successful, so cache the image. |
| 453 base::AutoLock lock_scope(*images_and_fonts_lock_); | |
| 454 | |
| 455 // Another thread raced the load and has already cached the image. | |
| 456 if (images_.count(resource_id)) | |
| 457 return images_[resource_id]; | |
| 458 | |
| 459 images_[resource_id] = image; | 452 images_[resource_id] = image; |
| 460 return images_[resource_id]; | 453 return images_[resource_id]; |
| 461 } | 454 } |
| 462 | 455 |
| 463 base::RefCountedMemory* ResourceBundle::LoadDataResourceBytes( | 456 base::RefCountedMemory* ResourceBundle::LoadDataResourceBytes( |
| 464 int resource_id) const { | 457 int resource_id) const { |
| 465 return LoadDataResourceBytesForScale(resource_id, ui::SCALE_FACTOR_NONE); | 458 return LoadDataResourceBytesForScale(resource_id, ui::SCALE_FACTOR_NONE); |
| 466 } | 459 } |
| 467 | 460 |
| 468 base::RefCountedMemory* ResourceBundle::LoadDataResourceBytesForScale( | 461 base::RefCountedMemory* ResourceBundle::LoadDataResourceBytesForScale( |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 579 } | 572 } |
| 580 } | 573 } |
| 581 // Release lock_scope and fall back to main data pack. | 574 // Release lock_scope and fall back to main data pack. |
| 582 return LoadDataResourceBytes(resource_id); | 575 return LoadDataResourceBytes(resource_id); |
| 583 } | 576 } |
| 584 | 577 |
| 585 const gfx::FontList& ResourceBundle::GetFontListWithDelta( | 578 const gfx::FontList& ResourceBundle::GetFontListWithDelta( |
| 586 int size_delta, | 579 int size_delta, |
| 587 gfx::Font::FontStyle style, | 580 gfx::Font::FontStyle style, |
| 588 gfx::Font::Weight weight) { | 581 gfx::Font::Weight weight) { |
| 589 base::AutoLock lock_scope(*images_and_fonts_lock_); | 582 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 590 | 583 |
| 591 const FontKey styled_key(size_delta, style, weight); | 584 const FontKey styled_key(size_delta, style, weight); |
| 592 | 585 |
| 593 auto found = font_cache_.find(styled_key); | 586 auto found = font_cache_.find(styled_key); |
| 594 if (found != font_cache_.end()) | 587 if (found != font_cache_.end()) |
| 595 return found->second; | 588 return found->second; |
| 596 | 589 |
| 597 const FontKey base_key(0, gfx::Font::NORMAL, gfx::Font::Weight::NORMAL); | 590 const FontKey base_key(0, gfx::Font::NORMAL, gfx::Font::Weight::NORMAL); |
| 598 gfx::FontList& base = font_cache_[base_key]; | 591 gfx::FontList& base = font_cache_[base_key]; |
| 599 if (styled_key == base_key) | 592 if (styled_key == base_key) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 648 } | 641 } |
| 649 | 642 |
| 650 return GetFontListWithDelta(size_delta, gfx::Font::NORMAL, font_weight); | 643 return GetFontListWithDelta(size_delta, gfx::Font::NORMAL, font_weight); |
| 651 } | 644 } |
| 652 | 645 |
| 653 const gfx::Font& ResourceBundle::GetFont(FontStyle style) { | 646 const gfx::Font& ResourceBundle::GetFont(FontStyle style) { |
| 654 return GetFontList(style).GetPrimaryFont(); | 647 return GetFontList(style).GetPrimaryFont(); |
| 655 } | 648 } |
| 656 | 649 |
| 657 void ResourceBundle::ReloadFonts() { | 650 void ResourceBundle::ReloadFonts() { |
| 658 base::AutoLock lock_scope(*images_and_fonts_lock_); | 651 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 659 InitDefaultFontList(); | 652 InitDefaultFontList(); |
| 660 font_cache_.clear(); | 653 font_cache_.clear(); |
| 661 } | 654 } |
| 662 | 655 |
| 663 ScaleFactor ResourceBundle::GetMaxScaleFactor() const { | 656 ScaleFactor ResourceBundle::GetMaxScaleFactor() const { |
| 664 #if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX) | 657 #if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX) |
| 665 return max_scale_factor_; | 658 return max_scale_factor_; |
| 666 #else | 659 #else |
| 667 return GetSupportedScaleFactors().back(); | 660 return GetSupportedScaleFactors().back(); |
| 668 #endif | 661 #endif |
| 669 } | 662 } |
| 670 | 663 |
| 671 bool ResourceBundle::IsScaleFactorSupported(ScaleFactor scale_factor) { | 664 bool ResourceBundle::IsScaleFactorSupported(ScaleFactor scale_factor) { |
| 672 const std::vector<ScaleFactor>& supported_scale_factors = | 665 const std::vector<ScaleFactor>& supported_scale_factors = |
| 673 ui::GetSupportedScaleFactors(); | 666 ui::GetSupportedScaleFactors(); |
| 674 return std::find(supported_scale_factors.begin(), | 667 return std::find(supported_scale_factors.begin(), |
| 675 supported_scale_factors.end(), | 668 supported_scale_factors.end(), |
| 676 scale_factor) != supported_scale_factors.end(); | 669 scale_factor) != supported_scale_factors.end(); |
| 677 } | 670 } |
| 678 | 671 |
| 679 ResourceBundle::ResourceBundle(Delegate* delegate) | 672 ResourceBundle::ResourceBundle(Delegate* delegate) |
| 680 : delegate_(delegate), | 673 : delegate_(delegate), |
| 681 images_and_fonts_lock_(new base::Lock), | |
| 682 locale_resources_data_lock_(new base::Lock), | 674 locale_resources_data_lock_(new base::Lock), |
| 683 max_scale_factor_(SCALE_FACTOR_100P) { | 675 max_scale_factor_(SCALE_FACTOR_100P) { |
| 684 } | 676 } |
| 685 | 677 |
| 686 ResourceBundle::~ResourceBundle() { | 678 ResourceBundle::~ResourceBundle() { |
| 687 FreeImages(); | 679 FreeImages(); |
| 688 UnloadLocaleResources(); | 680 UnloadLocaleResources(); |
| 689 } | 681 } |
| 690 | 682 |
| 691 // static | 683 // static |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 775 data_pack->CheckForDuplicateResources(data_packs_); | 767 data_pack->CheckForDuplicateResources(data_packs_); |
| 776 #endif | 768 #endif |
| 777 | 769 |
| 778 if (GetScaleForScaleFactor(data_pack->GetScaleFactor()) > | 770 if (GetScaleForScaleFactor(data_pack->GetScaleFactor()) > |
| 779 GetScaleForScaleFactor(max_scale_factor_)) | 771 GetScaleForScaleFactor(max_scale_factor_)) |
| 780 max_scale_factor_ = data_pack->GetScaleFactor(); | 772 max_scale_factor_ = data_pack->GetScaleFactor(); |
| 781 | 773 |
| 782 data_packs_.push_back(std::move(data_pack)); | 774 data_packs_.push_back(std::move(data_pack)); |
| 783 } | 775 } |
| 784 | 776 |
| 785 void ResourceBundle::InitDefaultFontList() { | 777 void ResourceBundle::InitDefaultFontList() { |
|
Yuki
2017/02/21 06:23:54
You may want to add DCHECK here, too.
tzik
2017/02/22 07:19:21
Done.
| |
| 786 #if defined(OS_CHROMEOS) | 778 #if defined(OS_CHROMEOS) |
| 787 std::string font_family = base::UTF16ToUTF8( | 779 std::string font_family = base::UTF16ToUTF8( |
| 788 GetLocalizedString(IDS_UI_FONT_FAMILY_CROS)); | 780 GetLocalizedString(IDS_UI_FONT_FAMILY_CROS)); |
| 789 gfx::FontList::SetDefaultFontDescription(font_family); | 781 gfx::FontList::SetDefaultFontDescription(font_family); |
| 790 | 782 |
| 791 // TODO(yukishiino): Remove SetDefaultFontDescription() once the migration to | 783 // TODO(yukishiino): Remove SetDefaultFontDescription() once the migration to |
| 792 // the font list is done. We will no longer need SetDefaultFontDescription() | 784 // the font list is done. We will no longer need SetDefaultFontDescription() |
| 793 // after every client gets started using a FontList instead of a Font. | 785 // after every client gets started using a FontList instead of a Font. |
| 794 gfx::PlatformFontLinux::SetDefaultFontDescription(font_family); | 786 gfx::PlatformFontLinux::SetDefaultFontDescription(font_family); |
| 795 #else | 787 #else |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 855 *fell_back_to_1x = true; | 847 *fell_back_to_1x = true; |
| 856 return true; | 848 return true; |
| 857 } | 849 } |
| 858 } | 850 } |
| 859 } | 851 } |
| 860 | 852 |
| 861 return false; | 853 return false; |
| 862 } | 854 } |
| 863 | 855 |
| 864 gfx::Image& ResourceBundle::GetEmptyImage() { | 856 gfx::Image& ResourceBundle::GetEmptyImage() { |
| 865 base::AutoLock lock(*images_and_fonts_lock_); | 857 DCHECK(sequence_checker_.CalledOnValidSequence()); |
| 866 | 858 |
| 867 if (empty_image_.IsEmpty()) { | 859 if (empty_image_.IsEmpty()) { |
| 868 // The placeholder bitmap is bright red so people notice the problem. | 860 // The placeholder bitmap is bright red so people notice the problem. |
| 869 SkBitmap bitmap = CreateEmptyBitmap(); | 861 SkBitmap bitmap = CreateEmptyBitmap(); |
| 870 empty_image_ = gfx::Image::CreateFrom1xBitmap(bitmap); | 862 empty_image_ = gfx::Image::CreateFrom1xBitmap(bitmap); |
| 871 } | 863 } |
| 872 return empty_image_; | 864 return empty_image_; |
| 873 } | 865 } |
| 874 | 866 |
| 875 // static | 867 // static |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 // static | 902 // static |
| 911 bool ResourceBundle::DecodePNG(const unsigned char* buf, | 903 bool ResourceBundle::DecodePNG(const unsigned char* buf, |
| 912 size_t size, | 904 size_t size, |
| 913 SkBitmap* bitmap, | 905 SkBitmap* bitmap, |
| 914 bool* fell_back_to_1x) { | 906 bool* fell_back_to_1x) { |
| 915 *fell_back_to_1x = PNGContainsFallbackMarker(buf, size); | 907 *fell_back_to_1x = PNGContainsFallbackMarker(buf, size); |
| 916 return gfx::PNGCodec::Decode(buf, size, bitmap); | 908 return gfx::PNGCodec::Decode(buf, size, bitmap); |
| 917 } | 909 } |
| 918 | 910 |
| 919 } // namespace ui | 911 } // namespace ui |
| OLD | NEW |