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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/ref_counted_memory.h" | 12 #include "base/memory/ref_counted_memory.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/path_service.h" | 14 #include "base/path_service.h" |
| 15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 16 #include "base/strings/string_piece.h" | 16 #include "base/strings/string_piece.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 18 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
| 19 #include "build/build_config.h" | 19 #include "build/build_config.h" |
| 20 #include "grit/app_locale_settings.h" | |
| 20 #include "net/base/big_endian.h" | 21 #include "net/base/big_endian.h" |
| 21 #include "skia/ext/image_operations.h" | 22 #include "skia/ext/image_operations.h" |
| 22 #include "third_party/skia/include/core/SkBitmap.h" | 23 #include "third_party/skia/include/core/SkBitmap.h" |
| 23 #include "ui/base/l10n/l10n_util.h" | 24 #include "ui/base/l10n/l10n_util.h" |
| 24 #include "ui/base/layout.h" | 25 #include "ui/base/layout.h" |
| 25 #include "ui/base/resource/data_pack.h" | 26 #include "ui/base/resource/data_pack.h" |
| 26 #include "ui/base/ui_base_paths.h" | 27 #include "ui/base/ui_base_paths.h" |
| 27 #include "ui/base/ui_base_switches.h" | 28 #include "ui/base/ui_base_switches.h" |
| 28 #include "ui/gfx/codec/jpeg_codec.h" | 29 #include "ui/gfx/codec/jpeg_codec.h" |
| 29 #include "ui/gfx/codec/png_codec.h" | 30 #include "ui/gfx/codec/png_codec.h" |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 450 string16 msg; | 451 string16 msg; |
| 451 if (encoding == ResourceHandle::UTF16) { | 452 if (encoding == ResourceHandle::UTF16) { |
| 452 msg = string16(reinterpret_cast<const char16*>(data.data()), | 453 msg = string16(reinterpret_cast<const char16*>(data.data()), |
| 453 data.length() / 2); | 454 data.length() / 2); |
| 454 } else if (encoding == ResourceHandle::UTF8) { | 455 } else if (encoding == ResourceHandle::UTF8) { |
| 455 msg = UTF8ToUTF16(data); | 456 msg = UTF8ToUTF16(data); |
| 456 } | 457 } |
| 457 return msg; | 458 return msg; |
| 458 } | 459 } |
| 459 | 460 |
| 460 const gfx::Font& ResourceBundle::GetFont(FontStyle style) { | 461 const gfx::FontList& ResourceBundle::GetFontList(FontStyle style) { |
| 461 { | 462 { |
| 462 base::AutoLock lock_scope(*images_and_fonts_lock_); | 463 base::AutoLock lock_scope(*images_and_fonts_lock_); |
| 463 LoadFontsIfNecessary(); | 464 LoadFontsIfNecessary(); |
| 464 } | 465 } |
| 465 switch (style) { | 466 switch (style) { |
| 466 case BoldFont: | 467 case BoldFont: |
| 467 return *bold_font_; | 468 return *bold_font_list_; |
| 468 case SmallFont: | 469 case SmallFont: |
| 469 return *small_font_; | 470 return *small_font_list_; |
| 470 case MediumFont: | 471 case MediumFont: |
| 471 return *medium_font_; | 472 return *medium_font_list_; |
| 472 case SmallBoldFont: | 473 case SmallBoldFont: |
| 473 return *small_bold_font_; | 474 return *small_bold_font_list_; |
| 474 case MediumBoldFont: | 475 case MediumBoldFont: |
| 475 return *medium_bold_font_; | 476 return *medium_bold_font_list_; |
| 476 case LargeFont: | 477 case LargeFont: |
| 477 return *large_font_; | 478 return *large_font_list_; |
| 478 case LargeBoldFont: | 479 case LargeBoldFont: |
| 479 return *large_bold_font_; | 480 return *large_bold_font_list_; |
| 480 default: | 481 default: |
| 481 return *base_font_; | 482 return *base_font_list_; |
| 482 } | 483 } |
| 483 } | 484 } |
| 484 | 485 |
| 486 const gfx::Font& ResourceBundle::GetFont(FontStyle style) { | |
| 487 return GetFontList(style).GetPrimaryFont(); | |
| 488 } | |
| 489 | |
| 485 void ResourceBundle::ReloadFonts() { | 490 void ResourceBundle::ReloadFonts() { |
| 486 base::AutoLock lock_scope(*images_and_fonts_lock_); | 491 base::AutoLock lock_scope(*images_and_fonts_lock_); |
| 487 base_font_.reset(); | 492 base_font_list_.reset(); |
| 488 LoadFontsIfNecessary(); | 493 LoadFontsIfNecessary(); |
| 489 } | 494 } |
| 490 | 495 |
| 491 ResourceBundle::ResourceBundle(Delegate* delegate) | 496 ResourceBundle::ResourceBundle(Delegate* delegate) |
| 492 : delegate_(delegate), | 497 : delegate_(delegate), |
| 493 images_and_fonts_lock_(new base::Lock), | 498 images_and_fonts_lock_(new base::Lock), |
| 494 locale_resources_data_lock_(new base::Lock), | 499 locale_resources_data_lock_(new base::Lock), |
| 495 max_scale_factor_(SCALE_FACTOR_100P) { | 500 max_scale_factor_(SCALE_FACTOR_100P) { |
| 496 } | 501 } |
| 497 | 502 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 532 void ResourceBundle::AddDataPack(DataPack* data_pack) { | 537 void ResourceBundle::AddDataPack(DataPack* data_pack) { |
| 533 data_packs_.push_back(data_pack); | 538 data_packs_.push_back(data_pack); |
| 534 | 539 |
| 535 if (GetScaleFactorScale(data_pack->GetScaleFactor()) > | 540 if (GetScaleFactorScale(data_pack->GetScaleFactor()) > |
| 536 GetScaleFactorScale(max_scale_factor_)) | 541 GetScaleFactorScale(max_scale_factor_)) |
| 537 max_scale_factor_ = data_pack->GetScaleFactor(); | 542 max_scale_factor_ = data_pack->GetScaleFactor(); |
| 538 } | 543 } |
| 539 | 544 |
| 540 void ResourceBundle::LoadFontsIfNecessary() { | 545 void ResourceBundle::LoadFontsIfNecessary() { |
| 541 images_and_fonts_lock_->AssertAcquired(); | 546 images_and_fonts_lock_->AssertAcquired(); |
| 542 if (!base_font_.get()) { | 547 if (!base_font_list_.get()) { |
| 543 if (delegate_) { | 548 if (delegate_) { |
| 544 base_font_.reset(delegate_->GetFont(BaseFont).release()); | 549 base_font_list_ = GetFontListFromDelegate(BaseFont); |
| 545 bold_font_.reset(delegate_->GetFont(BoldFont).release()); | 550 bold_font_list_ = GetFontListFromDelegate(BoldFont); |
| 546 small_font_.reset(delegate_->GetFont(SmallFont).release()); | 551 small_font_list_ = GetFontListFromDelegate(SmallFont); |
| 547 small_bold_font_.reset(delegate_->GetFont(SmallBoldFont).release()); | 552 small_bold_font_list_ = GetFontListFromDelegate(SmallBoldFont); |
| 548 medium_font_.reset(delegate_->GetFont(MediumFont).release()); | 553 medium_font_list_ = GetFontListFromDelegate(MediumFont); |
| 549 medium_bold_font_.reset(delegate_->GetFont(MediumBoldFont).release()); | 554 medium_bold_font_list_ = GetFontListFromDelegate(MediumBoldFont); |
| 550 large_font_.reset(delegate_->GetFont(LargeFont).release()); | 555 large_font_list_ = GetFontListFromDelegate(LargeFont); |
| 551 large_bold_font_.reset(delegate_->GetFont(LargeBoldFont).release()); | 556 large_bold_font_list_ = GetFontListFromDelegate(LargeBoldFont); |
| 552 } | 557 } |
| 553 | 558 |
| 554 if (!base_font_.get()) | 559 if (!base_font_list_.get()) { |
| 555 base_font_.reset(new gfx::Font()); | 560 #if defined(OS_CHROMEOS) |
| 556 | 561 base_font_list_.reset(new gfx::FontList( |
| 557 if (!bold_font_.get()) { | 562 l10n_util::GetStringUTF8(IDS_UI_FONT_FAMILY_CROS))); |
| 558 bold_font_.reset(new gfx::Font()); | 563 #else |
| 559 *bold_font_ = | 564 base_font_list_.reset(new gfx::FontList()); |
| 560 base_font_->DeriveFont(0, base_font_->GetStyle() | gfx::Font::BOLD); | 565 #endif |
| 561 } | 566 } |
| 562 | 567 |
| 563 if (!small_font_.get()) { | 568 if (!bold_font_list_.get()) { |
| 564 small_font_.reset(new gfx::Font()); | 569 bold_font_list_.reset(new gfx::FontList()); |
| 565 *small_font_ = base_font_->DeriveFont(kSmallFontSizeDelta); | 570 *bold_font_list_ = base_font_list_->DeriveFontList( |
| 571 base_font_list_->GetFontStyle() | gfx::Font::BOLD); | |
| 566 } | 572 } |
| 567 | 573 |
| 568 if (!small_bold_font_.get()) { | 574 if (!small_font_list_.get()) { |
| 569 small_bold_font_.reset(new gfx::Font()); | 575 small_font_list_.reset(new gfx::FontList()); |
| 570 *small_bold_font_ = base_font_->DeriveFont( | 576 *small_font_list_ = base_font_list_->DeriveFontListWithSize( |
| 571 kSmallFontSizeDelta, base_font_->GetStyle() | gfx::Font::BOLD); | 577 base_font_list_->GetFontSize() + kSmallFontSizeDelta); |
| 572 } | 578 } |
| 573 | 579 |
| 574 if (!medium_font_.get()) { | 580 if (!small_bold_font_list_.get()) { |
| 575 medium_font_.reset(new gfx::Font()); | 581 small_bold_font_list_.reset(new gfx::FontList()); |
| 576 *medium_font_ = base_font_->DeriveFont(kMediumFontSizeDelta); | 582 *small_bold_font_list_ = small_font_list_->DeriveFontList( |
| 583 small_font_list_->GetFontStyle() | gfx::Font::BOLD); | |
| 577 } | 584 } |
| 578 | 585 |
| 579 if (!medium_bold_font_.get()) { | 586 if (!medium_font_list_.get()) { |
| 580 medium_bold_font_.reset(new gfx::Font()); | 587 medium_font_list_.reset(new gfx::FontList()); |
| 581 *medium_bold_font_ = | 588 *medium_font_list_ = base_font_list_->DeriveFontListWithSize( |
| 582 base_font_->DeriveFont(kMediumFontSizeDelta, | 589 base_font_list_->GetFontSize() + kMediumFontSizeDelta); |
| 583 base_font_->GetStyle() | gfx::Font::BOLD); | |
| 584 } | 590 } |
| 585 | 591 |
| 586 if (!large_font_.get()) { | 592 if (!medium_bold_font_list_.get()) { |
| 587 large_font_.reset(new gfx::Font()); | 593 medium_bold_font_list_.reset(new gfx::FontList()); |
| 588 *large_font_ = base_font_->DeriveFont(kLargeFontSizeDelta); | 594 *medium_bold_font_list_ = medium_font_list_->DeriveFontList( |
| 595 medium_font_list_->GetFontStyle() | gfx::Font::BOLD); | |
| 589 } | 596 } |
| 590 | 597 |
| 591 if (!large_bold_font_.get()) { | 598 if (!large_font_list_.get()) { |
| 592 large_bold_font_.reset(new gfx::Font()); | 599 large_font_list_.reset(new gfx::FontList()); |
| 593 *large_bold_font_ = | 600 *large_font_list_ = base_font_list_->DeriveFontListWithSize( |
| 594 base_font_->DeriveFont(kLargeFontSizeDelta, | 601 base_font_list_->GetFontSize() + kLargeFontSizeDelta); |
| 595 base_font_->GetStyle() | gfx::Font::BOLD); | 602 } |
| 603 | |
| 604 if (!large_bold_font_list_.get()) { | |
| 605 large_bold_font_list_.reset(new gfx::FontList()); | |
| 606 *large_bold_font_list_ = large_font_list_->DeriveFontList( | |
| 607 large_font_list_->GetFontStyle() | gfx::Font::BOLD); | |
| 596 } | 608 } |
| 597 } | 609 } |
| 598 } | 610 } |
| 599 | 611 |
| 612 scoped_ptr<gfx::FontList> ResourceBundle::GetFontListFromDelegate( | |
| 613 FontStyle style) { | |
| 614 DCHECK(delegate_); | |
| 615 scoped_ptr<gfx::Font> font = delegate_->GetFont(style); | |
| 616 if (font.get()) | |
| 617 return scoped_ptr<gfx::FontList>(new gfx::FontList(*font)); | |
| 618 else | |
|
tony
2013/08/01 16:48:07
Nit: else not needed.
Yuki
2013/08/02 06:00:29
Sent out a CL http://crrev.com/21734002
Thanks.
| |
| 619 return scoped_ptr<gfx::FontList>(); | |
| 620 } | |
| 621 | |
| 600 bool ResourceBundle::LoadBitmap(const ResourceHandle& data_handle, | 622 bool ResourceBundle::LoadBitmap(const ResourceHandle& data_handle, |
| 601 int resource_id, | 623 int resource_id, |
| 602 SkBitmap* bitmap, | 624 SkBitmap* bitmap, |
| 603 bool* fell_back_to_1x) const { | 625 bool* fell_back_to_1x) const { |
| 604 DCHECK(fell_back_to_1x); | 626 DCHECK(fell_back_to_1x); |
| 605 scoped_refptr<base::RefCountedMemory> memory( | 627 scoped_refptr<base::RefCountedMemory> memory( |
| 606 data_handle.GetStaticMemory(resource_id)); | 628 data_handle.GetStaticMemory(resource_id)); |
| 607 if (!memory.get()) | 629 if (!memory.get()) |
| 608 return false; | 630 return false; |
| 609 | 631 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 706 // static | 728 // static |
| 707 bool ResourceBundle::DecodePNG(const unsigned char* buf, | 729 bool ResourceBundle::DecodePNG(const unsigned char* buf, |
| 708 size_t size, | 730 size_t size, |
| 709 SkBitmap* bitmap, | 731 SkBitmap* bitmap, |
| 710 bool* fell_back_to_1x) { | 732 bool* fell_back_to_1x) { |
| 711 *fell_back_to_1x = PNGContainsFallbackMarker(buf, size); | 733 *fell_back_to_1x = PNGContainsFallbackMarker(buf, size); |
| 712 return gfx::PNGCodec::Decode(buf, size, bitmap); | 734 return gfx::PNGCodec::Decode(buf, size, bitmap); |
| 713 } | 735 } |
| 714 | 736 |
| 715 } // namespace ui | 737 } // namespace ui |
| OLD | NEW |