浏览代码

Add basic filters

Michael Ragazzon 2 年之前
父节点
当前提交
bafca42b8d
共有 4 个文件被更改,包括 169 次插入0 次删除
  1. 2 0
      CMake/FileList.cmake
  2. 16 0
      Source/Core/Factory.cpp
  3. 85 0
      Source/Core/FilterBasic.cpp
  4. 66 0
      Source/Core/FilterBasic.h

+ 2 - 0
CMake/FileList.cmake

@@ -47,6 +47,7 @@ set(Core_HDR_FILES
     ${PROJECT_SOURCE_DIR}/Source/Core/EventInstancerDefault.h
     ${PROJECT_SOURCE_DIR}/Source/Core/EventSpecification.h
     ${PROJECT_SOURCE_DIR}/Source/Core/FileInterfaceDefault.h
+    ${PROJECT_SOURCE_DIR}/Source/Core/FilterBasic.h
     ${PROJECT_SOURCE_DIR}/Source/Core/FontEffectBlur.h
     ${PROJECT_SOURCE_DIR}/Source/Core/FontEffectGlow.h
     ${PROJECT_SOURCE_DIR}/Source/Core/FontEffectOutline.h
@@ -303,6 +304,7 @@ set(Core_SRC_FILES
     ${PROJECT_SOURCE_DIR}/Source/Core/FileInterface.cpp
     ${PROJECT_SOURCE_DIR}/Source/Core/FileInterfaceDefault.cpp
     ${PROJECT_SOURCE_DIR}/Source/Core/Filter.cpp
+    ${PROJECT_SOURCE_DIR}/Source/Core/FilterBasic.cpp
     ${PROJECT_SOURCE_DIR}/Source/Core/FontEffect.cpp
     ${PROJECT_SOURCE_DIR}/Source/Core/FontEffectBlur.cpp
     ${PROJECT_SOURCE_DIR}/Source/Core/FontEffectGlow.cpp

+ 16 - 0
Source/Core/Factory.cpp

@@ -62,6 +62,7 @@
 #include "Elements/XMLNodeHandlerTabSet.h"
 #include "Elements/XMLNodeHandlerTextArea.h"
 #include "EventInstancerDefault.h"
+#include "FilterBasic.h"
 #include "FontEffectBlur.h"
 #include "FontEffectGlow.h"
 #include "FontEffectOutline.h"
@@ -151,6 +152,11 @@ struct DefaultInstancers {
 	DecoratorNinePatchInstancer decorator_ninepatch;
 	DecoratorGradientInstancer decorator_gradient;
 
+	// Filters
+	FilterBasicInstancer filter_hue_rotate = {FilterBasicInstancer::ValueType::Angle, "0rad"};
+	FilterBasicInstancer filter_basic_d0 = {FilterBasicInstancer::ValueType::NumberPercent, "0"};
+	FilterBasicInstancer filter_basic_d1 = {FilterBasicInstancer::ValueType::NumberPercent, "1"};
+
 	// Font effects
 	FontEffectBlurInstancer font_effect_blur;
 	FontEffectGlowInstancer font_effect_glow;
@@ -233,6 +239,16 @@ bool Factory::Initialise()
 	RegisterDecoratorInstancer("ninepatch", &default_instancers->decorator_ninepatch);
 	RegisterDecoratorInstancer("gradient", &default_instancers->decorator_gradient);
 
+	// Filter instancers
+	RegisterFilterInstancer("hue-rotate", &default_instancers->filter_hue_rotate);
+	RegisterFilterInstancer("brightness", &default_instancers->filter_basic_d1);
+	RegisterFilterInstancer("contrast", &default_instancers->filter_basic_d1);
+	RegisterFilterInstancer("grayscale", &default_instancers->filter_basic_d0);
+	RegisterFilterInstancer("invert", &default_instancers->filter_basic_d0);
+	RegisterFilterInstancer("opacity", &default_instancers->filter_basic_d1);
+	RegisterFilterInstancer("saturate", &default_instancers->filter_basic_d1);
+	RegisterFilterInstancer("sepia", &default_instancers->filter_basic_d0);
+
 	// Font effect instancers
 	RegisterFontEffectInstancer("blur", &default_instancers->font_effect_blur);
 	RegisterFontEffectInstancer("glow", &default_instancers->font_effect_glow);

+ 85 - 0
Source/Core/FilterBasic.cpp

@@ -0,0 +1,85 @@
+/*
+ * This source file is part of RmlUi, the HTML/CSS Interface Middleware
+ *
+ * For the latest information, see http://github.com/mikke89/RmlUi
+ *
+ * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
+ * Copyright (c) 2019-2023 The RmlUi Team, and contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+#include "FilterBasic.h"
+#include "../../Include/RmlUi/Core/Core.h"
+#include "../../Include/RmlUi/Core/PropertyDefinition.h"
+#include "../../Include/RmlUi/Core/PropertyDictionary.h"
+#include "../../Include/RmlUi/Core/RenderInterface.h"
+
+namespace Rml {
+
+bool FilterBasic::Initialise(const String& in_name, float in_value)
+{
+	name = in_name;
+	value = in_value;
+	return true;
+}
+
+CompiledFilterHandle FilterBasic::CompileFilter(Element* /*element*/) const
+{
+	CompiledFilterHandle handle = GetRenderInterface()->CompileFilter(name, Dictionary{{"value", Variant(value)}});
+	return handle;
+}
+
+void FilterBasic::ReleaseCompiledFilter(Element* /*element*/, CompiledFilterHandle filter_handle) const
+{
+	GetRenderInterface()->ReleaseCompiledFilter(filter_handle);
+}
+
+FilterBasicInstancer::FilterBasicInstancer(ValueType value_type, const char* default_value)
+{
+	switch (value_type)
+	{
+	case ValueType::NumberPercent: ids.value = RegisterProperty("value", default_value).AddParser("number_percent").GetId(); break;
+	case ValueType::Angle: ids.value = RegisterProperty("value", default_value).AddParser("angle").GetId(); break;
+	}
+
+	RegisterShorthand("filter", "value", ShorthandType::FallThrough);
+}
+
+SharedPtr<Filter> FilterBasicInstancer::InstanceFilter(const String& name, const PropertyDictionary& properties_)
+{
+	const Property* p_value = properties_.GetProperty(ids.value);
+	if (!p_value)
+		return nullptr;
+
+	float value = p_value->Get<float>();
+	if (p_value->unit == Unit::PERCENT)
+		value *= 0.01f;
+	else if (p_value->unit == Unit::DEG)
+		value = Rml::Math::DegreesToRadians(value);
+
+	auto filter = MakeShared<FilterBasic>();
+	if (filter->Initialise(name, value))
+		return filter;
+
+	return nullptr;
+}
+
+} // namespace Rml

+ 66 - 0
Source/Core/FilterBasic.h

@@ -0,0 +1,66 @@
+/*
+ * This source file is part of RmlUi, the HTML/CSS Interface Middleware
+ *
+ * For the latest information, see http://github.com/mikke89/RmlUi
+ *
+ * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
+ * Copyright (c) 2019-2023 The RmlUi Team, and contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ */
+
+#ifndef RMLUI_CORE_FILTERBASIC_H
+#define RMLUI_CORE_FILTERBASIC_H
+
+#include "../../Include/RmlUi/Core/Filter.h"
+#include "../../Include/RmlUi/Core/ID.h"
+
+namespace Rml {
+
+class FilterBasic : public Filter {
+public:
+	bool Initialise(const String& name, float value);
+
+	CompiledFilterHandle CompileFilter(Element* element) const override;
+
+	void ReleaseCompiledFilter(Element* element, CompiledFilterHandle filter_handle) const override;
+
+private:
+	String name;
+	float value = 0.f;
+};
+
+class FilterBasicInstancer : public FilterInstancer {
+public:
+	enum class ValueType { NumberPercent, Angle };
+
+	FilterBasicInstancer(ValueType value_type, const char* default_value);
+
+	SharedPtr<Filter> InstanceFilter(const String& name, const PropertyDictionary& properties) override;
+
+private:
+	struct PropertyIds {
+		PropertyId value;
+	};
+	PropertyIds ids = {};
+};
+
+} // namespace Rml
+#endif