expr apply(expr const & a) { check_system("max_sharing"); auto r = m_expr_cache.find(a); if (r != m_expr_cache.end()) return *r; expr res; switch (a.kind()) { case expr_kind::Var: res = a; break; case expr_kind::Constant: res = update_constant(a, map(const_levels(a), [&](level const & l) { return apply(l); })); break; case expr_kind::Sort: res = update_sort(a, apply(sort_level(a))); break; case expr_kind::App: res = update_app(a, apply(app_fn(a)), apply(app_arg(a))); break; case expr_kind::Lambda: case expr_kind::Pi: res = update_binding(a, apply(binding_domain(a)), apply(binding_body(a))); break; case expr_kind::Meta: case expr_kind::Local: res = update_mlocal(a, apply(mlocal_type(a))); break; case expr_kind::Macro: { buffer<expr> new_args; for (unsigned i = 0; i < macro_num_args(a); i++) new_args.push_back(macro_arg(a, i)); res = update_macro(a, new_args.size(), new_args.data()); break; }} m_expr_cache.insert(res); return res; }
expr collect(expr const & e) { return replace(e, [&](expr const & e, unsigned) { if (is_metavar(e)) { name const & id = mlocal_name(e); if (auto r = m_meta_to_param.find(id)) { return some_expr(*r); } else { expr type = m_ctx.infer(e); expr x = m_ctx.push_local("_x", type); m_meta_to_param.insert(id, x); m_meta_to_param_inv.insert(mlocal_name(x), e); m_params.push_back(x); return some_expr(x); } } else if (is_local(e)) { name const & id = mlocal_name(e); if (!m_found_local.contains(id)) { m_found_local.insert(id); m_params.push_back(e); } } else if (is_sort(e)) { return some_expr(update_sort(e, collect(sort_level(e)))); } else if (is_constant(e)) { return some_expr(update_constant(e, collect(const_levels(e)))); } return none_expr(); }); }
void Image_controls::on_image_source_combo_box__currentIndexChanged(int index) { if (0 == index) { update_constant(); } else { update_image(); } }
void Image_controls::on_scalar_constant_spin_box__valueChanged(double arg1) { set_constant(static_cast<float>(arg1)); if (0 == ui->image_source_combo_box_->currentIndex()) { update_constant(); } else { ui->image_source_combo_box_->setCurrentIndex(0); } }
void Image_controls::init(uint32_t num_channels, const rendering::Color3& constant, bool treat_missing_source_as_constant, Thumbnail_provider* thumbnail_provider) { treat_missing_source_as_constant_ = treat_missing_source_as_constant; thumbnail_provider_ = thumbnail_provider; bool single_channel = 1 == num_channels; if (treat_missing_source_as_constant) { ui->constant_stacked_widget_->setCurrentIndex(single_channel ? 1 : 0); } else { ui->constant_stacked_widget_->setCurrentIndex(2); } ui->manipulator_stacked_widget_->setCurrentIndex(single_channel ? 1 : 0); constant_ = constant; ui->scalar_constant_spin_box_->setValue(double(constant.x)); if (single_channel) { QStringList channels; channels.append("Red"); channels.append("Green"); channels.append("Blue"); channels.append("Alpha"); ui->channels_combo_box_->addItems(channels); } treat_missing_source_as_constant_ = treat_missing_source_as_constant; ui->image_source_combo_box_->addItem(treat_missing_source_as_constant ? "Use constant" : ""); thumbnail_.resize(thumbnail_provider->thumbnail_dimensions()); update_constant(); }
void Image_controls::on_color_constant_button__clicked() { rendering::Color3 rgb = rendering::linear_to_sRGB(constant_); QColor qcolor = QColorDialog::getColor(QColor::fromRgbF(rgb.r, rgb.g, rgb.b), this, "Color constant"); if (qcolor.isValid()) { rgb = rendering::Color3(qcolor.redF(), qcolor.greenF(), qcolor.blueF()); set_constant(rendering::sRGB_to_linear(rgb)); if (0 == ui->image_source_combo_box_->currentIndex()) { update_constant(); } else { ui->image_source_combo_box_->setCurrentIndex(0); } } }
virtual expr visit_constant(expr const & c) { return update_constant(c, visit_levels(const_levels(c))); }