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

Side by Side Diff: chrome/browser/themes/browser_theme_pack.cc

Issue 16977007: Only load theme images for the scale factors that use them (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: delay GetRawMemory Created 7 years, 6 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/themes/browser_theme_pack.h ('k') | no next file » | 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/themes/browser_theme_pack.h" 5 #include "chrome/browser/themes/browser_theme_pack.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/memory/ref_counted_memory.h" 9 #include "base/memory/ref_counted_memory.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 canvas.drawBitmapRect(rep_100p.sk_bitmap(), NULL, resized_bounds); 473 canvas.drawBitmapRect(rep_100p.sk_bitmap(), NULL, resized_bounds);
474 return gfx::ImageSkiaRep(resized_bitmap, scale_factor); 474 return gfx::ImageSkiaRep(resized_bitmap, scale_factor);
475 } 475 }
476 476
477 private: 477 private:
478 const gfx::ImageSkia source_; 478 const gfx::ImageSkia source_;
479 479
480 DISALLOW_COPY_AND_ASSIGN(ThemeImageSource); 480 DISALLOW_COPY_AND_ASSIGN(ThemeImageSource);
481 }; 481 };
482 482
483 // An ImageSkiaSouce that delays decoding PNG data into bitmaps until
pkotwicz 2013/06/18 15:23:43 Nit: ImageSkiaSource
sschmitz 2013/06/18 18:20:29 Done.
484 // needed and, if necessary, generates bitmaps for scale factors for
485 // which no PNG was provided. Once a PNG is decoded the resulting
486 // bitmap is stored for later use.
487 class ThemeImagePngSource : public gfx::ImageSkiaSource {
488 public:
489 ThemeImagePngSource(const base::WeakPtr<BrowserThemePack>& btp, int id) :
490 browser_theme_pack_(btp),
491 idr_id_(id) {
492 }
493
494 virtual ~ThemeImagePngSource() {}
495
496 private:
497 virtual gfx::ImageSkiaRep GetImageForScale(
498 ui::ScaleFactor scale_factor) OVERRIDE {
499 // Look up the scale factor in the bitmap map. If found return it.
500 BitmapMap::const_iterator exact_bitmap = bitmap_map_.find(scale_factor);
pkotwicz 2013/06/18 15:23:43 I personally like suffixing iterator variable name
sschmitz 2013/06/18 18:20:29 Done.
501 if (exact_bitmap != bitmap_map_.end())
502 return gfx::ImageSkiaRep(exact_bitmap->second, scale_factor);
503
504 if (!browser_theme_pack_.get())
505 return gfx::ImageSkiaRep(SkBitmap(), scale_factor);
pkotwicz 2013/06/18 15:23:43 Nit: just use the empty constructor for ImageSkiaR
sschmitz 2013/06/18 18:20:29 Done.
506
507 // Look up the scale factor in the browser theme pack. If found,
pkotwicz 2013/06/18 15:23:43 How about: "Look up the raw PNG data for |idr_id_|
sschmitz 2013/06/18 18:20:29 Done.
508 // decode it, store the result in the bitmap map and return it.
509 scoped_refptr<base::RefCountedMemory> exact_memory =
510 browser_theme_pack_->GetRawData(idr_id_, scale_factor);
511 if (exact_memory.get()) {
512 SkBitmap bitmap;
513 if (!gfx::PNGCodec::Decode(exact_memory->front(),
514 exact_memory->size(),
515 &bitmap)) {
516 NOTREACHED();
517 return gfx::ImageSkiaRep(SkBitmap(), scale_factor);
pkotwicz 2013/06/18 15:23:43 Nit: use the empty constructor
sschmitz 2013/06/18 18:20:29 Done.
518 }
519 bitmap_map_[scale_factor] = bitmap;
520 return gfx::ImageSkiaRep(bitmap, scale_factor);
521 }
522
523 // No exact match was found, find an available png with highest scale.
pkotwicz 2013/06/18 15:23:43 Nit: the highest scale factor
sschmitz 2013/06/18 18:20:29 I changed to: "for the scale factor that correspon
524 ui::ScaleFactor available_scale_factor = ui::SCALE_FACTOR_NONE;
525 scoped_refptr<base::RefCountedMemory> available_png =
526 browser_theme_pack_->GetRawDataWithHighestScale(
527 idr_id_,
528 &available_scale_factor);
529 // No png found for this id, return null rep.
530 if (!available_png.get())
531 return gfx::ImageSkiaRep(SkBitmap(), scale_factor);
532
533 // Look up the found scale factor in the bitmap map. If not found, decode
534 // the corresponding png and store the result in bitmap map.
pkotwicz 2013/06/18 15:23:43 Nit: "the bitmap map" or "|bitmap_map_|".
sschmitz 2013/06/18 18:20:29 Done.
535 BitmapMap::const_iterator available_bitmap =
536 bitmap_map_.find(available_scale_factor);
537 if (available_bitmap == bitmap_map_.end()) {
538 SkBitmap bitmap;
539 if (!gfx::PNGCodec::Decode(available_png->front(),
540 available_png->size(),
541 &bitmap)) {
542 NOTREACHED();
543 return gfx::ImageSkiaRep(SkBitmap(), scale_factor);
544 }
545 bitmap_map_[available_scale_factor] = bitmap;
546 available_bitmap = bitmap_map_.find(available_scale_factor);
547 }
548
549 // Use available bitmap to create bitmap for desired scale factor by
550 // scaling, store the result in the bitmap map and return it.
551 gfx::Size scaled_size = gfx::ToCeiledSize(
pkotwicz 2013/06/18 15:23:43 Nit: Pull out the resizing code into a function in
sschmitz 2013/06/18 18:20:29 Done.
552 gfx::ScaleSize(gfx::Size(available_bitmap->second.width(),
553 available_bitmap->second.height()),
554 ui::GetScaleFactorScale(scale_factor) /
555 ui::GetScaleFactorScale(available_scale_factor)));
556 SkBitmap scaled_bitmap;
557 scaled_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
558 scaled_size.width(),
559 scaled_size.height());
560 if (!scaled_bitmap.allocPixels())
561 SK_CRASH();
562 scaled_bitmap.eraseARGB(0, 0, 0, 0);
563 SkCanvas canvas(scaled_bitmap);
564 SkRect scaled_bounds = RectToSkRect(gfx::Rect(scaled_size));
565 canvas.drawBitmapRect(available_bitmap->second, NULL, scaled_bounds);
566 bitmap_map_[scale_factor] = scaled_bitmap;
567 return gfx::ImageSkiaRep(scaled_bitmap, scale_factor);
568 }
569
570 private:
571 typedef std::map<ui::ScaleFactor, SkBitmap> BitmapMap;
572 base::WeakPtr<BrowserThemePack> browser_theme_pack_;
573 const int idr_id_;
574 BitmapMap bitmap_map_;
pkotwicz 2013/06/18 15:23:43 Nit: Move the typedef to the line above |bitmap_ma
sschmitz 2013/06/18 18:20:29 Done.
575
576 DISALLOW_COPY_AND_ASSIGN(ThemeImagePngSource);
577 };
578
483 class TabBackgroundImageSource: public gfx::CanvasImageSource { 579 class TabBackgroundImageSource: public gfx::CanvasImageSource {
484 public: 580 public:
485 TabBackgroundImageSource(const gfx::ImageSkia& image_to_tint, 581 TabBackgroundImageSource(const gfx::ImageSkia& image_to_tint,
486 const gfx::ImageSkia& overlay, 582 const gfx::ImageSkia& overlay,
487 const color_utils::HSL& hsl_shift, 583 const color_utils::HSL& hsl_shift,
488 int vertical_offset) 584 int vertical_offset)
489 : gfx::CanvasImageSource(image_to_tint.size(), false), 585 : gfx::CanvasImageSource(image_to_tint.size(), false),
490 image_to_tint_(image_to_tint), 586 image_to_tint_(image_to_tint),
491 overlay_(overlay), 587 overlay_(overlay),
492 hsl_shift_(hsl_shift), 588 hsl_shift_(hsl_shift),
(...skipping 20 matching lines...) Expand all
513 609
514 private: 610 private:
515 const gfx::ImageSkia image_to_tint_; 611 const gfx::ImageSkia image_to_tint_;
516 const gfx::ImageSkia overlay_; 612 const gfx::ImageSkia overlay_;
517 const color_utils::HSL hsl_shift_; 613 const color_utils::HSL hsl_shift_;
518 const int vertical_offset_; 614 const int vertical_offset_;
519 615
520 DISALLOW_COPY_AND_ASSIGN(TabBackgroundImageSource); 616 DISALLOW_COPY_AND_ASSIGN(TabBackgroundImageSource);
521 }; 617 };
522 618
619 class OrderByScale {
620 public:
621 bool operator()(const ui::ScaleFactor& a,
622 const ui::ScaleFactor& b) const {
623 return ui::GetScaleFactorScale(a) > ui::GetScaleFactorScale(b);
624 }
625 };
626
523 } // namespace 627 } // namespace
524 628
525 BrowserThemePack::~BrowserThemePack() { 629 BrowserThemePack::~BrowserThemePack() {
526 if (!data_pack_.get()) { 630 if (!data_pack_.get()) {
527 delete header_; 631 delete header_;
528 delete [] tints_; 632 delete [] tints_;
529 delete [] colors_; 633 delete [] colors_;
530 delete [] display_properties_; 634 delete [] display_properties_;
531 delete [] source_images_; 635 delete [] source_images_;
532 } 636 }
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 gfx::Image BrowserThemePack::GetImageNamed(int idr_id) { 846 gfx::Image BrowserThemePack::GetImageNamed(int idr_id) {
743 int prs_id = GetPersistentIDByIDR(idr_id); 847 int prs_id = GetPersistentIDByIDR(idr_id);
744 if (prs_id == -1) 848 if (prs_id == -1)
745 return gfx::Image(); 849 return gfx::Image();
746 850
747 // Check if the image is cached. 851 // Check if the image is cached.
748 ImageCache::const_iterator image_iter = images_on_ui_thread_.find(prs_id); 852 ImageCache::const_iterator image_iter = images_on_ui_thread_.find(prs_id);
749 if (image_iter != images_on_ui_thread_.end()) 853 if (image_iter != images_on_ui_thread_.end())
750 return image_iter->second; 854 return image_iter->second;
751 855
752 // TODO(pkotwicz): Do something better than loading the bitmaps 856 gfx::ImageSkia image_skia(
pkotwicz 2013/06/18 15:23:43 Nit: Comment that the gfx::ImageSkia machinery wil
sschmitz 2013/06/18 18:20:29 Done.
753 // for all the scale factors associated with |idr_id|. 857 new ThemeImagePngSource(weak_ptr_factory_.GetWeakPtr(), idr_id),
754 // See crbug.com/243831. 858 ui::SCALE_FACTOR_100P);
755 gfx::ImageSkia source_image_skia; 859 gfx::Image ret = gfx::Image(image_skia);
756 for (size_t i = 0; i < scale_factors_.size(); ++i) { 860 images_on_ui_thread_[prs_id] = ret;
757 scoped_refptr<base::RefCountedMemory> memory = 861 return ret;
758 GetRawData(idr_id, scale_factors_[i]);
759 if (memory.get()) {
760 // Decode the PNG.
761 SkBitmap bitmap;
762 if (!gfx::PNGCodec::Decode(memory->front(), memory->size(),
763 &bitmap)) {
764 NOTREACHED() << "Unable to decode theme image resource " << idr_id
765 << " from saved DataPack.";
766 continue;
767 }
768 source_image_skia.AddRepresentation(
769 gfx::ImageSkiaRep(bitmap, scale_factors_[i]));
770 }
771 }
772
773 if (!source_image_skia.isNull()) {
774 ThemeImageSource* source = new ThemeImageSource(source_image_skia);
775 gfx::ImageSkia image_skia(source, source_image_skia.size());
776 gfx::Image ret = gfx::Image(image_skia);
777 images_on_ui_thread_[prs_id] = ret;
778 return ret;
779 }
780 return gfx::Image();
781 } 862 }
782 863
783 base::RefCountedMemory* BrowserThemePack::GetRawData( 864 base::RefCountedMemory* BrowserThemePack::GetRawData(
784 int idr_id, 865 int idr_id,
785 ui::ScaleFactor scale_factor) const { 866 ui::ScaleFactor scale_factor) const {
786 base::RefCountedMemory* memory = NULL; 867 base::RefCountedMemory* memory = NULL;
787 int prs_id = GetPersistentIDByIDR(idr_id); 868 int prs_id = GetPersistentIDByIDR(idr_id);
788 int raw_id = GetRawIDByPersistentID(prs_id, scale_factor); 869 int raw_id = GetRawIDByPersistentID(prs_id, scale_factor);
789 870
790 if (raw_id != -1) { 871 if (raw_id != -1) {
791 if (data_pack_.get()) { 872 if (data_pack_.get()) {
792 memory = data_pack_->GetStaticMemory(raw_id); 873 memory = data_pack_->GetStaticMemory(raw_id);
793 } else { 874 } else {
794 RawImages::const_iterator it = image_memory_.find(raw_id); 875 RawImages::const_iterator it = image_memory_.find(raw_id);
795 if (it != image_memory_.end()) { 876 if (it != image_memory_.end()) {
796 memory = it->second.get(); 877 memory = it->second.get();
797 } 878 }
798 } 879 }
799 } 880 }
800 881
801 return memory; 882 return memory;
802 } 883 }
803 884
885 base::RefCountedMemory* BrowserThemePack::GetRawDataWithHighestScale(
pkotwicz 2013/06/18 15:23:43 This is only used by ThemeImagePngSource. Can this
sschmitz 2013/06/18 18:20:29 Done.
886 int idr_id,
887 ui::ScaleFactor* scale_factor) const {
888 for (std::vector<ui::ScaleFactor>::const_reverse_iterator it =
889 scale_factors_ordered_by_scale_.rbegin();
890 it != scale_factors_ordered_by_scale_.rend(); ++it) {
891 if (base::RefCountedMemory* memory = GetRawData(idr_id, *it)) {
892 if (scale_factor)
893 *scale_factor = *it;
894 return memory;
895 }
896 }
897 return NULL;
898 }
899
804 // static 900 // static
805 void BrowserThemePack::GetThemeableImageIDRs(std::set<int>* result) { 901 void BrowserThemePack::GetThemeableImageIDRs(std::set<int>* result) {
806 if (!result) 902 if (!result)
807 return; 903 return;
808 904
809 result->clear(); 905 result->clear();
810 for (size_t i = 0; i < kPersistingImagesLength; ++i) 906 for (size_t i = 0; i < kPersistingImagesLength; ++i)
811 result->insert(kPersistingImages[i].idr_id); 907 result->insert(kPersistingImages[i].idr_id);
812 908
813 #if defined(OS_WIN) && defined(USE_AURA) 909 #if defined(OS_WIN) && defined(USE_AURA)
(...skipping 16 matching lines...) Expand all
830 return false; 926 return false;
831 } 927 }
832 928
833 // private: 929 // private:
834 930
835 BrowserThemePack::BrowserThemePack() 931 BrowserThemePack::BrowserThemePack()
836 : header_(NULL), 932 : header_(NULL),
837 tints_(NULL), 933 tints_(NULL),
838 colors_(NULL), 934 colors_(NULL),
839 display_properties_(NULL), 935 display_properties_(NULL),
840 source_images_(NULL) { 936 source_images_(NULL),
937 weak_ptr_factory_(this) {
841 scale_factors_ = ui::GetSupportedScaleFactors(); 938 scale_factors_ = ui::GetSupportedScaleFactors();
pkotwicz 2013/06/18 15:23:43 Nit: The result of ui::GetSupportedScaleFactors()
sschmitz 2013/06/18 18:20:29 Done.
939 scale_factors_ordered_by_scale_ = scale_factors_;
940 std::sort(scale_factors_ordered_by_scale_.begin(),
941 scale_factors_ordered_by_scale_.end(),
942 OrderByScale());
842 } 943 }
843 944
844 void BrowserThemePack::BuildHeader(const Extension* extension) { 945 void BrowserThemePack::BuildHeader(const Extension* extension) {
845 header_ = new BrowserThemePackHeader; 946 header_ = new BrowserThemePackHeader;
846 header_->version = kThemePackVersion; 947 header_->version = kThemePackVersion;
847 948
848 // TODO(erg): Need to make this endian safe on other computers. Prerequisite 949 // TODO(erg): Need to make this endian safe on other computers. Prerequisite
849 // is that ui::DataPack removes this same check. 950 // is that ui::DataPack removes this same check.
850 #if defined(__BYTE_ORDER) 951 #if defined(__BYTE_ORDER)
851 // Linux check 952 // Linux check
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 false, 1627 false,
1527 &bitmap_data)) { 1628 &bitmap_data)) {
1528 NOTREACHED() << "Unable to encode theme image for prs_id=" 1629 NOTREACHED() << "Unable to encode theme image for prs_id="
1529 << prs_id << " for scale_factor=" << scale_factors_[i]; 1630 << prs_id << " for scale_factor=" << scale_factors_[i];
1530 break; 1631 break;
1531 } 1632 }
1532 image_memory_[scaled_raw_id] = 1633 image_memory_[scaled_raw_id] =
1533 base::RefCountedBytes::TakeVector(&bitmap_data); 1634 base::RefCountedBytes::TakeVector(&bitmap_data);
1534 } 1635 }
1535 } 1636 }
OLDNEW
« no previous file with comments | « chrome/browser/themes/browser_theme_pack.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698