Home | History | Annotate | Download | only in base
      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/layout.h"
      6 
      7 #include <algorithm>
      8 #include <cmath>
      9 #include <limits>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/command_line.h"
     13 #include "base/logging.h"
     14 #include "build/build_config.h"
     15 #include "ui/base/touch/touch_device.h"
     16 #include "ui/base/ui_base_switches.h"
     17 #include "ui/gfx/display.h"
     18 #include "ui/gfx/image/image_skia.h"
     19 #include "ui/gfx/screen.h"
     20 
     21 #if defined(OS_WIN)
     22 #include "base/win/metro.h"
     23 #include "ui/gfx/win/dpi.h"
     24 #include <Windows.h>
     25 #endif  // defined(OS_WIN)
     26 
     27 namespace ui {
     28 
     29 namespace {
     30 
     31 bool ScaleFactorComparator(const ScaleFactor& lhs, const ScaleFactor& rhs){
     32   return GetScaleForScaleFactor(lhs) < GetScaleForScaleFactor(rhs);
     33 }
     34 
     35 std::vector<ScaleFactor>* g_supported_scale_factors = NULL;
     36 
     37 const float kScaleFactorScales[] = {1.0f, 1.0f, 1.25f, 1.33f, 1.4f, 1.5f, 1.8f,
     38                                     2.0f, 2.5f, 3.0f};
     39 COMPILE_ASSERT(NUM_SCALE_FACTORS == arraysize(kScaleFactorScales),
     40                kScaleFactorScales_incorrect_size);
     41 
     42 }  // namespace
     43 
     44 void SetSupportedScaleFactors(
     45     const std::vector<ui::ScaleFactor>& scale_factors) {
     46   if (g_supported_scale_factors != NULL)
     47     delete g_supported_scale_factors;
     48 
     49   g_supported_scale_factors = new std::vector<ScaleFactor>(scale_factors);
     50   std::sort(g_supported_scale_factors->begin(),
     51             g_supported_scale_factors->end(),
     52             ScaleFactorComparator);
     53 
     54   // Set ImageSkia's supported scales.
     55   std::vector<float> scales;
     56   for (std::vector<ScaleFactor>::const_iterator it =
     57           g_supported_scale_factors->begin();
     58        it != g_supported_scale_factors->end(); ++it) {
     59     scales.push_back(kScaleFactorScales[*it]);
     60   }
     61   gfx::ImageSkia::SetSupportedScales(scales);
     62 }
     63 
     64 const std::vector<ScaleFactor>& GetSupportedScaleFactors() {
     65   DCHECK(g_supported_scale_factors != NULL);
     66   return *g_supported_scale_factors;
     67 }
     68 
     69 ScaleFactor GetSupportedScaleFactor(float scale) {
     70   DCHECK(g_supported_scale_factors != NULL);
     71   ScaleFactor closest_match = SCALE_FACTOR_100P;
     72   float smallest_diff =  std::numeric_limits<float>::max();
     73   for (size_t i = 0; i < g_supported_scale_factors->size(); ++i) {
     74     ScaleFactor scale_factor = (*g_supported_scale_factors)[i];
     75     float diff = std::abs(kScaleFactorScales[scale_factor] - scale);
     76     if (diff < smallest_diff) {
     77       closest_match = scale_factor;
     78       smallest_diff = diff;
     79     }
     80   }
     81   DCHECK_NE(closest_match, SCALE_FACTOR_NONE);
     82   return closest_match;
     83 }
     84 
     85 float GetImageScale(ScaleFactor scale_factor) {
     86 #if defined(OS_WIN)
     87   if (gfx::IsHighDPIEnabled())
     88     return gfx::win::GetDeviceScaleFactor();
     89 #endif
     90   return GetScaleForScaleFactor(scale_factor);
     91 }
     92 
     93 float GetScaleForScaleFactor(ScaleFactor scale_factor) {
     94   return kScaleFactorScales[scale_factor];
     95 }
     96 
     97 namespace test {
     98 
     99 ScopedSetSupportedScaleFactors::ScopedSetSupportedScaleFactors(
    100     const std::vector<ui::ScaleFactor>& new_scale_factors) {
    101   if (g_supported_scale_factors) {
    102     original_scale_factors_ =
    103         new std::vector<ScaleFactor>(*g_supported_scale_factors);
    104   } else {
    105     original_scale_factors_ = NULL;
    106   }
    107   SetSupportedScaleFactors(new_scale_factors);
    108 }
    109 
    110 ScopedSetSupportedScaleFactors::~ScopedSetSupportedScaleFactors() {
    111   if (original_scale_factors_) {
    112     SetSupportedScaleFactors(*original_scale_factors_);
    113     delete original_scale_factors_;
    114   } else {
    115     delete g_supported_scale_factors;
    116     g_supported_scale_factors = NULL;
    117   }
    118 }
    119 
    120 }  // namespace test
    121 
    122 #if !defined(OS_MACOSX)
    123 float GetScaleFactorForNativeView(gfx::NativeView view) {
    124   gfx::Screen* screen = gfx::Screen::GetScreenFor(view);
    125   if (screen->IsDIPEnabled()) {
    126     gfx::Display display = screen->GetDisplayNearestWindow(view);
    127     return display.device_scale_factor();
    128   }
    129   return 1.0f;
    130 }
    131 #endif  // !defined(OS_MACOSX)
    132 
    133 }  // namespace ui
    134