+int GetIntOrDouble(const base::DictionaryValue* dict,
+ const std::string& field) {
+ double double_result = 0;
+ if (dict->GetDouble(field, &double_result))
+ return static_cast<int>(double_result);
+
+ int result = 0;
+ dict->GetInteger(field, &result);
+ return result;
+}
+
+bool GetFloat(const base::DictionaryValue* dict,
+ const std::string& field,
+ float* result) {
+ double double_result = 0;
+ if (dict->GetDouble(field, &double_result)) {
+ *result = static_cast<float>(double_result);
+ return true;
+ }
+ return false;
+}
+
+bool ConvertValueToDisplayMode(const base::DictionaryValue* dict,
+ ash::DisplayMode* mode) {
+ mode->size.set_width(GetIntOrDouble(dict, "originalWidth"));
+ mode->size.set_height(GetIntOrDouble(dict, "originalHeight"));
+ if (mode->size.IsEmpty()) {
+ LOG(ERROR) << "missing width or height.";
+ return false;
+ }
+ if (!GetFloat(dict, "refreshRate", &mode->refresh_rate)) {
+ LOG(ERROR) << "missing refreshRate.";
+ return false;
+ }
+ if (!GetFloat(dict, "scale", &mode->ui_scale)) {
+ LOG(ERROR) << "missing ui-scale.";
+ return false;
+ }
+ if (!GetFloat(dict, "deviceScaleFactor", &mode->device_scale_factor)) {
+ LOG(ERROR) << "missing deviceScaleFactor.";
+ return false;
+ }
+ return true;
+}
+
+base::DictionaryValue* ConvertDisplayModeToValue(int64 display_id,
+ const ash::DisplayMode& mode) {
+ base::DictionaryValue* result = new base::DictionaryValue();
+ gfx::Size size_dip = mode.GetSizeInDIP();
+ result->SetInteger("width", size_dip.width());
+ result->SetInteger("height", size_dip.height());
+ result->SetInteger("originalWidth", mode.size.width());
+ result->SetInteger("originalHeight", mode.size.height());
+ result->SetDouble("deviceScaleFactor", mode.device_scale_factor);
+ result->SetDouble("scale", mode.ui_scale);
+ result->SetDouble("refreshRate", mode.refresh_rate);
+ result->SetBoolean("isBest", mode.native);
+ result->SetBoolean(
+ "selected", mode.IsEquivalent(
+ GetDisplayManager()->GetActiveModeForDisplayId(display_id)));
+ return result;
+}
+