• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ui/base/resource/resource_bundle_win.h"
6 
7 #include "base/logging.h"
8 #include "base/path_service.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "ui/base/layout.h"
11 #include "ui/base/resource/resource_bundle.h"
12 #include "ui/base/resource/resource_data_dll_win.h"
13 #include "ui/gfx/win/dpi.h"
14 
15 namespace ui {
16 
17 namespace {
18 
19 HINSTANCE resources_data_dll;
20 
GetCurrentResourceDLL()21 HINSTANCE GetCurrentResourceDLL() {
22   if (resources_data_dll)
23     return resources_data_dll;
24   return GetModuleHandle(NULL);
25 }
26 
GetResourcesPakFilePath(const std::string & pak_name)27 base::FilePath GetResourcesPakFilePath(const std::string& pak_name) {
28   base::FilePath path;
29   if (PathService::Get(base::DIR_MODULE, &path))
30     return path.AppendASCII(pak_name.c_str());
31 
32   // Return just the name of the pack file.
33   return base::FilePath(ASCIIToUTF16(pak_name));
34 }
35 
36 }  // namespace
37 
LoadCommonResources()38 void ResourceBundle::LoadCommonResources() {
39   // As a convenience, add the current resource module as a data packs.
40   data_packs_.push_back(new ResourceDataDLL(GetCurrentResourceDLL()));
41   // Have high-DPI resources for 140% and 180% scaling on Windows based on
42   // default scaling for Metro mode. If high-DPI mode is enabled, load resource
43   // pak closest to the desired scale factor.  The high-DPI resources are
44   // scaled up from 100% touch.
45   float scale = gfx::win::GetDeviceScaleFactor();
46   bool force_touch_resources = false;
47   switch(ui::GetSupportedScaleFactor(scale)) {
48     case ui::SCALE_FACTOR_180P:
49       AddDataPackFromPath(GetResourcesPakFilePath(
50           "chrome_touch_180_percent.pak"),
51           SCALE_FACTOR_180P);
52       force_touch_resources = true;
53       break;
54     case ui::SCALE_FACTOR_140P:
55       AddDataPackFromPath(GetResourcesPakFilePath(
56           "chrome_touch_140_percent.pak"),
57           SCALE_FACTOR_140P);
58       force_touch_resources = true;
59   }
60   // TODO(kevers|girard): Remove loading of 1x resources when in high-DPI
61   // mode once all resources are available at 140% and 180%.
62   if (ui::GetDisplayLayout() == ui::LAYOUT_TOUCH || force_touch_resources) {
63     AddDataPackFromPath(
64         GetResourcesPakFilePath("chrome_touch_100_percent.pak"),
65         SCALE_FACTOR_100P);
66   } else {
67     AddDataPackFromPath(
68         GetResourcesPakFilePath("chrome_100_percent.pak"),
69         SCALE_FACTOR_100P);
70   }
71 }
72 
GetNativeImageNamed(int resource_id,ImageRTL rtl)73 gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id, ImageRTL rtl) {
74   // Flipped image is not used on Windows.
75   DCHECK_EQ(rtl, RTL_DISABLED);
76 
77   // Windows only uses SkBitmap for gfx::Image, so this is the same as
78   // GetImageNamed.
79   return GetImageNamed(resource_id);
80 }
81 
SetResourcesDataDLL(HINSTANCE handle)82 void SetResourcesDataDLL(HINSTANCE handle) {
83   resources_data_dll = handle;
84 }
85 
LoadThemeIconFromResourcesDataDLL(int icon_id)86 HICON LoadThemeIconFromResourcesDataDLL(int icon_id) {
87   return ::LoadIcon(GetCurrentResourceDLL(), MAKEINTRESOURCE(icon_id));
88 }
89 
90 }  // namespace ui;
91