browser_theme_pack.cc revision bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/themes/browser_theme_pack.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "app/resource_bundle.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/data_pack.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/stl_util-inl.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_util.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/values.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chrome_thread.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/themes/browser_theme_provider.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "gfx/codec/png_codec.h" 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "gfx/skbitmap_operations.h" 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/app_resources.h" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/theme_resources.h" 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/base/file_stream.h" 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/base/net_errors.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "third_party/skia/include/core/SkCanvas.h" 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace { 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Version number of the current theme pack. We just throw out and rebuild 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// theme packs that aren't int-equal to this. 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kThemePackVersion = 15; 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// IDs that are in the DataPack won't clash with the positive integer 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// int32_t. kHeaderID should always have the maximum value because we want the 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// "header" to be written last. That way we can detect whether the pack was 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// successfully written and ignore and regenerate if it was only partially 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// written (i.e. chrome crashed on a different thread while writing the pack). 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kHeaderID = UINT_MAX - 1; 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kTintsID = UINT_MAX - 2; 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kColorsID = UINT_MAX - 3; 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kDisplayPropertiesID = UINT_MAX - 4; 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kSourceImagesID = UINT_MAX - 5; 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Static size of the tint/color/display property arrays that are mmapped. 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kTintArraySize = 6; 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kColorArraySize = 19; 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kDisplayPropertySize = 3; 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The sum of kFrameBorderThickness and kNonClientRestoredExtraThickness from 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// OpaqueBrowserFrameView. 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kRestoredTabVerticalOffset = 15; 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Persistent constants for the main images that we need. These have the same 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// names as their IDR_* counterparts but these values will always stay the 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// same. 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_FRAME = 1; 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_FRAME_INACTIVE = 2; 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_FRAME_INCOGNITO = 3; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_FRAME_INCOGNITO_INACTIVE = 4; 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_TOOLBAR = 5; 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_TAB_BACKGROUND = 6; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_TAB_BACKGROUND_INCOGNITO = 7; 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_TAB_BACKGROUND_V = 8; 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_NTP_BACKGROUND = 9; 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_FRAME_OVERLAY = 10; 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_FRAME_OVERLAY_INACTIVE = 11; 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_BUTTON_BACKGROUND = 12; 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_NTP_ATTRIBUTION = 13; 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int PRS_THEME_WINDOW_CONTROL_BACKGROUND = 14; 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstruct PersistingImagesTable { 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A non-changing integer ID meant to be saved in theme packs. This ID must 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // not change between versions of chrome. 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int persistent_id; 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The IDR that depends on the whims of GRIT and therefore changes whenever 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // someone adds a new resource. 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int idr_id; 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // String to check for when parsing theme manifests or NULL if this isn't 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // supposed to be changeable by the user. 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const char* key; 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// IDR_* resource names change whenever new resources are added; use persistent 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// IDs when storing to a cached pack. 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenPersistingImagesTable kPersistingImages[] = { 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME, IDR_THEME_FRAME, 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_frame" }, 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_INACTIVE, IDR_THEME_FRAME_INACTIVE, 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_frame_inactive" }, 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_INCOGNITO, IDR_THEME_FRAME_INCOGNITO, 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_frame_incognito" }, 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_INCOGNITO_INACTIVE, IDR_THEME_FRAME_INCOGNITO_INACTIVE, 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_frame_incognito_inactive" }, 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_TOOLBAR, IDR_THEME_TOOLBAR, 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_toolbar" }, 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_TAB_BACKGROUND, IDR_THEME_TAB_BACKGROUND, 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_tab_background" }, 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_TAB_BACKGROUND_INCOGNITO, IDR_THEME_TAB_BACKGROUND_INCOGNITO, 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_tab_background_incognito" }, 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_TAB_BACKGROUND_V, IDR_THEME_TAB_BACKGROUND_V, 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_tab_background_v"}, 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_NTP_BACKGROUND, IDR_THEME_NTP_BACKGROUND, 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_ntp_background" }, 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_OVERLAY, IDR_THEME_FRAME_OVERLAY, 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_frame_overlay" }, 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_OVERLAY_INACTIVE, IDR_THEME_FRAME_OVERLAY_INACTIVE, 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_frame_overlay_inactive" }, 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_BUTTON_BACKGROUND, IDR_THEME_BUTTON_BACKGROUND, 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_button_background" }, 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_NTP_ATTRIBUTION, IDR_THEME_NTP_ATTRIBUTION, 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_ntp_attribution" }, 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_WINDOW_CONTROL_BACKGROUND, IDR_THEME_WINDOW_CONTROL_BACKGROUND, 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "theme_window_control_background"}, 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The rest of these entries have no key because they can't be overridden 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // from the json manifest. 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 15, IDR_BACK, NULL }, 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 16, IDR_BACK_D, NULL }, 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 17, IDR_BACK_H, NULL }, 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 18, IDR_BACK_P, NULL }, 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 19, IDR_FORWARD, NULL }, 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 20, IDR_FORWARD_D, NULL }, 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 21, IDR_FORWARD_H, NULL }, 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 22, IDR_FORWARD_P, NULL }, 123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 23, IDR_HOME, NULL }, 124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 24, IDR_HOME_H, NULL }, 125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 25, IDR_HOME_P, NULL }, 126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 26, IDR_RELOAD, NULL }, 127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 27, IDR_RELOAD_H, NULL }, 128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 28, IDR_RELOAD_P, NULL }, 129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 29, IDR_STOP, NULL }, 130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 30, IDR_STOP_D, NULL }, 131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 31, IDR_STOP_H, NULL }, 132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 32, IDR_STOP_P, NULL }, 133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 33, IDR_LOCATIONBG_C, NULL }, 134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 34, IDR_LOCATIONBG_L, NULL }, 135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 35, IDR_LOCATIONBG_R, NULL }, 136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 36, IDR_BROWSER_ACTIONS_OVERFLOW, NULL }, 137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 37, IDR_BROWSER_ACTIONS_OVERFLOW_H, NULL }, 138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 38, IDR_BROWSER_ACTIONS_OVERFLOW_P, NULL }, 139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 39, IDR_TOOLS, NULL }, 140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 40, IDR_TOOLS_H, NULL }, 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 41, IDR_TOOLS_P, NULL }, 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 42, IDR_MENU_DROPARROW, NULL }, 143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 43, IDR_THROBBER, NULL }, 144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 44, IDR_THROBBER_WAITING, NULL }, 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { 45, IDR_THROBBER_LIGHT, NULL }, 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint GetPersistentIDByName(const std::string& key) { 149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (size_t i = 0; i < arraysize(kPersistingImages); ++i) { 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (kPersistingImages[i].key != NULL && 151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::strcasecmp(key.c_str(), kPersistingImages[i].key) == 0) { 152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return kPersistingImages[i].persistent_id; 153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return -1; 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint GetPersistentIDByIDR(int idr) { 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (size_t i = 0; i < arraysize(kPersistingImages); ++i) { 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (kPersistingImages[i].idr_id == idr) { 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return kPersistingImages[i].persistent_id; 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return -1; 167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstruct StringToIntTable { 170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const char* key; 171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int id; 172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Strings used by themes to identify tints in the JSON. 175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenStringToIntTable kTintTable[] = { 176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "buttons", BrowserThemeProvider::TINT_BUTTONS }, 177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame", BrowserThemeProvider::TINT_FRAME }, 178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame_inactive", BrowserThemeProvider::TINT_FRAME_INACTIVE }, 179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame_incognito", BrowserThemeProvider::TINT_FRAME_INCOGNITO }, 180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame_incognito_inactive", 181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_FRAME_INCOGNITO_INACTIVE }, 182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "background_tab", BrowserThemeProvider::TINT_BACKGROUND_TAB }, 183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { NULL, 0 } 184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Strings used by themes to identify colors in the JSON. 187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenStringToIntTable kColorTable[] = { 188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame", BrowserThemeProvider::COLOR_FRAME }, 189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame_inactive", BrowserThemeProvider::COLOR_FRAME_INACTIVE }, 190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame_incognito", BrowserThemeProvider::COLOR_FRAME_INCOGNITO }, 191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "frame_incognito_inactive", 192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE }, 193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "toolbar", BrowserThemeProvider::COLOR_TOOLBAR }, 194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "tab_text", BrowserThemeProvider::COLOR_TAB_TEXT }, 195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "tab_background_text", BrowserThemeProvider::COLOR_BACKGROUND_TAB_TEXT }, 196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "bookmark_text", BrowserThemeProvider::COLOR_BOOKMARK_TEXT }, 197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_background", BrowserThemeProvider::COLOR_NTP_BACKGROUND }, 198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_text", BrowserThemeProvider::COLOR_NTP_TEXT }, 199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_link", BrowserThemeProvider::COLOR_NTP_LINK }, 200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_link_underline", BrowserThemeProvider::COLOR_NTP_LINK_UNDERLINE }, 201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_header", BrowserThemeProvider::COLOR_NTP_HEADER }, 202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_section", BrowserThemeProvider::COLOR_NTP_SECTION }, 203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_section_text", BrowserThemeProvider::COLOR_NTP_SECTION_TEXT }, 204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_section_link", BrowserThemeProvider::COLOR_NTP_SECTION_LINK }, 205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_section_link_underline", 206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::COLOR_NTP_SECTION_LINK_UNDERLINE }, 207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "control_background", BrowserThemeProvider::COLOR_CONTROL_BACKGROUND }, 208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "button_background", BrowserThemeProvider::COLOR_BUTTON_BACKGROUND }, 209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { NULL, 0 } 210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Strings used by themes to identify display properties keys in JSON. 213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenStringToIntTable kDisplayProperties[] = { 214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_background_alignment", 215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::NTP_BACKGROUND_ALIGNMENT }, 216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_background_repeat", BrowserThemeProvider::NTP_BACKGROUND_TILING }, 217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "ntp_logo_alternate", BrowserThemeProvider::NTP_LOGO_ALTERNATE }, 218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { NULL, 0 } 219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Strings used by the tiling values in JSON. 222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenStringToIntTable kTilingStrings[] = { 223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "no-repeat", BrowserThemeProvider::NO_REPEAT }, 224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "repeat-x", BrowserThemeProvider::REPEAT_X }, 225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "repeat-y", BrowserThemeProvider::REPEAT_Y }, 226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { "repeat", BrowserThemeProvider::REPEAT }, 227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { NULL, 0 } 228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenint GetIntForString(const std::string& key, StringToIntTable* table) { 231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; table[i].key != NULL; ++i) { 232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (base::strcasecmp(key.c_str(), table[i].key) == 0) { 233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return table[i].id; 234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return -1; 238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstruct IntToIntTable { 241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int key; 242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int value; 243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Mapping used in GenerateFrameImages() to associate frame images with the 246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// tint ID that should maybe be applied to it. 247bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIntToIntTable kFrameTintMap[] = { 248bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME, BrowserThemeProvider::TINT_FRAME }, 249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_INACTIVE, BrowserThemeProvider::TINT_FRAME_INACTIVE }, 250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_OVERLAY, BrowserThemeProvider::TINT_FRAME }, 251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_OVERLAY_INACTIVE, 252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_FRAME_INACTIVE }, 253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_INCOGNITO, BrowserThemeProvider::TINT_FRAME_INCOGNITO }, 254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_FRAME_INCOGNITO_INACTIVE, 255bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_FRAME_INCOGNITO_INACTIVE } 256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 257bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 258bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Mapping used in GenerateTabBackgroundImages() to associate what frame image 259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// goes with which tab background. 260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenIntToIntTable kTabBackgroundMap[] = { 261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_TAB_BACKGROUND, PRS_THEME_FRAME }, 262bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen { PRS_THEME_TAB_BACKGROUND_INCOGNITO, PRS_THEME_FRAME_INCOGNITO } 263bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// A list of images that don't need tinting or any other modification and can 266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// be byte-copied directly into the finished DataPack. This should contain the 267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// persistent IDs for all themeable image IDs that aren't in kFrameTintMap or 268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// kTabBackgroundMap. 269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst int kPreloadIDs[] = { 270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PRS_THEME_TOOLBAR, 271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PRS_THEME_NTP_BACKGROUND, 272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PRS_THEME_BUTTON_BACKGROUND, 273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PRS_THEME_NTP_ATTRIBUTION, 274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PRS_THEME_WINDOW_CONTROL_BACKGROUND 275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Returns a piece of memory with the contents of the file |path|. 278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenRefCountedMemory* ReadFileData(const FilePath& path) { 279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!path.empty()) { 280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen net::FileStream file; 281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ; 282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (file.Open(path, flags) == net::OK) { 283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 avail = file.Available(); 284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (avail > 0 && avail < INT_MAX) { 285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size_t size = static_cast<size_t>(avail); 286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<unsigned char> raw_data; 287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen raw_data.resize(size); 288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen char* data = reinterpret_cast<char*>(&(raw_data.front())); 289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (file.ReadUntilComplete(data, size) == avail) 290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return RefCountedBytes::TakeVector(&raw_data); 291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Does error checking for invalid incoming data while trying to read an 299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// floating point value. 300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool ValidRealValue(ListValue* tint_list, int index, double* out) { 301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tint_list->GetReal(index, out)) 302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int value = 0; 305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tint_list->GetInteger(index, &value)) { 306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *out = value; 307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace 314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenBrowserThemePack::~BrowserThemePack() { 316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!data_pack_.get()) { 317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete header_; 318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete [] tints_; 319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete [] colors_; 320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete [] display_properties_; 321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete [] source_images_; 322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteValues(&prepared_images_); 325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STLDeleteValues(&loaded_images_); 326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static 329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenBrowserThemePack* BrowserThemePack::BuildFromExtension(Extension* extension) { 330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(extension); 332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(extension->is_theme()); 333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemePack* pack = new BrowserThemePack; 335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->BuildHeader(extension); 336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->BuildTintsFromJSON(extension->GetThemeTints()); 337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->BuildColorsFromJSON(extension->GetThemeColors()); 338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->BuildDisplayPropertiesFromJSON(extension->GetThemeDisplayProperties()); 339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Builds the images. (Image building is dependent on tints). 341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePathMap file_paths; 342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->ParseImageNamesFromJSON(extension->GetThemeImages(), 343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen extension->path(), 344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &file_paths); 345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->BuildSourceImagesArray(file_paths); 346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->LoadRawBitmapsTo(file_paths, &pack->prepared_images_)) 348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->GenerateFrameImages(&pack->prepared_images_); 351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if !defined(OS_MACOSX) 353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // OSX uses its own special buttons that are PDFs that do odd sorts of vector 354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // graphics tricks. Other platforms use bitmaps and we must pre-tint them. 355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->GenerateTintedButtons( 356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->GetTintInternal(BrowserThemeProvider::TINT_BUTTONS), 357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &pack->prepared_images_); 358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif 359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->GenerateTabBackgroundImages(&pack->prepared_images_); 361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The BrowserThemePack is now in a consistent state. 363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return pack; 364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// static 367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenscoped_refptr<BrowserThemePack> BrowserThemePack::BuildFromDataPack( 368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath path, const std::string& expected_id) { 369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_refptr<BrowserThemePack> pack = new BrowserThemePack; 371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->data_pack_.reset(new base::DataPack); 372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->data_pack_->Load(path)) { 374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LOG(ERROR) << "Failed to load theme data pack."; 375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::StringPiece pointer; 379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->data_pack_->GetStringPiece(kHeaderID, &pointer)) 380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->header_ = reinterpret_cast<BrowserThemePackHeader*>(const_cast<char*>( 382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pointer.data())); 383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (pack->header_->version != kThemePackVersion) { 385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DLOG(ERROR) << "BuildFromDataPack failure! Version mismatch!"; 386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(erg): Check endianess once DataPack works on the other endian. 389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string theme_id(reinterpret_cast<char*>(pack->header_->theme_id), 390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Extension::kIdSize); 391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string truncated_id = expected_id.substr(0, Extension::kIdSize); 392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (theme_id != truncated_id) { 393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DLOG(ERROR) << "Wrong id: " << theme_id << " vs " << expected_id; 394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->data_pack_->GetStringPiece(kTintsID, &pointer)) 398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->tints_ = reinterpret_cast<TintEntry*>(const_cast<char*>( 400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pointer.data())); 401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->data_pack_->GetStringPiece(kColorsID, &pointer)) 403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->colors_ = 405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<ColorPair*>(const_cast<char*>(pointer.data())); 406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->data_pack_->GetStringPiece(kDisplayPropertiesID, &pointer)) 408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->display_properties_ = reinterpret_cast<DisplayPropertyPair*>( 410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const_cast<char*>(pointer.data())); 411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!pack->data_pack_->GetStringPiece(kSourceImagesID, &pointer)) 413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen pack->source_images_ = reinterpret_cast<int*>( 415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const_cast<char*>(pointer.data())); 416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return pack; 418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool BrowserThemePack::WriteToDisk(FilePath path) const { 421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); 422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Add resources for each of the property arrays. 423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RawDataForWriting resources; 424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources[kHeaderID] = base::StringPiece( 425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<const char*>(header_), sizeof(BrowserThemePackHeader)); 426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources[kTintsID] = base::StringPiece( 427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<const char*>(tints_), sizeof(TintEntry[kTintArraySize])); 428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources[kColorsID] = base::StringPiece( 429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<const char*>(colors_), 430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sizeof(ColorPair[kColorArraySize])); 431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources[kDisplayPropertiesID] = base::StringPiece( 432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<const char*>(display_properties_), 433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sizeof(DisplayPropertyPair[kDisplayPropertySize])); 434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int source_count = 1; 436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int* end = source_images_; 437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (; *end != -1 ; end++) 438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen source_count++; 439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen resources[kSourceImagesID] = base::StringPiece( 440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<const char*>(source_images_), 441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen source_count * sizeof(*source_images_)); 442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddRawImagesTo(image_memory_, &resources); 444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RawImages reencoded_images; 446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RepackImages(prepared_images_, &reencoded_images); 447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen AddRawImagesTo(reencoded_images, &resources); 448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return base::DataPack::WritePack(path, resources); 450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool BrowserThemePack::GetTint(int id, color_utils::HSL* hsl) const { 453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tints_) { 454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kTintArraySize; ++i) { 455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tints_[i].id == id) { 456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen hsl->h = tints_[i].h; 457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen hsl->s = tints_[i].s; 458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen hsl->l = tints_[i].l; 459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool BrowserThemePack::GetColor(int id, SkColor* color) const { 468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (colors_) { 469bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kColorArraySize; ++i) { 470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (colors_[i].id == id) { 471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *color = colors_[i].color; 472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 473bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 476bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 478bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool BrowserThemePack::GetDisplayProperty(int id, int* result) const { 481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (display_properties_) { 482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kDisplayPropertySize; ++i) { 483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (display_properties_[i].id == id) { 484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *result = display_properties_[i].property; 485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSkBitmap* BrowserThemePack::GetBitmapNamed(int idr_id) const { 494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_id = GetPersistentIDByIDR(idr_id); 495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (prs_id == -1) 496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Check our cache of prepared images, first. 499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache::const_iterator image_iter = prepared_images_.find(prs_id); 500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (image_iter != prepared_images_.end()) 501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return image_iter->second; 502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Check if we've already loaded this image. 504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen image_iter = loaded_images_.find(prs_id); 505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (image_iter != loaded_images_.end()) 506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return image_iter->second; 507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 508bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_refptr<RefCountedMemory> memory; 509bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (data_pack_.get()) { 510bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen memory = data_pack_->GetStaticMemory(prs_id); 511bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RawImages::const_iterator it = image_memory_.find(prs_id); 513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (it != image_memory_.end()) { 514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen memory = it->second; 515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (memory.get()) { 519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Decode the PNG. 520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmap bitmap; 521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!gfx::PNGCodec::Decode(memory->front(), memory->size(), 522bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &bitmap)) { 523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unable to decode theme image resource " << idr_id 524bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen << " from saved DataPack."; 525bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 526bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 527bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 528bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmap* ret = new SkBitmap(bitmap); 529bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen loaded_images_[prs_id] = ret; 530bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return ret; 532bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 534bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return NULL; 535bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenRefCountedMemory* BrowserThemePack::GetRawData(int idr_id) const { 538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RefCountedMemory* memory = NULL; 539bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_id = GetPersistentIDByIDR(idr_id); 540bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (prs_id != -1) { 542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (data_pack_.get()) { 543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen memory = data_pack_->GetStaticMemory(prs_id); 544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 545bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RawImages::const_iterator it = image_memory_.find(prs_id); 546bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (it != image_memory_.end()) { 547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen memory = it->second; 548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return memory; 553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool BrowserThemePack::HasCustomImage(int idr_id) const { 556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_id = GetPersistentIDByIDR(idr_id); 557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (prs_id == -1) 558bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 559bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int* img = source_images_; 561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (; *img != -1; ++img) { 562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (*img == prs_id) 563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 565bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 568bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 569bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// private: 570bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 571bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenBrowserThemePack::BrowserThemePack() 572bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : header_(NULL), 573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_(NULL), 574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors_(NULL), 575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_(NULL), 576bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen source_images_(NULL) { 577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::BuildHeader(Extension* extension) { 580bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen header_ = new BrowserThemePackHeader; 581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen header_->version = kThemePackVersion; 582bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 583bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(erg): Need to make this endian safe on other computers. Prerequisite 584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // is that base::DataPack removes this same check. 585bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(__BYTE_ORDER) 586bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Linux check 587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen COMPILE_ASSERT(__BYTE_ORDER == __LITTLE_ENDIAN, 588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen datapack_assumes_little_endian); 589bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#elif defined(__BIG_ENDIAN__) 590bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Mac check 591bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen #error DataPack assumes little endian 592bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif 593bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen header_->little_endian = 1; 594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const std::string& id = extension->id(); 596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen memcpy(header_->theme_id, id.c_str(), Extension::kIdSize); 597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::BuildTintsFromJSON(DictionaryValue* tints_value) { 600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_ = new TintEntry[kTintArraySize]; 601bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kTintArraySize; ++i) { 602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[i].id = -1; 603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[i].h = -1; 604bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[i].s = -1; 605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[i].l = -1; 606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!tints_value) 609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Parse the incoming data from |tints_value| into an intermediary structure. 612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, color_utils::HSL> temp_tints; 613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (DictionaryValue::key_iterator iter(tints_value->begin_keys()); 614bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != tints_value->end_keys(); ++iter) { 615bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ListValue* tint_list; 616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tints_value->GetList(*iter, &tint_list) && 617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (tint_list->GetSize() == 3)) { 618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL hsl = { -1, -1, -1 }; 619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (ValidRealValue(tint_list, 0, &hsl.h) && 621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ValidRealValue(tint_list, 1, &hsl.s) && 622bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ValidRealValue(tint_list, 2, &hsl.l)) { 623bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int id = GetIntForString(*iter, kTintTable); 624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (id != -1) { 625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_tints[id] = hsl; 626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Copy data from the intermediary data structure to the array. 632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int count = 0; 633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (std::map<int, color_utils::HSL>::const_iterator it = 634bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_tints.begin(); it != temp_tints.end() && count < kTintArraySize; 635bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ++it, ++count) { 636bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[count].id = it->first; 637bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[count].h = it->second.h; 638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[count].s = it->second.s; 639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen tints_[count].l = it->second.l; 640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::BuildColorsFromJSON(DictionaryValue* colors_value) { 644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors_ = new ColorPair[kColorArraySize]; 645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kColorArraySize; ++i) { 646bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors_[i].id = -1; 647bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors_[i].color = SkColorSetRGB(0, 0, 0); 648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor> temp_colors; 651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (colors_value) 652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ReadColorsFromJSON(colors_value, &temp_colors); 653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GenerateMissingColors(&temp_colors); 654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Copy data from the intermediary data structure to the array. 656bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int count = 0; 657bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (std::map<int, SkColor>::const_iterator it = temp_colors.begin(); 658bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != temp_colors.end() && count < kColorArraySize; ++it, ++count) { 659bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors_[count].id = it->first; 660bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors_[count].color = it->second; 661bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 662bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 663bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 664bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::ReadColorsFromJSON( 665bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DictionaryValue* colors_value, 666bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor>* temp_colors) { 667bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Parse the incoming data from |colors_value| into an intermediary structure. 668bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (DictionaryValue::key_iterator iter(colors_value->begin_keys()); 669bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != colors_value->end_keys(); ++iter) { 670bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ListValue* color_list; 671bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (colors_value->GetList(*iter, &color_list) && 672bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ((color_list->GetSize() == 3) || (color_list->GetSize() == 4))) { 673bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor color = SK_ColorWHITE; 674bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int r, g, b; 675bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (color_list->GetInteger(0, &r) && 676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_list->GetInteger(1, &g) && 677bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_list->GetInteger(2, &b)) { 678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (color_list->GetSize() == 4) { 679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen double alpha; 680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int alpha_int; 681bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (color_list->GetReal(3, &alpha)) { 682bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color = SkColorSetARGB(static_cast<int>(alpha * 255), r, g, b); 683bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (color_list->GetInteger(3, &alpha_int) && 684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (alpha_int == 0 || alpha_int == 1)) { 685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color = SkColorSetARGB(alpha_int ? 255 : 0, r, g, b); 686bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Invalid entry for part 4. 688bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen continue; 689bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 690bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 691bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color = SkColorSetRGB(r, g, b); 692bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 693bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 694bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int id = GetIntForString(*iter, kColorTable); 695bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (id != -1) { 696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*temp_colors)[id] = color; 697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 698bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 699bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 702bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::GenerateMissingColors( 704bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor>* colors) { 705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Generate link colors, if missing. (See GetColor()). 706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_NTP_HEADER) && 707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors->count(BrowserThemeProvider::COLOR_NTP_SECTION)) { 708bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_NTP_HEADER] = 709bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_NTP_SECTION]; 710bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 711bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 712bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_NTP_SECTION_LINK_UNDERLINE) && 713bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors->count(BrowserThemeProvider::COLOR_NTP_SECTION_LINK)) { 714bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor color_section_link = 715bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_NTP_SECTION_LINK]; 716bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_NTP_SECTION_LINK_UNDERLINE] = 717bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColorSetA(color_section_link, SkColorGetA(color_section_link) / 3); 718bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 719bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 720bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_NTP_LINK_UNDERLINE) && 721bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors->count(BrowserThemeProvider::COLOR_NTP_LINK)) { 722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor color_link = (*colors)[BrowserThemeProvider::COLOR_NTP_LINK]; 723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_NTP_LINK_UNDERLINE] = 724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColorSetA(color_link, SkColorGetA(color_link) / 3); 725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Generate frame colors, if missing. (See GenerateFrameColors()). 728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkColor frame; 729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, SkColor>::const_iterator it = 730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen colors->find(BrowserThemeProvider::COLOR_FRAME); 731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (it != colors->end()) { 732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen frame = it->second; 733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen frame = BrowserThemeProvider::GetDefaultColor( 735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::COLOR_FRAME); 736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_FRAME)) { 739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_FRAME] = 740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HSLShift(frame, GetTintInternal(BrowserThemeProvider::TINT_FRAME)); 741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_FRAME_INACTIVE)) { 743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_FRAME_INACTIVE] = 744bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HSLShift(frame, GetTintInternal( 745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_FRAME_INACTIVE)); 746bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 747bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_FRAME_INCOGNITO)) { 748bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_FRAME_INCOGNITO] = 749bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HSLShift(frame, GetTintInternal( 750bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_FRAME_INCOGNITO)); 751bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 752bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!colors->count(BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE)) { 753bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*colors)[BrowserThemeProvider::COLOR_FRAME_INCOGNITO_INACTIVE] = 754bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen HSLShift(frame, GetTintInternal( 755bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_FRAME_INCOGNITO_INACTIVE)); 756bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 757bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 758bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 759bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::BuildDisplayPropertiesFromJSON( 760bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DictionaryValue* display_properties_value) { 761bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_ = new DisplayPropertyPair[kDisplayPropertySize]; 762bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kDisplayPropertySize; ++i) { 763bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_[i].id = -1; 764bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_[i].property = 0; 765bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 766bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 767bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!display_properties_value) 768bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 769bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 770bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::map<int, int> temp_properties; 771bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (DictionaryValue::key_iterator iter( 772bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_value->begin_keys()); 773bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != display_properties_value->end_keys(); ++iter) { 774bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int property_id = GetIntForString(*iter, kDisplayProperties); 775bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (property_id) { 776bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case BrowserThemeProvider::NTP_BACKGROUND_ALIGNMENT: { 777bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string val; 778bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (display_properties_value->GetString(*iter, &val)) { 779bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_properties[BrowserThemeProvider::NTP_BACKGROUND_ALIGNMENT] = 780bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::StringToAlignment(val); 781bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 782bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 783bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 784bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case BrowserThemeProvider::NTP_BACKGROUND_TILING: { 785bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string val; 786bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (display_properties_value->GetString(*iter, &val)) { 787bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_properties[BrowserThemeProvider::NTP_BACKGROUND_TILING] = 788bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GetIntForString(val, kTilingStrings); 789bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 790bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 791bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 792bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case BrowserThemeProvider::NTP_LOGO_ALTERNATE: { 793bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int val = 0; 794bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (display_properties_value->GetInteger(*iter, &val)) 795bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_properties[BrowserThemeProvider::NTP_LOGO_ALTERNATE] = val; 796bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 797bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 798bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 799bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 800bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 801bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Copy data from the intermediary data structure to the array. 802bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int count = 0; 803bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (std::map<int, int>::const_iterator it = temp_properties.begin(); 804bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != temp_properties.end() && count < kDisplayPropertySize; 805bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ++it, ++count) { 806bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_[count].id = it->first; 807bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen display_properties_[count].property = it->second; 808bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 809bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 810bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 811bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::ParseImageNamesFromJSON( 812bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DictionaryValue* images_value, 813bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePath images_path, 814bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FilePathMap* file_paths) const { 815bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!images_value) 816bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return; 817bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 818bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (DictionaryValue::key_iterator iter(images_value->begin_keys()); 819bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen iter != images_value->end_keys(); ++iter) { 820bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string val; 821bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (images_value->GetString(*iter, &val)) { 822bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int id = GetPersistentIDByName(*iter); 823bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (id != -1) 824bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*file_paths)[id] = images_path.AppendASCII(val); 825bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 826bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 827bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 828bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 829bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::BuildSourceImagesArray(const FilePathMap& file_paths) { 830bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<int> ids; 831bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (FilePathMap::const_iterator it = file_paths.begin(); 832bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != file_paths.end(); ++it) { 833bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ids.push_back(it->first); 834bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 835bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 836bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen source_images_ = new int[ids.size() + 1]; 837bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::copy(ids.begin(), ids.end(), source_images_); 838bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen source_images_[ids.size()] = -1; 839bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 840bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 841bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool BrowserThemePack::LoadRawBitmapsTo( 842bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const FilePathMap& file_paths, 843bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache* raw_bitmaps) { 844bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (FilePathMap::const_iterator it = file_paths.begin(); 845bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != file_paths.end(); ++it) { 846bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_refptr<RefCountedMemory> raw_data(ReadFileData(it->second)); 847bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!raw_data.get()) { 848bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen LOG(ERROR) << "Could not load theme image"; 849bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 850bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 851bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 852bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int id = it->first; 853bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 854bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Some images need to go directly into |image_memory_|. No modification is 855bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // necessary or desirable. 856bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool is_copyable = false; 857bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (size_t i = 0; i < arraysize(kPreloadIDs); ++i) { 858bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (kPreloadIDs[i] == id) { 859bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen is_copyable = true; 860bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 861bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 862bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 863bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 864bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (is_copyable) { 865bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen image_memory_[id] = raw_data; 866bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (raw_data.get() && raw_data->size()) { 867bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Decode the PNG. 868bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmap bitmap; 869bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (gfx::PNGCodec::Decode(raw_data->front(), raw_data->size(), 870bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &bitmap)) { 871bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*raw_bitmaps)[it->first] = new SkBitmap(bitmap); 872bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 873bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Unable to decode theme image resource " << it->first; 874bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 875bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 876bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 877bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 878bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 879bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 880bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 881bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::GenerateFrameImages(ImageCache* bitmaps) const { 882bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 883bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 884bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Create all the output bitmaps in a separate cache and move them back into 885bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the input bitmaps because there can be name collisions. 886bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache temp_output; 887bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 888bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (size_t i = 0; i < arraysize(kFrameTintMap); ++i) { 889bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_id = kFrameTintMap[i].key; 890bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<SkBitmap> frame; 891bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If there's no frame image provided for the specified id, then load 892bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the default provided frame. If that's not provided, skip this whole 893bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // thing and just use the default images. 894bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_base_id; 895bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 896bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (prs_id == PRS_THEME_FRAME_INCOGNITO_INACTIVE) { 897bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen prs_base_id = bitmaps->count(PRS_THEME_FRAME_INCOGNITO) ? 898bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen PRS_THEME_FRAME_INCOGNITO : PRS_THEME_FRAME; 899bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (prs_id == PRS_THEME_FRAME_OVERLAY_INACTIVE) { 900bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen prs_base_id = PRS_THEME_FRAME_OVERLAY; 901bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (prs_id == PRS_THEME_FRAME_INACTIVE) { 902bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen prs_base_id = PRS_THEME_FRAME; 903bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (prs_id == PRS_THEME_FRAME_INCOGNITO && 904bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen !bitmaps->count(PRS_THEME_FRAME_INCOGNITO)) { 905bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen prs_base_id = PRS_THEME_FRAME; 906bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 907bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen prs_base_id = prs_id; 908bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 909bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 910bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (bitmaps->count(prs_id)) { 911bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen frame.reset(new SkBitmap(*(*bitmaps)[prs_id])); 912bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (prs_base_id != prs_id && bitmaps->count(prs_base_id)) { 913bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen frame.reset(new SkBitmap(*(*bitmaps)[prs_base_id])); 914bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else if (prs_base_id == PRS_THEME_FRAME_OVERLAY && 915bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bitmaps->count(PRS_THEME_FRAME)) { 916bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If there is no theme overlay, don't tint the default frame, 917bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // because it will overwrite the custom frame image when we cache and 918bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // reload from disk. 919bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen frame.reset(NULL); 920bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 921bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If the theme doesn't specify an image, then apply the tint to 922bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the default frame. 923bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen frame.reset(new SkBitmap(*rb.GetBitmapNamed(IDR_THEME_FRAME))); 924bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 925bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 926bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (frame.get()) { 927bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_output[prs_id] = new SkBitmap( 928bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmapOperations::CreateHSLShiftedBitmap( 929bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *frame, GetTintInternal(kFrameTintMap[i].value))); 930bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 931bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 932bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 933bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MergeImageCaches(temp_output, bitmaps); 934bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 935bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 936bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::GenerateTintedButtons( 937bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL button_tint, 938bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache* processed_bitmaps) const { 939bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (button_tint.h != -1 || button_tint.s != -1 || button_tint.l != -1) { 940bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 941bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const std::set<int>& idr_ids = 942bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::GetTintableToolbarButtons(); 943bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (std::set<int>::const_iterator it = idr_ids.begin(); 944bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != idr_ids.end(); ++it) { 945bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_id = GetPersistentIDByIDR(*it); 946bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(prs_id > 0); 947bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 948bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Fetch the image by IDR... 949bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<SkBitmap> button(new SkBitmap(*rb.GetBitmapNamed(*it))); 950bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 951bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // but save a version with the persistent ID. 952bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*processed_bitmaps)[prs_id] = new SkBitmap( 953bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmapOperations::CreateHSLShiftedBitmap(*button, button_tint)); 954bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 955bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 956bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 957bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 958bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::GenerateTabBackgroundImages(ImageCache* bitmaps) const { 959bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache temp_output; 960bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (size_t i = 0; i < arraysize(kTabBackgroundMap); ++i) { 961bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_id = kTabBackgroundMap[i].key; 962bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int prs_base_id = kTabBackgroundMap[i].value; 963bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 964bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // We only need to generate the background tab images if we were provided 965bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // with a PRS_THEME_FRAME. 966bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache::const_iterator it = bitmaps->find(prs_base_id); 967bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (it != bitmaps->end()) { 968bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmap bg_tint = SkBitmapOperations::CreateHSLShiftedBitmap( 969bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *(it->second), GetTintInternal( 970bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BrowserThemeProvider::TINT_BACKGROUND_TAB)); 971bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int vertical_offset = bitmaps->count(prs_id) 972bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ? kRestoredTabVerticalOffset : 0; 973bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmap* bg_tab = new SkBitmap(SkBitmapOperations::CreateTiledBitmap( 974bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bg_tint, 0, vertical_offset, bg_tint.width(), bg_tint.height())); 975bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 976bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // If they've provided a custom image, overlay it. 977bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache::const_iterator overlay_it = bitmaps->find(prs_id); 978bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (overlay_it != bitmaps->end()) { 979bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkBitmap* overlay = overlay_it->second; 980bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SkCanvas canvas(*bg_tab); 981bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int x = 0; x < bg_tab->width(); x += overlay->width()) 982bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen canvas.drawBitmap(*overlay, static_cast<SkScalar>(x), 0, NULL); 983bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 984bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 985bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen temp_output[prs_id] = bg_tab; 986bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 987bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 988bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 989bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MergeImageCaches(temp_output, bitmaps); 990bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 991bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 992bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::RepackImages(const ImageCache& images, 993bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RawImages* reencoded_images) const { 994bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); 995bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (ImageCache::const_iterator it = images.begin(); 996bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen it != images.end(); ++it) { 997bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::vector<unsigned char> image_data; 998bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!gfx::PNGCodec::EncodeBGRASkBitmap(*(it->second), false, &image_data)) { 999bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED() << "Image file for resource " << it->first 1000bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen << " could not be encoded."; 1001bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 1002bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*reencoded_images)[it->first] = RefCountedBytes::TakeVector(&image_data); 1003bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1004bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1005bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1006bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1007bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::MergeImageCaches( 1008bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const ImageCache& source, ImageCache* destination) const { 1009bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1010bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (ImageCache::const_iterator it = source.begin(); it != source.end(); 1011bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ++it) { 1012bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ImageCache::const_iterator bitmap_it = destination->find(it->first); 1013bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (bitmap_it != destination->end()) 1014bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delete bitmap_it->second; 1015bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1016bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*destination)[it->first] = it->second; 1017bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1018bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1019bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1020bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BrowserThemePack::AddRawImagesTo(const RawImages& images, 1021bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen RawDataForWriting* out) const { 1022bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); 1023bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (RawImages::const_iterator it = images.begin(); it != images.end(); 1024bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ++it) { 1025bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (*out)[it->first] = base::StringPiece( 1026bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen reinterpret_cast<const char*>(it->second->front()), it->second->size()); 1027bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1028bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1029bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1030bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsencolor_utils::HSL BrowserThemePack::GetTintInternal(int id) const { 1031bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tints_) { 1032bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (int i = 0; i < kTintArraySize; ++i) { 1033bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (tints_[i].id == id) { 1034bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen color_utils::HSL hsl; 1035bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen hsl.h = tints_[i].h; 1036bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen hsl.s = tints_[i].s; 1037bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen hsl.l = tints_[i].l; 1038bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return hsl; 1039bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1040bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1041bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 1042bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 1043bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return BrowserThemeProvider::GetDefaultTint(id); 1044bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 1045