15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/browser_theme_pack.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/files/file.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_properties.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/theme_handler.h" 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/crx_file/id_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/data_pack.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/canvas_image_source.h" 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/gfx/image/image.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/gfx/size_conversions.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/skia_util.h" 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version number of the current theme pack. We just throw out and rebuild 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// theme packs that aren't int-equal to this. Increment this number if you 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// change default theme assets. 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kThemePackVersion = 35; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDs that are in the DataPack won't clash with the positive integer 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uint16. kHeaderID should always have the maximum value because we want the 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "header" to be written last. That way we can detect whether the pack was 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successfully written and ignore and regenerate if it was only partially 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// written (i.e. chrome crashed on a different thread while writing the pack). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxID = 0x0000FFFF; // Max unsigned 16-bit int. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kHeaderID = kMaxID - 1; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTintsID = kMaxID - 2; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kColorsID = kMaxID - 3; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kDisplayPropertiesID = kMaxID - 4; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSourceImagesID = kMaxID - 5; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kScaleFactorsID = kMaxID - 6; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The sum of kFrameBorderThickness and kNonClientRestoredExtraThickness from 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OpaqueBrowserFrameView. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kRestoredTabVerticalOffset = 15; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Persistent constants for the main images that we need. These have the same 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// names as their IDR_* counterparts but these values will always stay the 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_FRAME = 1; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_FRAME_INACTIVE = 2; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_FRAME_INCOGNITO = 3; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_FRAME_INCOGNITO_INACTIVE = 4; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_TOOLBAR = 5; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_TAB_BACKGROUND = 6; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_TAB_BACKGROUND_INCOGNITO = 7; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_TAB_BACKGROUND_V = 8; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_NTP_BACKGROUND = 9; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_FRAME_OVERLAY = 10; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_FRAME_OVERLAY_INACTIVE = 11; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_BUTTON_BACKGROUND = 12; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_NTP_ATTRIBUTION = 13; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int PRS_THEME_WINDOW_CONTROL_BACKGROUND = 14; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PersistingImagesTable { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A non-changing integer ID meant to be saved in theme packs. This ID must 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not change between versions of chrome. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int persistent_id; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IDR that depends on the whims of GRIT and therefore changes whenever 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // someone adds a new resource. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idr_id; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // String to check for when parsing theme manifests or NULL if this isn't 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supposed to be changeable by the user. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* key; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDR_* resource names change whenever new resources are added; use persistent 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDs when storing to a cached pack. 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(erg): The cocoa port is the last user of the IDR_*_[HP] variants. These 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// should be removed once the cocoa port no longer uses them. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PersistingImagesTable kPersistingImages[] = { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME, IDR_THEME_FRAME, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_frame" }, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_INACTIVE, IDR_THEME_FRAME_INACTIVE, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_frame_inactive" }, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO, IDR_THEME_FRAME_INCOGNITO, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_frame_incognito" }, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_INACTIVE, IDR_THEME_FRAME_INCOGNITO_INACTIVE, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_frame_incognito_inactive" }, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_TOOLBAR, IDR_THEME_TOOLBAR, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_toolbar" }, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND, IDR_THEME_TAB_BACKGROUND, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_tab_background" }, 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_MACOSX) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_INCOGNITO, IDR_THEME_TAB_BACKGROUND_INCOGNITO, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_tab_background_incognito" }, 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_V, IDR_THEME_TAB_BACKGROUND_V, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_tab_background_v"}, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_NTP_BACKGROUND, IDR_THEME_NTP_BACKGROUND, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_ntp_background" }, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_OVERLAY, IDR_THEME_FRAME_OVERLAY, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_frame_overlay" }, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_OVERLAY_INACTIVE, IDR_THEME_FRAME_OVERLAY_INACTIVE, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_frame_overlay_inactive" }, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_BUTTON_BACKGROUND, IDR_THEME_BUTTON_BACKGROUND, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_button_background" }, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_NTP_ATTRIBUTION, IDR_THEME_NTP_ATTRIBUTION, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_ntp_attribution" }, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_WINDOW_CONTROL_BACKGROUND, IDR_THEME_WINDOW_CONTROL_BACKGROUND, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "theme_window_control_background"}, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rest of these entries have no key because they can't be overridden 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the json manifest. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15, IDR_BACK, NULL }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16, IDR_BACK_D, NULL }, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 17, IDR_BACK_H, NULL }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 18, IDR_BACK_P, NULL }, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 19, IDR_FORWARD, NULL }, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 20, IDR_FORWARD_D, NULL }, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 21, IDR_FORWARD_H, NULL }, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 22, IDR_FORWARD_P, NULL }, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23, IDR_HOME, NULL }, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 24, IDR_HOME_H, NULL }, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 25, IDR_HOME_P, NULL }, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26, IDR_RELOAD, NULL }, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27, IDR_RELOAD_H, NULL }, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 28, IDR_RELOAD_P, NULL }, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29, IDR_STOP, NULL }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 30, IDR_STOP_D, NULL }, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 31, IDR_STOP_H, NULL }, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 32, IDR_STOP_P, NULL }, 15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 33, IDR_BROWSER_ACTIONS_OVERFLOW, NULL }, 15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 34, IDR_BROWSER_ACTIONS_OVERFLOW_H, NULL }, 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 35, IDR_BROWSER_ACTIONS_OVERFLOW_P, NULL }, 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 36, IDR_TOOLS, NULL }, 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 37, IDR_TOOLS_H, NULL }, 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 38, IDR_TOOLS_P, NULL }, 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 39, IDR_MENU_DROPARROW, NULL }, 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 40, IDR_THROBBER, NULL }, 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 41, IDR_THROBBER_WAITING, NULL }, 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 42, IDR_THROBBER_LIGHT, NULL }, 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 43, IDR_TOOLBAR_BEZEL_HOVER, NULL }, 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 44, IDR_TOOLBAR_BEZEL_PRESSED, NULL }, 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 45, IDR_TOOLS_BAR, NULL }, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPersistingImagesLength = arraysize(kPersistingImages); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Persistent theme ids for Windows. 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_FRAME_DESKTOP = 100; 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_FRAME_INACTIVE_DESKTOP = 101; 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_FRAME_INCOGNITO_DESKTOP = 102; 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_FRAME_INCOGNITO_INACTIVE_DESKTOP = 103; 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_TOOLBAR_DESKTOP = 104; 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_TAB_BACKGROUND_DESKTOP = 105; 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int PRS_THEME_TAB_BACKGROUND_INCOGNITO_DESKTOP = 106; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Persistent theme to resource id mapping for Windows AURA. 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PersistingImagesTable kPersistingImagesDesktopAura[] = { 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_DESKTOP, IDR_THEME_FRAME_DESKTOP, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_frame" }, 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_INACTIVE_DESKTOP, IDR_THEME_FRAME_INACTIVE_DESKTOP, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_frame_inactive" }, 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_DESKTOP, IDR_THEME_FRAME_INCOGNITO_DESKTOP, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_frame_incognito" }, 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_INACTIVE_DESKTOP, 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IDR_THEME_FRAME_INCOGNITO_INACTIVE_DESKTOP, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_frame_incognito_inactive" }, 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_TOOLBAR_DESKTOP, IDR_THEME_TOOLBAR_DESKTOP, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_toolbar" }, 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_DESKTOP, IDR_THEME_TAB_BACKGROUND_DESKTOP, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_tab_background" }, 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_INCOGNITO_DESKTOP, 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND_INCOGNITO_DESKTOP, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "theme_tab_background_incognito" }, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const size_t kPersistingImagesDesktopAuraLength = 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arraysize(kPersistingImagesDesktopAura); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetPersistentIDByNameHelper(const std::string& key, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PersistingImagesTable* image_table, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t image_table_size) { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < image_table_size; ++i) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (image_table[i].key != NULL && 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::strcasecmp(key.c_str(), image_table[i].key) == 0) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return image_table[i].persistent_id; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetPersistentIDByName(const std::string& key) { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPersistentIDByNameHelper(key, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPersistingImages, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kPersistingImagesLength); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetPersistentIDByIDR(int idr) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::map<int,int>* lookup_table = new std::map<int,int>(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lookup_table->empty()) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kPersistingImagesLength; ++i) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idr = kPersistingImages[i].idr_id; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = kPersistingImages[i].persistent_id; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*lookup_table)[idr] = prs_id; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < kPersistingImagesDesktopAuraLength; ++i) { 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int idr = kPersistingImagesDesktopAura[i].idr_id; 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int prs_id = kPersistingImagesDesktopAura[i].persistent_id; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*lookup_table)[idr] = prs_id; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int,int>::iterator it = lookup_table->find(idr); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (it == lookup_table->end()) ? -1 : it->second; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns the maximum persistent id. 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint GetMaxPersistentId() { 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static int max_prs_id = -1; 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (max_prs_id == -1) { 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < kPersistingImagesLength; ++i) { 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (kPersistingImages[i].persistent_id > max_prs_id) 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci max_prs_id = kPersistingImages[i].persistent_id; 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_ASH) && !defined(OS_CHROMEOS) 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < kPersistingImagesDesktopAuraLength; ++i) { 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (kPersistingImagesDesktopAura[i].persistent_id > max_prs_id) 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci max_prs_id = kPersistingImagesDesktopAura[i].persistent_id; 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return max_prs_id; 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the scales in |input| match those in |expected|. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The order must match as the index is used in determining the raw id. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InputScalesValid(const base::StringPiece& input, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& expected) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t scales_size = static_cast<size_t>(input.size() / sizeof(float)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (scales_size != expected.size()) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<float[]> scales(new float[scales_size]); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do a memcpy to avoid misaligned memory access. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(scales.get(), input.data(), input.size()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t index = 0; index < scales_size; ++index) { 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (scales[index] != ui::GetScaleForScaleFactor(expected[index])) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns |scale_factors| as a string to be written to disk. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetScaleFactorsAsString( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor>& scale_factors) { 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<float[]> scales(new float[scale_factors.size()]); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < scale_factors.size(); ++i) 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scales[i] = ui::GetScaleForScaleFactor(scale_factors[i]); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out_string = std::string( 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(scales.get()), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scale_factors.size() * sizeof(float)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out_string; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct StringToIntTable { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* key; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::OverwritableByUserThemeProperty id; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Strings used by themes to identify tints in the JSON. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringToIntTable kTintTable[] = { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "buttons", ThemeProperties::TINT_BUTTONS }, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "frame", ThemeProperties::TINT_FRAME }, 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "frame_inactive", ThemeProperties::TINT_FRAME_INACTIVE }, 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "frame_incognito", ThemeProperties::TINT_FRAME_INCOGNITO }, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "frame_incognito_inactive", 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "background_tab", ThemeProperties::TINT_BACKGROUND_TAB }, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kTintTableLength = arraysize(kTintTable); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Strings used by themes to identify colors in the JSON. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringToIntTable kColorTable[] = { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "frame", ThemeProperties::COLOR_FRAME }, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "frame_inactive", ThemeProperties::COLOR_FRAME_INACTIVE }, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "frame_incognito", ThemeProperties::COLOR_FRAME_INCOGNITO }, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "frame_incognito_inactive", 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE }, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "toolbar", ThemeProperties::COLOR_TOOLBAR }, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "tab_text", ThemeProperties::COLOR_TAB_TEXT }, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "tab_background_text", ThemeProperties::COLOR_BACKGROUND_TAB_TEXT }, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "bookmark_text", ThemeProperties::COLOR_BOOKMARK_TEXT }, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_background", ThemeProperties::COLOR_NTP_BACKGROUND }, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_text", ThemeProperties::COLOR_NTP_TEXT }, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_link", ThemeProperties::COLOR_NTP_LINK }, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_link_underline", ThemeProperties::COLOR_NTP_LINK_UNDERLINE }, 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_header", ThemeProperties::COLOR_NTP_HEADER }, 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_section", ThemeProperties::COLOR_NTP_SECTION }, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_section_text", ThemeProperties::COLOR_NTP_SECTION_TEXT }, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_section_link", ThemeProperties::COLOR_NTP_SECTION_LINK }, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ntp_section_link_underline", 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE }, 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "button_background", ThemeProperties::COLOR_BUTTON_BACKGROUND }, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kColorTableLength = arraysize(kColorTable); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Strings used by themes to identify display properties keys in JSON. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StringToIntTable kDisplayProperties[] = { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "ntp_background_alignment", 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::NTP_BACKGROUND_ALIGNMENT }, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_background_repeat", ThemeProperties::NTP_BACKGROUND_TILING }, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ntp_logo_alternate", ThemeProperties::NTP_LOGO_ALTERNATE }, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kDisplayPropertiesSize = arraysize(kDisplayProperties); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GetIntForString(const std::string& key, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringToIntTable* table, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t table_length) { 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < table_length; ++i) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::strcasecmp(key.c_str(), table[i].key) == 0) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return table[i].id; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IntToIntTable { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int key; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Mapping used in CreateFrameImages() to associate frame images with the 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tint ID that should maybe be applied to it. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IntToIntTable kFrameTintMap[] = { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { PRS_THEME_FRAME, ThemeProperties::TINT_FRAME }, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { PRS_THEME_FRAME_INACTIVE, ThemeProperties::TINT_FRAME_INACTIVE }, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { PRS_THEME_FRAME_OVERLAY, ThemeProperties::TINT_FRAME }, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_OVERLAY_INACTIVE, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INACTIVE }, 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO, ThemeProperties::TINT_FRAME_INCOGNITO }, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_INACTIVE, 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_DESKTOP, ThemeProperties::TINT_FRAME }, 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_INACTIVE_DESKTOP, ThemeProperties::TINT_FRAME_INACTIVE }, 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_DESKTOP, ThemeProperties::TINT_FRAME_INCOGNITO }, 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_INACTIVE_DESKTOP, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE }, 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mapping used in GenerateTabBackgroundImages() to associate what frame image 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// goes with which tab background. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IntToIntTable kTabBackgroundMap[] = { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND, PRS_THEME_FRAME }, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_INCOGNITO, PRS_THEME_FRAME_INCOGNITO }, 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_DESKTOP, PRS_THEME_FRAME_DESKTOP }, 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_TAB_BACKGROUND_INCOGNITO_DESKTOP, 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PRS_THEME_FRAME_INCOGNITO_DESKTOP }, 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct CropEntry { 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int prs_id; 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The maximum useful height of the image at |prs_id|. 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int max_height; 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Whether cropping the image at |prs_id| should be skipped on OSes which 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // have a frame border to the left and right of the web contents. 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This should be true for images which can be used to decorate the border to 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the left and the right of the web contents. 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool skip_if_frame_border; 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The images which should be cropped before being saved to the data pack. The 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// maximum heights are meant to be conservative as to give room for the UI to 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// change without the maximum heights having to be modified. 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// |kThemePackVersion| must be incremented if any of the maximum heights below 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// are modified. 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct CropEntry kImagesToCrop[] = { 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_FRAME, 120, true }, 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_FRAME_INACTIVE, 120, true }, 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO, 120, true }, 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_FRAME_INCOGNITO_INACTIVE, 120, true }, 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_FRAME_OVERLAY, 120, true }, 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_FRAME_OVERLAY_INACTIVE, 120, true }, 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_TOOLBAR, 200, false }, 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_BUTTON_BACKGROUND, 60, false }, 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { PRS_THEME_WINDOW_CONTROL_BACKGROUND, 50, false }, 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { PRS_THEME_TOOLBAR_DESKTOP, 200, false } 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A list of images that don't need tinting or any other modification and can 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be byte-copied directly into the finished DataPack. This should contain the 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// persistent IDs for all themeable image IDs that aren't in kFrameTintMap, 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// kTabBackgroundMap or kImagesToCrop. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPreloadIDs[] = { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRS_THEME_NTP_BACKGROUND, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRS_THEME_NTP_ATTRIBUTION, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns true if this OS uses a browser frame which has a non zero width to 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the left and the right of the web contents. 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool HasFrameBorder() { 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_MACOSX) 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a piece of memory with the contents of the file |path|. 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::RefCountedMemory* ReadFileData(const base::FilePath& path) { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!path.empty()) { 444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ); 445effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (file.IsValid()) { 446effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int64 length = file.GetLength(); 447effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (length > 0 && length < INT_MAX) { 448effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int size = static_cast<int>(length); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> raw_data; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw_data.resize(size); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* data = reinterpret_cast<char*>(&(raw_data.front())); 452effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (file.ReadAtCurrentPos(data, size) == length) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::RefCountedBytes::TakeVector(&raw_data); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shifts an image's HSL values. The caller is responsible for deleting 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the returned image. 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image CreateHSLShiftedImage(const gfx::Image& image, 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const color_utils::HSL& hsl_shift) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia* src_image = image.ToImageSkia(); 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Image(gfx::ImageSkiaOperations::CreateHSLShiftedImage( 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *src_image, hsl_shift)); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Computes a bitmap at one scale from a bitmap at a different scale. 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSkBitmap CreateLowQualityResizedBitmap(const SkBitmap& source_bitmap, 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::ScaleFactor source_scale_factor, 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::ScaleFactor desired_scale_factor) { 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Size scaled_size = gfx::ToCeiledSize( 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::ScaleSize(gfx::Size(source_bitmap.width(), 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch source_bitmap.height()), 477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleForScaleFactor(desired_scale_factor) / 478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleForScaleFactor(source_scale_factor))); 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap scaled_bitmap; 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scaled_bitmap.allocN32Pixels(scaled_size.width(), scaled_size.height()); 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scaled_bitmap.eraseARGB(0, 0, 0, 0); 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkCanvas canvas(scaled_bitmap); 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkRect scaled_bounds = RectToSkRect(gfx::Rect(scaled_size)); 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note(oshima): The following scaling code doesn't work with 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // a mask image. 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canvas.drawBitmapRect(source_bitmap, NULL, scaled_bounds); 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return scaled_bitmap; 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A ImageSkiaSource that scales 100P image to the target scale factor 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if the ImageSkiaRep for the target scale factor isn't available. 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThemeImageSource: public gfx::ImageSkiaSource { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ThemeImageSource(const gfx::ImageSkia& source) : source_(source) { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThemeImageSource() {} 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 49868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE { 49968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (source_.HasRepresentation(scale)) 50068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return source_.GetRepresentation(scale); 50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const gfx::ImageSkiaRep& rep_100p = source_.GetRepresentation(1.0f); 502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap scaled_bitmap = CreateLowQualityResizedBitmap( 503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rep_100p.sk_bitmap(), 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::SCALE_FACTOR_100P, 50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetSupportedScaleFactor(scale)); 50668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ImageSkiaRep(scaled_bitmap, scale); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::ImageSkia source_; 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThemeImageSource); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// An ImageSkiaSource that delays decoding PNG data into bitmaps until 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// needed. Missing data for a scale factor is computed by scaling data for an 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// available scale factor. Computed bitmaps are stored for future look up. 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ThemeImagePngSource : public gfx::ImageSkiaSource { 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch typedef std::map<ui::ScaleFactor, 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::RefCountedMemory> > PngMap; 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch explicit ThemeImagePngSource(const PngMap& png_map) : png_map_(png_map) {} 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~ThemeImagePngSource() {} 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 52868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual gfx::ImageSkiaRep GetImageForScale(float scale) OVERRIDE { 52968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::ScaleFactor scale_factor = ui::GetSupportedScaleFactor(scale); 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Look up the bitmap for |scale factor| in the bitmap map. If found 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // return it. 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BitmapMap::const_iterator exact_bitmap_it = bitmap_map_.find(scale_factor); 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (exact_bitmap_it != bitmap_map_.end()) 53468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ImageSkiaRep(exact_bitmap_it->second, scale); 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Look up the raw PNG data for |scale_factor| in the png map. If found, 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // decode it, store the result in the bitmap map and return it. 538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PngMap::const_iterator exact_png_it = png_map_.find(scale_factor); 539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (exact_png_it != png_map_.end()) { 540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap bitmap; 541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!gfx::PNGCodec::Decode(exact_png_it->second->front(), 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_png_it->second->size(), 543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &bitmap)) { 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return gfx::ImageSkiaRep(); 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bitmap_map_[scale_factor] = bitmap; 54868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ImageSkiaRep(bitmap, scale); 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Find an available PNG for another scale factor. We want to use the 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // highest available scale factor. 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PngMap::const_iterator available_png_it = png_map_.end(); 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (PngMap::const_iterator png_it = png_map_.begin(); 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch png_it != png_map_.end(); ++png_it) { 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (available_png_it == png_map_.end() || 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleForScaleFactor(png_it->first) > 558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleForScaleFactor(available_png_it->first)) { 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_png_it = png_it; 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (available_png_it == png_map_.end()) 563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return gfx::ImageSkiaRep(); 564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::ScaleFactor available_scale_factor = available_png_it->first; 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Look up the bitmap for |available_scale_factor| in the bitmap map. 567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If not found, decode the corresponging png data, store the result 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // in the bitmap map. 569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BitmapMap::const_iterator available_bitmap_it = 570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bitmap_map_.find(available_scale_factor); 571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (available_bitmap_it == bitmap_map_.end()) { 572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap available_bitmap; 573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!gfx::PNGCodec::Decode(available_png_it->second->front(), 574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_png_it->second->size(), 575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &available_bitmap)) { 576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return gfx::ImageSkiaRep(); 578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bitmap_map_[available_scale_factor] = available_bitmap; 580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_bitmap_it = bitmap_map_.find(available_scale_factor); 581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Scale the available bitmap to the desired scale factor, store the result 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // in the bitmap map and return it. 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap scaled_bitmap = CreateLowQualityResizedBitmap( 586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_bitmap_it->second, 587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_scale_factor, 588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scale_factor); 589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bitmap_map_[scale_factor] = scaled_bitmap; 59068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return gfx::ImageSkiaRep(scaled_bitmap, scale); 591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PngMap png_map_; 594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch typedef std::map<ui::ScaleFactor, SkBitmap> BitmapMap; 596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BitmapMap bitmap_map_; 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(ThemeImagePngSource); 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabBackgroundImageSource: public gfx::CanvasImageSource { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabBackgroundImageSource(const gfx::ImageSkia& image_to_tint, 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& overlay, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL& hsl_shift, 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int vertical_offset) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : gfx::CanvasImageSource(image_to_tint.size(), false), 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_to_tint_(image_to_tint), 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_(overlay), 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl_shift_(hsl_shift), 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertical_offset_(vertical_offset) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TabBackgroundImageSource() { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CanvasImageSource: 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Draw(gfx::Canvas* canvas) OVERRIDE { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia bg_tint = 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkiaOperations::CreateHSLShiftedImage(image_to_tint_, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl_shift_); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->TileImageInt(bg_tint, 0, vertical_offset_, 0, 0, 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size().width(), size().height()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If they've provided a custom image, overlay it. 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!overlay_.isNull()) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->TileImageInt(overlay_, 0, 0, size().width(), 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_.height()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia image_to_tint_; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia overlay_; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL hsl_shift_; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int vertical_offset_; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TabBackgroundImageSource); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserThemePack::~BrowserThemePack() { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data_pack_.get()) { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete header_; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] tints_; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] colors_; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] display_properties_; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] source_images_; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromExtension( 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension) { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(extension); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(extension->is_theme()); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BrowserThemePack> pack(new BrowserThemePack); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->BuildHeader(extension); 662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pack->BuildTintsFromJSON(extensions::ThemeInfo::GetTints(extension)); 663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pack->BuildColorsFromJSON(extensions::ThemeInfo::GetColors(extension)); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pack->BuildDisplayPropertiesFromJSON( 665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ThemeInfo::GetDisplayProperties(extension)); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builds the images. (Image building is dependent on tints). 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePathMap file_paths; 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pack->ParseImageNamesFromJSON( 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ThemeInfo::GetImages(extension), 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension->path(), 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &file_paths); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->BuildSourceImagesArray(file_paths); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->LoadRawBitmapsTo(file_paths, &pack->images_on_ui_thread_)) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->CreateImages(&pack->images_on_ui_thread_); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the |images_on_file_thread_| has bitmaps for supported 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scale factors before passing to FILE thread. 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pack->images_on_file_thread_ = pack->images_on_ui_thread_; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ImageCache::iterator it = pack->images_on_file_thread_.begin(); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != pack->images_on_file_thread_.end(); ++it) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia* image_skia = 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const_cast<gfx::ImageSkia*>(it->second.ToImageSkia()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) image_skia->MakeThreadSafe(); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 690868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Set ThemeImageSource on |images_on_ui_thread_| to resample the source 691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // image if a caller of BrowserThemePack::GetImageNamed() requests an 692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ImageSkiaRep for a scale factor not specified by the theme author. 693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Callers of BrowserThemePack::GetImageNamed() to be able to retrieve 694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // ImageSkiaReps for all supported scale factors. 695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ImageCache::iterator it = pack->images_on_ui_thread_.begin(); 696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it != pack->images_on_ui_thread_.end(); ++it) { 697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const gfx::ImageSkia source_image_skia = it->second.AsImageSkia(); 698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ThemeImageSource* source = new ThemeImageSource(source_image_skia); 699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // image_skia takes ownership of source. 700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::ImageSkia image_skia(source, source_image_skia.size()); 701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it->second = gfx::Image(image_skia); 702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 7047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Generate raw images (for new-tab-page attribution and background) for 7057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // any missing scale from an available scale image. 7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < arraysize(kPreloadIDs); ++i) { 7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pack->GenerateRawImageForAllSupportedScales(kPreloadIDs[i]); 7087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 7097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The BrowserThemePack is now in a consistent state. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pack; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromDataPack( 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, const std::string& expected_id) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow IO on UI thread due to deep-seated theme design issues. 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see http://crbug.com/80206) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_io; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<BrowserThemePack> pack(new BrowserThemePack); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scale factor parameter is moot as data pack has image resources for all 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supported scale factors. 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->data_pack_.reset( 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::DataPack(ui::SCALE_FACTOR_NONE)); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->LoadFromPath(path)) { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to load theme data pack."; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringPiece pointer; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->GetStringPiece(kHeaderID, &pointer)) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->header_ = reinterpret_cast<BrowserThemePackHeader*>(const_cast<char*>( 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer.data())); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pack->header_->version != kThemePackVersion) { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "BuildFromDataPack failure! Version mismatch!"; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erg): Check endianess once DataPack works on the other endian. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string theme_id(reinterpret_cast<char*>(pack->header_->theme_id), 74403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) crx_file::id_util::kIdSize); 74503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::string truncated_id = expected_id.substr(0, crx_file::id_util::kIdSize); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_id != truncated_id) { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Wrong id: " << theme_id << " vs " << expected_id; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->GetStringPiece(kTintsID, &pointer)) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->tints_ = reinterpret_cast<TintEntry*>(const_cast<char*>( 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer.data())); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->GetStringPiece(kColorsID, &pointer)) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->colors_ = 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<ColorPair*>(const_cast<char*>(pointer.data())); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->GetStringPiece(kDisplayPropertiesID, &pointer)) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->display_properties_ = reinterpret_cast<DisplayPropertyPair*>( 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<char*>(pointer.data())); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->GetStringPiece(kSourceImagesID, &pointer)) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pack->source_images_ = reinterpret_cast<int*>( 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<char*>(pointer.data())); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pack->data_pack_->GetStringPiece(kScaleFactorsID, &pointer)) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InputScalesValid(pointer, pack->scale_factors_)) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "BuildFromDataPack failure! The pack scale factors differ " 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "from those supported by platform."; 777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pack; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 782558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// static 783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid BrowserThemePack::GetThemeableImageIDRs(std::set<int>* result) { 784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!result) 785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 787558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result->clear(); 788558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch for (size_t i = 0; i < kPersistingImagesLength; ++i) 789558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch result->insert(kPersistingImages[i].idr_id); 790558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < kPersistingImagesDesktopAuraLength; ++i) 793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result->insert(kPersistingImagesDesktopAura[i].idr_id); 794558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 795558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 796558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BrowserThemePack::WriteToDisk(const base::FilePath& path) const { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add resources for each of the property arrays. 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RawDataForWriting resources; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources[kHeaderID] = base::StringPiece( 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(header_), sizeof(BrowserThemePackHeader)); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources[kTintsID] = base::StringPiece( 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reinterpret_cast<const char*>(tints_), 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(TintEntry[kTintTableLength])); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources[kColorsID] = base::StringPiece( 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(colors_), 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(ColorPair[kColorTableLength])); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources[kDisplayPropertiesID] = base::StringPiece( 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(display_properties_), 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sizeof(DisplayPropertyPair[kDisplayPropertiesSize])); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source_count = 1; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* end = source_images_; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; *end != -1 ; end++) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_count++; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources[kSourceImagesID] = base::StringPiece( 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(source_images_), 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_count * sizeof(*source_images_)); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store results of GetScaleFactorsAsString() in std::string as 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base::StringPiece does not copy data in constructor. 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string scale_factors_string = GetScaleFactorsAsString(scale_factors_); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources[kScaleFactorsID] = scale_factors_string; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRawImagesTo(image_memory_, &resources); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RawImages reencoded_images; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepackImages(images_on_file_thread_, &reencoded_images); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRawImagesTo(reencoded_images, &resources); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DataPack::WritePack(path, resources, ui::DataPack::BINARY); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserThemePack::GetTint(int id, color_utils::HSL* hsl) const { 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tints_) { 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kTintTableLength; ++i) { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tints_[i].id == id) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl->h = tints_[i].h; 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl->s = tints_[i].s; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl->l = tints_[i].l; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserThemePack::GetColor(int id, SkColor* color) const { 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (colors_) { 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kColorTableLength; ++i) { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (colors_[i].id == id) { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *color = colors_[i].color; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserThemePack::GetDisplayProperty(int id, int* result) const { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (display_properties_) { 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kDisplayPropertiesSize; ++i) { 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (display_properties_[i].id == id) { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result = display_properties_[i].property; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image BrowserThemePack::GetImageNamed(int idr_id) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = GetPersistentIDByIDR(idr_id); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prs_id == -1) 878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Image(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if the image is cached. 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache::const_iterator image_iter = images_on_ui_thread_.find(prs_id); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (image_iter != images_on_ui_thread_.end()) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image_iter->second; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThemeImagePngSource::PngMap png_map; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < scale_factors_.size(); ++i) { 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> memory = 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRawData(idr_id, scale_factors_[i]); 889eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (memory.get()) 890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch png_map[scale_factors_[i]] = memory; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!png_map.empty()) { 893a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch gfx::ImageSkia image_skia(new ThemeImagePngSource(png_map), 1.0f); 894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |image_skia| takes ownership of ThemeImagePngSource. 895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image ret = gfx::Image(image_skia); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images_on_ui_thread_[prs_id] = ret; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Image(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::RefCountedMemory* BrowserThemePack::GetRawData( 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idr_id, 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor scale_factor) const { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedMemory* memory = NULL; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = GetPersistentIDByIDR(idr_id); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int raw_id = GetRawIDByPersistentID(prs_id, scale_factor); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (raw_id != -1) { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_pack_.get()) { 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memory = data_pack_->GetStaticMemory(raw_id); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RawImages::const_iterator it = image_memory_.find(raw_id); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != image_memory_.end()) { 916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) memory = it->second.get(); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return memory; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserThemePack::HasCustomImage(int idr_id) const { 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = GetPersistentIDByIDR(idr_id); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prs_id == -1) 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* img = source_images_; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; *img != -1; ++img) { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*img == prs_id) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// private: 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserThemePack::BrowserThemePack() 941558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : CustomThemeSupplier(EXTENSION), 942558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch header_(NULL), 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_(NULL), 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_(NULL), 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_properties_(NULL), 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_images_(NULL) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scale_factors_ = ui::GetSupportedScaleFactors(); 948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // On Windows HiDPI SCALE_FACTOR_100P may not be supported by default. 949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (std::find(scale_factors_.begin(), scale_factors_.end(), 950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::SCALE_FACTOR_100P) == scale_factors_.end()) { 951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scale_factors_.push_back(ui::SCALE_FACTOR_100P); 952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::BuildHeader(const Extension* extension) { 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_ = new BrowserThemePackHeader; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_->version = kThemePackVersion; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erg): Need to make this endian safe on other computers. Prerequisite 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is that ui::DataPack removes this same check. 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__BYTE_ORDER) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Linux check 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(__BYTE_ORDER == __LITTLE_ENDIAN, 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) datapack_assumes_little_endian); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(__BIG_ENDIAN__) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mac check 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #error DataPack assumes little endian 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_->little_endian = 1; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id = extension->id(); 97203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) memcpy(header_->theme_id, id.c_str(), crx_file::id_util::kIdSize); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserThemePack::BuildTintsFromJSON( 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* tints_value) { 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tints_ = new TintEntry[kTintTableLength]; 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kTintTableLength; ++i) { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[i].id = -1; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[i].h = -1; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[i].s = -1; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[i].l = -1; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tints_value) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse the incoming data from |tints_value| into an intermediary structure. 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, color_utils::HSL> temp_tints; 9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*tints_value); !iter.IsAtEnd(); 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* tint_list; 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsList(&tint_list) && 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (tint_list->GetSize() == 3)) { 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL hsl = { -1, -1, -1 }; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tint_list->GetDouble(0, &hsl.h) && 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint_list->GetDouble(1, &hsl.s) && 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint_list->GetDouble(2, &hsl.l)) { 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = GetIntForString(iter.key(), kTintTable, kTintTableLength); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id != -1) { 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_tints[id] = hsl; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy data from the intermediary data structure to the array. 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t count = 0; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::map<int, color_utils::HSL>::const_iterator it = 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_tints.begin(); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != temp_tints.end() && count < kTintTableLength; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it, ++count) { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[count].id = it->first; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[count].h = it->second.h; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[count].s = it->second.s; 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[count].l = it->second.l; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserThemePack::BuildColorsFromJSON( 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* colors_value) { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors_ = new ColorPair[kColorTableLength]; 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kColorTableLength; ++i) { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_[i].id = -1; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_[i].color = SkColorSetRGB(0, 0, 0); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, SkColor> temp_colors; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (colors_value) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadColorsFromJSON(colors_value, &temp_colors); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateMissingColors(&temp_colors); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy data from the intermediary data structure to the array. 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t count = 0; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::map<int, SkColor>::const_iterator it = temp_colors.begin(); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != temp_colors.end() && count < kColorTableLength; ++it, ++count) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_[count].id = it->first; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_[count].color = it->second; 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::ReadColorsFromJSON( 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* colors_value, 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, SkColor>* temp_colors) { 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse the incoming data from |colors_value| into an intermediary structure. 10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*colors_value); !iter.IsAtEnd(); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* color_list; 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsList(&color_list) && 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((color_list->GetSize() == 3) || (color_list->GetSize() == 4))) { 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color = SK_ColorWHITE; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r, g, b; 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_list->GetInteger(0, &r) && 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_list->GetInteger(1, &g) && 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_list->GetInteger(2, &b)) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_list->GetSize() == 4) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double alpha; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int alpha_int; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (color_list->GetDouble(3, &alpha)) { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color = SkColorSetARGB(static_cast<int>(alpha * 255), r, g, b); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (color_list->GetInteger(3, &alpha_int) && 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (alpha_int == 0 || alpha_int == 1)) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color = SkColorSetARGB(alpha_int ? 255 : 0, r, g, b); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid entry for part 4. 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color = SkColorSetRGB(r, g, b); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int id = GetIntForString(iter.key(), kColorTable, kColorTableLength); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id != -1) { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*temp_colors)[id] = color; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::GenerateMissingColors( 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, SkColor>* colors) { 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate link colors, if missing. (See GetColor()). 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_NTP_HEADER) && 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors->count(ThemeProperties::COLOR_NTP_SECTION)) { 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_NTP_HEADER] = 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_NTP_SECTION]; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE) && 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors->count(ThemeProperties::COLOR_NTP_SECTION_LINK)) { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color_section_link = 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_NTP_SECTION_LINK]; 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE] = 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColorSetA(color_section_link, SkColorGetA(color_section_link) / 3); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_NTP_LINK_UNDERLINE) && 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors->count(ThemeProperties::COLOR_NTP_LINK)) { 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor color_link = (*colors)[ThemeProperties::COLOR_NTP_LINK]; 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_NTP_LINK_UNDERLINE] = 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColorSetA(color_link, SkColorGetA(color_link) / 3); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate frame colors, if missing. (See GenerateFrameColors()). 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor frame; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, SkColor>::const_iterator it = 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors->find(ThemeProperties::COLOR_FRAME); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != colors->end()) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = it->second; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame = ThemeProperties::GetDefaultColor( 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_FRAME)) { 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_FRAME] = 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HSLShift(frame, GetTintInternal(ThemeProperties::TINT_FRAME)); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_FRAME_INACTIVE)) { 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_FRAME_INACTIVE] = 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HSLShift(frame, GetTintInternal( 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INACTIVE)); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_FRAME_INCOGNITO)) { 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_FRAME_INCOGNITO] = 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HSLShift(frame, GetTintInternal( 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO)); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!colors->count(ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE)) { 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*colors)[ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE] = 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HSLShift(frame, GetTintInternal( 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE)); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::BuildDisplayPropertiesFromJSON( 1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* display_properties_value) { 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_properties_ = new DisplayPropertyPair[kDisplayPropertiesSize]; 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kDisplayPropertiesSize; ++i) { 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_properties_[i].id = -1; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_properties_[i].property = 0; 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!display_properties_value) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int, int> temp_properties; 11505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*display_properties_value); 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int property_id = GetIntForString(iter.key(), kDisplayProperties, 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kDisplayPropertiesSize); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (property_id) { 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::NTP_BACKGROUND_ALIGNMENT: { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string val; 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsString(&val)) { 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_properties[ThemeProperties::NTP_BACKGROUND_ALIGNMENT] = 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::StringToAlignment(val); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::NTP_BACKGROUND_TILING: { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string val; 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsString(&val)) { 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_properties[ThemeProperties::NTP_BACKGROUND_TILING] = 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::StringToTiling(val); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::NTP_LOGO_ALTERNATE: { 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int val = 0; 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter.value().GetAsInteger(&val)) 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) temp_properties[ThemeProperties::NTP_LOGO_ALTERNATE] = val; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy data from the intermediary data structure to the array. 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t count = 0; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::map<int, int>::const_iterator it = temp_properties.begin(); 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != temp_properties.end() && count < kDisplayPropertiesSize; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it, ++count) { 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_properties_[count].id = it->first; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_properties_[count].property = it->second; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::ParseImageNamesFromJSON( 1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* images_value, 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& images_path, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePathMap* file_paths) const { 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!images_value) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(*images_value); !iter.IsAtEnd(); 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter.Advance()) { 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (iter.value().IsType(base::Value::TYPE_DICTIONARY)) { 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* inner_value = NULL; 1201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (iter.value().GetAsDictionary(&inner_value)) { 12025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::DictionaryValue::Iterator inner_iter(*inner_value); 1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !inner_iter.IsAtEnd(); 1204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inner_iter.Advance()) { 1205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string name; 1206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::ScaleFactor scale_factor = ui::SCALE_FACTOR_NONE; 1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (GetScaleFactorFromManifestKey(inner_iter.key(), &scale_factor) && 12085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) inner_iter.value().IsType(base::Value::TYPE_STRING) && 1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) inner_iter.value().GetAsString(&name)) { 1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddFileAtScaleToMap(iter.key(), 1211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scale_factor, 1212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) images_path.AppendASCII(name), 1213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_paths); 1214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (iter.value().IsType(base::Value::TYPE_STRING)) { 1218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string name; 1219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (iter.value().GetAsString(&name)) { 1220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddFileAtScaleToMap(iter.key(), 1221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::SCALE_FACTOR_100P, 1222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) images_path.AppendASCII(name), 1223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_paths); 1224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void BrowserThemePack::AddFileAtScaleToMap(const std::string& image_name, 1230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::ScaleFactor scale_factor, 1231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath& image_path, 1232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FilePathMap* file_paths) const { 1233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int id = GetPersistentIDByName(image_name); 1234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (id != -1) 1235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (*file_paths)[id][scale_factor] = image_path; 1236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) id = GetPersistentIDByNameHelper(image_name, 1238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kPersistingImagesDesktopAura, 1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kPersistingImagesDesktopAuraLength); 1240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (id != -1) 1241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (*file_paths)[id][scale_factor] = image_path; 1242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 1243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::BuildSourceImagesArray(const FilePathMap& file_paths) { 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> ids; 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (FilePathMap::const_iterator it = file_paths.begin(); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != file_paths.end(); ++it) { 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids.push_back(it->first); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_images_ = new int[ids.size() + 1]; 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::copy(ids.begin(), ids.end(), source_images_); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_images_[ids.size()] = -1; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserThemePack::LoadRawBitmapsTo( 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePathMap& file_paths, 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache* image_cache) { 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Themes should be loaded on the file thread, not the UI thread. 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/61838 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_io; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (FilePathMap::const_iterator it = file_paths.begin(); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != file_paths.end(); ++it) { 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = it->first; 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some images need to go directly into |image_memory_|. No modification is 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary or desirable. 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_copyable = false; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kPreloadIDs); ++i) { 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kPreloadIDs[i] == prs_id) { 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_copyable = true; 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gfx::ImageSkia image_skia; 1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (int pass = 0; pass < 2; ++pass) { 1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Two passes: In the first pass, we process only scale factor 1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 100% and in the second pass all other scale factors. We 1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // process scale factor 100% first because the first image added 1281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // in image_skia.AddRepresentation() determines the DIP size for 1282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // all representations. 1283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (ScaleFactorToFileMap::const_iterator s2f = it->second.begin(); 1284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) s2f != it->second.end(); ++s2f) { 1285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::ScaleFactor scale_factor = s2f->first; 1286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if ((pass == 0 && scale_factor != ui::SCALE_FACTOR_100P) || 1287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (pass == 1 && scale_factor == ui::SCALE_FACTOR_100P)) { 1288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) continue; 1289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> raw_data( 1291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReadFileData(s2f->second)); 1292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!raw_data.get() || !raw_data->size()) { 1293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LOG(ERROR) << "Could not load theme image" 1294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << " prs_id=" << prs_id 1295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << " scale_factor_enum=" << scale_factor 1296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << " file=" << s2f->second.value() 1297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << (raw_data.get() ? " (zero size)" : " (read error)"); 1298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 1299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (is_copyable) { 1301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int raw_id = GetRawIDByPersistentID(prs_id, scale_factor); 1302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) image_memory_[raw_id] = raw_data; 1303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 1304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkBitmap bitmap; 1305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(), 1306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) &bitmap)) { 1307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) image_skia.AddRepresentation( 130868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::ImageSkiaRep(bitmap, 1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleForScaleFactor(scale_factor))); 1310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else { 1311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTREACHED() << "Unable to decode theme image resource " 1312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) << it->first; 1313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!is_copyable && !image_skia.isNull()) 1318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) (*image_cache)[prs_id] = gfx::Image(image_skia); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::CreateImages(ImageCache* images) const { 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CropImages(images); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFrameImages(images); 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateTintedButtons(GetTintInternal(ThemeProperties::TINT_BUTTONS), images); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateTabBackgroundImages(images); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BrowserThemePack::CropImages(ImageCache* images) const { 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_frame_border = HasFrameBorder(); 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < arraysize(kImagesToCrop); ++i) { 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (has_frame_border && kImagesToCrop[i].skip_if_frame_border) 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int prs_id = kImagesToCrop[i].prs_id; 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageCache::iterator it = images->find(prs_id); 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (it == images->end()) 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int crop_height = kImagesToCrop[i].max_height; 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageSkia image_skia = it->second.AsImageSkia(); 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (*images)[prs_id] = gfx::Image(gfx::ImageSkiaOperations::ExtractSubset( 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_skia, gfx::Rect(0, 0, image_skia.width(), crop_height))); 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::CreateFrameImages(ImageCache* images) const { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create all the output images in a separate cache and move them back into 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the input images because there can be name collisions. 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache temp_output; 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kFrameTintMap); ++i) { 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = kFrameTintMap[i].key; 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image frame; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there's no frame image provided for the specified id, then load 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the default provided frame. If that's not provided, skip this whole 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thing and just use the default images. 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int prs_base_id = 0; 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 1365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (prs_id == PRS_THEME_FRAME_INCOGNITO_INACTIVE_DESKTOP) { 1366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prs_base_id = images->count(PRS_THEME_FRAME_INCOGNITO_DESKTOP) ? 1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PRS_THEME_FRAME_INCOGNITO_DESKTOP : PRS_THEME_FRAME_DESKTOP; 1368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (prs_id == PRS_THEME_FRAME_INACTIVE_DESKTOP) { 1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prs_base_id = PRS_THEME_FRAME_DESKTOP; 1370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (prs_id == PRS_THEME_FRAME_INCOGNITO_DESKTOP && 1371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !images->count(PRS_THEME_FRAME_INCOGNITO_DESKTOP)) { 1372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prs_base_id = PRS_THEME_FRAME_DESKTOP; 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!prs_base_id) { 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prs_id == PRS_THEME_FRAME_INCOGNITO_INACTIVE) { 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prs_base_id = images->count(PRS_THEME_FRAME_INCOGNITO) ? 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PRS_THEME_FRAME_INCOGNITO : PRS_THEME_FRAME; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (prs_id == PRS_THEME_FRAME_OVERLAY_INACTIVE) { 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prs_base_id = PRS_THEME_FRAME_OVERLAY; 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (prs_id == PRS_THEME_FRAME_INACTIVE) { 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prs_base_id = PRS_THEME_FRAME; 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (prs_id == PRS_THEME_FRAME_INCOGNITO && 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !images->count(PRS_THEME_FRAME_INCOGNITO)) { 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prs_base_id = PRS_THEME_FRAME; 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prs_base_id = prs_id; 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (images->count(prs_id)) { 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = (*images)[prs_id]; 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (prs_base_id != prs_id && images->count(prs_base_id)) { 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame = (*images)[prs_base_id]; 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (prs_base_id == PRS_THEME_FRAME_OVERLAY) { 1395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 1396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (images->count(PRS_THEME_FRAME_DESKTOP)) { 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (images->count(PRS_THEME_FRAME)) { 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is no theme overlay, don't tint the default frame, 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because it will overwrite the custom frame image when we cache and 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // reload from disk. 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame = gfx::Image(); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the theme doesn't specify an image, then apply the tint to 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the default frame. 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame = rb.GetImageNamed(IDR_THEME_FRAME); 1409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(USE_ASH) && !defined(OS_CHROMEOS) 1410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (prs_id >= PRS_THEME_FRAME_DESKTOP && 1411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) prs_id <= PRS_THEME_FRAME_INCOGNITO_INACTIVE_DESKTOP) { 1412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) frame = rb.GetImageNamed(IDR_THEME_FRAME_DESKTOP); 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!frame.IsEmpty()) { 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) temp_output[prs_id] = CreateHSLShiftedImage( 1418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) frame, GetTintInternal(kFrameTintMap[i].value)); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MergeImageCaches(temp_output, images); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::CreateTintedButtons( 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL& button_tint, 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache* processed_images) const { 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (button_tint.h != -1 || button_tint.s != -1 || button_tint.l != -1) { 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<int>& idr_ids = 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::GetTintableToolbarButtons(); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::set<int>::const_iterator it = idr_ids.begin(); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != idr_ids.end(); ++it) { 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = GetPersistentIDByIDR(*it); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(prs_id > 0); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch the image by IDR... 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image& button = rb.GetImageNamed(*it); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but save a version with the persistent ID. 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*processed_images)[prs_id] = 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateHSLShiftedImage(button, button_tint); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::CreateTabBackgroundImages(ImageCache* images) const { 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache temp_output; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kTabBackgroundMap); ++i) { 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id = kTabBackgroundMap[i].key; 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_base_id = kTabBackgroundMap[i].value; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only need to generate the background tab images if we were provided 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with a PRS_THEME_FRAME. 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache::const_iterator it = images->find(prs_base_id); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != images->end()) { 1456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageSkia image_to_tint = (it->second).AsImageSkia(); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL hsl_shift = GetTintInternal( 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_BACKGROUND_TAB); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int vertical_offset = images->count(prs_id) 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? kRestoredTabVerticalOffset : 0; 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia overlay; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache::const_iterator overlay_it = images->find(prs_id); 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (overlay_it != images->end()) 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overlay = overlay_it->second.AsImageSkia(); 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkiaSource* source = new TabBackgroundImageSource( 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_to_tint, overlay, hsl_shift, vertical_offset); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ImageSkia takes ownership of |source|. 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) temp_output[prs_id] = gfx::Image(gfx::ImageSkia(source, 1471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_to_tint.size())); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MergeImageCaches(temp_output, images); 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::RepackImages(const ImageCache& images, 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RawImages* reencoded_images) const { 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ImageCache::const_iterator it = images.begin(); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != images.end(); ++it) { 1481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageSkia image_skia = *it->second.ToImageSkia(); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<gfx::ImageSkiaRep> ImageSkiaReps; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageSkiaReps image_reps = image_skia.image_reps(); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (image_reps.empty()) { 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "No image reps for resource " << it->first << "."; 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ImageSkiaReps::iterator rep_it = image_reps.begin(); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rep_it != image_reps.end(); ++rep_it) { 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> bitmap_data; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gfx::PNGCodec::EncodeBGRASkBitmap(rep_it->sk_bitmap(), false, 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bitmap_data)) { 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Image file for resource " << it->first 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " could not be encoded."; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 149668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int raw_id = GetRawIDByPersistentID( 149768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) it->first, 149868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetSupportedScaleFactor(rep_it->scale())); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*reencoded_images)[raw_id] = 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&bitmap_data); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::MergeImageCaches( 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ImageCache& source, ImageCache* destination) const { 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ImageCache::const_iterator it = source.begin(); it != source.end(); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*destination)[it->first] = it->second; 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserThemePack::AddRawImagesTo(const RawImages& images, 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RawDataForWriting* out) const { 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RawImages::const_iterator it = images.begin(); it != images.end(); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*out)[it->first] = base::StringPiece( 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it->second->front_as<char>(), it->second->size()); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)color_utils::HSL BrowserThemePack::GetTintInternal(int id) const { 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tints_) { 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kTintTableLength; ++i) { 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tints_[i].id == id) { 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL hsl; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.h = tints_[i].h; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.s = tints_[i].s; 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.l = tints_[i].l; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hsl; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ThemeProperties::GetDefaultTint(id); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int BrowserThemePack::GetRawIDByPersistentID( 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prs_id, 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ScaleFactor scale_factor) const { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prs_id < 0) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < scale_factors_.size(); ++i) { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (scale_factors_[i] == scale_factor) 15461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ((GetMaxPersistentId() + 1) * i) + prs_id; 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool BrowserThemePack::GetScaleFactorFromManifestKey( 1552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& key, 1553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui::ScaleFactor* scale_factor) const { 1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int percent = 0; 1555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (base::StringToInt(key, &percent)) { 1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) float scale = static_cast<float>(percent) / 100.0f; 1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < scale_factors_.size(); ++i) { 1558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (fabs(ui::GetScaleForScaleFactor(scale_factors_[i]) - scale) 1559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) < 0.001) { 1560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *scale_factor = scale_factors_[i]; 1561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return true; 1562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return false; 1566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 15677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void BrowserThemePack::GenerateRawImageForAllSupportedScales(int prs_id) { 15697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Compute (by scaling) bitmaps for |prs_id| for any scale factors 15707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // for which the theme author did not provide a bitmap. We compute 15717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // the bitmaps using the highest scale factor that theme author 15727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // provided. 15737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Note: We use only supported scale factors. For example, if scale 15747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // factor 2x is supported by the current system, but 1.8x is not and 15757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // if the theme author did not provide an image for 2x but one for 15767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // 1.8x, we will not use the 1.8x image here. Here we will only use 15777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // images provided for scale factors supported by the current system. 15787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // See if any image is missing. If not, we're done. 15807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool image_missing = false; 15817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < scale_factors_.size(); ++i) { 15827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int raw_id = GetRawIDByPersistentID(prs_id, scale_factors_[i]); 15837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (image_memory_.find(raw_id) == image_memory_.end()) { 15847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) image_missing = true; 15857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 15867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 15877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 15887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!image_missing) 15897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 15907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Find available scale factor with highest scale. 1592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::ScaleFactor available_scale_factor = ui::SCALE_FACTOR_NONE; 15937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < scale_factors_.size(); ++i) { 15947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int raw_id = GetRawIDByPersistentID(prs_id, scale_factors_[i]); 1595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((available_scale_factor == ui::SCALE_FACTOR_NONE || 1596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (ui::GetScaleForScaleFactor(scale_factors_[i]) > 1597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleForScaleFactor(available_scale_factor))) && 15987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) image_memory_.find(raw_id) != image_memory_.end()) { 1599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_scale_factor = scale_factors_[i]; 16007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // If no scale factor is available, we're done. 1603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (available_scale_factor == ui::SCALE_FACTOR_NONE) 16047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 16057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 16067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Get bitmap for the available scale factor. 1607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int available_raw_id = GetRawIDByPersistentID(prs_id, available_scale_factor); 16087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RawImages::const_iterator it = image_memory_.find(available_raw_id); 16097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SkBitmap available_bitmap; 16107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!gfx::PNGCodec::Decode(it->second->front(), 16117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) it->second->size(), 16127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &available_bitmap)) { 16137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED() << "Unable to decode theme image for prs_id=" 1614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch << prs_id << " for scale_factor=" << available_scale_factor; 16157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 16167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 16187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Fill in all missing scale factors by scaling the available bitmap. 16197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < scale_factors_.size(); ++i) { 16207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int scaled_raw_id = GetRawIDByPersistentID(prs_id, scale_factors_[i]); 16217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (image_memory_.find(scaled_raw_id) != image_memory_.end()) 16227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 1623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkBitmap scaled_bitmap = 1624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CreateLowQualityResizedBitmap(available_bitmap, 1625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch available_scale_factor, 1626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scale_factors_[i]); 16277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<unsigned char> bitmap_data; 16287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!gfx::PNGCodec::EncodeBGRASkBitmap(scaled_bitmap, 16297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 16307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &bitmap_data)) { 16317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NOTREACHED() << "Unable to encode theme image for prs_id=" 16327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << prs_id << " for scale_factor=" << scale_factors_[i]; 16337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 16347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) image_memory_[scaled_raw_id] = 16367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::RefCountedBytes::TakeVector(&bitmap_data); 16377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 16387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1639