consolidate stylesheet cascading

This commit is contained in:
Konstantin Käfer
2014-05-26 12:43:49 +02:00
parent e506d6bcdd
commit 4b8e3faa70
4 changed files with 57 additions and 136 deletions

View File

@@ -94,7 +94,7 @@ struct GenericClass {
boost::optional<bool> prerender;
boost::optional<float> prerenderBuffer;
boost::optional<uint16_t> prerenderSize;
boost::optional<bool> prerenderBlur;
boost::optional<uint16_t> prerenderBlur;
};
struct GenericProperties {
@@ -105,7 +105,7 @@ struct GenericProperties {
bool prerender = false;
float prerenderBuffer = 1.0f / 32.0f;
uint16_t prerenderSize = 256;
bool prerenderBlur = false;
uint16_t prerenderBlur = 0;
};
struct IconClass : public GenericClass {

View File

@@ -68,6 +68,8 @@ private:
uint64_t transitionDuration(std::string layer_name, TransitionablePropertyKey key);
uint64_t transitionDelay(std::string layer_name, TransitionablePropertyKey key);
void cascadeProperties(GenericProperties &properties, const GenericClass& klass, const std::string& layer_name, const std::string& class_name, float z);
private:
// Last applied settings.
struct {

View File

@@ -25,6 +25,50 @@ void Style::reset() {
properties_to_transition.clear();
}
void Style::cascadeProperties(GenericProperties &properties, const GenericClass& klass, const std::string& layer_name, const std::string& class_name, float z) {
if (klass.enabled) {
properties.enabled = klass.enabled.get().evaluate<bool>(z);
}
if (klass.translate) {
properties.translate = {{ klass.translate.get()[0].evaluate<float>(z),
klass.translate.get()[1].evaluate<float>(z) }};
computed.effective_classes[layer_name][TransitionablePropertyKey::Translate] = class_name;
if (klass.translate_transition && klass.translate_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Translate] = klass.translate_transition.get();
}
}
if (klass.translateAnchor) {
properties.translateAnchor = klass.translateAnchor.get();
}
if (klass.opacity) {
properties.opacity = klass.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (klass.opacity_transition && klass.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = klass.opacity_transition.get();
}
}
if (klass.prerender) {
properties.prerender = klass.prerender.get();
}
if (klass.prerenderBuffer) {
properties.prerenderBuffer = klass.prerenderBuffer.get();
}
if (klass.prerenderSize) {
properties.prerenderSize = klass.prerenderSize.get();
}
if (klass.prerenderBlur) {
properties.prerenderBlur = klass.prerenderBlur.get();
}
}
void Style::cascade(float z) {
uv::writelock lock(mtx);
@@ -62,22 +106,7 @@ void Style::cascade(float z) {
llmr::FillProperties& fill = computed.fills[layer_name];
if (layer.enabled) {
fill.enabled = layer.enabled.get().evaluate<bool>(z);
}
if (layer.translate) {
fill.translate = {{ layer.translate.get()[0].evaluate<float>(z),
layer.translate.get()[1].evaluate<float>(z) }};
computed.effective_classes[layer_name][TransitionablePropertyKey::Translate] = class_name;
if (layer.translate_transition && layer.translate_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Translate] = layer.translate_transition.get();
}
}
if (layer.translateAnchor) {
fill.translateAnchor = layer.translateAnchor.get();
}
cascadeProperties(fill, layer, layer_name, class_name, z);
if (layer.winding) {
fill.winding = layer.winding.get();
@@ -103,25 +132,9 @@ void Style::cascade(float z) {
}
}
if (layer.opacity) {
fill.opacity = layer.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (layer.opacity_transition && layer.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = layer.opacity_transition.get();
}
}
if (layer.image) {
fill.image = layer.image.get();
}
if (layer.prerender) {
fill.prerender = layer.prerender.get();
}
if (layer.prerenderBlur) {
fill.prerenderBlur = layer.prerenderBlur.get();
}
}
// Cascade line classes.
@@ -131,22 +144,7 @@ void Style::cascade(float z) {
llmr::LineProperties& stroke = computed.lines[layer_name];
if (layer.enabled) {
stroke.enabled = layer.enabled.get().evaluate<bool>(z);
}
if (layer.translate) {
stroke.translate = {{ layer.translate.get()[0].evaluate<float>(z),
layer.translate.get()[1].evaluate<float>(z) }};
computed.effective_classes[layer_name][TransitionablePropertyKey::Translate] = class_name;
if (layer.translate_transition && layer.translate_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Translate] = layer.translate_transition.get();
}
}
if (layer.translateAnchor) {
stroke.translateAnchor = layer.translateAnchor.get();
}
cascadeProperties(stroke, layer, layer_name, class_name, z);
if (layer.width) {
stroke.width = layer.width.get().evaluate<float>(z);
@@ -181,14 +179,6 @@ void Style::cascade(float z) {
properties_to_transition[layer_name][TransitionablePropertyKey::DashArray] = layer.dash_array_transition.get();
}
}
if (layer.opacity) {
stroke.opacity = layer.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (layer.opacity_transition && layer.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = layer.opacity_transition.get();
}
}
}
// Cascade icon classes.
@@ -198,22 +188,7 @@ void Style::cascade(float z) {
llmr::IconProperties& icon = computed.icons[layer_name];
if (layer.enabled) {
icon.enabled = layer.enabled.get().evaluate<bool>(z);
}
if (layer.translate) {
icon.translate = {{ layer.translate.get()[0].evaluate<float>(z),
layer.translate.get()[1].evaluate<float>(z) }};
computed.effective_classes[layer_name][TransitionablePropertyKey::Translate] = class_name;
if (layer.translate_transition && layer.translate_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Translate] = layer.translate_transition.get();
}
}
if (layer.translateAnchor) {
icon.translateAnchor = layer.translateAnchor.get();
}
cascadeProperties(icon, layer, layer_name, class_name, z);
if (layer.color) {
icon.color = layer.color.get();
@@ -227,14 +202,6 @@ void Style::cascade(float z) {
icon.size = layer.size.get().evaluate<float>(z);
}
if (layer.opacity) {
icon.opacity = layer.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (layer.opacity_transition && layer.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = layer.opacity_transition.get();
}
}
if (layer.image) {
icon.image = layer.image.get();
}
@@ -263,22 +230,7 @@ void Style::cascade(float z) {
llmr::TextProperties& text = computed.texts[layer_name];
if (layer.enabled) {
text.enabled = layer.enabled.get().evaluate<bool>(z);
}
if (layer.translate) {
text.translate = {{ layer.translate.get()[0].evaluate<float>(z),
layer.translate.get()[1].evaluate<float>(z) }};
computed.effective_classes[layer_name][TransitionablePropertyKey::Translate] = class_name;
if (layer.translate_transition && layer.translate_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Translate] = layer.translate_transition.get();
}
}
if (layer.translateAnchor) {
text.translateAnchor = layer.translateAnchor.get();
}
cascadeProperties(text, layer, layer_name, class_name, z);
if (layer.color) {
text.color = layer.color.get();
@@ -323,14 +275,6 @@ void Style::cascade(float z) {
if (layer.always_visible) {
text.always_visible = layer.always_visible.get().evaluate<bool>(z);
}
if (layer.opacity) {
text.opacity = layer.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (layer.opacity_transition && layer.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = layer.opacity_transition.get();
}
}
}
// Cascade raster classes.
@@ -340,17 +284,7 @@ void Style::cascade(float z) {
llmr::RasterProperties& raster = computed.rasters[layer_name];
if (layer.enabled) {
raster.enabled = layer.enabled.get().evaluate<bool>(z);
}
if (layer.opacity) {
raster.opacity = layer.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (layer.opacity_transition && layer.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = layer.opacity_transition.get();
}
}
cascadeProperties(raster, layer, layer_name, class_name, z);
}
// Cascade composite classes.
@@ -360,21 +294,13 @@ void Style::cascade(float z) {
llmr::CompositeProperties& composite = computed.composites[layer_name];
if (layer.enabled) {
composite.enabled = layer.enabled.get().evaluate<bool>(z);
}
if (layer.opacity) {
composite.opacity = layer.opacity.get().evaluate<float>(z);
computed.effective_classes[layer_name][TransitionablePropertyKey::Opacity] = class_name;
if (layer.opacity_transition && layer.opacity_transition.get().duration) {
properties_to_transition[layer_name][TransitionablePropertyKey::Opacity] = layer.opacity_transition.get();
}
}
cascadeProperties(composite, layer, layer_name, class_name, z);
}
// Cascade background.
{
cascadeProperties(computed.background, sheetClass.background, "background", class_name, z);
if (sheetClass.background.color) {
computed.background.color = sheetClass.background.color.get();
computed.effective_classes["background"][TransitionablePropertyKey::Color] = class_name;
@@ -382,13 +308,6 @@ void Style::cascade(float z) {
properties_to_transition["background"][TransitionablePropertyKey::Color] = sheetClass.background.color_transition.get();
}
}
if (sheetClass.background.opacity) {
computed.background.opacity = sheetClass.background.opacity.get().evaluate<float>(z);
computed.effective_classes["background"][TransitionablePropertyKey::Opacity] = class_name;
if (sheetClass.background.opacity_transition && sheetClass.background.opacity_transition.get().duration) {
properties_to_transition["background"][TransitionablePropertyKey::Opacity] = sheetClass.background.opacity_transition.get();
}
}
}
}

View File

@@ -533,7 +533,7 @@ void StyleParser::parseGenericClass(GenericClass &klass, JSVal value) {
}
if (value.HasMember("prerender-blur")) {
klass.prerenderBlur = parseBoolean(value["prerender-blur"]);
klass.prerenderBlur = toNumber<uint64_t>(parseValue(value["prerender-blur"]));
}
}