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 "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 14 matching lines...) Expand all Loading... | |
| 25 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
| 26 #include "third_party/skia/include/core/SkCanvas.h" | 26 #include "third_party/skia/include/core/SkCanvas.h" |
| 27 #include "ui/base/resource/data_pack.h" | 27 #include "ui/base/resource/data_pack.h" |
| 28 #include "ui/base/resource/resource_bundle.h" | 28 #include "ui/base/resource/resource_bundle.h" |
| 29 #include "ui/gfx/canvas.h" | 29 #include "ui/gfx/canvas.h" |
| 30 #include "ui/gfx/codec/png_codec.h" | 30 #include "ui/gfx/codec/png_codec.h" |
| 31 #include "ui/gfx/image/canvas_image_source.h" | 31 #include "ui/gfx/image/canvas_image_source.h" |
| 32 #include "ui/gfx/image/image_skia.h" | 32 #include "ui/gfx/image/image_skia.h" |
| 33 #include "ui/gfx/image/image_skia_operations.h" | 33 #include "ui/gfx/image/image_skia_operations.h" |
| 34 #include "ui/gfx/screen.h" | 34 #include "ui/gfx/screen.h" |
| 35 #include "ui/gfx/size_conversions.h" | |
| 35 #include "ui/gfx/skia_util.h" | 36 #include "ui/gfx/skia_util.h" |
| 36 | 37 |
| 37 using content::BrowserThread; | 38 using content::BrowserThread; |
| 38 using extensions::Extension; | 39 using extensions::Extension; |
| 39 | 40 |
| 40 namespace { | 41 namespace { |
| 41 | 42 |
| 42 // Version number of the current theme pack. We just throw out and rebuild | 43 // Version number of the current theme pack. We just throw out and rebuild |
| 43 // theme packs that aren't int-equal to this. Increment this number if you | 44 // theme packs that aren't int-equal to this. Increment this number if you |
| 44 // change default theme assets. | 45 // change default theme assets. |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 575 // ImageSkiaReps for all supported scale factors. | 576 // ImageSkiaReps for all supported scale factors. |
| 576 for (ImageCache::iterator it = pack->images_on_ui_thread_.begin(); | 577 for (ImageCache::iterator it = pack->images_on_ui_thread_.begin(); |
| 577 it != pack->images_on_ui_thread_.end(); ++it) { | 578 it != pack->images_on_ui_thread_.end(); ++it) { |
| 578 const gfx::ImageSkia source_image_skia = it->second.AsImageSkia(); | 579 const gfx::ImageSkia source_image_skia = it->second.AsImageSkia(); |
| 579 ThemeImageSource* source = new ThemeImageSource(source_image_skia); | 580 ThemeImageSource* source = new ThemeImageSource(source_image_skia); |
| 580 // image_skia takes ownership of source. | 581 // image_skia takes ownership of source. |
| 581 gfx::ImageSkia image_skia(source, source_image_skia.size()); | 582 gfx::ImageSkia image_skia(source, source_image_skia.size()); |
| 582 it->second = gfx::Image(image_skia); | 583 it->second = gfx::Image(image_skia); |
| 583 } | 584 } |
| 584 | 585 |
| 586 // Generate raw images (for new-tab-page attribution and background) for | |
| 587 // any missing scale from an available scale image. | |
|
pkotwicz
2013/06/10 15:20:11
We should iterate through kPreloadIDs here.
sschmitz
2013/06/10 17:24:14
Done.
| |
| 588 pack->GenerateRawImageForAllSupportedScales(PRS_THEME_NTP_BACKGROUND); | |
| 589 pack->GenerateRawImageForAllSupportedScales(PRS_THEME_NTP_ATTRIBUTION); | |
| 590 | |
| 585 // The BrowserThemePack is now in a consistent state. | 591 // The BrowserThemePack is now in a consistent state. |
| 586 return pack; | 592 return pack; |
| 587 } | 593 } |
| 588 | 594 |
| 589 // static | 595 // static |
| 590 scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromDataPack( | 596 scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromDataPack( |
| 591 const base::FilePath& path, const std::string& expected_id) { | 597 const base::FilePath& path, const std::string& expected_id) { |
| 592 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 598 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 593 // Allow IO on UI thread due to deep-seated theme design issues. | 599 // Allow IO on UI thread due to deep-seated theme design issues. |
| 594 // (see http://crbug.com/80206) | 600 // (see http://crbug.com/80206) |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1436 float scale = static_cast<float>(percent) / 100.0f; | 1442 float scale = static_cast<float>(percent) / 100.0f; |
| 1437 for (size_t i = 0; i < scale_factors_.size(); ++i) { | 1443 for (size_t i = 0; i < scale_factors_.size(); ++i) { |
| 1438 if (fabs(ui::GetScaleFactorScale(scale_factors_[i]) - scale) < 0.001) { | 1444 if (fabs(ui::GetScaleFactorScale(scale_factors_[i]) - scale) < 0.001) { |
| 1439 *scale_factor = scale_factors_[i]; | 1445 *scale_factor = scale_factors_[i]; |
| 1440 return true; | 1446 return true; |
| 1441 } | 1447 } |
| 1442 } | 1448 } |
| 1443 } | 1449 } |
| 1444 return false; | 1450 return false; |
| 1445 } | 1451 } |
| 1452 | |
| 1453 void BrowserThemePack::GenerateRawImageForAllSupportedScales(int prs_id) { | |
| 1454 // For any raw theme image for a supported scale that is not in the | |
|
pkotwicz
2013/06/10 15:20:11
How about:
Compute (by scaling) bitmaps for |prs_i
sschmitz
2013/06/10 17:24:14
Done.
| |
| 1455 // theme extension we compute (by scaling) an image based on an | |
| 1456 // available image. We use the available image with the highest | |
| 1457 // scale to compute the missing images. | |
| 1458 | |
| 1459 // See if any image is missing. If not, we're done. | |
| 1460 bool image_missing = false; | |
| 1461 for (size_t i = 0; i < scale_factors_.size(); ++i) { | |
| 1462 int raw_id = GetRawIDByPersistentID(prs_id, scale_factors_[i]); | |
| 1463 if (image_memory_.find(raw_id) == image_memory_.end()) { | |
| 1464 image_missing = true; | |
| 1465 break; | |
| 1466 } | |
| 1467 } | |
| 1468 if (!image_missing) | |
| 1469 return; | |
| 1470 | |
| 1471 // Find available scale factor with highest scale. | |
| 1472 ui::ScaleFactor available = ui::SCALE_FACTOR_NONE; | |
| 1473 for (size_t i = 0; i < scale_factors_.size(); ++i) { | |
| 1474 int raw_id = GetRawIDByPersistentID(prs_id, scale_factors_[i]); | |
| 1475 if ((available == ui::SCALE_FACTOR_NONE || | |
| 1476 (ui::GetScaleFactorScale(scale_factors_[i]) > | |
| 1477 ui::GetScaleFactorScale(available))) && | |
| 1478 image_memory_.find(raw_id) != image_memory_.end()) { | |
| 1479 available = scale_factors_[i]; | |
| 1480 } | |
| 1481 } | |
| 1482 // If no image is available, we're done. | |
| 1483 if (available == ui::SCALE_FACTOR_NONE) | |
| 1484 return; | |
| 1485 | |
| 1486 // Get bitmap of the available image. | |
|
pkotwicz
2013/06/10 15:20:11
Nit: How about:
Get the bitmap for the available s
sschmitz
2013/06/10 17:24:14
Done.
| |
| 1487 int available_raw_id = GetRawIDByPersistentID(prs_id, available); | |
| 1488 RawImages::const_iterator it = image_memory_.find(available_raw_id); | |
| 1489 DCHECK(it != image_memory_.end()); | |
| 1490 DCHECK(it->second->size() > 0); | |
|
pkotwicz
2013/06/10 15:20:11
The above DCHECK is not necessary. gfx::PNGCodec::
sschmitz
2013/06/10 17:24:14
Actually, we don't need either one.
Done.
| |
| 1491 SkBitmap available_bitmap; | |
| 1492 if (!gfx::PNGCodec::Decode(it->second->front(), | |
| 1493 it->second->size(), | |
| 1494 &available_bitmap)) { | |
| 1495 NOTREACHED() << "Unable to decode theme image for prs_id=" | |
| 1496 << prs_id << " for scale_factor=" << available; | |
| 1497 return; | |
| 1498 } | |
| 1499 | |
| 1500 // Fill in all missing scales by scaling the available image. | |
|
pkotwicz
2013/06/10 15:20:11
Nit scales -> scale factors
available image ->
sschmitz
2013/06/10 17:24:14
Done.
| |
| 1501 for (size_t i = 0; i < scale_factors_.size(); ++i) { | |
| 1502 int scaled_raw_id = GetRawIDByPersistentID(prs_id, scale_factors_[i]); | |
| 1503 if (image_memory_.find(scaled_raw_id) != image_memory_.end()) | |
| 1504 continue; | |
| 1505 gfx::Size scaled_size = gfx::ToCeiledSize( | |
| 1506 gfx::ScaleSize(gfx::Size(available_bitmap.width(), | |
| 1507 available_bitmap.height()), | |
| 1508 ui::GetScaleFactorScale(scale_factors_[i]) / | |
| 1509 ui::GetScaleFactorScale(available))); | |
| 1510 SkBitmap scaled_bitmap; | |
| 1511 scaled_bitmap.setConfig(SkBitmap::kARGB_8888_Config, | |
| 1512 scaled_size.width(), | |
| 1513 scaled_size.height()); | |
| 1514 if (!scaled_bitmap.allocPixels()) | |
| 1515 SK_CRASH(); | |
| 1516 scaled_bitmap.eraseARGB(0, 0, 0, 0); | |
| 1517 SkCanvas canvas(scaled_bitmap); | |
| 1518 SkRect scaled_bounds = RectToSkRect(gfx::Rect(scaled_size)); | |
| 1519 canvas.drawBitmapRect(available_bitmap, NULL, scaled_bounds); | |
| 1520 std::vector<unsigned char> bitmap_data; | |
| 1521 if (!gfx::PNGCodec::EncodeBGRASkBitmap(scaled_bitmap, | |
| 1522 false, | |
| 1523 &bitmap_data)) { | |
| 1524 NOTREACHED() << "Unable to encode theme image for prs_id=" | |
| 1525 << prs_id << " for scale_factor=" << scale_factors_[i]; | |
| 1526 break; | |
| 1527 } | |
| 1528 image_memory_[scaled_raw_id] = | |
| 1529 base::RefCountedBytes::TakeVector(&bitmap_data); | |
| 1530 } | |
| 1531 } | |
| OLD | NEW |