Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3341)

Unified Diff: chrome/browser/android/vr_shell/ui_scene.cc

Issue 2706343005: Allow individual UI element properties to be modified. (Closed)
Patch Set: Use a safer cast on integer conversions. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/android/vr_shell/ui_scene_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/vr_shell/ui_scene.cc
diff --git a/chrome/browser/android/vr_shell/ui_scene.cc b/chrome/browser/android/vr_shell/ui_scene.cc
index b2ecb39eae100f0b8f2c5854bac99be484530fee..99d0dab4369367ba39285a44ed9b4b85ee6bf0c3 100644
--- a/chrome/browser/android/vr_shell/ui_scene.cc
+++ b/chrome/browser/android/vr_shell/ui_scene.cc
@@ -16,65 +16,30 @@ namespace vr_shell {
namespace {
-bool ParseFloat(const base::DictionaryValue& dict,
- const std::string& key,
- float* output) {
- double value;
- if (!dict.GetDouble(key, &value)) {
+// Parse an integer to an int or enum value.
+template <typename T>
+bool ParseInt(const base::DictionaryValue& dict,
+ const std::string& key,
+ T* output) {
+ int value;
+ if (!dict.GetInteger(key, &value)) {
return false;
}
- *output = value;
+ *output = static_cast<T>(value);
return true;
}
-bool ParseRecti(const base::DictionaryValue& dict,
- const std::string& key,
- Recti* output) {
- const base::DictionaryValue* item_dict;
- if (dict.GetDictionary(key, &item_dict)) {
- CHECK(item_dict->GetInteger("x", &output->x));
- CHECK(item_dict->GetInteger("y", &output->y));
- CHECK(item_dict->GetInteger("width", &output->width));
- CHECK(item_dict->GetInteger("height", &output->height));
- return true;
- } else {
- return false;
- }
-}
-
-bool Parse2DVec3f(const base::DictionaryValue& dict,
- const std::string& key,
- gvr::Vec3f* output) {
- const base::DictionaryValue* item_dict;
- if (dict.GetDictionary(key, &item_dict)) {
- double value;
- CHECK(item_dict->GetDouble("x", &value));
- output->x = value;
- CHECK(item_dict->GetDouble("y", &value));
- output->y = value;
- output->z = 1.0f;
- return true;
- } else {
- return false;
- }
-}
-
-bool ParseVec3f(const base::DictionaryValue& dict,
+// Parse a floating point number to a float or double.
+template <typename T>
+bool ParseFloat(const base::DictionaryValue& dict,
const std::string& key,
- gvr::Vec3f* output) {
- const base::DictionaryValue* item_dict;
- if (dict.GetDictionary(key, &item_dict)) {
- double value;
- CHECK(item_dict->GetDouble("x", &value));
- output->x = value;
- CHECK(item_dict->GetDouble("y", &value));
- output->y = value;
- CHECK(item_dict->GetDouble("z", &value));
- output->z = value;
- return true;
- } else {
+ T* output) {
+ double value;
+ if (!dict.GetDouble(key, &value)) {
return false;
}
+ *output = value;
+ return true;
}
bool ParseColorf(const base::DictionaryValue& dict,
@@ -97,26 +62,6 @@ bool ParseColorf(const base::DictionaryValue& dict,
}
}
-bool ParseRotationAxisAngle(const base::DictionaryValue& dict,
- const std::string& key,
- RotationAxisAngle* output) {
- const base::DictionaryValue* item_dict;
- if (dict.GetDictionary(key, &item_dict)) {
- double value;
- CHECK(item_dict->GetDouble("x", &value));
- output->x = value;
- CHECK(item_dict->GetDouble("y", &value));
- output->y = value;
- CHECK(item_dict->GetDouble("z", &value));
- output->z = value;
- CHECK(item_dict->GetDouble("a", &value));
- output->angle = value;
- return true;
- } else {
- return false;
- }
-}
-
void ParseFloats(const base::DictionaryValue& dict,
const std::vector<std::string>& keys,
std::vector<float>* vec) {
@@ -155,7 +100,7 @@ bool ParseEndpointToFloats(Animation::Property property,
std::unique_ptr<easing::Easing> ParseEasing(const base::DictionaryValue& dict) {
easing::EasingType easingType;
- CHECK(dict.GetInteger("type", reinterpret_cast<int*>(&easingType)));
+ CHECK(ParseInt(dict, "type", &easingType));
std::unique_ptr<easing::Easing> result;
switch (easingType) {
@@ -236,7 +181,7 @@ void UiScene::AddUiElement(std::unique_ptr<ContentRectangle>& element) {
void UiScene::AddUiElementFromDict(const base::DictionaryValue& dict) {
int id;
- CHECK(dict.GetInteger("id", &id));
+ CHECK(ParseInt(dict, "id", &id));
CHECK_EQ(GetUiElementById(id), nullptr);
std::unique_ptr<ContentRectangle> element(new ContentRectangle);
@@ -248,7 +193,7 @@ void UiScene::AddUiElementFromDict(const base::DictionaryValue& dict) {
void UiScene::UpdateUiElementFromDict(const base::DictionaryValue& dict) {
int id;
- CHECK(dict.GetInteger("id", &id));
+ CHECK(ParseInt(dict, "id", &id));
ContentRectangle* element = GetUiElementById(id);
CHECK_NE(element, nullptr);
ApplyDictToElement(dict, element);
@@ -290,11 +235,11 @@ void UiScene::AddAnimationFromDict(const base::DictionaryValue& dict,
std::vector<float> from;
std::vector<float> to;
- CHECK(dict.GetInteger("id", &animation_id));
- CHECK(dict.GetInteger("meshId", &element_id));
- CHECK(dict.GetInteger("property", reinterpret_cast<int*>(&property)));
- CHECK(dict.GetDouble("startInMillis", &start_time_ms));
- CHECK(dict.GetDouble("durationMillis", &duration_ms));
+ CHECK(ParseInt(dict, "id", &animation_id));
+ CHECK(ParseInt(dict, "meshId", &element_id));
+ CHECK(ParseInt(dict, "property", &property));
+ CHECK(ParseFloat(dict, "startInMillis", &start_time_ms));
+ CHECK(ParseFloat(dict, "durationMillis", &duration_ms));
CHECK(dict.GetDictionary("easing", &easing_dict));
auto easing = ParseEasing(*easing_dict);
@@ -345,7 +290,7 @@ void UiScene::HandleCommands(std::unique_ptr<base::ListValue> commands,
Command type;
base::DictionaryValue* data;
- CHECK(dict->GetInteger("type", reinterpret_cast<int*>(&type)));
+ CHECK(ParseInt(*dict, "type", &type));
CHECK(dict->GetDictionary("data", &data));
switch (type) {
@@ -357,7 +302,7 @@ void UiScene::HandleCommands(std::unique_ptr<base::ListValue> commands,
break;
case Command::REMOVE_ELEMENT: {
int element_id;
- CHECK(data->GetInteger("id", &element_id));
+ CHECK(ParseInt(*data, "id", &element_id));
RemoveUiElement(element_id);
break;
}
@@ -366,8 +311,8 @@ void UiScene::HandleCommands(std::unique_ptr<base::ListValue> commands,
break;
case Command::REMOVE_ANIMATION: {
int element_id, animation_id;
- CHECK(data->GetInteger("id", &animation_id));
- CHECK(data->GetInteger("meshId", &element_id));
+ CHECK(ParseInt(*data, "id", &animation_id));
+ CHECK(ParseInt(*data, "meshId", &element_id));
RemoveAnimation(element_id, animation_id);
break;
}
@@ -441,7 +386,8 @@ void UiScene::ApplyRecursiveTransforms(const ContentRectangle& element,
void UiScene::ApplyDictToElement(const base::DictionaryValue& dict,
ContentRectangle* element) {
int parent_id;
- if (dict.GetInteger("parentId", &parent_id)) {
+
+ if (ParseInt(dict, "parentId", &parent_id)) {
CHECK_GE(parent_id, 0);
CHECK_NE(GetUiElementById(parent_id), nullptr);
element->parent_id = parent_id;
@@ -450,27 +396,31 @@ void UiScene::ApplyDictToElement(const base::DictionaryValue& dict,
dict.GetBoolean("visible", &element->visible);
dict.GetBoolean("hitTestable", &element->hit_testable);
dict.GetBoolean("lockToFov", &element->lock_to_fov);
- Parse2DVec3f(dict, "size", &element->size);
- ParseVec3f(dict, "scale", &element->scale);
- ParseRotationAxisAngle(dict, "rotation", &element->rotation);
- ParseVec3f(dict, "translation", &element->translation);
- double opacity;
- if (dict.GetDouble("opacity", &opacity)) {
- element->opacity = opacity;
- }
- dict.GetInteger("drawPhase", &element->draw_phase);
-
- if (dict.GetInteger("xAnchoring",
- reinterpret_cast<int*>(&element->x_anchoring))) {
+ ParseInt(dict, "drawPhase", &element->draw_phase);
+ ParseFloat(dict, "opacity", &element->opacity);
+
+ ParseFloat(dict, "sizeX", &element->size.x);
+ ParseFloat(dict, "sizeY", &element->size.y);
+ ParseFloat(dict, "scaleX", &element->scale.x);
+ ParseFloat(dict, "scaleY", &element->scale.y);
+ ParseFloat(dict, "scaleZ", &element->scale.z);
+ ParseFloat(dict, "rotationX", &element->rotation.x);
+ ParseFloat(dict, "rotationY", &element->rotation.y);
+ ParseFloat(dict, "rotationZ", &element->rotation.z);
+ ParseFloat(dict, "rotationAngle", &element->rotation.angle);
+ ParseFloat(dict, "translationX", &element->translation.x);
+ ParseFloat(dict, "translationY", &element->translation.y);
+ ParseFloat(dict, "translationZ", &element->translation.z);
+
+ if (ParseInt(dict, "xAnchoring", &element->x_anchoring)) {
CHECK_GE(element->parent_id, 0);
}
- if (dict.GetInteger("yAnchoring",
- reinterpret_cast<int*>(&element->y_anchoring))) {
+ if (ParseInt(dict, "yAnchoring", &element->y_anchoring)) {
CHECK_GE(element->parent_id, 0);
}
// Parse the element fill.
- if (dict.GetInteger("fillType", reinterpret_cast<int*>(&element->fill))) {
+ if (ParseInt(dict, "fillType", &element->fill)) {
// If the previous content element has a new filling now make sure this is
// tracked correctly.
if (content_element_ == element && element->fill != Fill::CONTENT) {
@@ -479,7 +429,10 @@ void UiScene::ApplyDictToElement(const base::DictionaryValue& dict,
switch (element->fill) {
case Fill::SPRITE:
- CHECK(ParseRecti(dict, "copyRect", &element->copy_rect));
+ CHECK(ParseInt(dict, "copyRectX", &element->copy_rect.x));
+ CHECK(ParseInt(dict, "copyRectY", &element->copy_rect.y));
+ CHECK(ParseInt(dict, "copyRectWidth", &element->copy_rect.width));
+ CHECK(ParseInt(dict, "copyRectHeight", &element->copy_rect.height));
break;
case Fill::OPAQUE_GRADIENT:
CHECK(ParseColorf(dict, "edgeColor", &element->edge_color));
@@ -488,7 +441,7 @@ void UiScene::ApplyDictToElement(const base::DictionaryValue& dict,
case Fill::GRID_GRADIENT:
CHECK(ParseColorf(dict, "edgeColor", &element->edge_color));
CHECK(ParseColorf(dict, "centerColor", &element->center_color));
- CHECK(dict.GetInteger("gridlineCount", &element->gridline_count));
+ CHECK(ParseInt(dict, "gridlineCount", &element->gridline_count));
CHECK_GE(element->gridline_count, 0);
break;
case Fill::CONTENT:
« no previous file with comments | « no previous file | chrome/browser/android/vr_shell/ui_scene_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698