/* Copyright (C) 2009 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
*/
#include "android/hw-lcd.h"
#include "android/boot-properties.h"
#include <math.h>
#include <stdio.h>

int
hwLcd_mapDensity(int density) {
    /* Map density to one of our bucket values.
       The TV density is a bit particular (and not actually a bucket
       value) so we do only exact match on it.
    */
    if (density != LCD_DENSITY_TVDPI) {
        if (density < (LCD_DENSITY_LDPI + LCD_DENSITY_MDPI)/2)
            density = LCD_DENSITY_LDPI;
        else if (density < (LCD_DENSITY_MDPI + LCD_DENSITY_HDPI)/2)
            density = LCD_DENSITY_MDPI;
        else if (density < (LCD_DENSITY_HDPI + LCD_DENSITY_260DPI)/2)
            density = LCD_DENSITY_HDPI;
        else if (density < (LCD_DENSITY_260DPI + LCD_DENSITY_280DPI)/2)
            density = LCD_DENSITY_260DPI;
        else if (density < (LCD_DENSITY_280DPI + LCD_DENSITY_300DPI)/2)
            density = LCD_DENSITY_280DPI;
        else if (density < (LCD_DENSITY_300DPI + LCD_DENSITY_XHDPI)/2)
            density = LCD_DENSITY_300DPI;
        else if (density < (LCD_DENSITY_XHDPI + LCD_DENSITY_340DPI)/2)
            density = LCD_DENSITY_XHDPI;
        else if (density < (LCD_DENSITY_340DPI + LCD_DENSITY_360DPI)/2)
            density = LCD_DENSITY_340DPI;
        else if (density < (LCD_DENSITY_360DPI + LCD_DENSITY_400DPI)/2)
            density = LCD_DENSITY_360DPI;
        else if (density < (LCD_DENSITY_400DPI + LCD_DENSITY_420DPI) / 2)
            density = LCD_DENSITY_400DPI;
        else if (density < (LCD_DENSITY_420DPI + LCD_DENSITY_440DPI) / 2)
            density = LCD_DENSITY_420DPI;
        else if (density < (LCD_DENSITY_440DPI + LCD_DENSITY_XXHDPI) / 2)
            density = LCD_DENSITY_440DPI;
        else if (density < (LCD_DENSITY_XXHDPI + LCD_DENSITY_560DPI)/2)
            density = LCD_DENSITY_XXHDPI;
        else if (density < (LCD_DENSITY_560DPI + LCD_DENSITY_XXXHDPI)/2)
            density = LCD_DENSITY_560DPI;
        else
            density = LCD_DENSITY_XXXHDPI;
    }
    return density;
}


void
hwLcd_setBootProperty(int density)
{
    char  temp[8];
    int mapped_density;

    mapped_density = hwLcd_mapDensity(density);


    snprintf(temp, sizeof temp, "%d", mapped_density);
    boot_property_add("qemu.sf.lcd_density", temp);
}

hwLcd_screenSize_t hwLcd_getScreenSize(int heightPx, int widthPx, int density) {
    double screen_inches = sqrt(pow((double)heightPx / density, 2) +
                               pow((double)widthPx / density, 2));

    if (screen_inches >= 7.5) {
        return LCD_SIZE_XLARGE;
    }
    if (screen_inches >= 5) {
        return LCD_SIZE_LARGE;
    }
    if (screen_inches >= 3.6) {
        return LCD_SIZE_NORMAL;
    }
    return LCD_SIZE_SMALL;
}
