From ff541bd02bea5140fc9373c23a923c4fa82eb431 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Mon, 14 Sep 2020 16:05:04 +0300 Subject: [PATCH] ICC Color Correction effect --- effects/CMakeLists.txt | 13 + effects/effect_builtins.cpp | 16 ++ effects/effect_builtins.h | 1 + effects/icc/CMakeLists.txt | 37 +++ effects/icc/data/1.10/icc.frag | 26 ++ effects/icc/data/1.40/icc.frag | 29 +++ effects/icc/icc.cpp | 242 +++++++++++++++++++ effects/icc/icc.h | 78 ++++++ effects/icc/icc.kcfg | 15 ++ effects/icc/icc_config.cpp | 82 +++++++ effects/icc/icc_config.desktop | 9 + effects/icc/icc_config.h | 48 ++++ effects/icc/icc_config.ui | 59 +++++ effects/icc/iccconfig.kcfgc | 5 + effects/shaders.qrc | 2 + kcmkwin/kwineffects/kcm_kwin_effects.desktop | 2 +- 16 files changed, 663 insertions(+), 1 deletion(-) create mode 100644 effects/icc/CMakeLists.txt create mode 100644 effects/icc/data/1.10/icc.frag create mode 100644 effects/icc/data/1.40/icc.frag create mode 100644 effects/icc/icc.cpp create mode 100644 effects/icc/icc.h create mode 100644 effects/icc/icc.kcfg create mode 100644 effects/icc/icc_config.cpp create mode 100644 effects/icc/icc_config.desktop create mode 100644 effects/icc/icc_config.h create mode 100644 effects/icc/icc_config.ui create mode 100644 effects/icc/iccconfig.kcfgc diff --git a/effects/CMakeLists.txt b/effects/CMakeLists.txt index ed3e06788..f47c15c48 100644 --- a/effects/CMakeLists.txt +++ b/effects/CMakeLists.txt @@ -73,6 +73,11 @@ macro(KWIN4_ADD_EFFECT name) install(TARGETS kwin4_effect_${name} ${INSTALL_TARGETS_DEFAULT_ARGS}) endmacro() +# For ICC (FIXME remove if building separately) +find_package(PkgConfig) +pkg_check_modules(LCMS2 REQUIRED lcms2) +set_package_properties(LCMS2 PROPERTIES TYPE REQUIRED PURPOSE "Required for ICC color correction.") + # Install the KWin/Effect service type install(FILES kwineffect.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR}) @@ -92,6 +97,7 @@ set(kwin4_effect_builtins_sources effect_builtins.cpp flipswitch/flipswitch.cpp glide/glide.cpp + icc/icc.cpp invert/invert.cpp logging.cpp lookingglass/lookingglass.cpp @@ -133,6 +139,7 @@ kconfig_add_kcfg_files(kwin4_effect_builtins_sources fallapart/fallapartconfig.kcfgc flipswitch/flipswitchconfig.kcfgc glide/glideconfig.kcfgc + icc/iccconfig.kcfgc lookingglass/lookingglassconfig.kcfgc magiclamp/magiclampconfig.kcfgc magnifier/magnifierconfig.kcfgc @@ -205,6 +212,7 @@ add_subdirectory(cube) add_subdirectory(cubeslide) add_subdirectory(flipswitch) add_subdirectory(glide) +add_subdirectory(icc) add_subdirectory(invert) add_subdirectory(lookingglass) add_subdirectory(magnifier) @@ -221,3 +229,8 @@ add_subdirectory(wobblywindows) # Add the builtins plugin kwin4_add_effect(builtins ${kwin4_effect_builtins_sources}) + +# FIXME For ICC, remove if building separately +target_link_libraries(kwin4_effect_builtins PUBLIC ${LCMS2_LIBRARIES}) +target_include_directories(kwin4_effect_builtins PUBLIC ${LCMS2_INCLUDE_DIRS}) +target_compile_options(kwin4_effect_builtins PUBLIC ${LCMS2_CFLAGS_OTHER}) diff --git a/effects/effect_builtins.cpp b/effects/effect_builtins.cpp index 90a7554c3..f7730e099 100644 --- a/effects/effect_builtins.cpp +++ b/effects/effect_builtins.cpp @@ -38,6 +38,7 @@ #include "cubeslide/cubeslide.h" #include "flipswitch/flipswitch.h" #include "glide/glide.h" +#include "icc/icc.h" #include "invert/invert.h" #include "lookingglass/lookingglass.h" #include "magnifier/magnifier.h" @@ -265,6 +266,21 @@ EFFECT_FALLBACK nullptr, nullptr #endif +EFFECT_FALLBACK + }, { + QStringLiteral("icc"), + i18ndc("kwin_effects", "Name of a KWin Effect", "ICC Color Correction"), + i18ndc("kwin_effects", "Comment describing the KWin Effect", "Applies full ICC color correction to the whole display"), + QStringLiteral("Appearance"), + QString(), + QUrl(), + false, + false, +#ifdef EFFECT_BUILTINS + &createHelper, + &ICCEffect::supported, + nullptr +#endif EFFECT_FALLBACK }, { QStringLiteral("invert"), diff --git a/effects/effect_builtins.h b/effects/effect_builtins.h index d0dd751a9..5ce123a4c 100644 --- a/effects/effect_builtins.h +++ b/effects/effect_builtins.h @@ -35,6 +35,7 @@ enum class BuiltInEffect FlipSwitch, Glide, HighlightWindow, + ICC, Invert, Kscreen, LookingGlass, diff --git a/effects/icc/CMakeLists.txt b/effects/icc/CMakeLists.txt new file mode 100644 index 000000000..286124be2 --- /dev/null +++ b/effects/icc/CMakeLists.txt @@ -0,0 +1,37 @@ +####################################### +# Effect + +####################################### +# Config +set(kwin_icc_config_SRCS icc_config.cpp) +ki18n_wrap_ui(kwin_icc_config_SRCS icc_config.ui) +qt5_add_dbus_interface(kwin_icc_config_SRCS ${kwin_effects_dbus_xml} kwineffects_interface) +kconfig_add_kcfg_files(kwin_icc_config_SRCS iccconfig.kcfgc) + +add_library(kwin_icc_config MODULE ${kwin_icc_config_SRCS}) + +## Build separate plugin +#find_package(PkgConfig) +#pkg_check_modules(LCMS2 REQUIRED lcms2) +#set_package_properties(LCMS2 PROPERTIES TYPE REQUIRED PURPOSE "Required for ICC color correction.") +# +#kwin4_add_effect(icc icc.cpp) +#target_link_libraries(kwin4_effect_icc PUBLIC ${LCMS2_LIBRARIES}) +#target_include_directories(kwin4_effect_icc PUBLIC ${LCMS2_INCLUDE_DIRS}) +#target_compile_options(kwin4_effect_icc PUBLIC ${LCMS2_CFLAGS_OTHER}) + +target_link_libraries(kwin_icc_config + KF5::ConfigWidgets + KF5::I18n + KF5::Service + KF5::XmlGui +) + +kcoreaddons_desktop_to_json(kwin_icc_config icc_config.desktop SERVICE_TYPES kcmodule.desktop) + +install( + TARGETS + kwin_icc_config + DESTINATION + ${PLUGIN_INSTALL_DIR}/kwin/effects/configs +) diff --git a/effects/icc/data/1.10/icc.frag b/effects/icc/data/1.10/icc.frag new file mode 100644 index 000000000..8370b1ed8 --- /dev/null +++ b/effects/icc/data/1.10/icc.frag @@ -0,0 +1,26 @@ +uniform sampler2D sampler; + +varying vec2 texcoord0; + +uniform sampler3D clut; + +uniform vec4 modulation; + +uniform float saturation; + +void main() +{ + vec4 tex = texture2D(sampler, texcoord0); + + if (saturation != 1.0) { + vec3 desaturated = tex.rgb * vec3( 0.30, 0.59, 0.11 ); + desaturated = vec3( dot( desaturated, tex.rgb )); + tex.rgb = tex.rgb * vec3( saturation ) + desaturated * vec3( 1.0 - saturation ); + } + + tex.rgb = texture3D(clut, tex.rgb).rgb; + tex *= modulation; + tex.rgb *= tex.a; + + gl_FragColor = tex; +} diff --git a/effects/icc/data/1.40/icc.frag b/effects/icc/data/1.40/icc.frag new file mode 100644 index 000000000..32238d80d --- /dev/null +++ b/effects/icc/data/1.40/icc.frag @@ -0,0 +1,29 @@ +#version 140 +uniform sampler2D sampler; + +in vec2 texcoord0; + +uniform sampler3D clut; + +out vec4 fragColor; + +uniform vec4 modulation; + +uniform float saturation; + +void main() +{ + vec4 tex = texture(sampler, texcoord0); + + if (saturation != 1.0) { + vec3 desaturated = tex.rgb * vec3( 0.30, 0.59, 0.11 ); + desaturated = vec3( dot( desaturated, tex.rgb )); + tex.rgb = tex.rgb * vec3( saturation ) + desaturated * vec3( 1.0 - saturation ); + } + + tex.rgb = texture(clut, tex.rgb).rgb; + tex *= modulation; + tex.rgb *= tex.a; + + fragColor = tex; +} diff --git a/effects/icc/icc.cpp b/effects/icc/icc.cpp new file mode 100644 index 000000000..2281acf67 --- /dev/null +++ b/effects/icc/icc.cpp @@ -0,0 +1,242 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#include "icc.h" +#include "iccconfig.h" +#include "kwinglplatform.h" + +#include "lcms2.h" + +#include +#include +#include +#include +#include + +static const int LUT_POINTS = 64; + +namespace KWin +{ + +ICCEffect::ICCEffect() + : m_valid(false), + m_shader(NULL), + m_texture(0), + m_clut(NULL) +{ + initConfig(); + reconfigure(ReconfigureAll); +} + +ICCEffect::~ICCEffect() +{ + if (m_shader) + delete m_shader; + if (m_clut) + delete[] m_clut; + if (m_texture != 0) + glDeleteTextures(1, &m_texture); +} + +bool ICCEffect::supported() +{ + return effects->compositingType() == OpenGL2Compositing; +} + +void ICCEffect::reconfigure(ReconfigureFlags flags) +{ + Q_UNUSED(flags) + + ICCConfig::self()->read(); + + m_sourceICC = ICCConfig::self()->sourceICC().trimmed(); + m_targetICC = ICCConfig::self()->targetICC().trimmed(); + + loadData(); + + effects->addRepaintFull(); +} + +bool ICCEffect::loadData() +{ + m_valid = false; + + if (m_shader) + delete m_shader; + if (m_clut) + delete[] m_clut; + if (m_texture != 0) + glDeleteTextures(1, &m_texture); + + m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral("icc.frag")); + if (!m_shader->isValid()) + { + qCCritical(KWINEFFECTS) << "The shader failed to load!"; + return false; + } + ShaderManager::instance()->pushShader(m_shader); + m_shader->setUniform("clut", 3); // GL_TEXTURE3 + ShaderManager::instance()->popShader(); + + m_clut = makeCLUT(m_sourceICC.trimmed().isEmpty() ? NULL : m_sourceICC.toLocal8Bit().data(), m_targetICC.toLocal8Bit().data()); + + if (m_clut) + { + m_texture = setupCCTexture(m_clut); + + if (m_texture) + { + m_valid = true; + return true; + } + } + + return false; +} + +uint8_t *ICCEffect::makeCLUT(const char* source_icc, const char* target_icc) +{ + uint8_t *clut = NULL, *clut_source = NULL; + cmsHPROFILE source, target; + cmsHTRANSFORM transform; + source = source_icc ? cmsOpenProfileFromFile(source_icc, "r") : cmsCreate_sRGBProfile(); + if (!source) + goto free_nothing; + target = cmsOpenProfileFromFile(target_icc, "r"); + if (!target) + goto free_source; + transform = cmsCreateTransform( + source, TYPE_RGB_8, target, TYPE_RGB_8, + INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_BLACKPOINTCOMPENSATION + ); + if (!transform) + goto free_target; + clut_source = new uint8_t[LUT_POINTS*LUT_POINTS*LUT_POINTS*3]; + if (!clut_source) + goto free_transform; + for (int b = 0, addr = 0; b < LUT_POINTS; b++) + { + for (int g = 0; g < LUT_POINTS; g++) + { + for (int r = 0; r < LUT_POINTS; r++, addr += 3) + { + clut_source[addr] = 255*r/(LUT_POINTS-1); + clut_source[addr+1] = 255*g/(LUT_POINTS-1); + clut_source[addr+2] = 255*b/(LUT_POINTS-1); + } + } + } + clut = new uint8_t[LUT_POINTS*LUT_POINTS*LUT_POINTS*3]; + if (!clut) + goto free_clut_source; + cmsDoTransform(transform, clut_source, clut, LUT_POINTS*LUT_POINTS*LUT_POINTS); + /*for (int b = 0, addr = 0; b < LUT_POINTS; b++) + { + for (int g = 0; g < LUT_POINTS; g++) + { + for (int r = 0; r < LUT_POINTS; r++, addr += 3) + { + printf("cLUT %02x%02x%02x -> %02x%02x%02x\n", 255*r/(LUT_POINTS-1), 255*g/(LUT_POINTS-1), 255*b/(LUT_POINTS-1), clut[addr], clut[addr+1], clut[addr+2]); + } + } + }*/ +free_clut_source: + delete[] clut_source; +free_transform: + cmsDeleteTransform(transform); +free_target: + cmsCloseProfile(target); +free_source: + cmsCloseProfile(source); +free_nothing: + return clut; +} + +GLuint ICCEffect::setupCCTexture(uint8_t *clut) +{ + GLenum err = glGetError(); + GLuint texture; + + glGenTextures(1, &texture); + + glBindTexture(GL_TEXTURE_3D, texture); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, + LUT_POINTS, LUT_POINTS, LUT_POINTS, + 0, GL_RGB, GL_UNSIGNED_BYTE, clut); + + if ((err = glGetError()) != GL_NO_ERROR) + { + glDeleteTextures(1, &texture); + return 0; + } + + return texture; +} + +void ICCEffect::drawWindow(EffectWindow* w, int mask, const QRegion ®ion, WindowPaintData& data) +{ + if (m_valid) + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_3D, m_texture); + glActiveTexture(GL_TEXTURE0); + ShaderManager *shaderManager = ShaderManager::instance(); + shaderManager->pushShader(m_shader); + data.shader = m_shader; + } + + effects->drawWindow(w, mask, region, data); + + if (m_valid) + { + ShaderManager::instance()->popShader(); + } +} + +void ICCEffect::paintEffectFrame(KWin::EffectFrame* frame, const QRegion ®ion, double opacity, double frameOpacity) +{ + if (m_valid) + { + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_3D, m_texture); + glActiveTexture(GL_TEXTURE0); + frame->setShader(m_shader); + ShaderBinder binder(m_shader); + effects->paintEffectFrame(frame, region, opacity, frameOpacity); + } + else + { + effects->paintEffectFrame(frame, region, opacity, frameOpacity); + } +} + +bool ICCEffect::isActive() const +{ + return m_valid; +} + +} // namespace diff --git a/effects/icc/icc.h b/effects/icc/icc.h new file mode 100644 index 000000000..6eb3f6cfa --- /dev/null +++ b/effects/icc/icc.h @@ -0,0 +1,78 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#ifndef KWIN_ICC_H +#define KWIN_ICC_H + +#include +#include "kwinglutils.h" + +namespace KWin +{ + +class GLShader; + +/** + * Applies cLUT (32x32x32 RGB LUT)-based color correction to the whole desktop + * cLUT is generated from a pair of ICC profiles using LCMS2 + */ +class ICCEffect + : public Effect +{ + Q_OBJECT +public: + ICCEffect(); + ~ICCEffect(); + + void reconfigure(ReconfigureFlags flags) override; + void drawWindow(EffectWindow* w, int mask, const QRegion ®ion, WindowPaintData& data) override; + void paintEffectFrame(KWin::EffectFrame* frame, const QRegion ®ion, double opacity, double frameOpacity) override; + bool isActive() const override; + + int requestedEffectChainPosition() const override; + + static bool supported(); + +public Q_SLOTS: + +protected: + bool loadData(); + +private: + bool m_inited; + bool m_valid; + QString m_sourceICC; + QString m_targetICC; + GLShader* m_shader; + GLuint m_texture; + uint8_t *m_clut; + + uint8_t *makeCLUT(const char* source_icc, const char* target_icc); + GLuint setupCCTexture(uint8_t *clut); +}; + +inline int ICCEffect::requestedEffectChainPosition() const +{ + return 98; +} + +} // namespace + +#endif diff --git a/effects/icc/icc.kcfg b/effects/icc/icc.kcfg new file mode 100644 index 000000000..3d4ea7b9f --- /dev/null +++ b/effects/icc/icc.kcfg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/effects/icc/icc_config.cpp b/effects/icc/icc_config.cpp new file mode 100644 index 000000000..143b069cb --- /dev/null +++ b/effects/icc/icc_config.cpp @@ -0,0 +1,82 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#include "icc_config.h" +#include +#include "iccconfig.h" +#include + +#include + +#include +#include +#include +#include + +#include + +K_PLUGIN_FACTORY_WITH_JSON(ICCEffectConfigFactory, + "icc_config.json", + registerPlugin();) + +namespace KWin +{ + +ICCEffectConfig::ICCEffectConfig(QWidget* parent, const QVariantList& args) : + KCModule(KAboutData::pluginData(QStringLiteral("icc")), parent, args) +{ + ui.setupUi(this); + ICCConfig::instance(KWIN_CONFIG); + addConfig(ICCConfig::self(), this); + load(); +} + +ICCEffectConfig::~ICCEffectConfig() +{ + // Undo unsaved changes +} + +void ICCEffectConfig::load() +{ + KCModule::load(); + + emit changed(false); +} + +void ICCEffectConfig::save() +{ + KCModule::save(); + + emit changed(false); + OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"), + QStringLiteral("/Effects"), + QDBusConnection::sessionBus()); + interface.reconfigureEffect(QStringLiteral("icc")); +} + +void ICCEffectConfig::defaults() +{ + emit changed(true); +} + + +} // namespace + +#include "icc_config.moc" diff --git a/effects/icc/icc_config.desktop b/effects/icc/icc_config.desktop new file mode 100644 index 000000000..65f3d1bf5 --- /dev/null +++ b/effects/icc/icc_config.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KCModule + +X-KDE-Library=kwin_icc_config +X-KDE-ParentComponents=icc + +Name=ICC color correction +Name[ru]=ICC цветокоррекция diff --git a/effects/icc/icc_config.h b/effects/icc/icc_config.h new file mode 100644 index 000000000..a0645131d --- /dev/null +++ b/effects/icc/icc_config.h @@ -0,0 +1,48 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2019 Vitaliy Filippov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#ifndef KWIN_ICC_CONFIG_H +#define KWIN_ICC_CONFIG_H + +#include +#include "ui_icc_config.h" + +namespace KWin +{ + +class ICCEffectConfig : public KCModule +{ + Q_OBJECT +public: + explicit ICCEffectConfig(QWidget* parent = 0, const QVariantList& args = QVariantList()); + ~ICCEffectConfig(); + +public Q_SLOTS: + virtual void save(); + virtual void load(); + virtual void defaults(); + +private: + ::Ui::ICCEffectConfig ui; +}; + +} // namespace + +#endif diff --git a/effects/icc/icc_config.ui b/effects/icc/icc_config.ui new file mode 100644 index 000000000..9f1425365 --- /dev/null +++ b/effects/icc/icc_config.ui @@ -0,0 +1,59 @@ + + + ICCEffectConfig + + + + 0 + 0 + 642 + 107 + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + Source ICC profile file: + + + + + + + + + + leave empty to use sRGB (default color space) + + + + + + + Target ICC profile file: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + select your display's ICC profile here + + + + + + + + + + diff --git a/effects/icc/iccconfig.kcfgc b/effects/icc/iccconfig.kcfgc new file mode 100644 index 000000000..cbdc922ed --- /dev/null +++ b/effects/icc/iccconfig.kcfgc @@ -0,0 +1,5 @@ +File=icc.kcfg +ClassName=ICCConfig +NameSpace=KWin +Singleton=true +Mutators=true diff --git a/effects/shaders.qrc b/effects/shaders.qrc index a196dd895..ff50f3127 100644 --- a/effects/shaders.qrc +++ b/effects/shaders.qrc @@ -6,6 +6,7 @@ cube/data/1.10/cylinder.vert cube/data/1.10/sphere.vert invert/data/1.10/invert.frag + icc/data/1.10/icc.frag lookingglass/data/1.10/lookingglass.frag startupfeedback/data/1.10/blinking-startup-fragment.glsl @@ -16,6 +17,7 @@ cube/data/1.40/cylinder.vert cube/data/1.40/sphere.vert invert/data/1.40/invert.frag + icc/data/1.40/icc.frag lookingglass/data/1.40/lookingglass.frag startupfeedback/data/1.40/blinking-startup-fragment.glsl diff --git a/kcmkwin/kwineffects/kcm_kwin_effects.desktop b/kcmkwin/kwineffects/kcm_kwin_effects.desktop index b6d94b830..33f6812a0 100644 --- a/kcmkwin/kwineffects/kcm_kwin_effects.desktop +++ b/kcmkwin/kwineffects/kcm_kwin_effects.desktop @@ -95,7 +95,7 @@ Comment[x-test]=xxConfigure compositor settings for desktop effectsxx Comment[zh_CN]=配置桌面特效混成器设置 Comment[zh_TW]=設定桌面特效的合成器設定 -X-KDE-Keywords=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect +X-KDE-Keywords=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,icc effect,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect X-KDE-Keywords[az]=kwin, pəncərə,menecer,effekt,3D effektlər,2D effektlər,qrafik effektlər,iş masası effektləri,animasiyalar,dəyişkən animasiyalar,pəncərə effektləri idarəsi,pəncərə dəyişdirmə effektləri,iş masası dəyişdirmə effektləri,animasiyalar,iş masası animasiyaları,sürücülər,sürücü ayarları,təsvirin işlənməsi,əks effektlər,linza effekti,lupa effekti,qopma effekti,siçanı izləmə effekti,miqyaslama effekti,yayğınlaşma effekti,solma effekti,iş masasının solması effekti,səpələnmə effekti,süzülmə effekti,vurğulama effekti,pəncərə işıqlandırma effekti,giriş effekti,çıxış effekti,sehirli lampa,animasiyalı yığılma,siçanı işarələmək,tor,ekran şəkli,vərəq,sürüşdürmə,sürüşən pəncərələr,yan miniatürləri,şəffaflıq,pəncərə həndəsəsi,titrək pəncərə,dialoq pəncərəsi,tutqunlaşma,pəncərə tutqunlaşması,ekran tutqunlaşması,geriyə sürüşmə,saniyədə kadrlar,ekranda şəkil çəkmə,örtmə,iş masası kubu animasiyası,kitab vərəqləri,pəncərə təqdimatı,pəncərə ölçüsünün dəyişdirilməsi,arxa fon kontrastı X-KDE-Keywords[ca]=kwin,finestra,gestor,efecte,efectes 3D,efectes 2D,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes en la gestió de les finestres,efecte en el canvi de finestra,efecte en el canvi d'escriptori,animacions,animacions a l'escriptori,controladors,configuració dels controladors,renderització,render,efecte d'inversió,efecte d'aspecte de vidre,efecte de lupa,efecte ajudant del desplaçament,efecte de seguiment del ratolí,efecte de zoom,efecte de difuminat,efecte d'esvaïment,efecte d'esvaïment de l'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de la finestra,efecte en l'inici de la sessió,efecte en sortir de la sessió,efecte de làmpada màgica,efecte d'animació de la minimització,efecte de marca del ratolí,efecte d'apropament,efecte de captura de la pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de la finestra,efecte de finestres sacsejades,efecte de confirmació d'engegada,efecte de diàleg principal,efecte d'enfosquiment en estar inactiu,efecte d'enfosquiment de la pantalla,efecte de diapositiva prèvia,decoració,efecte per a mostrar els FPS,efecte de mostrar el pintat,efecte de canvi de coberta,efecte de cub de l'escriptori,efecte d'animació del cub de l'escriptori,efecte de quadrícula de l'escriptori,efecte de canvi en roda,efecte de presentació de les finestres,efecte de redimensionat de la finestra,efecte de contrast del fons X-KDE-Keywords[ca@valencia]=kwin,finestra,gestor,efecte,efectes 3D,efectes 2D,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes en la gestió de les finestres,efecte en el canvi de finestra,efecte en el canvi d'escriptori,animacions,animacions en l'escriptori,controladors,configuració dels controladors,renderització,render,efecte d'inversió,efecte d'aspecte de vidre,efecte de lupa,efecte ajudant del desplaçament,efecte de seguiment del ratolí,efecte de zoom,efecte de difuminat,efecte de fosa,efecte de fosa de l'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de la finestra,efecte en l'inici de la sessió,efecte en eixir de la sessió,efecte de làmpada màgica,efecte d'animació de la minimització,efecte de marca del ratolí,efecte d'apropament,efecte de captura de pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de la finestra,efecte de finestres sacsejades,efecte de retroacció d'inici,efecte de diàleg principal,efecte d'enfosquiment en estar inactiu,efecte d'enfosquiment de la pantalla,efecte de diapositiva prèvia,decoració,efecte per a mostrar els FPS,efecte per a mostrar les zones pintades,efecte de canvi de coberta,efecte de cub de l'escriptori,efecte d'animació del cub de l'escriptori,efecte de graella de l'escriptori,efecte de canvi en roda,efecte de presentació de les finestres,efecte de redimensionat de la finestra,efecte de contrast del fons