From 017f7027b366322c3dd364c735e9df1a181050d3 Mon Sep 17 00:00:00 2001 From: Chih-Wei Huang Date: Sun, 26 Oct 2014 15:39:53 +0800 Subject: [PATCH] auto determine the density if not provided in surfaceflinger We hope to support tablet UI for different resolutions. So adjust the density according to the resolution. --- services/surfaceflinger/SurfaceFlinger_hwc1.cpp | 29 ++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index aee128af6b..eb644dad14 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -593,8 +593,27 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp& display, public: static int getEmuDensity() { return getDensityFromProperty("qemu.sf.lcd_density"); } - static int getBuildDensity() { - return getDensityFromProperty("ro.sf.lcd_density"); } + static int getBuildDensity(const DisplayInfo& info) { + static int density = getDensityFromProperty("ro.sf.lcd_density"); +#if defined(__i386__) || defined(__x86_64__) + if (density == 0) { + uint32_t area = info.w * info.h; + if (area <= 800 * 480) { + density = 120; + } else if (area <= 1024 * 600) { + density = 130; + } else if (area < 1024 * 768) { + density = 140; + } else if (area < 1920 * 1080) { + density = 160; + } else { + density = 240; + } + ALOGI("auto set density to %d", density); + } +#endif + return density; + } }; configs->clear(); @@ -607,10 +626,12 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp& display, float xdpi = hwConfig.xdpi; float ydpi = hwConfig.ydpi; + info.w = hwConfig.width; + info.h = hwConfig.height; if (type == DisplayDevice::DISPLAY_PRIMARY) { // The density of the device is provided by a build property - float density = Density::getBuildDensity() / 160.0f; + float density = Density::getBuildDensity(info) / 160.0f; if (density == 0) { // the build doesn't provide a density -- this is wrong! // use xdpi instead @@ -634,8 +655,6 @@ status_t SurfaceFlinger::getDisplayConfigs(const sp& display, info.orientation = 0; } - info.w = hwConfig.width; - info.h = hwConfig.height; info.xdpi = xdpi; info.ydpi = ydpi; info.fps = float(1e9 / hwConfig.refresh); -- 2.11.0