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> | 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 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 } | 470 } |
471 | 471 |
472 // A ImageSkiaSource that scales 100P image to the target scale factor | 472 // A ImageSkiaSource that scales 100P image to the target scale factor |
473 // if the ImageSkiaRep for the target scale factor isn't available. | 473 // if the ImageSkiaRep for the target scale factor isn't available. |
474 class ThemeImageSource: public gfx::ImageSkiaSource { | 474 class ThemeImageSource: public gfx::ImageSkiaSource { |
475 public: | 475 public: |
476 explicit ThemeImageSource(const gfx::ImageSkia& source) : source_(source) { | 476 explicit ThemeImageSource(const gfx::ImageSkia& source) : source_(source) { |
477 } | 477 } |
478 virtual ~ThemeImageSource() {} | 478 virtual ~ThemeImageSource() {} |
479 | 479 |
480 virtual gfx::ImageSkiaRep GetImageForScale( | 480 virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
481 ui::ScaleFactor scale_factor) OVERRIDE { | 481 if (source_.HasRepresentation(scale)) |
482 if (source_.HasRepresentation(scale_factor)) | 482 return source_.GetRepresentation(scale); |
483 return source_.GetRepresentation(scale_factor); | |
484 const gfx::ImageSkiaRep& rep_100p = | 483 const gfx::ImageSkiaRep& rep_100p = |
485 source_.GetRepresentation(ui::SCALE_FACTOR_100P); | 484 source_.GetRepresentation(1.0f); |
486 SkBitmap scaled_bitmap = CreateLowQualityResizedBitmap( | 485 SkBitmap scaled_bitmap = CreateLowQualityResizedBitmap( |
487 rep_100p.sk_bitmap(), | 486 rep_100p.sk_bitmap(), |
488 ui::SCALE_FACTOR_100P, | 487 ui::SCALE_FACTOR_100P, |
489 scale_factor); | 488 ui::GetScaleFactorFromScale(scale)); |
490 return gfx::ImageSkiaRep(scaled_bitmap, scale_factor); | 489 return gfx::ImageSkiaRep(scaled_bitmap, scale); |
491 } | 490 } |
492 | 491 |
493 private: | 492 private: |
494 const gfx::ImageSkia source_; | 493 const gfx::ImageSkia source_; |
495 | 494 |
496 DISALLOW_COPY_AND_ASSIGN(ThemeImageSource); | 495 DISALLOW_COPY_AND_ASSIGN(ThemeImageSource); |
497 }; | 496 }; |
498 | 497 |
499 // An ImageSkiaSource that delays decoding PNG data into bitmaps until | 498 // An ImageSkiaSource that delays decoding PNG data into bitmaps until |
500 // needed. Missing data for a scale factor is computed by scaling data for an | 499 // needed. Missing data for a scale factor is computed by scaling data for an |
501 // available scale factor. Computed bitmaps are stored for future look up. | 500 // available scale factor. Computed bitmaps are stored for future look up. |
502 class ThemeImagePngSource : public gfx::ImageSkiaSource { | 501 class ThemeImagePngSource : public gfx::ImageSkiaSource { |
503 public: | 502 public: |
504 typedef std::map<ui::ScaleFactor, | 503 typedef std::map<ui::ScaleFactor, |
505 scoped_refptr<base::RefCountedMemory> > PngMap; | 504 scoped_refptr<base::RefCountedMemory> > PngMap; |
506 | 505 |
507 explicit ThemeImagePngSource(const PngMap& png_map) : png_map_(png_map) {} | 506 explicit ThemeImagePngSource(const PngMap& png_map) : png_map_(png_map) {} |
508 | 507 |
509 virtual ~ThemeImagePngSource() {} | 508 virtual ~ThemeImagePngSource() {} |
510 | 509 |
511 private: | 510 private: |
512 virtual gfx::ImageSkiaRep GetImageForScale( | 511 virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
513 ui::ScaleFactor scale_factor) OVERRIDE { | 512 ui::ScaleFactor scale_factor = ui::GetScaleFactorFromScale(scale); |
514 // Look up the bitmap for |scale factor| in the bitmap map. If found | 513 // Look up the bitmap for |scale factor| in the bitmap map. If found |
515 // return it. | 514 // return it. |
516 BitmapMap::const_iterator exact_bitmap_it = bitmap_map_.find(scale_factor); | 515 BitmapMap::const_iterator exact_bitmap_it = bitmap_map_.find(scale_factor); |
517 if (exact_bitmap_it != bitmap_map_.end()) | 516 if (exact_bitmap_it != bitmap_map_.end()) |
518 return gfx::ImageSkiaRep(exact_bitmap_it->second, scale_factor); | 517 return gfx::ImageSkiaRep(exact_bitmap_it->second, scale); |
519 | 518 |
520 // Look up the raw PNG data for |scale_factor| in the png map. If found, | 519 // Look up the raw PNG data for |scale_factor| in the png map. If found, |
521 // decode it, store the result in the bitmap map and return it. | 520 // decode it, store the result in the bitmap map and return it. |
522 PngMap::const_iterator exact_png_it = png_map_.find(scale_factor); | 521 PngMap::const_iterator exact_png_it = png_map_.find(scale_factor); |
523 if (exact_png_it != png_map_.end()) { | 522 if (exact_png_it != png_map_.end()) { |
524 SkBitmap bitmap; | 523 SkBitmap bitmap; |
525 if (!gfx::PNGCodec::Decode(exact_png_it->second->front(), | 524 if (!gfx::PNGCodec::Decode(exact_png_it->second->front(), |
526 exact_png_it->second->size(), | 525 exact_png_it->second->size(), |
527 &bitmap)) { | 526 &bitmap)) { |
528 NOTREACHED(); | 527 NOTREACHED(); |
529 return gfx::ImageSkiaRep(); | 528 return gfx::ImageSkiaRep(); |
530 } | 529 } |
531 bitmap_map_[scale_factor] = bitmap; | 530 bitmap_map_[scale_factor] = bitmap; |
532 return gfx::ImageSkiaRep(bitmap, scale_factor); | 531 return gfx::ImageSkiaRep(bitmap, scale); |
533 } | 532 } |
534 | 533 |
535 // Find an available PNG for another scale factor. We want to use the | 534 // Find an available PNG for another scale factor. We want to use the |
536 // highest available scale factor. | 535 // highest available scale factor. |
537 PngMap::const_iterator available_png_it = png_map_.end(); | 536 PngMap::const_iterator available_png_it = png_map_.end(); |
538 for (PngMap::const_iterator png_it = png_map_.begin(); | 537 for (PngMap::const_iterator png_it = png_map_.begin(); |
539 png_it != png_map_.end(); ++png_it) { | 538 png_it != png_map_.end(); ++png_it) { |
540 if (available_png_it == png_map_.end() || | 539 if (available_png_it == png_map_.end() || |
541 ui::GetScaleFactorScale(png_it->first) > | 540 ui::GetScaleFactorScale(png_it->first) > |
542 ui::GetScaleFactorScale(available_png_it->first)) { | 541 ui::GetScaleFactorScale(available_png_it->first)) { |
(...skipping 21 matching lines...) Expand all Loading... |
564 available_bitmap_it = bitmap_map_.find(available_scale_factor); | 563 available_bitmap_it = bitmap_map_.find(available_scale_factor); |
565 } | 564 } |
566 | 565 |
567 // Scale the available bitmap to the desired scale factor, store the result | 566 // Scale the available bitmap to the desired scale factor, store the result |
568 // in the bitmap map and return it. | 567 // in the bitmap map and return it. |
569 SkBitmap scaled_bitmap = CreateLowQualityResizedBitmap( | 568 SkBitmap scaled_bitmap = CreateLowQualityResizedBitmap( |
570 available_bitmap_it->second, | 569 available_bitmap_it->second, |
571 available_scale_factor, | 570 available_scale_factor, |
572 scale_factor); | 571 scale_factor); |
573 bitmap_map_[scale_factor] = scaled_bitmap; | 572 bitmap_map_[scale_factor] = scaled_bitmap; |
574 return gfx::ImageSkiaRep(scaled_bitmap, scale_factor); | 573 return gfx::ImageSkiaRep(scaled_bitmap, scale); |
575 } | 574 } |
576 | 575 |
577 PngMap png_map_; | 576 PngMap png_map_; |
578 | 577 |
579 typedef std::map<ui::ScaleFactor, SkBitmap> BitmapMap; | 578 typedef std::map<ui::ScaleFactor, SkBitmap> BitmapMap; |
580 BitmapMap bitmap_map_; | 579 BitmapMap bitmap_map_; |
581 | 580 |
582 DISALLOW_COPY_AND_ASSIGN(ThemeImagePngSource); | 581 DISALLOW_COPY_AND_ASSIGN(ThemeImagePngSource); |
583 }; | 582 }; |
584 | 583 |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1278 return false; | 1277 return false; |
1279 } | 1278 } |
1280 if (is_copyable) { | 1279 if (is_copyable) { |
1281 int raw_id = GetRawIDByPersistentID(prs_id, scale_factor); | 1280 int raw_id = GetRawIDByPersistentID(prs_id, scale_factor); |
1282 image_memory_[raw_id] = raw_data; | 1281 image_memory_[raw_id] = raw_data; |
1283 } else { | 1282 } else { |
1284 SkBitmap bitmap; | 1283 SkBitmap bitmap; |
1285 if (gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(), | 1284 if (gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(), |
1286 &bitmap)) { | 1285 &bitmap)) { |
1287 image_skia.AddRepresentation( | 1286 image_skia.AddRepresentation( |
1288 gfx::ImageSkiaRep(bitmap, scale_factor)); | 1287 gfx::ImageSkiaRep(bitmap, |
| 1288 ui::GetScaleFactorScale(scale_factor))); |
1289 } else { | 1289 } else { |
1290 NOTREACHED() << "Unable to decode theme image resource " | 1290 NOTREACHED() << "Unable to decode theme image resource " |
1291 << it->first; | 1291 << it->first; |
1292 } | 1292 } |
1293 } | 1293 } |
1294 } | 1294 } |
1295 } | 1295 } |
1296 if (!is_copyable && !image_skia.isNull()) | 1296 if (!is_copyable && !image_skia.isNull()) |
1297 (*image_cache)[prs_id] = gfx::Image(image_skia); | 1297 (*image_cache)[prs_id] = gfx::Image(image_skia); |
1298 } | 1298 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1466 NOTREACHED() << "No image reps for resource " << it->first << "."; | 1466 NOTREACHED() << "No image reps for resource " << it->first << "."; |
1467 } | 1467 } |
1468 for (ImageSkiaReps::iterator rep_it = image_reps.begin(); | 1468 for (ImageSkiaReps::iterator rep_it = image_reps.begin(); |
1469 rep_it != image_reps.end(); ++rep_it) { | 1469 rep_it != image_reps.end(); ++rep_it) { |
1470 std::vector<unsigned char> bitmap_data; | 1470 std::vector<unsigned char> bitmap_data; |
1471 if (!gfx::PNGCodec::EncodeBGRASkBitmap(rep_it->sk_bitmap(), false, | 1471 if (!gfx::PNGCodec::EncodeBGRASkBitmap(rep_it->sk_bitmap(), false, |
1472 &bitmap_data)) { | 1472 &bitmap_data)) { |
1473 NOTREACHED() << "Image file for resource " << it->first | 1473 NOTREACHED() << "Image file for resource " << it->first |
1474 << " could not be encoded."; | 1474 << " could not be encoded."; |
1475 } | 1475 } |
1476 int raw_id = GetRawIDByPersistentID(it->first, rep_it->scale_factor()); | 1476 int raw_id = GetRawIDByPersistentID( |
| 1477 it->first, |
| 1478 ui::GetScaleFactorFromScale(rep_it->scale())); |
1477 (*reencoded_images)[raw_id] = | 1479 (*reencoded_images)[raw_id] = |
1478 base::RefCountedBytes::TakeVector(&bitmap_data); | 1480 base::RefCountedBytes::TakeVector(&bitmap_data); |
1479 } | 1481 } |
1480 } | 1482 } |
1481 } | 1483 } |
1482 | 1484 |
1483 void BrowserThemePack::MergeImageCaches( | 1485 void BrowserThemePack::MergeImageCaches( |
1484 const ImageCache& source, ImageCache* destination) const { | 1486 const ImageCache& source, ImageCache* destination) const { |
1485 for (ImageCache::const_iterator it = source.begin(); it != source.end(); | 1487 for (ImageCache::const_iterator it = source.begin(); it != source.end(); |
1486 ++it) { | 1488 ++it) { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1606 false, | 1608 false, |
1607 &bitmap_data)) { | 1609 &bitmap_data)) { |
1608 NOTREACHED() << "Unable to encode theme image for prs_id=" | 1610 NOTREACHED() << "Unable to encode theme image for prs_id=" |
1609 << prs_id << " for scale_factor=" << scale_factors_[i]; | 1611 << prs_id << " for scale_factor=" << scale_factors_[i]; |
1610 break; | 1612 break; |
1611 } | 1613 } |
1612 image_memory_[scaled_raw_id] = | 1614 image_memory_[scaled_raw_id] = |
1613 base::RefCountedBytes::TakeVector(&bitmap_data); | 1615 base::RefCountedBytes::TakeVector(&bitmap_data); |
1614 } | 1616 } |
1615 } | 1617 } |
OLD | NEW |