| 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.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 if (!data_pack_.get()) { | 540 if (!data_pack_.get()) { |
| 541 delete header_; | 541 delete header_; |
| 542 delete [] tints_; | 542 delete [] tints_; |
| 543 delete [] colors_; | 543 delete [] colors_; |
| 544 delete [] display_properties_; | 544 delete [] display_properties_; |
| 545 delete [] source_images_; | 545 delete [] source_images_; |
| 546 } | 546 } |
| 547 } | 547 } |
| 548 | 548 |
| 549 // static | 549 // static |
| 550 scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromExtension( | 550 void BrowserThemePack::BuildFromExtension( |
| 551 const Extension* extension) { | 551 const extensions::Extension* extension, |
| 552 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 552 scoped_refptr<BrowserThemePack> pack) { |
| 553 DCHECK(extension); | 553 DCHECK(extension); |
| 554 DCHECK(extension->is_theme()); | 554 DCHECK(extension->is_theme()); |
| 555 DCHECK(!pack->is_valid()); |
| 555 | 556 |
| 556 scoped_refptr<BrowserThemePack> pack(new BrowserThemePack); | |
| 557 pack->BuildHeader(extension); | 557 pack->BuildHeader(extension); |
| 558 pack->BuildTintsFromJSON(extensions::ThemeInfo::GetTints(extension)); | 558 pack->BuildTintsFromJSON(extensions::ThemeInfo::GetTints(extension)); |
| 559 pack->BuildColorsFromJSON(extensions::ThemeInfo::GetColors(extension)); | 559 pack->BuildColorsFromJSON(extensions::ThemeInfo::GetColors(extension)); |
| 560 pack->BuildDisplayPropertiesFromJSON( | 560 pack->BuildDisplayPropertiesFromJSON( |
| 561 extensions::ThemeInfo::GetDisplayProperties(extension)); | 561 extensions::ThemeInfo::GetDisplayProperties(extension)); |
| 562 | 562 |
| 563 // Builds the images. (Image building is dependent on tints). | 563 // Builds the images. (Image building is dependent on tints). |
| 564 FilePathMap file_paths; | 564 FilePathMap file_paths; |
| 565 pack->ParseImageNamesFromJSON( | 565 pack->ParseImageNamesFromJSON( |
| 566 extensions::ThemeInfo::GetImages(extension), | 566 extensions::ThemeInfo::GetImages(extension), |
| 567 extension->path(), | 567 extension->path(), |
| 568 &file_paths); | 568 &file_paths); |
| 569 pack->BuildSourceImagesArray(file_paths); | 569 pack->BuildSourceImagesArray(file_paths); |
| 570 | 570 |
| 571 if (!pack->LoadRawBitmapsTo(file_paths, &pack->images_on_ui_thread_)) | 571 if (!pack->LoadRawBitmapsTo(file_paths, &pack->images_)) |
| 572 return NULL; | 572 return; |
| 573 | 573 |
| 574 pack->CreateImages(&pack->images_on_ui_thread_); | 574 pack->CreateImages(&pack->images_); |
| 575 | 575 |
| 576 // Make sure the |images_on_file_thread_| has bitmaps for supported | 576 // Make sure the |images_on_file_thread_| has bitmaps for supported |
| 577 // scale factors before passing to FILE thread. | 577 // scale factors before passing to FILE thread. |
| 578 pack->images_on_file_thread_ = pack->images_on_ui_thread_; | 578 pack->images_on_file_thread_ = pack->images_; |
| 579 for (ImageCache::iterator it = pack->images_on_file_thread_.begin(); | 579 for (ImageCache::iterator it = pack->images_on_file_thread_.begin(); |
| 580 it != pack->images_on_file_thread_.end(); ++it) { | 580 it != pack->images_on_file_thread_.end(); ++it) { |
| 581 gfx::ImageSkia* image_skia = | 581 gfx::ImageSkia* image_skia = |
| 582 const_cast<gfx::ImageSkia*>(it->second.ToImageSkia()); | 582 const_cast<gfx::ImageSkia*>(it->second.ToImageSkia()); |
| 583 image_skia->MakeThreadSafe(); | 583 image_skia->MakeThreadSafe(); |
| 584 } | 584 } |
| 585 | 585 |
| 586 // Set ThemeImageSource on |images_on_ui_thread_| to resample the source | 586 // Set ThemeImageSource on |images_| to resample the source |
| 587 // image if a caller of BrowserThemePack::GetImageNamed() requests an | 587 // image if a caller of BrowserThemePack::GetImageNamed() requests an |
| 588 // ImageSkiaRep for a scale factor not specified by the theme author. | 588 // ImageSkiaRep for a scale factor not specified by the theme author. |
| 589 // Callers of BrowserThemePack::GetImageNamed() to be able to retrieve | 589 // Callers of BrowserThemePack::GetImageNamed() to be able to retrieve |
| 590 // ImageSkiaReps for all supported scale factors. | 590 // ImageSkiaReps for all supported scale factors. |
| 591 for (ImageCache::iterator it = pack->images_on_ui_thread_.begin(); | 591 for (ImageCache::iterator it = pack->images_.begin(); |
| 592 it != pack->images_on_ui_thread_.end(); ++it) { | 592 it != pack->images_.end(); ++it) { |
| 593 const gfx::ImageSkia source_image_skia = it->second.AsImageSkia(); | 593 const gfx::ImageSkia source_image_skia = it->second.AsImageSkia(); |
| 594 ThemeImageSource* source = new ThemeImageSource(source_image_skia); | 594 ThemeImageSource* source = new ThemeImageSource(source_image_skia); |
| 595 // image_skia takes ownership of source. | 595 // image_skia takes ownership of source. |
| 596 gfx::ImageSkia image_skia(source, source_image_skia.size()); | 596 gfx::ImageSkia image_skia(source, source_image_skia.size()); |
| 597 it->second = gfx::Image(image_skia); | 597 it->second = gfx::Image(image_skia); |
| 598 } | 598 } |
| 599 | 599 |
| 600 // Generate raw images (for new-tab-page attribution and background) for | 600 // Generate raw images (for new-tab-page attribution and background) for |
| 601 // any missing scale from an available scale image. | 601 // any missing scale from an available scale image. |
| 602 for (size_t i = 0; i < arraysize(kPreloadIDs); ++i) { | 602 for (size_t i = 0; i < arraysize(kPreloadIDs); ++i) { |
| 603 pack->GenerateRawImageForAllSupportedScales(kPreloadIDs[i]); | 603 pack->GenerateRawImageForAllSupportedScales(kPreloadIDs[i]); |
| 604 } | 604 } |
| 605 | 605 |
| 606 // The BrowserThemePack is now in a consistent state. | 606 // The BrowserThemePack is now in a consistent state. |
| 607 return pack; | 607 pack->is_valid_ = true; |
| 608 } | 608 } |
| 609 | 609 |
| 610 // static | 610 // static |
| 611 scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromDataPack( | 611 scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromDataPack( |
| 612 const base::FilePath& path, const std::string& expected_id) { | 612 const base::FilePath& path, const std::string& expected_id) { |
| 613 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 613 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 614 // Allow IO on UI thread due to deep-seated theme design issues. | 614 // Allow IO on UI thread due to deep-seated theme design issues. |
| 615 // (see http://crbug.com/80206) | 615 // (see http://crbug.com/80206) |
| 616 base::ThreadRestrictions::ScopedAllowIO allow_io; | 616 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 617 scoped_refptr<BrowserThemePack> pack(new BrowserThemePack); | 617 scoped_refptr<BrowserThemePack> pack(new BrowserThemePack); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 const_cast<char*>(pointer.data())); | 665 const_cast<char*>(pointer.data())); |
| 666 | 666 |
| 667 if (!pack->data_pack_->GetStringPiece(kScaleFactorsID, &pointer)) | 667 if (!pack->data_pack_->GetStringPiece(kScaleFactorsID, &pointer)) |
| 668 return NULL; | 668 return NULL; |
| 669 | 669 |
| 670 if (!InputScalesValid(pointer, pack->scale_factors_)) { | 670 if (!InputScalesValid(pointer, pack->scale_factors_)) { |
| 671 DLOG(ERROR) << "BuildFromDataPack failure! The pack scale factors differ " | 671 DLOG(ERROR) << "BuildFromDataPack failure! The pack scale factors differ " |
| 672 << "from those supported by platform."; | 672 << "from those supported by platform."; |
| 673 return NULL; | 673 return NULL; |
| 674 } | 674 } |
| 675 pack->is_valid_ = true; |
| 675 return pack; | 676 return pack; |
| 676 } | 677 } |
| 677 | 678 |
| 678 // static | 679 // static |
| 679 bool BrowserThemePack::IsPersistentImageID(int id) { | 680 bool BrowserThemePack::IsPersistentImageID(int id) { |
| 680 for (size_t i = 0; i < kPersistingImagesLength; ++i) | 681 for (size_t i = 0; i < kPersistingImagesLength; ++i) |
| 681 if (kPersistingImages[i].idr_id == id) | 682 if (kPersistingImages[i].idr_id == id) |
| 682 return true; | 683 return true; |
| 683 | 684 |
| 684 return false; | 685 return false; |
| 685 } | 686 } |
| 686 | 687 |
| 688 BrowserThemePack::BrowserThemePack() : CustomThemeSupplier(EXTENSION) { |
| 689 scale_factors_ = ui::GetSupportedScaleFactors(); |
| 690 // On Windows HiDPI SCALE_FACTOR_100P may not be supported by default. |
| 691 if (!base::ContainsValue(scale_factors_, ui::SCALE_FACTOR_100P)) |
| 692 scale_factors_.push_back(ui::SCALE_FACTOR_100P); |
| 693 } |
| 694 |
| 687 bool BrowserThemePack::WriteToDisk(const base::FilePath& path) const { | 695 bool BrowserThemePack::WriteToDisk(const base::FilePath& path) const { |
| 688 // Add resources for each of the property arrays. | 696 // Add resources for each of the property arrays. |
| 689 RawDataForWriting resources; | 697 RawDataForWriting resources; |
| 690 resources[kHeaderID] = base::StringPiece( | 698 resources[kHeaderID] = base::StringPiece( |
| 691 reinterpret_cast<const char*>(header_), sizeof(BrowserThemePackHeader)); | 699 reinterpret_cast<const char*>(header_), sizeof(BrowserThemePackHeader)); |
| 692 resources[kTintsID] = base::StringPiece( | 700 resources[kTintsID] = base::StringPiece( |
| 693 reinterpret_cast<const char*>(tints_), | 701 reinterpret_cast<const char*>(tints_), |
| 694 sizeof(TintEntry[kTintTableLength])); | 702 sizeof(TintEntry[kTintTableLength])); |
| 695 resources[kColorsID] = base::StringPiece( | 703 resources[kColorsID] = base::StringPiece( |
| 696 reinterpret_cast<const char*>(colors_), | 704 reinterpret_cast<const char*>(colors_), |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 | 773 |
| 766 return false; | 774 return false; |
| 767 } | 775 } |
| 768 | 776 |
| 769 gfx::Image BrowserThemePack::GetImageNamed(int idr_id) { | 777 gfx::Image BrowserThemePack::GetImageNamed(int idr_id) { |
| 770 int prs_id = GetPersistentIDByIDR(idr_id); | 778 int prs_id = GetPersistentIDByIDR(idr_id); |
| 771 if (prs_id == -1) | 779 if (prs_id == -1) |
| 772 return gfx::Image(); | 780 return gfx::Image(); |
| 773 | 781 |
| 774 // Check if the image is cached. | 782 // Check if the image is cached. |
| 775 ImageCache::const_iterator image_iter = images_on_ui_thread_.find(prs_id); | 783 ImageCache::const_iterator image_iter = images_.find(prs_id); |
| 776 if (image_iter != images_on_ui_thread_.end()) | 784 if (image_iter != images_.end()) |
| 777 return image_iter->second; | 785 return image_iter->second; |
| 778 | 786 |
| 779 ThemeImagePngSource::PngMap png_map; | 787 ThemeImagePngSource::PngMap png_map; |
| 780 for (size_t i = 0; i < scale_factors_.size(); ++i) { | 788 for (size_t i = 0; i < scale_factors_.size(); ++i) { |
| 781 scoped_refptr<base::RefCountedMemory> memory = | 789 scoped_refptr<base::RefCountedMemory> memory = |
| 782 GetRawData(idr_id, scale_factors_[i]); | 790 GetRawData(idr_id, scale_factors_[i]); |
| 783 if (memory.get()) | 791 if (memory.get()) |
| 784 png_map[scale_factors_[i]] = memory; | 792 png_map[scale_factors_[i]] = memory; |
| 785 } | 793 } |
| 786 if (!png_map.empty()) { | 794 if (!png_map.empty()) { |
| 787 gfx::ImageSkia image_skia(new ThemeImagePngSource(png_map), 1.0f); | 795 gfx::ImageSkia image_skia(new ThemeImagePngSource(png_map), 1.0f); |
| 788 // |image_skia| takes ownership of ThemeImagePngSource. | 796 // |image_skia| takes ownership of ThemeImagePngSource. |
| 789 gfx::Image ret = gfx::Image(image_skia); | 797 gfx::Image ret = gfx::Image(image_skia); |
| 790 images_on_ui_thread_[prs_id] = ret; | 798 images_[prs_id] = ret; |
| 791 return ret; | 799 return ret; |
| 792 } | 800 } |
| 793 | 801 |
| 794 return gfx::Image(); | 802 return gfx::Image(); |
| 795 } | 803 } |
| 796 | 804 |
| 797 base::RefCountedMemory* BrowserThemePack::GetRawData( | 805 base::RefCountedMemory* BrowserThemePack::GetRawData( |
| 798 int idr_id, | 806 int idr_id, |
| 799 ui::ScaleFactor scale_factor) const { | 807 ui::ScaleFactor scale_factor) const { |
| 800 base::RefCountedMemory* memory = NULL; | 808 base::RefCountedMemory* memory = NULL; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 824 for (; *img != -1; ++img) { | 832 for (; *img != -1; ++img) { |
| 825 if (*img == prs_id) | 833 if (*img == prs_id) |
| 826 return true; | 834 return true; |
| 827 } | 835 } |
| 828 | 836 |
| 829 return false; | 837 return false; |
| 830 } | 838 } |
| 831 | 839 |
| 832 // private: | 840 // private: |
| 833 | 841 |
| 834 BrowserThemePack::BrowserThemePack() | |
| 835 : CustomThemeSupplier(EXTENSION), | |
| 836 header_(NULL), | |
| 837 tints_(NULL), | |
| 838 colors_(NULL), | |
| 839 display_properties_(NULL), | |
| 840 source_images_(NULL) { | |
| 841 scale_factors_ = ui::GetSupportedScaleFactors(); | |
| 842 // On Windows HiDPI SCALE_FACTOR_100P may not be supported by default. | |
| 843 if (!base::ContainsValue(scale_factors_, ui::SCALE_FACTOR_100P)) | |
| 844 scale_factors_.push_back(ui::SCALE_FACTOR_100P); | |
| 845 } | |
| 846 | |
| 847 void BrowserThemePack::BuildHeader(const Extension* extension) { | 842 void BrowserThemePack::BuildHeader(const Extension* extension) { |
| 848 header_ = new BrowserThemePackHeader; | 843 header_ = new BrowserThemePackHeader; |
| 849 header_->version = kThemePackVersion; | 844 header_->version = kThemePackVersion; |
| 850 | 845 |
| 851 // TODO(erg): Need to make this endian safe on other computers. Prerequisite | 846 // TODO(erg): Need to make this endian safe on other computers. Prerequisite |
| 852 // is that ui::DataPack removes this same check. | 847 // is that ui::DataPack removes this same check. |
| 853 #if defined(__BYTE_ORDER) | 848 #if defined(__BYTE_ORDER) |
| 854 // Linux check | 849 // Linux check |
| 855 static_assert(__BYTE_ORDER == __LITTLE_ENDIAN, | 850 static_assert(__BYTE_ORDER == __LITTLE_ENDIAN, |
| 856 "datapack assumes little endian"); | 851 "datapack assumes little endian"); |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1431 false, | 1426 false, |
| 1432 &bitmap_data)) { | 1427 &bitmap_data)) { |
| 1433 NOTREACHED() << "Unable to encode theme image for prs_id=" | 1428 NOTREACHED() << "Unable to encode theme image for prs_id=" |
| 1434 << prs_id << " for scale_factor=" << scale_factors_[i]; | 1429 << prs_id << " for scale_factor=" << scale_factors_[i]; |
| 1435 break; | 1430 break; |
| 1436 } | 1431 } |
| 1437 image_memory_[scaled_raw_id] = | 1432 image_memory_[scaled_raw_id] = |
| 1438 base::RefCountedBytes::TakeVector(&bitmap_data); | 1433 base::RefCountedBytes::TakeVector(&bitmap_data); |
| 1439 } | 1434 } |
| 1440 } | 1435 } |
| OLD | NEW |