fix: update KF6 cross-compile build configurations
Patch CMakeLists.txt across 15 KF6 packages for Redox cross-compile. Add kf6-ksvg recipe for KWin dependency chain. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -57,7 +57,7 @@ add_subdirectory(src)
|
||||
|
||||
# Enable unit testing
|
||||
if (BUILD_TESTING)
|
||||
############################### add_subdirectory(autotests)
|
||||
################################# add_subdirectory(autotests)
|
||||
add_subdirectory(tests)
|
||||
endif ()
|
||||
|
||||
|
||||
@@ -115,6 +115,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
|
||||
# shall we use DBus?
|
||||
# enabled per default on Linux & BSD systems
|
||||
|
||||
@@ -93,6 +93,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
|
||||
set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].")
|
||||
|
||||
|
||||
@@ -84,6 +84,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
|
||||
find_package(KF6Codecs ${KF_DEP_VERSION} REQUIRED)
|
||||
find_package(KF6Config ${KF_DEP_VERSION} REQUIRED)
|
||||
|
||||
@@ -87,6 +87,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
|
||||
# shall we use DBus?
|
||||
# enabled per default on Linux & BSD systems
|
||||
|
||||
@@ -32,7 +32,7 @@ find_package(KF6GuiAddons ${KF_DEP_VERSION} REQUIRED)
|
||||
|
||||
|
||||
if(NOT WIN32 AND NOT APPLE AND NOT ANDROID AND NOT REDOX)
|
||||
###################################################### find_package(KF6GlobalAccel ${KF_DEP_VERSION} REQUIRED)
|
||||
######################################################## find_package(KF6GlobalAccel ${KF_DEP_VERSION} REQUIRED)
|
||||
set(HAVE_KGLOBALACCEL TRUE)
|
||||
else()
|
||||
set(HAVE_KGLOBALACCEL FALSE)
|
||||
|
||||
@@ -106,6 +106,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6Svg ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE)
|
||||
|
||||
# shall we use DBus?
|
||||
|
||||
@@ -38,7 +38,7 @@ set_package_properties(Qt6Qml PROPERTIES
|
||||
)
|
||||
|
||||
if (TARGET Qt6::Qml)
|
||||
################################# include(ECMQmlModule)
|
||||
################################### include(ECMQmlModule)
|
||||
endif()
|
||||
|
||||
set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
add_subdirectory(core)
|
||||
if (TARGET Qt6::Qml)
|
||||
################################ add_subdirectory(qml)
|
||||
################################## add_subdirectory(qml)
|
||||
endif()
|
||||
|
||||
ecm_qt_install_logging_categories(
|
||||
|
||||
@@ -71,6 +71,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
|
||||
set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].")
|
||||
|
||||
|
||||
@@ -73,6 +73,8 @@ find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED)
|
||||
|
||||
if(NOT WIN32 AND NOT APPLE AND NOT ANDROID AND NOT HAIKU)
|
||||
option(WITH_X11 "Build with support for QX11Info::appUserTime()" ON)
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#clang-format
|
||||
08d4f6335bcd60306b243f4fd53d1ea60a995a06
|
||||
#clang-tidy
|
||||
3120de70f25378cad1faf0ee4e96ac506006b953
|
||||
# re-run of clang-format
|
||||
30f46ade664d7a9492817befa838297aecc44506
|
||||
@@ -0,0 +1,28 @@
|
||||
# Ignore the following files
|
||||
*~
|
||||
*.[oa]
|
||||
*.diff
|
||||
*.kate-swp
|
||||
*.kdev4
|
||||
.kdev_include_paths
|
||||
*.kdevelop.pcs
|
||||
*.moc
|
||||
*.moc.cpp
|
||||
*.orig
|
||||
*.user
|
||||
.*.swp
|
||||
.swp.*
|
||||
Doxyfile
|
||||
Makefile
|
||||
avail
|
||||
random_seed
|
||||
/build*/
|
||||
CMakeLists.txt.user*
|
||||
*.unc-backup*
|
||||
.cmake/
|
||||
cmake-build-debug*
|
||||
.idea
|
||||
/.clang-format
|
||||
/compile_commands.json
|
||||
.clangd
|
||||
.cache
|
||||
@@ -0,0 +1,10 @@
|
||||
# SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
include:
|
||||
- project: sysadmin/ci-utilities
|
||||
file:
|
||||
- /gitlab-templates/linux-qt6.yml
|
||||
- /gitlab-templates/freebsd-qt6.yml
|
||||
- /gitlab-templates/windows-qt6.yml
|
||||
- /gitlab-templates/android-qt6.yml
|
||||
@@ -0,0 +1,15 @@
|
||||
Dependencies:
|
||||
- 'on': ['Linux', 'FreeBSD', 'Windows', 'macOS', 'Android']
|
||||
'require':
|
||||
'frameworks/extra-cmake-modules': '@same'
|
||||
'frameworks/karchive' : '@same'
|
||||
'frameworks/kconfig' : '@same'
|
||||
'frameworks/kcoreaddons' : '@same'
|
||||
'frameworks/kguiaddons' : '@same'
|
||||
'frameworks/kirigami' : '@same'
|
||||
'frameworks/kcolorscheme' : '@same'
|
||||
|
||||
Options:
|
||||
test-before-installing: True
|
||||
cppcheck-ignore-files: ['templates/']
|
||||
require-passing-tests-on: ['Linux', 'FreeBSD', 'Windows', 'macOS']
|
||||
@@ -0,0 +1,128 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
set(KF_VERSION "6.10.0") # handled by release scripts
|
||||
set(KF_DEP_VERSION "6.10.0") # handled by release scripts
|
||||
project(KSvg VERSION ${KF_VERSION})
|
||||
|
||||
# ECM setup
|
||||
include(FeatureSummary)
|
||||
find_package(ECM 6.10.0 NO_MODULE)
|
||||
set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules")
|
||||
feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||
|
||||
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
|
||||
|
||||
include(KDEInstallDirs)
|
||||
include(KDECMakeSettings)
|
||||
include(KDEGitCommitHooks)
|
||||
include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE)
|
||||
|
||||
include(ECMGenerateExportHeader)
|
||||
include(ECMGenerateHeaders)
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(ECMSetupVersion)
|
||||
include(ECMQtDeclareLoggingCategory)
|
||||
include(ECMAddQch)
|
||||
include(KDEPackageAppTemplates)
|
||||
include(ECMGenerateQmlTypes)
|
||||
include(ECMMarkNonGuiExecutable)
|
||||
include(ECMDeprecationSettings)
|
||||
include(ECMQmlModule)
|
||||
|
||||
option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF)
|
||||
add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)")
|
||||
|
||||
ecm_setup_version(PROJECT
|
||||
VARIABLE_PREFIX KSVG
|
||||
VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/ksvg_version.h"
|
||||
PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF6SvgConfigVersion.cmake"
|
||||
SOVERSION 6)
|
||||
|
||||
################# now find all used packages #################
|
||||
|
||||
set (REQUIRED_QT_VERSION 6.6.0)
|
||||
|
||||
find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Gui Svg)
|
||||
|
||||
find_package(KF6 ${KF_DEP_VERSION} REQUIRED
|
||||
COMPONENTS
|
||||
Archive # svgz
|
||||
Config # rects cache
|
||||
ColorScheme
|
||||
CoreAddons
|
||||
GuiAddons # KImageCache
|
||||
)
|
||||
|
||||
#########################################################################
|
||||
|
||||
ecm_set_disabled_deprecation_versions(
|
||||
QT 6.8.0
|
||||
KF 6.8.0
|
||||
)
|
||||
|
||||
#add_definitions(-Wno-deprecated)
|
||||
|
||||
#########################################################################
|
||||
|
||||
option(BUILD_TOOLS "Build and install KSVG tools." OFF)
|
||||
|
||||
option(BUILD_COVERAGE "Build Plasma Frameworks with gcov support" OFF)
|
||||
|
||||
if(BUILD_COVERAGE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov")
|
||||
endif()
|
||||
|
||||
# make ksvg_version.h available
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
################# list the subdirectories #################
|
||||
add_subdirectory(src)
|
||||
|
||||
if (BUILD_TESTING)
|
||||
add_subdirectory(autotests)
|
||||
endif()
|
||||
|
||||
################ create PlasmaConfig.cmake and install it ###########################
|
||||
|
||||
# create a Config.cmake and a ConfigVersion.cmake file and install them
|
||||
|
||||
set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF6Svg")
|
||||
|
||||
if (BUILD_QCH)
|
||||
ecm_install_qch_export(
|
||||
TARGETS KF6Svg_QCH
|
||||
FILE KF6SvgQchTargets.cmake
|
||||
DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
|
||||
COMPONENT Devel
|
||||
)
|
||||
set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF6SvgQchTargets.cmake\")")
|
||||
endif()
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/KF6SvgConfig.cmake.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/KF6SvgConfig.cmake"
|
||||
INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
|
||||
PATH_VARS CMAKE_INSTALL_PREFIX
|
||||
)
|
||||
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/KF6SvgConfig.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/KF6SvgConfigVersion.cmake"
|
||||
DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
install(EXPORT KF6SvgTargets
|
||||
DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
|
||||
FILE KF6SvgTargets.cmake
|
||||
NAMESPACE KF6::
|
||||
COMPONENT Devel)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ksvg_version.h
|
||||
DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KSvg COMPONENT Devel )
|
||||
|
||||
include(ECMFeatureSummary)
|
||||
ecm_feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||
|
||||
kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT)
|
||||
@@ -0,0 +1,17 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
# Any changes in this ".cmake" file will be overwritten by CMake, the source is the ".cmake.in" file.
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/KF6SvgTargets.cmake")
|
||||
@PACKAGE_INCLUDE_QCHTARGETS@
|
||||
|
||||
set(KSvg_INSTALL_PREFIX "@PACKAGE_CMAKE_INSTALL_PREFIX@")
|
||||
|
||||
set(KSvg_LIBRARIES KF6::Svg)
|
||||
|
||||
include(CMakeFindDependencyMacro)
|
||||
find_dependency(Qt6Gui "@REQUIRED_QT_VERSION@")
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/KF6SvgTargets.cmake")
|
||||
|
||||
@PACKAGE_SETUP_AUTOMOC_VARIABLES@
|
||||
@@ -0,0 +1,22 @@
|
||||
Copyright (c) <year> <owner>. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,26 @@
|
||||
Copyright (c) <year> <owner>. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -0,0 +1,121 @@
|
||||
Creative Commons Legal Code
|
||||
|
||||
CC0 1.0 Universal
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
Statement of Purpose
|
||||
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
||||
@@ -0,0 +1,319 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to share
|
||||
and change it. By contrast, the GNU General Public License is intended to
|
||||
guarantee your freedom to share and change free software--to make sure the
|
||||
software is free for all its users. This General Public License applies to
|
||||
most of the Free Software Foundation's software and to any other program whose
|
||||
authors commit to using it. (Some other Free Software Foundation software
|
||||
is covered by the GNU Lesser General Public License instead.) You can apply
|
||||
it to your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our
|
||||
General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for this service if you
|
||||
wish), that you receive source code or can get it if you want it, that you
|
||||
can change the software or use pieces of it in new free programs; and that
|
||||
you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid anyone to
|
||||
deny you these rights or to ask you to surrender the rights. These restrictions
|
||||
translate to certain responsibilities for you if you distribute copies of
|
||||
the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether gratis or
|
||||
for a fee, you must give the recipients all the rights that you have. You
|
||||
must make sure that they, too, receive or can get the source code. And you
|
||||
must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and (2)
|
||||
offer you this license which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain that
|
||||
everyone understands that there is no warranty for this free software. If
|
||||
the software is modified by someone else and passed on, we want its recipients
|
||||
to know that what they have is not the original, so that any problems introduced
|
||||
by others will not reflect on the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software patents. We
|
||||
wish to avoid the danger that redistributors of a free program will individually
|
||||
obtain patent licenses, in effect making the program proprietary. To prevent
|
||||
this, we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains a notice
|
||||
placed by the copyright holder saying it may be distributed under the terms
|
||||
of this General Public License. The "Program", below, refers to any such program
|
||||
or work, and a "work based on the Program" means either the Program or any
|
||||
derivative work under copyright law: that is to say, a work containing the
|
||||
Program or a portion of it, either verbatim or with modifications and/or translated
|
||||
into another language. (Hereinafter, translation is included without limitation
|
||||
in the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not covered
|
||||
by this License; they are outside its scope. The act of running the Program
|
||||
is not restricted, and the output from the Program is covered only if its
|
||||
contents constitute a work based on the Program (independent of having been
|
||||
made by running the Program). Whether that is true depends on what the Program
|
||||
does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's source code
|
||||
as you receive it, in any medium, provided that you conspicuously and appropriately
|
||||
publish on each copy an appropriate copyright notice and disclaimer of warranty;
|
||||
keep intact all the notices that refer to this License and to the absence
|
||||
of any warranty; and give any other recipients of the Program a copy of this
|
||||
License along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you
|
||||
may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion of it,
|
||||
thus forming a work based on the Program, and copy and distribute such modifications
|
||||
or work under the terms of Section 1 above, provided that you also meet all
|
||||
of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices stating that
|
||||
you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in whole or
|
||||
in part contains or is derived from the Program or any part thereof, to be
|
||||
licensed as a whole at no charge to all third parties under the terms of this
|
||||
License.
|
||||
|
||||
c) If the modified program normally reads commands interactively when run,
|
||||
you must cause it, when started running for such interactive use in the most
|
||||
ordinary way, to print or display an announcement including an appropriate
|
||||
copyright notice and a notice that there is no warranty (or else, saying that
|
||||
you provide a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this License.
|
||||
(Exception: if the Program itself is interactive but does not normally print
|
||||
such an announcement, your work based on the Program is not required to print
|
||||
an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Program, and can be reasonably
|
||||
considered independent and separate works in themselves, then this License,
|
||||
and its terms, do not apply to those sections when you distribute them as
|
||||
separate works. But when you distribute the same sections as part of a whole
|
||||
which is a work based on the Program, the distribution of the whole must be
|
||||
on the terms of this License, whose permissions for other licensees extend
|
||||
to the entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest your
|
||||
rights to work written entirely by you; rather, the intent is to exercise
|
||||
the right to control the distribution of derivative or collective works based
|
||||
on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program with
|
||||
the Program (or with a work based on the Program) on a volume of a storage
|
||||
or distribution medium does not bring the other work under the scope of this
|
||||
License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, under Section
|
||||
2) in object code or executable form under the terms of Sections 1 and 2 above
|
||||
provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable source code,
|
||||
which must be distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three years, to give
|
||||
any third party, for a charge no more than your cost of physically performing
|
||||
source distribution, a complete machine-readable copy of the corresponding
|
||||
source code, to be distributed under the terms of Sections 1 and 2 above on
|
||||
a medium customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer to distribute
|
||||
corresponding source code. (This alternative is allowed only for noncommercial
|
||||
distribution and only if you received the program in object code or executable
|
||||
form with such an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for making
|
||||
modifications to it. For an executable work, complete source code means all
|
||||
the source code for all modules it contains, plus any associated interface
|
||||
definition files, plus the scripts used to control compilation and installation
|
||||
of the executable. However, as a special exception, the source code distributed
|
||||
need not include anything that is normally distributed (in either source or
|
||||
binary form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component itself
|
||||
accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering access to
|
||||
copy from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place counts as distribution of the source code,
|
||||
even though third parties are not compelled to copy the source along with
|
||||
the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program except
|
||||
as expressly provided under this License. Any attempt otherwise to copy, modify,
|
||||
sublicense or distribute the Program is void, and will automatically terminate
|
||||
your rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses terminated
|
||||
so long as such parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute the
|
||||
Program or its derivative works. These actions are prohibited by law if you
|
||||
do not accept this License. Therefore, by modifying or distributing the Program
|
||||
(or any work based on the Program), you indicate your acceptance of this License
|
||||
to do so, and all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the Program),
|
||||
the recipient automatically receives a license from the original licensor
|
||||
to copy, distribute or modify the Program subject to these terms and conditions.
|
||||
You may not impose any further restrictions on the recipients' exercise of
|
||||
the rights granted herein. You are not responsible for enforcing compliance
|
||||
by third parties to this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent infringement
|
||||
or for any other reason (not limited to patent issues), conditions are imposed
|
||||
on you (whether by court order, agreement or otherwise) that contradict the
|
||||
conditions of this License, they do not excuse you from the conditions of
|
||||
this License. If you cannot distribute so as to satisfy simultaneously your
|
||||
obligations under this License and any other pertinent obligations, then as
|
||||
a consequence you may not distribute the Program at all. For example, if a
|
||||
patent license would not permit royalty-free redistribution of the Program
|
||||
by all those who receive copies directly or indirectly through you, then the
|
||||
only way you could satisfy both it and this License would be to refrain entirely
|
||||
from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply and
|
||||
the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents
|
||||
or other property right claims or to contest validity of any such claims;
|
||||
this section has the sole purpose of protecting the integrity of the free
|
||||
software distribution system, which is implemented by public license practices.
|
||||
Many people have made generous contributions to the wide range of software
|
||||
distributed through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing to
|
||||
distribute software through any other system and a licensee cannot impose
|
||||
that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a
|
||||
consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original copyright
|
||||
holder who places the Program under this License may add an explicit geographical
|
||||
distribution limitation excluding those countries, so that distribution is
|
||||
permitted only in or among countries not thus excluded. In such case, this
|
||||
License incorporates the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions of
|
||||
the General Public License from time to time. Such new versions will be similar
|
||||
in spirit to the present version, but may differ in detail to address new
|
||||
problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program specifies
|
||||
a version number of this License which applies to it and "any later version",
|
||||
you have the option of following the terms and conditions either of that version
|
||||
or of any later version published by the Free Software Foundation. If the
|
||||
Program does not specify a version number of this License, you may choose
|
||||
any version ever published by the Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free programs
|
||||
whose distribution conditions are different, write to the author to ask for
|
||||
permission. For software which is copyrighted by the Free Software Foundation,
|
||||
write to the Free Software Foundation; we sometimes make exceptions for this.
|
||||
Our decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing and reuse
|
||||
of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
|
||||
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
|
||||
OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
|
||||
OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
|
||||
OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
|
||||
OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
|
||||
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest possible
|
||||
use to the public, the best way to achieve this is to make it free software
|
||||
which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to attach
|
||||
them to the start of each source file to most effectively convey the exclusion
|
||||
of warranty; and each file should have at least the "copyright" line and a
|
||||
pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and an idea of what it does.>
|
||||
|
||||
Copyright (C)< yyyy> <name of author>
|
||||
|
||||
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, write to the Free Software Foundation, Inc., 51 Franklin
|
||||
Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this when
|
||||
it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
|
||||
with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software,
|
||||
and you are welcome to redistribute it under certain conditions; type `show
|
||||
c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may be
|
||||
called something other than `show w' and `show c'; they could even be mouse-clicks
|
||||
or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision'
|
||||
(which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon >, 1 April 1989 Ty Coon, President of Vice This General
|
||||
Public License does not permit incorporating your program into proprietary
|
||||
programs. If your program is a subroutine library, you may consider it more
|
||||
useful to permit linking proprietary applications with the library. If this
|
||||
is what you want to do, use the GNU Lesser General Public License instead
|
||||
of this License.
|
||||
@@ -0,0 +1,319 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to share
|
||||
and change it. By contrast, the GNU General Public License is intended to
|
||||
guarantee your freedom to share and change free software--to make sure the
|
||||
software is free for all its users. This General Public License applies to
|
||||
most of the Free Software Foundation's software and to any other program whose
|
||||
authors commit to using it. (Some other Free Software Foundation software
|
||||
is covered by the GNU Lesser General Public License instead.) You can apply
|
||||
it to your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our
|
||||
General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for this service if you
|
||||
wish), that you receive source code or can get it if you want it, that you
|
||||
can change the software or use pieces of it in new free programs; and that
|
||||
you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid anyone to
|
||||
deny you these rights or to ask you to surrender the rights. These restrictions
|
||||
translate to certain responsibilities for you if you distribute copies of
|
||||
the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether gratis or
|
||||
for a fee, you must give the recipients all the rights that you have. You
|
||||
must make sure that they, too, receive or can get the source code. And you
|
||||
must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and (2)
|
||||
offer you this license which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain that
|
||||
everyone understands that there is no warranty for this free software. If
|
||||
the software is modified by someone else and passed on, we want its recipients
|
||||
to know that what they have is not the original, so that any problems introduced
|
||||
by others will not reflect on the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software patents. We
|
||||
wish to avoid the danger that redistributors of a free program will individually
|
||||
obtain patent licenses, in effect making the program proprietary. To prevent
|
||||
this, we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains a notice
|
||||
placed by the copyright holder saying it may be distributed under the terms
|
||||
of this General Public License. The "Program", below, refers to any such program
|
||||
or work, and a "work based on the Program" means either the Program or any
|
||||
derivative work under copyright law: that is to say, a work containing the
|
||||
Program or a portion of it, either verbatim or with modifications and/or translated
|
||||
into another language. (Hereinafter, translation is included without limitation
|
||||
in the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not covered
|
||||
by this License; they are outside its scope. The act of running the Program
|
||||
is not restricted, and the output from the Program is covered only if its
|
||||
contents constitute a work based on the Program (independent of having been
|
||||
made by running the Program). Whether that is true depends on what the Program
|
||||
does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's source code
|
||||
as you receive it, in any medium, provided that you conspicuously and appropriately
|
||||
publish on each copy an appropriate copyright notice and disclaimer of warranty;
|
||||
keep intact all the notices that refer to this License and to the absence
|
||||
of any warranty; and give any other recipients of the Program a copy of this
|
||||
License along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you
|
||||
may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion of it,
|
||||
thus forming a work based on the Program, and copy and distribute such modifications
|
||||
or work under the terms of Section 1 above, provided that you also meet all
|
||||
of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices stating that
|
||||
you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in whole or
|
||||
in part contains or is derived from the Program or any part thereof, to be
|
||||
licensed as a whole at no charge to all third parties under the terms of this
|
||||
License.
|
||||
|
||||
c) If the modified program normally reads commands interactively when run,
|
||||
you must cause it, when started running for such interactive use in the most
|
||||
ordinary way, to print or display an announcement including an appropriate
|
||||
copyright notice and a notice that there is no warranty (or else, saying that
|
||||
you provide a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this License.
|
||||
(Exception: if the Program itself is interactive but does not normally print
|
||||
such an announcement, your work based on the Program is not required to print
|
||||
an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Program, and can be reasonably
|
||||
considered independent and separate works in themselves, then this License,
|
||||
and its terms, do not apply to those sections when you distribute them as
|
||||
separate works. But when you distribute the same sections as part of a whole
|
||||
which is a work based on the Program, the distribution of the whole must be
|
||||
on the terms of this License, whose permissions for other licensees extend
|
||||
to the entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest your
|
||||
rights to work written entirely by you; rather, the intent is to exercise
|
||||
the right to control the distribution of derivative or collective works based
|
||||
on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program with
|
||||
the Program (or with a work based on the Program) on a volume of a storage
|
||||
or distribution medium does not bring the other work under the scope of this
|
||||
License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, under Section
|
||||
2) in object code or executable form under the terms of Sections 1 and 2 above
|
||||
provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable source code,
|
||||
which must be distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three years, to give
|
||||
any third party, for a charge no more than your cost of physically performing
|
||||
source distribution, a complete machine-readable copy of the corresponding
|
||||
source code, to be distributed under the terms of Sections 1 and 2 above on
|
||||
a medium customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer to distribute
|
||||
corresponding source code. (This alternative is allowed only for noncommercial
|
||||
distribution and only if you received the program in object code or executable
|
||||
form with such an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for making
|
||||
modifications to it. For an executable work, complete source code means all
|
||||
the source code for all modules it contains, plus any associated interface
|
||||
definition files, plus the scripts used to control compilation and installation
|
||||
of the executable. However, as a special exception, the source code distributed
|
||||
need not include anything that is normally distributed (in either source or
|
||||
binary form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component itself
|
||||
accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering access to
|
||||
copy from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place counts as distribution of the source code,
|
||||
even though third parties are not compelled to copy the source along with
|
||||
the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program except
|
||||
as expressly provided under this License. Any attempt otherwise to copy, modify,
|
||||
sublicense or distribute the Program is void, and will automatically terminate
|
||||
your rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses terminated
|
||||
so long as such parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute the
|
||||
Program or its derivative works. These actions are prohibited by law if you
|
||||
do not accept this License. Therefore, by modifying or distributing the Program
|
||||
(or any work based on the Program), you indicate your acceptance of this License
|
||||
to do so, and all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the Program),
|
||||
the recipient automatically receives a license from the original licensor
|
||||
to copy, distribute or modify the Program subject to these terms and conditions.
|
||||
You may not impose any further restrictions on the recipients' exercise of
|
||||
the rights granted herein. You are not responsible for enforcing compliance
|
||||
by third parties to this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent infringement
|
||||
or for any other reason (not limited to patent issues), conditions are imposed
|
||||
on you (whether by court order, agreement or otherwise) that contradict the
|
||||
conditions of this License, they do not excuse you from the conditions of
|
||||
this License. If you cannot distribute so as to satisfy simultaneously your
|
||||
obligations under this License and any other pertinent obligations, then as
|
||||
a consequence you may not distribute the Program at all. For example, if a
|
||||
patent license would not permit royalty-free redistribution of the Program
|
||||
by all those who receive copies directly or indirectly through you, then the
|
||||
only way you could satisfy both it and this License would be to refrain entirely
|
||||
from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply and
|
||||
the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents
|
||||
or other property right claims or to contest validity of any such claims;
|
||||
this section has the sole purpose of protecting the integrity of the free
|
||||
software distribution system, which is implemented by public license practices.
|
||||
Many people have made generous contributions to the wide range of software
|
||||
distributed through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing to
|
||||
distribute software through any other system and a licensee cannot impose
|
||||
that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a
|
||||
consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original copyright
|
||||
holder who places the Program under this License may add an explicit geographical
|
||||
distribution limitation excluding those countries, so that distribution is
|
||||
permitted only in or among countries not thus excluded. In such case, this
|
||||
License incorporates the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions of
|
||||
the General Public License from time to time. Such new versions will be similar
|
||||
in spirit to the present version, but may differ in detail to address new
|
||||
problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program specifies
|
||||
a version number of this License which applies to it and "any later version",
|
||||
you have the option of following the terms and conditions either of that version
|
||||
or of any later version published by the Free Software Foundation. If the
|
||||
Program does not specify a version number of this License, you may choose
|
||||
any version ever published by the Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free programs
|
||||
whose distribution conditions are different, write to the author to ask for
|
||||
permission. For software which is copyrighted by the Free Software Foundation,
|
||||
write to the Free Software Foundation; we sometimes make exceptions for this.
|
||||
Our decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing and reuse
|
||||
of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
|
||||
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
|
||||
OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
|
||||
OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
|
||||
OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
|
||||
OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
|
||||
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest possible
|
||||
use to the public, the best way to achieve this is to make it free software
|
||||
which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to attach
|
||||
them to the start of each source file to most effectively convey the exclusion
|
||||
of warranty; and each file should have at least the "copyright" line and a
|
||||
pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and an idea of what it does.>
|
||||
|
||||
Copyright (C) <yyyy> <name of author>
|
||||
|
||||
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, write to the Free Software Foundation, Inc., 51 Franklin
|
||||
Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this when
|
||||
it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
|
||||
with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software,
|
||||
and you are welcome to redistribute it under certain conditions; type `show
|
||||
c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may be
|
||||
called something other than `show w' and `show c'; they could even be mouse-clicks
|
||||
or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision'
|
||||
(which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General
|
||||
Public License does not permit incorporating your program into proprietary
|
||||
programs. If your program is a subroutine library, you may consider it more
|
||||
useful to permit linking proprietary applications with the library. If this
|
||||
is what you want to do, use the GNU Lesser General Public License instead
|
||||
of this License.
|
||||
@@ -0,0 +1,625 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for software and
|
||||
other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed to take
|
||||
away your freedom to share and change the works. By contrast, the GNU General
|
||||
Public License is intended to guarantee your freedom to share and change all
|
||||
versions of a program--to make sure it remains free software for all its users.
|
||||
We, the Free Software Foundation, use the GNU General Public License for most
|
||||
of our software; it applies also to any other work released this way by its
|
||||
authors. You can apply it to your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our
|
||||
General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for them if you wish), that
|
||||
you receive source code or can get it if you want it, that you can change
|
||||
the software or use pieces of it in new free programs, and that you know you
|
||||
can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you these rights
|
||||
or asking you to surrender the rights. Therefore, you have certain responsibilities
|
||||
if you distribute copies of the software, or if you modify it: responsibilities
|
||||
to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether gratis or
|
||||
for a fee, you must pass on to the recipients the same freedoms that you received.
|
||||
You must make sure that they, too, receive or can get the source code. And
|
||||
you must show them these terms so they know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps: (1) assert
|
||||
copyright on the software, and (2) offer you this License giving you legal
|
||||
permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains that
|
||||
there is no warranty for this free software. For both users' and authors'
|
||||
sake, the GPL requires that modified versions be marked as changed, so that
|
||||
their problems will not be attributed erroneously to authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run modified
|
||||
versions of the software inside them, although the manufacturer can do so.
|
||||
This is fundamentally incompatible with the aim of protecting users' freedom
|
||||
to change the software. The systematic pattern of such abuse occurs in the
|
||||
area of products for individuals to use, which is precisely where it is most
|
||||
unacceptable. Therefore, we have designed this version of the GPL to prohibit
|
||||
the practice for those products. If such problems arise substantially in other
|
||||
domains, we stand ready to extend this provision to those domains in future
|
||||
versions of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents. States
|
||||
should not allow patents to restrict development and use of software on general-purpose
|
||||
computers, but in those that do, we wish to avoid the special danger that
|
||||
patents applied to a free program could make it effectively proprietary. To
|
||||
prevent this, the GPL assures that patents cannot be used to render the program
|
||||
non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of works,
|
||||
such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this License.
|
||||
Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals
|
||||
or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work in
|
||||
a fashion requiring copyright permission, other than the making of an exact
|
||||
copy. The resulting work is called a "modified version" of the earlier work
|
||||
or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based on the
|
||||
Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without permission,
|
||||
would make you directly or secondarily liable for infringement under applicable
|
||||
copyright law, except executing it on a computer or modifying a private copy.
|
||||
Propagation includes copying, distribution (with or without modification),
|
||||
making available to the public, and in some countries other activities as
|
||||
well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other parties
|
||||
to make or receive copies. Mere interaction with a user through a computer
|
||||
network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" to the
|
||||
extent that it includes a convenient and prominently visible feature that
|
||||
(1) displays an appropriate copyright notice, and (2) tells the user that
|
||||
there is no warranty for the work (except to the extent that warranties are
|
||||
provided), that licensees may convey the work under this License, and how
|
||||
to view a copy of this License. If the interface presents a list of user commands
|
||||
or options, such as a menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work for making
|
||||
modifications to it. "Object code" means any non-source form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official standard
|
||||
defined by a recognized standards body, or, in the case of interfaces specified
|
||||
for a particular programming language, one that is widely used among developers
|
||||
working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other than
|
||||
the work as a whole, that (a) is included in the normal form of packaging
|
||||
a Major Component, but which is not part of that Major Component, and (b)
|
||||
serves only to enable use of the work with that Major Component, or to implement
|
||||
a Standard Interface for which an implementation is available to the public
|
||||
in source code form. A "Major Component", in this context, means a major essential
|
||||
component (kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to produce
|
||||
the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all the source
|
||||
code needed to generate, install, and (for an executable work) run the object
|
||||
code and to modify the work, including scripts to control those activities.
|
||||
However, it does not include the work's System Libraries, or general-purpose
|
||||
tools or generally available free programs which are used unmodified in performing
|
||||
those activities but which are not part of the work. For example, Corresponding
|
||||
Source includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically linked
|
||||
subprograms that the work is specifically designed to require, such as by
|
||||
intimate data communication or control flow between those subprograms and
|
||||
other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users can regenerate
|
||||
automatically from other parts of the Corresponding Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of copyright
|
||||
on the Program, and are irrevocable provided the stated conditions are met.
|
||||
This License explicitly affirms your unlimited permission to run the unmodified
|
||||
Program. The output from running a covered work is covered by this License
|
||||
only if the output, given its content, constitutes a covered work. This License
|
||||
acknowledges your rights of fair use or other equivalent, as provided by copyright
|
||||
law.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey, without
|
||||
conditions so long as your license otherwise remains in force. You may convey
|
||||
covered works to others for the sole purpose of having them make modifications
|
||||
exclusively for you, or provide you with facilities for running those works,
|
||||
provided that you comply with the terms of this License in conveying all material
|
||||
for which you do not control copyright. Those thus making or running the covered
|
||||
works for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of your copyrighted
|
||||
material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the conditions
|
||||
stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological measure
|
||||
under any applicable law fulfilling obligations under article 11 of the WIPO
|
||||
copyright treaty adopted on 20 December 1996, or similar laws prohibiting
|
||||
or restricting circumvention of such measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid circumvention
|
||||
of technological measures to the extent such circumvention is effected by
|
||||
exercising rights under this License with respect to the covered work, and
|
||||
you disclaim any intention to limit operation or modification of the work
|
||||
as a means of enforcing, against the work's users, your or third parties'
|
||||
legal rights to forbid circumvention of technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you receive
|
||||
it, in any medium, provided that you conspicuously and appropriately publish
|
||||
on each copy an appropriate copyright notice; keep intact all notices stating
|
||||
that this License and any non-permissive terms added in accord with section
|
||||
7 apply to the code; keep intact all notices of the absence of any warranty;
|
||||
and give all recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey, and you
|
||||
may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to produce
|
||||
it from the Program, in the form of source code under the terms of section
|
||||
4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified it, and
|
||||
giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is released under
|
||||
this License and any conditions added under section 7. This requirement modifies
|
||||
the requirement in section 4 to "keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this License to anyone
|
||||
who comes into possession of a copy. This License will therefore apply, along
|
||||
with any applicable section 7 additional terms, to the whole of the work,
|
||||
and all its parts, regardless of how they are packaged. This License gives
|
||||
no permission to license the work in any other way, but it does not invalidate
|
||||
such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display Appropriate
|
||||
Legal Notices; however, if the Program has interactive interfaces that do
|
||||
not display Appropriate Legal Notices, your work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent works,
|
||||
which are not by their nature extensions of the covered work, and which are
|
||||
not combined with it such as to form a larger program, in or on a volume of
|
||||
a storage or distribution medium, is called an "aggregate" if the compilation
|
||||
and its resulting copyright are not used to limit the access or legal rights
|
||||
of the compilation's users beyond what the individual works permit. Inclusion
|
||||
of a covered work in an aggregate does not cause this License to apply to
|
||||
the other parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms of sections
|
||||
4 and 5, provided that you also convey the machine-readable Corresponding
|
||||
Source under the terms of this License, in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product (including
|
||||
a physical distribution medium), accompanied by the Corresponding Source fixed
|
||||
on a durable physical medium customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product (including
|
||||
a physical distribution medium), accompanied by a written offer, valid for
|
||||
at least three years and valid for as long as you offer spare parts or customer
|
||||
support for that product model, to give anyone who possesses the object code
|
||||
either (1) a copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical medium customarily
|
||||
used for software interchange, for a price no more than your reasonable cost
|
||||
of physically performing this conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the written
|
||||
offer to provide the Corresponding Source. This alternative is allowed only
|
||||
occasionally and noncommercially, and only if you received the object code
|
||||
with such an offer, in accord with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated place (gratis
|
||||
or for a charge), and offer equivalent access to the Corresponding Source
|
||||
in the same way through the same place at no further charge. You need not
|
||||
require recipients to copy the Corresponding Source along with the object
|
||||
code. If the place to copy the object code is a network server, the Corresponding
|
||||
Source may be on a different server (operated by you or a third party) that
|
||||
supports equivalent copying facilities, provided you maintain clear directions
|
||||
next to the object code saying where to find the Corresponding Source. Regardless
|
||||
of what server hosts the Corresponding Source, you remain obligated to ensure
|
||||
that it is available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided you inform
|
||||
other peers where the object code and Corresponding Source of the work are
|
||||
being offered to the general public at no charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded from
|
||||
the Corresponding Source as a System Library, need not be included in conveying
|
||||
the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any tangible
|
||||
personal property which is normally used for personal, family, or household
|
||||
purposes, or (2) anything designed or sold for incorporation into a dwelling.
|
||||
In determining whether a product is a consumer product, doubtful cases shall
|
||||
be resolved in favor of coverage. For a particular product received by a particular
|
||||
user, "normally used" refers to a typical or common use of that class of product,
|
||||
regardless of the status of the particular user or of the way in which the
|
||||
particular user actually uses, or expects or is expected to use, the product.
|
||||
A product is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent the
|
||||
only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods, procedures,
|
||||
authorization keys, or other information required to install and execute modified
|
||||
versions of a covered work in that User Product from a modified version of
|
||||
its Corresponding Source. The information must suffice to ensure that the
|
||||
continued functioning of the modified object code is in no case prevented
|
||||
or interfered with solely because modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or specifically
|
||||
for use in, a User Product, and the conveying occurs as part of a transaction
|
||||
in which the right of possession and use of the User Product is transferred
|
||||
to the recipient in perpetuity or for a fixed term (regardless of how the
|
||||
transaction is characterized), the Corresponding Source conveyed under this
|
||||
section must be accompanied by the Installation Information. But this requirement
|
||||
does not apply if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has been installed
|
||||
in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a requirement
|
||||
to continue to provide support service, warranty, or updates for a work that
|
||||
has been modified or installed by the recipient, or for the User Product in
|
||||
which it has been modified or installed. Access to a network may be denied
|
||||
when the modification itself materially and adversely affects the operation
|
||||
of the network or violates the rules and protocols for communication across
|
||||
the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided, in accord
|
||||
with this section must be in a format that is publicly documented (and with
|
||||
an implementation available to the public in source code form), and must require
|
||||
no special password or key for unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this License
|
||||
by making exceptions from one or more of its conditions. Additional permissions
|
||||
that are applicable to the entire Program shall be treated as though they
|
||||
were included in this License, to the extent that they are valid under applicable
|
||||
law. If additional permissions apply only to part of the Program, that part
|
||||
may be used separately under those permissions, but the entire Program remains
|
||||
governed by this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option remove any
|
||||
additional permissions from that copy, or from any part of it. (Additional
|
||||
permissions may be written to require their own removal in certain cases when
|
||||
you modify the work.) You may place additional permissions on material, added
|
||||
by you to a covered work, for which you have or can give appropriate copyright
|
||||
permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you add
|
||||
to a covered work, you may (if authorized by the copyright holders of that
|
||||
material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the terms of
|
||||
sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or author
|
||||
attributions in that material or in the Appropriate Legal Notices displayed
|
||||
by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or requiring
|
||||
that modified versions of such material be marked in reasonable ways as different
|
||||
from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or authors
|
||||
of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some trade names,
|
||||
trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that material by
|
||||
anyone who conveys the material (or modified versions of it) with contractual
|
||||
assumptions of liability to the recipient, for any liability that these contractual
|
||||
assumptions directly impose on those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further restrictions"
|
||||
within the meaning of section 10. If the Program as you received it, or any
|
||||
part of it, contains a notice stating that it is governed by this License
|
||||
along with a term that is a further restriction, you may remove that term.
|
||||
If a license document contains a further restriction but permits relicensing
|
||||
or conveying under this License, you may add to a covered work material governed
|
||||
by the terms of that license document, provided that the further restriction
|
||||
does not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you must place,
|
||||
in the relevant source files, a statement of the additional terms that apply
|
||||
to those files, or a notice indicating where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the form
|
||||
of a separately written license, or stated as exceptions; the above requirements
|
||||
apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly provided
|
||||
under this License. Any attempt otherwise to propagate or modify it is void,
|
||||
and will automatically terminate your rights under this License (including
|
||||
any patent licenses granted under the third paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your license from
|
||||
a particular copyright holder is reinstated (a) provisionally, unless and
|
||||
until the copyright holder explicitly and finally terminates your license,
|
||||
and (b) permanently, if the copyright holder fails to notify you of the violation
|
||||
by some reasonable means prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is reinstated permanently
|
||||
if the copyright holder notifies you of the violation by some reasonable means,
|
||||
this is the first time you have received notice of violation of this License
|
||||
(for any work) from that copyright holder, and you cure the violation prior
|
||||
to 30 days after your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the licenses
|
||||
of parties who have received copies or rights from you under this License.
|
||||
If your rights have been terminated and not permanently reinstated, you do
|
||||
not qualify to receive new licenses for the same material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or run a copy
|
||||
of the Program. Ancillary propagation of a covered work occurring solely as
|
||||
a consequence of using peer-to-peer transmission to receive a copy likewise
|
||||
does not require acceptance. However, nothing other than this License grants
|
||||
you permission to propagate or modify any covered work. These actions infringe
|
||||
copyright if you do not accept this License. Therefore, by modifying or propagating
|
||||
a covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically receives
|
||||
a license from the original licensors, to run, modify and propagate that work,
|
||||
subject to this License. You are not responsible for enforcing compliance
|
||||
by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an organization,
|
||||
or substantially all assets of one, or subdividing an organization, or merging
|
||||
organizations. If propagation of a covered work results from an entity transaction,
|
||||
each party to that transaction who receives a copy of the work also receives
|
||||
whatever licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the Corresponding
|
||||
Source of the work from the predecessor in interest, if the predecessor has
|
||||
it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the rights
|
||||
granted or affirmed under this License. For example, you may not impose a
|
||||
license fee, royalty, or other charge for exercise of rights granted under
|
||||
this License, and you may not initiate litigation (including a cross-claim
|
||||
or counterclaim in a lawsuit) alleging that any patent claim is infringed
|
||||
by making, using, selling, offering for sale, or importing the Program or
|
||||
any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this License
|
||||
of the Program or a work on which the Program is based. The work thus licensed
|
||||
is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims owned or controlled
|
||||
by the contributor, whether already acquired or hereafter acquired, that would
|
||||
be infringed by some manner, permitted by this License, of making, using,
|
||||
or selling its contributor version, but do not include claims that would be
|
||||
infringed only as a consequence of further modification of the contributor
|
||||
version. For purposes of this definition, "control" includes the right to
|
||||
grant patent sublicenses in a manner consistent with the requirements of this
|
||||
License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free patent
|
||||
license under the contributor's essential patent claims, to make, use, sell,
|
||||
offer for sale, import and otherwise run, modify and propagate the contents
|
||||
of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express agreement
|
||||
or commitment, however denominated, not to enforce a patent (such as an express
|
||||
permission to practice a patent or covenant not to sue for patent infringement).
|
||||
To "grant" such a patent license to a party means to make such an agreement
|
||||
or commitment not to enforce a patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license, and the
|
||||
Corresponding Source of the work is not available for anyone to copy, free
|
||||
of charge and under the terms of this License, through a publicly available
|
||||
network server or other readily accessible means, then you must either (1)
|
||||
cause the Corresponding Source to be so available, or (2) arrange to deprive
|
||||
yourself of the benefit of the patent license for this particular work, or
|
||||
(3) arrange, in a manner consistent with the requirements of this License,
|
||||
to extend the patent license to downstream recipients. "Knowingly relying"
|
||||
means you have actual knowledge that, but for the patent license, your conveying
|
||||
the covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that country
|
||||
that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or arrangement,
|
||||
you convey, or propagate by procuring conveyance of, a covered work, and grant
|
||||
a patent license to some of the parties receiving the covered work authorizing
|
||||
them to use, propagate, modify or convey a specific copy of the covered work,
|
||||
then the patent license you grant is automatically extended to all recipients
|
||||
of the covered work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within the scope
|
||||
of its coverage, prohibits the exercise of, or is conditioned on the non-exercise
|
||||
of one or more of the rights that are specifically granted under this License.
|
||||
You may not convey a covered work if you are a party to an arrangement with
|
||||
a third party that is in the business of distributing software, under which
|
||||
you make payment to the third party based on the extent of your activity of
|
||||
conveying the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory patent
|
||||
license (a) in connection with copies of the covered work conveyed by you
|
||||
(or copies made from those copies), or (b) primarily for and in connection
|
||||
with specific products or compilations that contain the covered work, unless
|
||||
you entered into that arrangement, or that patent license was granted, prior
|
||||
to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting any implied
|
||||
license or other defenses to infringement that may otherwise be available
|
||||
to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or otherwise)
|
||||
that contradict the conditions of this License, they do not excuse you from
|
||||
the conditions of this License. If you cannot convey a covered work so as
|
||||
to satisfy simultaneously your obligations under this License and any other
|
||||
pertinent obligations, then as a consequence you may not convey it at all.
|
||||
For example, if you agree to terms that obligate you to collect a royalty
|
||||
for further conveying from those to whom you convey the Program, the only
|
||||
way you could satisfy both those terms and this License would be to refrain
|
||||
entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have permission to
|
||||
link or combine any covered work with a work licensed under version 3 of the
|
||||
GNU Affero General Public License into a single combined work, and to convey
|
||||
the resulting work. The terms of this License will continue to apply to the
|
||||
part which is the covered work, but the special requirements of the GNU Affero
|
||||
General Public License, section 13, concerning interaction through a network
|
||||
will apply to the combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of the
|
||||
GNU General Public License from time to time. Such new versions will be similar
|
||||
in spirit to the present version, but may differ in detail to address new
|
||||
problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program specifies
|
||||
that a certain numbered version of the GNU General Public License "or any
|
||||
later version" applies to it, you have the option of following the terms and
|
||||
conditions either of that numbered version or of any later version published
|
||||
by the Free Software Foundation. If the Program does not specify a version
|
||||
number of the GNU General Public License, you may choose any version ever
|
||||
published by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions of
|
||||
the GNU General Public License can be used, that proxy's public statement
|
||||
of acceptance of a version permanently authorizes you to choose that version
|
||||
for the Program.
|
||||
|
||||
Later license versions may give you additional or different permissions. However,
|
||||
no additional obligations are imposed on any author or copyright holder as
|
||||
a result of your choosing to follow a later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
|
||||
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
|
||||
PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
|
||||
CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
|
||||
ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM
|
||||
AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
|
||||
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO
|
||||
USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
|
||||
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
|
||||
PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
|
||||
PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided above cannot
|
||||
be given local legal effect according to their terms, reviewing courts shall
|
||||
apply local law that most closely approximates an absolute waiver of all civil
|
||||
liability in connection with the Program, unless a warranty or assumption
|
||||
of liability accompanies a copy of the Program in return for a fee. END OF
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest possible
|
||||
use to the public, the best way to achieve this is to make it free software
|
||||
which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest to attach
|
||||
them to the start of each source file to most effectively state the exclusion
|
||||
of warranty; and each file should have at least the "copyright" line and a
|
||||
pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 3 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short notice like
|
||||
this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
|
||||
This is free software, and you are welcome to redistribute it under certain
|
||||
conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands might
|
||||
be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary. For
|
||||
more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General Public
|
||||
License instead of this License. But first, please read <https://www.gnu.org/
|
||||
licenses /why-not-lgpl.html>.
|
||||
@@ -0,0 +1,446 @@
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is numbered 2 because
|
||||
it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to share
|
||||
and change it. By contrast, the GNU General Public Licenses are intended to
|
||||
guarantee your freedom to share and change free software--to make sure the
|
||||
software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some specially
|
||||
designated Free Software Foundation software, and to any other libraries whose
|
||||
authors decide to use it. You can use it for your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our
|
||||
General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for this service if you
|
||||
wish), that you receive source code or can get it if you want it, that you
|
||||
can change the software or use pieces of it in new free programs; and that
|
||||
you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid anyone to
|
||||
deny you these rights or to ask you to surrender the rights. These restrictions
|
||||
translate to certain responsibilities for you if you distribute copies of
|
||||
the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis or for
|
||||
a fee, you must give the recipients all the rights that we gave you. You must
|
||||
make sure that they, too, receive or can get the source code. If you link
|
||||
a program with the library, you must provide complete object files to the
|
||||
recipients so that they can relink them with the library, after making changes
|
||||
to the library and recompiling it. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright the library,
|
||||
and (2) offer you this license which gives you legal permission to copy, distribute
|
||||
and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain that everyone
|
||||
understands that there is no warranty for this free library. If the library
|
||||
is modified by someone else and passed on, we want its recipients to know
|
||||
that what they have is not the original version, so that any problems introduced
|
||||
by others will not reflect on the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software patents. We
|
||||
wish to avoid the danger that companies distributing free software will individually
|
||||
obtain patent licenses, thus in effect transforming the program into proprietary
|
||||
software. To prevent this, we have made it clear that any patent must be licensed
|
||||
for everyone's free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary GNU
|
||||
General Public License, which was designed for utility programs. This license,
|
||||
the GNU Library General Public License, applies to certain designated libraries.
|
||||
This license is quite different from the ordinary one; be sure to read it
|
||||
in full, and don't assume that anything in it is the same as in the ordinary
|
||||
license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that they
|
||||
blur the distinction we usually make between modifying or adding to a program
|
||||
and simply using it. Linking a program with a library, without changing the
|
||||
library, is in some sense simply using the library, and is analogous to running
|
||||
a utility program or application program. However, in a textual and legal
|
||||
sense, the linked executable is a combined work, a derivative of the original
|
||||
library, and the ordinary General Public License treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General Public License
|
||||
for libraries did not effectively promote software sharing, because most developers
|
||||
did not use the libraries. We concluded that weaker conditions might promote
|
||||
sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the users
|
||||
of those programs of all benefit from the free status of the libraries themselves.
|
||||
This Library General Public License is intended to permit developers of non-free
|
||||
programs to use free libraries, while preserving your freedom as a user of
|
||||
such programs to change the free libraries that are incorporated in them.
|
||||
(We have not seen how to achieve this as regards changes in header files,
|
||||
but we have achieved it as regards changes in the actual functions of the
|
||||
Library.) The hope is that this will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow. Pay close attention to the difference between a "work based on the
|
||||
library" and a "work that uses the library". The former contains code derived
|
||||
from the library, while the latter only works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary General
|
||||
Public License rather than by this special one.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which contains a
|
||||
notice placed by the copyright holder or other authorized party saying it
|
||||
may be distributed under the terms of this Library General Public License
|
||||
(also called "this License"). Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data prepared
|
||||
so as to be conveniently linked with application programs (which use some
|
||||
of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work which has
|
||||
been distributed under these terms. A "work based on the Library" means either
|
||||
the Library or any derivative work under copyright law: that is to say, a
|
||||
work containing the Library or a portion of it, either verbatim or with modifications
|
||||
and/or translated straightforwardly into another language. (Hereinafter, translation
|
||||
is included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for making modifications
|
||||
to it. For a library, complete source code means all the source code for all
|
||||
modules it contains, plus any associated interface definition files, plus
|
||||
the scripts used to control compilation and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not covered
|
||||
by this License; they are outside its scope. The act of running a program
|
||||
using the Library is not restricted, and output from such a program is covered
|
||||
only if its contents constitute a work based on the Library (independent of
|
||||
the use of the Library in a tool for writing it). Whether that is true depends
|
||||
on what the Library does and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's complete source
|
||||
code as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and disclaimer
|
||||
of warranty; keep intact all the notices that refer to this License and to
|
||||
the absence of any warranty; and distribute a copy of this License along with
|
||||
the Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you
|
||||
may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion of it,
|
||||
thus forming a work based on the Library, and copy and distribute such modifications
|
||||
or work under the terms of Section 1 above, provided that you also meet all
|
||||
of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices stating that
|
||||
you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no charge to all
|
||||
third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a table of
|
||||
data to be supplied by an application program that uses the facility, other
|
||||
than as an argument passed when the facility is invoked, then you must make
|
||||
a good faith effort to ensure that, in the event an application does not supply
|
||||
such function or table, the facility still operates, and performs whatever
|
||||
part of its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has a purpose
|
||||
that is entirely well-defined independent of the application. Therefore, Subsection
|
||||
2d requires that any application-supplied function or table used by this function
|
||||
must be optional: if the application does not supply it, the square root function
|
||||
must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Library, and can be reasonably
|
||||
considered independent and separate works in themselves, then this License,
|
||||
and its terms, do not apply to those sections when you distribute them as
|
||||
separate works. But when you distribute the same sections as part of a whole
|
||||
which is a work based on the Library, the distribution of the whole must be
|
||||
on the terms of this License, whose permissions for other licensees extend
|
||||
to the entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest your
|
||||
rights to work written entirely by you; rather, the intent is to exercise
|
||||
the right to control the distribution of derivative or collective works based
|
||||
on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library with
|
||||
the Library (or with a work based on the Library) on a volume of a storage
|
||||
or distribution medium does not bring the other work under the scope of this
|
||||
License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public License
|
||||
instead of this License to a given copy of the Library. To do this, you must
|
||||
alter all the notices that refer to this License, so that they refer to the
|
||||
ordinary GNU General Public License, version 2, instead of to this License.
|
||||
(If a newer version than version 2 of the ordinary GNU General Public License
|
||||
has appeared, then you can specify that version instead if you wish.) Do not
|
||||
make any other change in these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for that copy,
|
||||
so the ordinary GNU General Public License applies to all subsequent copies
|
||||
and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of the Library
|
||||
into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or derivative of
|
||||
it, under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you accompany it with the complete corresponding
|
||||
machine-readable source code, which must be distributed under the terms of
|
||||
Sections 1 and 2 above on a medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy from a designated
|
||||
place, then offering equivalent access to copy the source code from the same
|
||||
place satisfies the requirement to distribute the source code, even though
|
||||
third parties are not compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the Library, but
|
||||
is designed to work with the Library by being compiled or linked with it,
|
||||
is called a "work that uses the Library". Such a work, in isolation, is not
|
||||
a derivative work of the Library, and therefore falls outside the scope of
|
||||
this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library creates an
|
||||
executable that is a derivative of the Library (because it contains portions
|
||||
of the Library), rather than a "work that uses the library". The executable
|
||||
is therefore covered by this License. Section 6 states terms for distribution
|
||||
of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file that
|
||||
is part of the Library, the object code for the work may be a derivative work
|
||||
of the Library even though the source code is not. Whether this is true is
|
||||
especially significant if the work can be linked without the Library, or if
|
||||
the work is itself a library. The threshold for this to be true is not precisely
|
||||
defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data structure layouts
|
||||
and accessors, and small macros and small inline functions (ten lines or less
|
||||
in length), then the use of the object file is unrestricted, regardless of
|
||||
whether it is legally a derivative work. (Executables containing this object
|
||||
code plus portions of the Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may distribute
|
||||
the object code for the work under the terms of Section 6. Any executables
|
||||
containing that work also fall under Section 6, whether or not they are linked
|
||||
directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or link a "work
|
||||
that uses the Library" with the Library to produce a work containing portions
|
||||
of the Library, and distribute that work under terms of your choice, provided
|
||||
that the terms permit modification of the work for the customer's own use
|
||||
and reverse engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
You must supply a copy of this License. If the work during execution displays
|
||||
copyright notices, you must include the copyright notice for the Library among
|
||||
them, as well as a reference directing the user to the copy of this License.
|
||||
Also, you must do one of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding machine-readable source
|
||||
code for the Library including whatever changes were used in the work (which
|
||||
must be distributed under Sections 1 and 2 above); and, if the work is an
|
||||
executable linked with the Library, with the complete machine-readable "work
|
||||
that uses the Library", as object code and/or source code, so that the user
|
||||
can modify the Library and then relink to produce a modified executable containing
|
||||
the modified Library. (It is understood that the user who changes the contents
|
||||
of definitions files in the Library will not necessarily be able to recompile
|
||||
the application to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at least three years,
|
||||
to give the same user the materials specified in Subsection 6a, above, for
|
||||
a charge no more than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy from a designated
|
||||
place, offer equivalent access to copy the above specified materials from
|
||||
the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these materials or
|
||||
that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the Library" must
|
||||
include any data and utility programs needed for reproducing the executable
|
||||
from it. However, as a special exception, the source code distributed need
|
||||
not include anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the operating
|
||||
system on which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license restrictions of
|
||||
other proprietary libraries that do not normally accompany the operating system.
|
||||
Such a contradiction means you cannot use both them and the Library together
|
||||
in an executable that you distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the Library side-by-side
|
||||
in a single library together with other library facilities not covered by
|
||||
this License, and distribute such a combined library, provided that the separate
|
||||
distribution of the work based on the Library and of the other library facilities
|
||||
is otherwise permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the
|
||||
Library, uncombined with any other library facilities. This must be distributed
|
||||
under the terms of the Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact that part of
|
||||
it is a work based on the Library, and explaining where to find the accompanying
|
||||
uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute the Library
|
||||
except as expressly provided under this License. Any attempt otherwise to
|
||||
copy, modify, sublicense, link with, or distribute the Library is void, and
|
||||
will automatically terminate your rights under this License. However, parties
|
||||
who have received copies, or rights, from you under this License will not
|
||||
have their licenses terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute the
|
||||
Library or its derivative works. These actions are prohibited by law if you
|
||||
do not accept this License. Therefore, by modifying or distributing the Library
|
||||
(or any work based on the Library), you indicate your acceptance of this License
|
||||
to do so, and all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the Library),
|
||||
the recipient automatically receives a license from the original licensor
|
||||
to copy, distribute, link with or modify the Library subject to these terms
|
||||
and conditions. You may not impose any further restrictions on the recipients'
|
||||
exercise of the rights granted herein. You are not responsible for enforcing
|
||||
compliance by third parties to this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent infringement
|
||||
or for any other reason (not limited to patent issues), conditions are imposed
|
||||
on you (whether by court order, agreement or otherwise) that contradict the
|
||||
conditions of this License, they do not excuse you from the conditions of
|
||||
this License. If you cannot distribute so as to satisfy simultaneously your
|
||||
obligations under this License and any other pertinent obligations, then as
|
||||
a consequence you may not distribute the Library at all. For example, if a
|
||||
patent license would not permit royalty-free redistribution of the Library
|
||||
by all those who receive copies directly or indirectly through you, then the
|
||||
only way you could satisfy both it and this License would be to refrain entirely
|
||||
from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents
|
||||
or other property right claims or to contest validity of any such claims;
|
||||
this section has the sole purpose of protecting the integrity of the free
|
||||
software distribution system which is implemented by public license practices.
|
||||
Many people have made generous contributions to the wide range of software
|
||||
distributed through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing to
|
||||
distribute software through any other system and a licensee cannot impose
|
||||
that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a
|
||||
consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original copyright
|
||||
holder who places the Library under this License may add an explicit geographical
|
||||
distribution limitation excluding those countries, so that distribution is
|
||||
permitted only in or among countries not thus excluded. In such case, this
|
||||
License incorporates the limitation as if written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new versions of
|
||||
the Library General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to address
|
||||
new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library specifies
|
||||
a version number of this License which applies to it and "any later version",
|
||||
you have the option of following the terms and conditions either of that version
|
||||
or of any later version published by the Free Software Foundation. If the
|
||||
Library does not specify a license version number, you may choose any version
|
||||
ever published by the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free programs
|
||||
whose distribution conditions are incompatible with these, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free Software
|
||||
Foundation, write to the Free Software Foundation; we sometimes make exceptions
|
||||
for this. Our decision will be guided by the two goals of preserving the free
|
||||
status of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||
THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
|
||||
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
|
||||
OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||
THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
|
||||
OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
|
||||
OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
|
||||
OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
|
||||
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest possible
|
||||
use to the public, we recommend making it free software that everyone can
|
||||
redistribute and change. You can do so by permitting redistribution under
|
||||
these terms (or, alternatively, under the terms of the ordinary General Public
|
||||
License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is safest
|
||||
to attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the "copyright"
|
||||
line and a pointer to where the full notice is found.
|
||||
|
||||
one line to give the library's name and an idea of what it does.
|
||||
|
||||
Copyright (C) year name of author
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Library General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This library 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 Library General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the library, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in
|
||||
|
||||
the library `Frob' (a library for tweaking knobs) written
|
||||
|
||||
by James Random Hacker.
|
||||
|
||||
signature of Ty Coon, 1 April 1990
|
||||
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
@@ -0,0 +1,467 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts as the
|
||||
successor of the GNU Library Public License, version 2, hence the version
|
||||
number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to share
|
||||
and change it. By contrast, the GNU General Public Licenses are intended to
|
||||
guarantee your freedom to share and change free software--to make sure the
|
||||
software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some specially
|
||||
designated software packages--typically libraries--of the Free Software Foundation
|
||||
and other authors who decide to use it. You can use it too, but we suggest
|
||||
you first think carefully about whether this license or the ordinary General
|
||||
Public License is the better strategy to use in any particular case, based
|
||||
on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use, not price.
|
||||
Our General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for this service if you
|
||||
wish); that you receive source code or can get it if you want it; that you
|
||||
can change the software and use pieces of it in new free programs; and that
|
||||
you are informed that you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid distributors
|
||||
to deny you these rights or to ask you to surrender these rights. These restrictions
|
||||
translate to certain responsibilities for you if you distribute copies of
|
||||
the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis or for
|
||||
a fee, you must give the recipients all the rights that we gave you. You must
|
||||
make sure that they, too, receive or can get the source code. If you link
|
||||
other code with the library, you must provide complete object files to the
|
||||
recipients, so that they can relink them with the library after making changes
|
||||
to the library and recompiling it. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the library,
|
||||
and (2) we offer you this license, which gives you legal permission to copy,
|
||||
distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that there is no
|
||||
warranty for the free library. Also, if the library is modified by someone
|
||||
else and passed on, the recipients should know that what they have is not
|
||||
the original version, so that the original author's reputation will not be
|
||||
affected by problems that might be introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of any free
|
||||
program. We wish to make sure that a company cannot effectively restrict the
|
||||
users of a free program by obtaining a restrictive license from a patent holder.
|
||||
Therefore, we insist that any patent license obtained for a version of the
|
||||
library must be consistent with the full freedom of use specified in this
|
||||
license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary GNU
|
||||
General Public License. This license, the GNU Lesser General Public License,
|
||||
applies to certain designated libraries, and is quite different from the ordinary
|
||||
General Public License. We use this license for certain libraries in order
|
||||
to permit linking those libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using a shared
|
||||
library, the combination of the two is legally speaking a combined work, a
|
||||
derivative of the original library. The ordinary General Public License therefore
|
||||
permits such linking only if the entire combination fits its criteria of freedom.
|
||||
The Lesser General Public License permits more lax criteria for linking other
|
||||
code with the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it does Less
|
||||
to protect the user's freedom than the ordinary General Public License. It
|
||||
also provides other free software developers Less of an advantage over competing
|
||||
non-free programs. These disadvantages are the reason we use the ordinary
|
||||
General Public License for many libraries. However, the Lesser license provides
|
||||
advantages in certain special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to encourage the
|
||||
widest possible use of a certain library, so that it becomes a de-facto standard.
|
||||
To achieve this, non-free programs must be allowed to use the library. A more
|
||||
frequent case is that a free library does the same job as widely used non-free
|
||||
libraries. In this case, there is little to gain by limiting the free library
|
||||
to free software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free programs
|
||||
enables a greater number of people to use a large body of free software. For
|
||||
example, permission to use the GNU C Library in non-free programs enables
|
||||
many more people to use the whole GNU operating system, as well as its variant,
|
||||
the GNU/Linux operating system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the users'
|
||||
freedom, it does ensure that the user of a program that is linked with the
|
||||
Library has the freedom and the wherewithal to run that program using a modified
|
||||
version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow. Pay close attention to the difference between a "work based on the
|
||||
library" and a "work that uses the library". The former contains code derived
|
||||
from the library, whereas the latter must be combined with the library in
|
||||
order to run.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other program
|
||||
which contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Lesser General
|
||||
Public License (also called "this License"). Each licensee is addressed as
|
||||
"you".
|
||||
|
||||
A "library" means a collection of software functions and/or data prepared
|
||||
so as to be conveniently linked with application programs (which use some
|
||||
of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work which has
|
||||
been distributed under these terms. A "work based on the Library" means either
|
||||
the Library or any derivative work under copyright law: that is to say, a
|
||||
work containing the Library or a portion of it, either verbatim or with modifications
|
||||
and/or translated straightforwardly into another language. (Hereinafter, translation
|
||||
is included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for making modifications
|
||||
to it. For a library, complete source code means all the source code for all
|
||||
modules it contains, plus any associated interface definition files, plus
|
||||
the scripts used to control compilation and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not covered
|
||||
by this License; they are outside its scope. The act of running a program
|
||||
using the Library is not restricted, and output from such a program is covered
|
||||
only if its contents constitute a work based on the Library (independent of
|
||||
the use of the Library in a tool for writing it). Whether that is true depends
|
||||
on what the Library does and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's complete source
|
||||
code as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and disclaimer
|
||||
of warranty; keep intact all the notices that refer to this License and to
|
||||
the absence of any warranty; and distribute a copy of this License along with
|
||||
the Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you
|
||||
may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion of it,
|
||||
thus forming a work based on the Library, and copy and distribute such modifications
|
||||
or work under the terms of Section 1 above, provided that you also meet all
|
||||
of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices stating that
|
||||
you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no charge to all
|
||||
third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a table of
|
||||
data to be supplied by an application program that uses the facility, other
|
||||
than as an argument passed when the facility is invoked, then you must make
|
||||
a good faith effort to ensure that, in the event an application does not supply
|
||||
such function or table, the facility still operates, and performs whatever
|
||||
part of its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has a purpose
|
||||
that is entirely well-defined independent of the application. Therefore, Subsection
|
||||
2d requires that any application-supplied function or table used by this function
|
||||
must be optional: if the application does not supply it, the square root function
|
||||
must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Library, and can be reasonably
|
||||
considered independent and separate works in themselves, then this License,
|
||||
and its terms, do not apply to those sections when you distribute them as
|
||||
separate works. But when you distribute the same sections as part of a whole
|
||||
which is a work based on the Library, the distribution of the whole must be
|
||||
on the terms of this License, whose permissions for other licensees extend
|
||||
to the entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest your
|
||||
rights to work written entirely by you; rather, the intent is to exercise
|
||||
the right to control the distribution of derivative or collective works based
|
||||
on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library with
|
||||
the Library (or with a work based on the Library) on a volume of a storage
|
||||
or distribution medium does not bring the other work under the scope of this
|
||||
License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public License
|
||||
instead of this License to a given copy of the Library. To do this, you must
|
||||
alter all the notices that refer to this License, so that they refer to the
|
||||
ordinary GNU General Public License, version 2, instead of to this License.
|
||||
(If a newer version than version 2 of the ordinary GNU General Public License
|
||||
has appeared, then you can specify that version instead if you wish.) Do not
|
||||
make any other change in these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for that copy,
|
||||
so the ordinary GNU General Public License applies to all subsequent copies
|
||||
and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of the Library
|
||||
into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or derivative of
|
||||
it, under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you accompany it with the complete corresponding
|
||||
machine-readable source code, which must be distributed under the terms of
|
||||
Sections 1 and 2 above on a medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy from a designated
|
||||
place, then offering equivalent access to copy the source code from the same
|
||||
place satisfies the requirement to distribute the source code, even though
|
||||
third parties are not compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the Library, but
|
||||
is designed to work with the Library by being compiled or linked with it,
|
||||
is called a "work that uses the Library". Such a work, in isolation, is not
|
||||
a derivative work of the Library, and therefore falls outside the scope of
|
||||
this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library creates an
|
||||
executable that is a derivative of the Library (because it contains portions
|
||||
of the Library), rather than a "work that uses the library". The executable
|
||||
is therefore covered by this License. Section 6 states terms for distribution
|
||||
of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file that
|
||||
is part of the Library, the object code for the work may be a derivative work
|
||||
of the Library even though the source code is not. Whether this is true is
|
||||
especially significant if the work can be linked without the Library, or if
|
||||
the work is itself a library. The threshold for this to be true is not precisely
|
||||
defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data structure layouts
|
||||
and accessors, and small macros and small inline functions (ten lines or less
|
||||
in length), then the use of the object file is unrestricted, regardless of
|
||||
whether it is legally a derivative work. (Executables containing this object
|
||||
code plus portions of the Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may distribute
|
||||
the object code for the work under the terms of Section 6. Any executables
|
||||
containing that work also fall under Section 6, whether or not they are linked
|
||||
directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or link a "work
|
||||
that uses the Library" with the Library to produce a work containing portions
|
||||
of the Library, and distribute that work under terms of your choice, provided
|
||||
that the terms permit modification of the work for the customer's own use
|
||||
and reverse engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
You must supply a copy of this License. If the work during execution displays
|
||||
copyright notices, you must include the copyright notice for the Library among
|
||||
them, as well as a reference directing the user to the copy of this License.
|
||||
Also, you must do one of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding machine-readable source
|
||||
code for the Library including whatever changes were used in the work (which
|
||||
must be distributed under Sections 1 and 2 above); and, if the work is an
|
||||
executable linked with the Library, with the complete machine-readable "work
|
||||
that uses the Library", as object code and/or source code, so that the user
|
||||
can modify the Library and then relink to produce a modified executable containing
|
||||
the modified Library. (It is understood that the user who changes the contents
|
||||
of definitions files in the Library will not necessarily be able to recompile
|
||||
the application to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the Library. A
|
||||
suitable mechanism is one that (1) uses at run time a copy of the library
|
||||
already present on the user's computer system, rather than copying library
|
||||
functions into the executable, and (2) will operate properly with a modified
|
||||
version of the library, if the user installs one, as long as the modified
|
||||
version is interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at least three years,
|
||||
to give the same user the materials specified in Subsection 6a, above, for
|
||||
a charge no more than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy from a designated
|
||||
place, offer equivalent access to copy the above specified materials from
|
||||
the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these materials or
|
||||
that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the Library" must
|
||||
include any data and utility programs needed for reproducing the executable
|
||||
from it. However, as a special exception, the materials to be distributed
|
||||
need not include anything that is normally distributed (in either source or
|
||||
binary form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component itself
|
||||
accompanies the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license restrictions of
|
||||
other proprietary libraries that do not normally accompany the operating system.
|
||||
Such a contradiction means you cannot use both them and the Library together
|
||||
in an executable that you distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the Library side-by-side
|
||||
in a single library together with other library facilities not covered by
|
||||
this License, and distribute such a combined library, provided that the separate
|
||||
distribution of the work based on the Library and of the other library facilities
|
||||
is otherwise permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the
|
||||
Library, uncombined with any other library facilities. This must be distributed
|
||||
under the terms of the Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact that part of
|
||||
it is a work based on the Library, and explaining where to find the accompanying
|
||||
uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute the Library
|
||||
except as expressly provided under this License. Any attempt otherwise to
|
||||
copy, modify, sublicense, link with, or distribute the Library is void, and
|
||||
will automatically terminate your rights under this License. However, parties
|
||||
who have received copies, or rights, from you under this License will not
|
||||
have their licenses terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute the
|
||||
Library or its derivative works. These actions are prohibited by law if you
|
||||
do not accept this License. Therefore, by modifying or distributing the Library
|
||||
(or any work based on the Library), you indicate your acceptance of this License
|
||||
to do so, and all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the Library),
|
||||
the recipient automatically receives a license from the original licensor
|
||||
to copy, distribute, link with or modify the Library subject to these terms
|
||||
and conditions. You may not impose any further restrictions on the recipients'
|
||||
exercise of the rights granted herein. You are not responsible for enforcing
|
||||
compliance by third parties with this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent infringement
|
||||
or for any other reason (not limited to patent issues), conditions are imposed
|
||||
on you (whether by court order, agreement or otherwise) that contradict the
|
||||
conditions of this License, they do not excuse you from the conditions of
|
||||
this License. If you cannot distribute so as to satisfy simultaneously your
|
||||
obligations under this License and any other pertinent obligations, then as
|
||||
a consequence you may not distribute the Library at all. For example, if a
|
||||
patent license would not permit royalty-free redistribution of the Library
|
||||
by all those who receive copies directly or indirectly through you, then the
|
||||
only way you could satisfy both it and this License would be to refrain entirely
|
||||
from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents
|
||||
or other property right claims or to contest validity of any such claims;
|
||||
this section has the sole purpose of protecting the integrity of the free
|
||||
software distribution system which is implemented by public license practices.
|
||||
Many people have made generous contributions to the wide range of software
|
||||
distributed through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing to
|
||||
distribute software through any other system and a licensee cannot impose
|
||||
that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a
|
||||
consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original copyright
|
||||
holder who places the Library under this License may add an explicit geographical
|
||||
distribution limitation excluding those countries, so that distribution is
|
||||
permitted only in or among countries not thus excluded. In such case, this
|
||||
License incorporates the limitation as if written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new versions of
|
||||
the Lesser General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to address
|
||||
new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library specifies
|
||||
a version number of this License which applies to it and "any later version",
|
||||
you have the option of following the terms and conditions either of that version
|
||||
or of any later version published by the Free Software Foundation. If the
|
||||
Library does not specify a license version number, you may choose any version
|
||||
ever published by the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free programs
|
||||
whose distribution conditions are incompatible with these, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free Software
|
||||
Foundation, write to the Free Software Foundation; we sometimes make exceptions
|
||||
for this. Our decision will be guided by the two goals of preserving the free
|
||||
status of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||
THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
|
||||
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
|
||||
OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||
THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
|
||||
OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
|
||||
OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
|
||||
OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
|
||||
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest possible
|
||||
use to the public, we recommend making it free software that everyone can
|
||||
redistribute and change. You can do so by permitting redistribution under
|
||||
these terms (or, alternatively, under the terms of the ordinary General Public
|
||||
License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is safest
|
||||
to attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the "copyright"
|
||||
line and a pointer to where the full notice is found.
|
||||
|
||||
< one line to give the library's name and an idea of what it does. >
|
||||
|
||||
Copyright (C) < year > < name of author >
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This library 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 Lesser General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this library; if not, write to the Free Software Foundation, Inc., 51
|
||||
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information
|
||||
on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the library, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in
|
||||
|
||||
the library `Frob' (a library for tweaking knobs) written
|
||||
|
||||
by James Random Hacker.
|
||||
|
||||
< signature of Ty Coon > , 1 April 1990
|
||||
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
@@ -0,0 +1,468 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts as the
|
||||
successor of the GNU Library Public License, version 2, hence the version
|
||||
number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to share
|
||||
and change it. By contrast, the GNU General Public Licenses are intended to
|
||||
guarantee your freedom to share and change free software--to make sure the
|
||||
software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some specially
|
||||
designated software packages--typically libraries--of the Free Software Foundation
|
||||
and other authors who decide to use it. You can use it too, but we suggest
|
||||
you first think carefully about whether this license or the ordinary General
|
||||
Public License is the better strategy to use in any particular case, based
|
||||
on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use, not price.
|
||||
Our General Public Licenses are designed to make sure that you have the freedom
|
||||
to distribute copies of free software (and charge for this service if you
|
||||
wish); that you receive source code or can get it if you want it; that you
|
||||
can change the software and use pieces of it in new free programs; and that
|
||||
you are informed that you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid distributors
|
||||
to deny you these rights or to ask you to surrender these rights. These restrictions
|
||||
translate to certain responsibilities for you if you distribute copies of
|
||||
the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis or for
|
||||
a fee, you must give the recipients all the rights that we gave you. You must
|
||||
make sure that they, too, receive or can get the source code. If you link
|
||||
other code with the library, you must provide complete object files to the
|
||||
recipients, so that they can relink them with the library after making changes
|
||||
to the library and recompiling it. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the library,
|
||||
and (2) we offer you this license, which gives you legal permission to copy,
|
||||
distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that there is no
|
||||
warranty for the free library. Also, if the library is modified by someone
|
||||
else and passed on, the recipients should know that what they have is not
|
||||
the original version, so that the original author's reputation will not be
|
||||
affected by problems that might be introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of any free
|
||||
program. We wish to make sure that a company cannot effectively restrict the
|
||||
users of a free program by obtaining a restrictive license from a patent holder.
|
||||
Therefore, we insist that any patent license obtained for a version of the
|
||||
library must be consistent with the full freedom of use specified in this
|
||||
license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary GNU
|
||||
General Public License. This license, the GNU Lesser General Public License,
|
||||
applies to certain designated libraries, and is quite different from the ordinary
|
||||
General Public License. We use this license for certain libraries in order
|
||||
to permit linking those libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using a shared
|
||||
library, the combination of the two is legally speaking a combined work, a
|
||||
derivative of the original library. The ordinary General Public License therefore
|
||||
permits such linking only if the entire combination fits its criteria of freedom.
|
||||
The Lesser General Public License permits more lax criteria for linking other
|
||||
code with the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it does Less
|
||||
to protect the user's freedom than the ordinary General Public License. It
|
||||
also provides other free software developers Less of an advantage over competing
|
||||
non-free programs. These disadvantages are the reason we use the ordinary
|
||||
General Public License for many libraries. However, the Lesser license provides
|
||||
advantages in certain special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to encourage the
|
||||
widest possible use of a certain library, so that it becomes a de-facto standard.
|
||||
To achieve this, non-free programs must be allowed to use the library. A more
|
||||
frequent case is that a free library does the same job as widely used non-free
|
||||
libraries. In this case, there is little to gain by limiting the free library
|
||||
to free software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free programs
|
||||
enables a greater number of people to use a large body of free software. For
|
||||
example, permission to use the GNU C Library in non-free programs enables
|
||||
many more people to use the whole GNU operating system, as well as its variant,
|
||||
the GNU/Linux operating system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the users'
|
||||
freedom, it does ensure that the user of a program that is linked with the
|
||||
Library has the freedom and the wherewithal to run that program using a modified
|
||||
version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow. Pay close attention to the difference between a "work based on the
|
||||
library" and a "work that uses the library". The former contains code derived
|
||||
from the library, whereas the latter must be combined with the library in
|
||||
order to run.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other program
|
||||
which contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Lesser General
|
||||
Public License (also called "this License"). Each licensee is addressed as
|
||||
"you".
|
||||
|
||||
A "library" means a collection of software functions and/or data prepared
|
||||
so as to be conveniently linked with application programs (which use some
|
||||
of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work which has
|
||||
been distributed under these terms. A "work based on the Library" means either
|
||||
the Library or any derivative work under copyright law: that is to say, a
|
||||
work containing the Library or a portion of it, either verbatim or with modifications
|
||||
and/or translated straightforwardly into another language. (Hereinafter, translation
|
||||
is included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for making modifications
|
||||
to it. For a library, complete source code means all the source code for all
|
||||
modules it contains, plus any associated interface definition files, plus
|
||||
the scripts used to control compilation and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not covered
|
||||
by this License; they are outside its scope. The act of running a program
|
||||
using the Library is not restricted, and output from such a program is covered
|
||||
only if its contents constitute a work based on the Library (independent of
|
||||
the use of the Library in a tool for writing it). Whether that is true depends
|
||||
on what the Library does and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's complete source
|
||||
code as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and disclaimer
|
||||
of warranty; keep intact all the notices that refer to this License and to
|
||||
the absence of any warranty; and distribute a copy of this License along with
|
||||
the Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you
|
||||
may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion of it,
|
||||
thus forming a work based on the Library, and copy and distribute such modifications
|
||||
or work under the terms of Section 1 above, provided that you also meet all
|
||||
of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices stating that
|
||||
you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no charge to all
|
||||
third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a table of
|
||||
data to be supplied by an application program that uses the facility, other
|
||||
than as an argument passed when the facility is invoked, then you must make
|
||||
a good faith effort to ensure that, in the event an application does not supply
|
||||
such function or table, the facility still operates, and performs whatever
|
||||
part of its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has a purpose
|
||||
that is entirely well-defined independent of the application. Therefore, Subsection
|
||||
2d requires that any application-supplied function or table used by this function
|
||||
must be optional: if the application does not supply it, the square root function
|
||||
must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Library, and can be reasonably
|
||||
considered independent and separate works in themselves, then this License,
|
||||
and its terms, do not apply to those sections when you distribute them as
|
||||
separate works. But when you distribute the same sections as part of a whole
|
||||
which is a work based on the Library, the distribution of the whole must be
|
||||
on the terms of this License, whose permissions for other licensees extend
|
||||
to the entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest your
|
||||
rights to work written entirely by you; rather, the intent is to exercise
|
||||
the right to control the distribution of derivative or collective works based
|
||||
on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library with
|
||||
the Library (or with a work based on the Library) on a volume of a storage
|
||||
or distribution medium does not bring the other work under the scope of this
|
||||
License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public License
|
||||
instead of this License to a given copy of the Library. To do this, you must
|
||||
alter all the notices that refer to this License, so that they refer to the
|
||||
ordinary GNU General Public License, version 2, instead of to this License.
|
||||
(If a newer version than version 2 of the ordinary GNU General Public License
|
||||
has appeared, then you can specify that version instead if you wish.) Do not
|
||||
make any other change in these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for that copy,
|
||||
so the ordinary GNU General Public License applies to all subsequent copies
|
||||
and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of the Library
|
||||
into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or derivative of
|
||||
it, under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you accompany it with the complete corresponding
|
||||
machine-readable source code, which must be distributed under the terms of
|
||||
Sections 1 and 2 above on a medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy from a designated
|
||||
place, then offering equivalent access to copy the source code from the same
|
||||
place satisfies the requirement to distribute the source code, even though
|
||||
third parties are not compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the Library, but
|
||||
is designed to work with the Library by being compiled or linked with it,
|
||||
is called a "work that uses the Library". Such a work, in isolation, is not
|
||||
a derivative work of the Library, and therefore falls outside the scope of
|
||||
this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library creates an
|
||||
executable that is a derivative of the Library (because it contains portions
|
||||
of the Library), rather than a "work that uses the library". The executable
|
||||
is therefore covered by this License. Section 6 states terms for distribution
|
||||
of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file that
|
||||
is part of the Library, the object code for the work may be a derivative work
|
||||
of the Library even though the source code is not. Whether this is true is
|
||||
especially significant if the work can be linked without the Library, or if
|
||||
the work is itself a library. The threshold for this to be true is not precisely
|
||||
defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data structure layouts
|
||||
and accessors, and small macros and small inline functions (ten lines or less
|
||||
in length), then the use of the object file is unrestricted, regardless of
|
||||
whether it is legally a derivative work. (Executables containing this object
|
||||
code plus portions of the Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may distribute
|
||||
the object code for the work under the terms of Section 6. Any executables
|
||||
containing that work also fall under Section 6, whether or not they are linked
|
||||
directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or link a "work
|
||||
that uses the Library" with the Library to produce a work containing portions
|
||||
of the Library, and distribute that work under terms of your choice, provided
|
||||
that the terms permit modification of the work for the customer's own use
|
||||
and reverse engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
You must supply a copy of this License. If the work during execution displays
|
||||
copyright notices, you must include the copyright notice for the Library among
|
||||
them, as well as a reference directing the user to the copy of this License.
|
||||
Also, you must do one of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding machine-readable source
|
||||
code for the Library including whatever changes were used in the work (which
|
||||
must be distributed under Sections 1 and 2 above); and, if the work is an
|
||||
executable linked with the Library, with the complete machine-readable "work
|
||||
that uses the Library", as object code and/or source code, so that the user
|
||||
can modify the Library and then relink to produce a modified executable containing
|
||||
the modified Library. (It is understood that the user who changes the contents
|
||||
of definitions files in the Library will not necessarily be able to recompile
|
||||
the application to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the Library. A
|
||||
suitable mechanism is one that (1) uses at run time a copy of the library
|
||||
already present on the user's computer system, rather than copying library
|
||||
functions into the executable, and (2) will operate properly with a modified
|
||||
version of the library, if the user installs one, as long as the modified
|
||||
version is interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at least three years,
|
||||
to give the same user the materials specified in Subsection 6a, above, for
|
||||
a charge no more than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy from a designated
|
||||
place, offer equivalent access to copy the above specified materials from
|
||||
the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these materials or
|
||||
that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the Library" must
|
||||
include any data and utility programs needed for reproducing the executable
|
||||
from it. However, as a special exception, the materials to be distributed
|
||||
need not include anything that is normally distributed (in either source or
|
||||
binary form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component itself
|
||||
accompanies the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license restrictions of
|
||||
other proprietary libraries that do not normally accompany the operating system.
|
||||
Such a contradiction means you cannot use both them and the Library together
|
||||
in an executable that you distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the Library side-by-side
|
||||
in a single library together with other library facilities not covered by
|
||||
this License, and distribute such a combined library, provided that the separate
|
||||
distribution of the work based on the Library and of the other library facilities
|
||||
is otherwise permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the
|
||||
Library, uncombined with any other library facilities. This must be distributed
|
||||
under the terms of the Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact that part of
|
||||
it is a work based on the Library, and explaining where to find the accompanying
|
||||
uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute the Library
|
||||
except as expressly provided under this License. Any attempt otherwise to
|
||||
copy, modify, sublicense, link with, or distribute the Library is void, and
|
||||
will automatically terminate your rights under this License. However, parties
|
||||
who have received copies, or rights, from you under this License will not
|
||||
have their licenses terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute the
|
||||
Library or its derivative works. These actions are prohibited by law if you
|
||||
do not accept this License. Therefore, by modifying or distributing the Library
|
||||
(or any work based on the Library), you indicate your acceptance of this License
|
||||
to do so, and all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the Library),
|
||||
the recipient automatically receives a license from the original licensor
|
||||
to copy, distribute, link with or modify the Library subject to these terms
|
||||
and conditions. You may not impose any further restrictions on the recipients'
|
||||
exercise of the rights granted herein. You are not responsible for enforcing
|
||||
compliance by third parties with this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent infringement
|
||||
or for any other reason (not limited to patent issues), conditions are imposed
|
||||
on you (whether by court order, agreement or otherwise) that contradict the
|
||||
conditions of this License, they do not excuse you from the conditions of
|
||||
this License. If you cannot distribute so as to satisfy simultaneously your
|
||||
obligations under this License and any other pertinent obligations, then as
|
||||
a consequence you may not distribute the Library at all. For example, if a
|
||||
patent license would not permit royalty-free redistribution of the Library
|
||||
by all those who receive copies directly or indirectly through you, then the
|
||||
only way you could satisfy both it and this License would be to refrain entirely
|
||||
from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents
|
||||
or other property right claims or to contest validity of any such claims;
|
||||
this section has the sole purpose of protecting the integrity of the free
|
||||
software distribution system which is implemented by public license practices.
|
||||
Many people have made generous contributions to the wide range of software
|
||||
distributed through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing to
|
||||
distribute software through any other system and a licensee cannot impose
|
||||
that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a
|
||||
consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original copyright
|
||||
holder who places the Library under this License may add an explicit geographical
|
||||
distribution limitation excluding those countries, so that distribution is
|
||||
permitted only in or among countries not thus excluded. In such case, this
|
||||
License incorporates the limitation as if written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new versions of
|
||||
the Lesser General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to address
|
||||
new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library specifies
|
||||
a version number of this License which applies to it and "any later version",
|
||||
you have the option of following the terms and conditions either of that version
|
||||
or of any later version published by the Free Software Foundation. If the
|
||||
Library does not specify a license version number, you may choose any version
|
||||
ever published by the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free programs
|
||||
whose distribution conditions are incompatible with these, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free Software
|
||||
Foundation, write to the Free Software Foundation; we sometimes make exceptions
|
||||
for this. Our decision will be guided by the two goals of preserving the free
|
||||
status of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||
THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
|
||||
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
|
||||
OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
|
||||
THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
|
||||
OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
|
||||
OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
|
||||
OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
|
||||
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest possible
|
||||
use to the public, we recommend making it free software that everyone can
|
||||
redistribute and change. You can do so by permitting redistribution under
|
||||
these terms (or, alternatively, under the terms of the ordinary General Public
|
||||
License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is safest
|
||||
to attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the "copyright"
|
||||
line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and an idea of what it does.>
|
||||
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the Free
|
||||
Software Foundation; either version 2.1 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This library 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 Lesser General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License along
|
||||
with this library; if not, write to the Free Software Foundation, Inc., 51
|
||||
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the library, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in
|
||||
|
||||
the library `Frob' (a library for tweaking knobs) written
|
||||
|
||||
by James Random Hacker.
|
||||
|
||||
< signature of Ty Coon > , 1 April 1990
|
||||
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
@@ -0,0 +1,163 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates the terms
|
||||
and conditions of version 3 of the GNU General Public License, supplemented
|
||||
by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser General
|
||||
Public License, and the "GNU GPL" refers to version 3 of the GNU General Public
|
||||
License.
|
||||
|
||||
|
||||
|
||||
"The Library" refers to a covered work governed by this License, other than
|
||||
an Application or a Combined Work as defined below.
|
||||
|
||||
|
||||
|
||||
An "Application" is any work that makes use of an interface provided by the
|
||||
Library, but which is not otherwise based on the Library. Defining a subclass
|
||||
of a class defined by the Library is deemed a mode of using an interface provided
|
||||
by the Library.
|
||||
|
||||
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an Application
|
||||
with the Library. The particular version of the Library with which the Combined
|
||||
Work was made is also called the "Linked Version".
|
||||
|
||||
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the Corresponding
|
||||
Source for the Combined Work, excluding any source code for portions of the
|
||||
Combined Work that, considered in isolation, are based on the Application,
|
||||
and not on the Linked Version.
|
||||
|
||||
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the object
|
||||
code and/or source code for the Application, including any data and utility
|
||||
programs needed for reproducing the Combined Work from the Application, but
|
||||
excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License without
|
||||
being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a facility
|
||||
refers to a function or data to be supplied by an Application that uses the
|
||||
facility (other than as an argument passed when the facility is invoked),
|
||||
then you may convey a copy of the modified version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to ensure
|
||||
that, in the event an Application does not supply the function or data, the
|
||||
facility still operates, and performs whatever part of its purpose remains
|
||||
meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of this License
|
||||
applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from a header
|
||||
file that is part of the Library. You may convey such object code under terms
|
||||
of your choice, provided that, if the incorporated material is not limited
|
||||
to numerical parameters, data structure layouts and accessors, or small macros,
|
||||
inline functions and templates (ten or fewer lines in length), you do both
|
||||
of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that, taken together,
|
||||
effectively do not restrict modification of the portions of the Library contained
|
||||
in the Combined Work and reverse engineering for debugging such modifications,
|
||||
if you also do each of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during execution, include
|
||||
the copyright notice for the Library among these notices, as well as a reference
|
||||
directing the user to the copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this License,
|
||||
and the Corresponding Application Code in a form suitable for, and under terms
|
||||
that permit, the user to recombine or relink the Application with a modified
|
||||
version of the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the Library. A
|
||||
suitable mechanism is one that (a) uses at run time a copy of the Library
|
||||
already present on the user's computer system, and (b) will operate properly
|
||||
with a modified version of the Library that is interface-compatible with the
|
||||
Linked Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise be required
|
||||
to provide such information under section 6 of the GNU GPL, and only to the
|
||||
extent that such information is necessary to install and execute a modified
|
||||
version of the Combined Work produced by recombining or relinking the Application
|
||||
with a modified version of the Linked Version. (If you use option 4d0, the
|
||||
Installation Information must accompany the Minimal Corresponding Source and
|
||||
Corresponding Application Code. If you use option 4d1, you must provide the
|
||||
Installation Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the Library side
|
||||
by side in a single library together with other library facilities that are
|
||||
not Applications and are not covered by this License, and convey such a combined
|
||||
library under terms of your choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the
|
||||
Library, uncombined with any other library facilities, conveyed under the
|
||||
terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it is a work
|
||||
based on the Library, and explaining where to find the accompanying uncombined
|
||||
form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of the
|
||||
GNU Lesser General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to address
|
||||
new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library as you
|
||||
received it specifies that a certain numbered version of the GNU Lesser General
|
||||
Public License "or any later version" applies to it, you have the option of
|
||||
following the terms and conditions either of that published version or of
|
||||
any later version published by the Free Software Foundation. If the Library
|
||||
as you received it does not specify a version number of the GNU Lesser General
|
||||
Public License, you may choose any version of the GNU Lesser General Public
|
||||
License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide whether
|
||||
future versions of the GNU Lesser General Public License shall apply, that
|
||||
proxy's public statement of acceptance of any version is permanent authorization
|
||||
for you to choose that version for the Library.
|
||||
@@ -0,0 +1,12 @@
|
||||
This library 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 3 of
|
||||
the license or (at your option) at any later version that is
|
||||
accepted by the membership of KDE e.V. (or its successor
|
||||
approved by the membership of KDE e.V.), which shall act as a
|
||||
proxy as defined in Section 14 of version 3 of the license.
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,12 @@
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the license or (at your option) any later version
|
||||
that is accepted by the membership of KDE e.V. (or its successor
|
||||
approved by the membership of KDE e.V.), which shall act as a
|
||||
proxy as defined in Section 6 of version 3 of the license.
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,7 @@
|
||||
Commercial License Usage
|
||||
Licensees holding valid commercial Qt licenses may use this file in
|
||||
accordance with the commercial license agreement provided with the
|
||||
Software or, alternatively, in accordance with the terms contained in
|
||||
a written agreement between you and The Qt Company. For licensing terms
|
||||
and conditions see https://www.qt.io/terms-conditions. For further
|
||||
information use the contact form at https://www.qt.io/contact-us.
|
||||
@@ -0,0 +1,21 @@
|
||||
The Qt Company Qt LGPL Exception version 1.1
|
||||
|
||||
As an additional permission to the GNU Lesser General Public License version 2.1, the object code form of a "work that uses the Library" may incorporate material from a header file that is part of the Library. You may distribute such object code under terms of your choice, provided that:
|
||||
|
||||
(i) the header files of the Library have not been modified; and
|
||||
|
||||
(ii) the incorporated material is limited to numerical parameters, data structure layouts, accessors, macros, inline functions and templates; and
|
||||
|
||||
(iii) you comply with the terms of Section 6 of the GNU Lesser General Public License version 2.1.
|
||||
|
||||
Moreover, you may apply this exception to a modified version of the Library, provided that such modification does not involve copying material from the Library into the modified Library's header files unless such material is limited to
|
||||
|
||||
(i) numerical parameters;
|
||||
|
||||
(ii) data structure layouts;
|
||||
|
||||
(iii) accessors; and
|
||||
|
||||
(iv) small macros, templates and inline functions of five lines or less in length.
|
||||
|
||||
Furthermore, you are not required to apply this additional permission to a modified version of the Library.
|
||||
@@ -0,0 +1,67 @@
|
||||
/** @mainpage KSvg framework
|
||||
|
||||
\section Introduction
|
||||
|
||||
The KSvg framework introduces a series of apis to render SVG based graphics both with a QPainter-based api and and accelerated QtQuick component set.
|
||||
|
||||
The <a href="https://doc.qt.io/qt-5/qtquick-index.html">Qt Quick
|
||||
framework</a> and set of <a href="https://api.kde.org/frameworks">KDE Frameworks</a>
|
||||
provide the underpinning for KSvg framework. As a result, it should
|
||||
work anywhere that Qt does.
|
||||
|
||||
Important classes are:
|
||||
|
||||
- KSvg::Svg and KSvg::FrameSvg: provides themable, cached SVGs
|
||||
|
||||
\subsection types All Types
|
||||
- \link KSvg::Svg Svg \endlink
|
||||
- \link KSvg::SvgItem SvgItem \endlink
|
||||
- \link KSvg::FrameSvg FrameSvg \endlink
|
||||
- \link KSvg::FrameSvgItem FrameSvgItem \endlink
|
||||
- \link KSvg::FrameSvgItemMargins FrameSvgItemMargins \endlink
|
||||
- \link KSvg::ImageSet ImageSet \endlink
|
||||
- \link ImageTexturesCache ImageTexturesCache \endlink
|
||||
|
||||
@authors
|
||||
Aaron Seigo \<aseigo@kde.org\><br>
|
||||
Alessandro Diaferia \<alediaferia@gmail.com\><br>
|
||||
Alex Merry \<kde@randomguy3.me.uk\><br>
|
||||
Alexander Wiedenbruch \<wirr01@gmail.com\><br>
|
||||
Alexis Ménard \<darktears31@gmail.com\><br>
|
||||
André Duffeck \<andre@duffeck.de\><br>
|
||||
Andrew Lake \<jamboarder@yahoo.com\><br>
|
||||
Artur de Souza \<asouza@kde.org\><br>
|
||||
Bertjan Broeksema \<b.broeksema@kdemail.net\><br>
|
||||
Chani Armitage \<chanika@gmail.com\><br>
|
||||
Davide Bettio \<davide.bettio@kdemail.net\><br>
|
||||
Dan Meltzer \<hydrogen@notyetimplemented.com\><br>
|
||||
Fredrik Höglund \<fredrik@kde.org\><br>
|
||||
Ivan Cukic \<ivan.cukic+kde@gmail.com\><br>
|
||||
John Tapsell \<tapsell@kde.org\><br>
|
||||
Jordi Polo \<mumismo@gmail.com\><br>
|
||||
Kevin Ottens \<ervin@kde.org\><br>
|
||||
Montel Laurent \<montel@kde.org\><br>
|
||||
Marco Martin \<notmart@gmail.com\><br>
|
||||
Matt Broadstone \<mbroadst@gmail.com\><br>
|
||||
Petri Damsten \<damu@iki.fi\><br>
|
||||
Rafael Fernández López \<ereslibre@kde.org\><br>
|
||||
Riccardo Iaconelli \<riccardo@kde.org\><br>
|
||||
Richard J. Moore \<rich@kde.org\><br>
|
||||
Rob Scheepmaker \<r.scheepmaker@student.utwente.nl\><br>
|
||||
Robert Knight \<robertknight@gmail.com\><br>
|
||||
Sebastian Kuegler \<sebas@kde.org\><br>
|
||||
Siraj Razick \<siraj@kde.net\><br>
|
||||
Zack Rusin \<zack@kde.org\>
|
||||
|
||||
@maintainers
|
||||
Marco Martin \<notmart@gmail.com\>
|
||||
|
||||
@licenses
|
||||
@lgpl
|
||||
|
||||
*/
|
||||
|
||||
// DOXYGEN_SET_PROJECT_NAME = KSvg
|
||||
// DOXYGEN_SET_RECURSIVE = YES
|
||||
// DOXYGEN_EXCLUDE_PATTERNS = *_p.h */private/* */tests/*
|
||||
// vim:ts=4:sw=4:expandtab:filetype=doxygen
|
||||
@@ -0,0 +1,43 @@
|
||||
# KSvg
|
||||
A library for rendering SVG-based themes with stylesheet re-coloring and on-disk caching.
|
||||
|
||||
## Introduction
|
||||
KSvg provides both C++ classes and QtQuick components to render svgs based on image packs.
|
||||
Compared to plain QSvg, it caches the rendered images on disk with KImageCache, and can re-color
|
||||
properly crafted svg shapes that include internal stylesheets.
|
||||
|
||||
The default behavior is to re-color with the application palette, making it possible to create UI elements in SVG.
|
||||
|
||||
## C++
|
||||
In C++ there are 3 main classes, usable also in QWidget applications with a QPainter-compatible API:
|
||||
|
||||
* ``ImageSet``: Used to tell the other classes where to find the SVG files: by default, SVG "themes"
|
||||
will be searched in the application data dir (share/application_name/theme_name)
|
||||
* ``Svg``: Class to used to render Svg files: it loads a file with ``setImagePath`` using relative paths
|
||||
to the theme specified in ``ImageSet``
|
||||
* ``FrameSvg``: A subclass of Svg used to render 9-patch images, such as Buttons, where you want to stretch
|
||||
only the central area but not the edges
|
||||
|
||||
## QML
|
||||
Import QML bindings with ``import org.kde.ksvg 1.0 as KSvg``.
|
||||
|
||||
ImageSet is exported directly to QML which makes it possible to set the theme from QML.
|
||||
|
||||
Svg and FrameSvg have corresponding items, ``SvgItem`` and ``FrameSvgItem``, which inherit from QQuickItem
|
||||
and will paint their associated ``Svg`` or ``FrameSvg`` stretched to their full geometry.
|
||||
|
||||
QML code example:
|
||||
|
||||
```
|
||||
FrameSvgItem {
|
||||
// This resolves to a file like /usr/share/myapp/mytheme/widgets/button.svgz
|
||||
imagePath: "widgets/button"
|
||||
prefix: "pressed"
|
||||
}
|
||||
```
|
||||
|
||||
## More documentation
|
||||
Assume the theme filesystem hierarchy used by the Plasma shell, but the general concepts apply everywhere:
|
||||
|
||||
* https://develop.kde.org/docs/plasma/theme/theme-elements/
|
||||
* https://develop.kde.org/docs/plasma/theme/quickstart/
|
||||
@@ -0,0 +1,29 @@
|
||||
find_package(Qt6Test ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE)
|
||||
set_package_properties(Qt6Test PROPERTIES PURPOSE "Required for tests")
|
||||
|
||||
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
|
||||
remove_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_STRICT_ITERATORS -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_KEYWORDS)
|
||||
|
||||
include(ECMMarkAsTest)
|
||||
include(ECMAddTests)
|
||||
|
||||
MACRO(KSVG_UNIT_TESTS)
|
||||
FOREACH(_testname ${ARGN})
|
||||
set(libs Qt6::Qml Qt6::Test KF6::Svg
|
||||
KF6::Archive KF6::CoreAddons KF6::ConfigGui)
|
||||
if(QT_QTOPENGL_FOUND)
|
||||
list(APPEND libs Qt6::OpenGL)
|
||||
endif()
|
||||
ecm_add_test(${_testname}.cpp
|
||||
LINK_LIBRARIES ${libs}
|
||||
NAME_PREFIX "plasmasvg-")
|
||||
qt_add_resources(${_testname} "images"
|
||||
FILES "data/background.svgz")
|
||||
target_include_directories(${_testname} PRIVATE )
|
||||
ENDFOREACH(_testname)
|
||||
ENDMACRO(KSVG_UNIT_TESTS)
|
||||
|
||||
KSVG_UNIT_TESTS(
|
||||
framesvgtest
|
||||
)
|
||||
|
||||
Binary file not shown.
+19
@@ -0,0 +1,19 @@
|
||||
[Desktop Entry]
|
||||
Name=Plasma test theme
|
||||
|
||||
|
||||
X-KDE-PluginInfo-Author=KDE Visual Design Group
|
||||
X-KDE-PluginInfo-Email=kde-artists@kde.org
|
||||
X-KDE-PluginInfo-Name=default
|
||||
X-KDE-PluginInfo-Version=5.20
|
||||
X-KDE-PluginInfo-Website=https://plasma.kde.org
|
||||
X-KDE-PluginInfo-Category=
|
||||
X-KDE-PluginInfo-License=LGPL
|
||||
X-KDE-PluginInfo-EnabledByDefault=true
|
||||
X-Plasma-API=5.0
|
||||
|
||||
[ContrastEffect]
|
||||
enabled=true
|
||||
contrast=0.23
|
||||
intensity=2.0
|
||||
saturation=1.7
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
[ColorEffects:Disabled]
|
||||
Color=56,56,56
|
||||
ColorAmount=0
|
||||
ColorEffect=0
|
||||
ContrastAmount=0.65
|
||||
ContrastEffect=1
|
||||
IntensityAmount=0.1
|
||||
IntensityEffect=2
|
||||
|
||||
[ColorEffects:Inactive]
|
||||
ChangeSelectionColor=true
|
||||
Color=112,111,110
|
||||
ColorAmount=0.025
|
||||
ColorEffect=2
|
||||
ContrastAmount=0.1
|
||||
ContrastEffect=2
|
||||
Enable=false
|
||||
IntensityAmount=0
|
||||
IntensityEffect=0
|
||||
|
||||
[Colors:Button]
|
||||
BackgroundAlternate=224,223,222
|
||||
BackgroundNormal=239,240,241
|
||||
DecorationFocus=30,146,255
|
||||
DecorationHover=61,174,230
|
||||
ForegroundActive=246,116,0
|
||||
ForegroundInactive=175,176,179
|
||||
ForegroundLink=61,174,230
|
||||
ForegroundNegative=237,21,22
|
||||
ForegroundNeutral=201,206,60
|
||||
ForegroundNormal=49,54,59
|
||||
ForegroundPositive=17,209,23
|
||||
ForegroundVisited=61,174,230
|
||||
|
||||
[Colors:Selection]
|
||||
BackgroundAlternate=48,138,183
|
||||
BackgroundNormal=61,174,230
|
||||
DecorationFocus=30,146,255
|
||||
DecorationHover=61,174,230
|
||||
ForegroundActive=246,116,0
|
||||
ForegroundInactive=146,204,230
|
||||
ForegroundLink=252,252,252
|
||||
ForegroundNegative=237,21,21
|
||||
ForegroundNeutral=201,206,59
|
||||
ForegroundNormal=252,252,252
|
||||
ForegroundPositive=17,209,22
|
||||
ForegroundVisited=252,252,252
|
||||
|
||||
[Colors:Tooltip]
|
||||
BackgroundAlternate=196,224,255
|
||||
BackgroundNormal=239,240,241
|
||||
DecorationFocus=30,146,255
|
||||
DecorationHover=61,174,230
|
||||
ForegroundActive=246,116,0
|
||||
ForegroundInactive=175,176,179
|
||||
ForegroundLink=61,174,230
|
||||
ForegroundNegative=237,21,21
|
||||
ForegroundNeutral=201,206,59
|
||||
ForegroundNormal=49,54,59
|
||||
ForegroundPositive=17,209,22
|
||||
ForegroundVisited=61,174,230
|
||||
|
||||
[Colors:View]
|
||||
BackgroundAlternate=248,247,246
|
||||
BackgroundNormal=252,252,252
|
||||
DecorationFocus=30,146,255
|
||||
DecorationHover=61,174,230
|
||||
ForegroundActive=246,116,0
|
||||
ForegroundInactive=175,176,179
|
||||
ForegroundLink=61,174,230
|
||||
ForegroundNegative=237,21,23
|
||||
ForegroundNeutral=201,206,61
|
||||
ForegroundNormal=49,54,59
|
||||
ForegroundPositive=17,209,24
|
||||
ForegroundVisited=61,174,230
|
||||
|
||||
[Colors:Window]
|
||||
BackgroundAlternate=218,217,216
|
||||
BackgroundNormal=239,240,241
|
||||
DecorationFocus=30,146,255
|
||||
DecorationHover=61,174,230
|
||||
ForegroundActive=246,116,0
|
||||
ForegroundInactive=175,176,179
|
||||
ForegroundLink=61,174,230
|
||||
ForegroundNegative=237,21,21
|
||||
ForegroundNeutral=201,206,59
|
||||
#A very glaring red to check those colors are actually applied
|
||||
ForegroundNormal=255,54,59
|
||||
ForegroundPositive=17,209,22
|
||||
ForegroundVisited=61,174,230
|
||||
|
||||
[Colors:Complementary]
|
||||
BackgroundAlternate=59,64,69
|
||||
BackgroundNormal=49,54,59
|
||||
DecorationFocus=40,146,255
|
||||
DecorationHover=71,174,230
|
||||
ForegroundActive=246,116,20
|
||||
ForegroundInactive=185,176,179
|
||||
ForegroundLink=71,174,230
|
||||
ForegroundNegative=237,21,24
|
||||
ForegroundNeutral=201,206,62
|
||||
ForegroundNormal=239,240,241
|
||||
ForegroundPositive=17,209,25
|
||||
ForegroundVisited=71,174,230
|
||||
|
||||
[General]
|
||||
ColorScheme=Breeze
|
||||
Name=Breeze
|
||||
shadeSortColumn=true
|
||||
|
||||
[KDE]
|
||||
contrast=7
|
||||
|
||||
[WM]
|
||||
activeBackground=61,174,230
|
||||
activeBlend=252,252,252
|
||||
activeForeground=252,252,252
|
||||
inactiveBackground=123,124,126
|
||||
inactiveBlend=123,124,126
|
||||
inactiveForeground=252,252,252
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"KPlugin": {
|
||||
"Authors": [
|
||||
{
|
||||
"Email": "kde-artists@kde.org",
|
||||
"Name": "KDE Visual Design Group"
|
||||
}
|
||||
],
|
||||
"Category": "",
|
||||
"EnabledByDefault": true,
|
||||
"Id": "default",
|
||||
"License": "LGPL",
|
||||
"Name": "Plasma test theme",
|
||||
"Version": "5.20",
|
||||
"Website": "https://plasma.kde.org"
|
||||
},
|
||||
"X-Plasma-API": "5.0"
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
[ContrastEffect]
|
||||
enabled=true
|
||||
contrast=0.23
|
||||
intensity=2.0
|
||||
saturation=1.7
|
||||
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "framesvgtest.h"
|
||||
#include <QDirIterator>
|
||||
#include <QStandardPaths>
|
||||
|
||||
void copyDirectory(const QString &srcDir, const QString &dstDir)
|
||||
{
|
||||
QDir targetDir(dstDir);
|
||||
QDirIterator it(srcDir, QDir::Filters(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Name), QDirIterator::Subdirectories);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
QString path = it.filePath();
|
||||
QString relDestPath = path.last(it.filePath().length() - srcDir.length() - 1);
|
||||
if (it.fileInfo().isDir()) {
|
||||
QVERIFY(targetDir.mkpath(relDestPath));
|
||||
} else {
|
||||
QVERIFY(QFile::copy(path, dstDir % '/' % relDestPath));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FrameSvgTest::initTestCase()
|
||||
{
|
||||
QStandardPaths::setTestModeEnabled(true);
|
||||
|
||||
m_themeDir = QDir(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) % '/' % "plasma");
|
||||
m_themeDir.removeRecursively();
|
||||
|
||||
copyDirectory(QFINDTESTDATA("data/plasma"), m_themeDir.absolutePath());
|
||||
|
||||
m_cacheDir = QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation));
|
||||
m_cacheDir.removeRecursively();
|
||||
|
||||
m_frameSvg = new KSvg::FrameSvg;
|
||||
m_frameSvg->setImagePath(QFINDTESTDATA("data/background.svgz"));
|
||||
QVERIFY(m_frameSvg->isValid());
|
||||
}
|
||||
|
||||
void FrameSvgTest::cleanupTestCase()
|
||||
{
|
||||
delete m_frameSvg;
|
||||
|
||||
m_themeDir.removeRecursively();
|
||||
m_cacheDir.removeRecursively();
|
||||
}
|
||||
|
||||
void FrameSvgTest::margins()
|
||||
{
|
||||
QCOMPARE(m_frameSvg->marginSize(KSvg::FrameSvg::LeftMargin), (qreal)26);
|
||||
QCOMPARE(m_frameSvg->marginSize(KSvg::FrameSvg::TopMargin), (qreal)26);
|
||||
QCOMPARE(m_frameSvg->marginSize(KSvg::FrameSvg::RightMargin), (qreal)26);
|
||||
QCOMPARE(m_frameSvg->marginSize(KSvg::FrameSvg::BottomMargin), (qreal)26);
|
||||
}
|
||||
|
||||
void FrameSvgTest::contentsRect()
|
||||
{
|
||||
m_frameSvg->resizeFrame(QSize(100, 100));
|
||||
QCOMPARE(m_frameSvg->contentsRect(), QRectF(26, 26, 48, 48));
|
||||
}
|
||||
|
||||
void FrameSvgTest::repaintBlocked()
|
||||
{
|
||||
// check the properties to be correct even if set during a repaint blocked transaction
|
||||
m_frameSvg->setRepaintBlocked(true);
|
||||
QVERIFY(m_frameSvg->isRepaintBlocked());
|
||||
|
||||
m_frameSvg->setElementPrefix("prefix");
|
||||
m_frameSvg->setEnabledBorders(KSvg::FrameSvg::TopBorder | KSvg::FrameSvg::LeftBorder);
|
||||
m_frameSvg->resizeFrame(QSizeF(100, 100));
|
||||
|
||||
m_frameSvg->setRepaintBlocked(false);
|
||||
|
||||
QCOMPARE(m_frameSvg->prefix(), QString("prefix"));
|
||||
QCOMPARE(m_frameSvg->enabledBorders(), KSvg::FrameSvg::TopBorder | KSvg::FrameSvg::LeftBorder);
|
||||
QCOMPARE(m_frameSvg->frameSize(), QSizeF(100, 100));
|
||||
}
|
||||
|
||||
void FrameSvgTest::setImageSet()
|
||||
{
|
||||
// Should not crash
|
||||
|
||||
KSvg::FrameSvg *frameSvg = new KSvg::FrameSvg;
|
||||
frameSvg->setImagePath("widgets/background");
|
||||
frameSvg->setImageSet(new KSvg::ImageSet("breeze-light", {}, this));
|
||||
frameSvg->framePixmap();
|
||||
frameSvg->setImageSet(new KSvg::ImageSet("breeze-dark", {}, this));
|
||||
frameSvg->framePixmap();
|
||||
delete frameSvg;
|
||||
|
||||
frameSvg = new KSvg::FrameSvg;
|
||||
frameSvg->setImagePath("widgets/background");
|
||||
frameSvg->setImageSet(new KSvg::ImageSet("breeze-light", {}, this));
|
||||
frameSvg->framePixmap();
|
||||
frameSvg->setImageSet(new KSvg::ImageSet("breeze-dark", {}, this));
|
||||
frameSvg->framePixmap();
|
||||
|
||||
frameSvg->setImageSet(new KSvg::ImageSet("testtheme", "plasma/desktoptheme", this));
|
||||
QCOMPARE(frameSvg->color(KSvg::Svg::Text), QColor(255, 54, 59));
|
||||
|
||||
delete frameSvg;
|
||||
}
|
||||
|
||||
void FrameSvgTest::resizeMask()
|
||||
{
|
||||
m_frameSvg->resizeFrame(QSize(100, 100));
|
||||
QCOMPARE(m_frameSvg->alphaMask().size(), QSize(100, 100));
|
||||
m_frameSvg->resizeFrame(QSize(50, 50));
|
||||
QCOMPARE(m_frameSvg->alphaMask().size(), QSize(50, 50));
|
||||
m_frameSvg->resizeFrame(QSize(100, 100));
|
||||
QCOMPARE(m_frameSvg->alphaMask().size(), QSize(100, 100));
|
||||
}
|
||||
|
||||
void FrameSvgTest::loadQrc()
|
||||
{
|
||||
KSvg::FrameSvg *frameSvg = new KSvg::FrameSvg;
|
||||
frameSvg->setImageSet(new KSvg::ImageSet("testtheme", "plasma/desktoptheme", this));
|
||||
frameSvg->setImagePath(QStringLiteral("qrc:/data/background.svgz"));
|
||||
QVERIFY(frameSvg->isValid());
|
||||
// An external image is colored as well
|
||||
QCOMPARE(frameSvg->color(KSvg::Svg::Text), QColor(255, 54, 59));
|
||||
delete frameSvg;
|
||||
}
|
||||
|
||||
QTEST_MAIN(FrameSvgTest)
|
||||
|
||||
#include "moc_framesvgtest.cpp"
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
#ifndef FRAMESVGTEST_H
|
||||
#define FRAMESVGTEST_H
|
||||
|
||||
#include <QTest>
|
||||
|
||||
#include "ksvg/framesvg.h"
|
||||
|
||||
class FrameSvgTest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public Q_SLOTS:
|
||||
void initTestCase();
|
||||
void cleanupTestCase();
|
||||
|
||||
private Q_SLOTS:
|
||||
void margins();
|
||||
void contentsRect();
|
||||
void setImageSet();
|
||||
void repaintBlocked();
|
||||
void resizeMask();
|
||||
void loadQrc();
|
||||
|
||||
private:
|
||||
KSvg::FrameSvg *m_frameSvg;
|
||||
QDir m_themeDir;
|
||||
QDir m_cacheDir;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,7 @@
|
||||
### KApiDox Project-specific Overrides File
|
||||
|
||||
# define so that deprecated API is not skipped
|
||||
PREDEFINED += \
|
||||
"KSVG_ENABLE_DEPRECATED_SINCE(x, y)=1" \
|
||||
"KSVG_BUILD_DEPRECATED_SINCE(x, y)=1" \
|
||||
"KSVG_DEPRECATED_VERSION(x, y, t)="
|
||||
@@ -0,0 +1,19 @@
|
||||
description: A library for rendering SVG-based themes with stylesheet re-coloring and on-disk caching
|
||||
tier: 3
|
||||
type: solution
|
||||
platforms:
|
||||
- name: Linux
|
||||
- name: FreeBSD
|
||||
- name: Windows
|
||||
- name: macOS
|
||||
- name: Android
|
||||
portingAid: false
|
||||
deprecated: false
|
||||
release: true
|
||||
libraries:
|
||||
- cmake: KF6::Svg
|
||||
cmakename: KF6Svg
|
||||
|
||||
public_lib: true
|
||||
group: Frameworks
|
||||
subgroup: Tier 3
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2024 Zayed Al-Saidi <zayed.alsaidi@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-02-12 12:10+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: ar\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "زايد السعيدي"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "zayed.alsaidi@gmail.com"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) 2023 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2023 Enol P. <enolp@softastur.org>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-10-25 10:01+0200\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: ast\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.08.2\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Softastur"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "alministradores@softastur.org"
|
||||
@@ -0,0 +1,30 @@
|
||||
# Bulgarian translations for ksvg package.
|
||||
# Copyright (C) 2023 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Automatically generated, 2023.
|
||||
# Mincho Kondarev <mkondarev@yahoo.de>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-08-09 09:53+0200\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: bg\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Минчо Кондарев"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "mkondarev@yahoo.de"
|
||||
@@ -0,0 +1,30 @@
|
||||
# Translation of libksvg6.po to Catalan
|
||||
# Copyright (C) 2023 This_file_is_part_of_KDE
|
||||
# This file is distributed under the license LGPL version 2.1 or
|
||||
# version 3 or later versions approved by the membership of KDE e.V.
|
||||
#
|
||||
# Josep M. Ferrer <txemaq@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-13 10:41+0200\n"
|
||||
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
|
||||
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 22.12.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Josep M. Ferrer"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "txemaq@gmail.com"
|
||||
@@ -0,0 +1,30 @@
|
||||
# Translation of libksvg6.po to Catalan (Valencian)
|
||||
# Copyright (C) 2023 This_file_is_part_of_KDE
|
||||
# This file is distributed under the license LGPL version 2.1 or
|
||||
# version 3 or later versions approved by the membership of KDE e.V.
|
||||
#
|
||||
# Josep M. Ferrer <txemaq@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-13 10:41+0200\n"
|
||||
"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
|
||||
"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
|
||||
"Language: ca@valencia\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 22.12.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Josep M. Ferrer"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "txemaq@gmail.com"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Vit Pelcak <vit@pelcak.org>, 2023.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-08-07 17:01+0200\n"
|
||||
"Last-Translator: Vit Pelcak <vit@pelcak.org>\n"
|
||||
"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Vít Pelčák"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "vit@pelcak.org"
|
||||
@@ -0,0 +1,30 @@
|
||||
# German translations for ksvg package.
|
||||
# Copyright (C) 2023 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Frederik Schwarzer <schwarzer@kde.org>, 2023.
|
||||
#
|
||||
# Automatically generated, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: libksvg6\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-24 21:19+0200\n"
|
||||
"Last-Translator: Frederik Schwarzer <schwarzer@kde.org>\n"
|
||||
"Language-Team: German <kde-i18n-de@kde.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 23.11.70\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Deutsches KDE-Übersetzerteam"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "kde-i18n-de@kde.org"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2024 Steve Allewell <steve.allewell@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-05-20 19:22+0100\n"
|
||||
"Last-Translator: Steve Allewell <steve.allewell@gmail.com>\n"
|
||||
"Language-Team: British English\n"
|
||||
"Language: en_GB\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 24.02.2\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Steve Allewell"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "steve.allewell@gmail.com"
|
||||
@@ -0,0 +1,28 @@
|
||||
# translation of libksvg6.pot to esperanto
|
||||
# Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Oliver Kellogg <olivermkellogg@gmail.com, 2023.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-16 06:48+0100\n"
|
||||
"Last-Translator: Oliver Kellogg <olivermkellogg@gmail.com>\n"
|
||||
"Language-Team: Esperanto <kde-i18n-eo@kde.org>\n"
|
||||
"Language: eo\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Oliver Kellogg"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "olivermkellogg@gmail.com"
|
||||
@@ -0,0 +1,30 @@
|
||||
# Spanish translations for libksvg5.po package.
|
||||
# Copyright (C) 2023 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Automatically generated, 2023.
|
||||
# Eloy Cuadra <ecuadra@eloihr.net>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: libksvg5\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-15 00:31+0200\n"
|
||||
"Last-Translator: Eloy Cuadra <ecuadra@eloihr.net>\n"
|
||||
"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Eloy Cuadra"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "ecuadra@eloihr.net"
|
||||
@@ -0,0 +1,31 @@
|
||||
# Translation for libksvg5.po to Euskara/Basque (eu)
|
||||
# Copyright (C) 2023 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# KDE euskaratzeko proiektuko arduraduna <xalba@ni.eus>.
|
||||
#
|
||||
# Translators:
|
||||
# Iñigo Salvador Azurmendi <xalba@ni.eus>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-15 08:51+0200\n"
|
||||
"Last-Translator: Iñigo Salvador Azurmendi <xalba@ni.eus>\n"
|
||||
"Language-Team: Basque <kde-i18n-eu@kde.org>\n"
|
||||
"Language: eu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Iñigo Salvador Azurmendi"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "xalba@ni.eus"
|
||||
@@ -0,0 +1,27 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Tommi Nieminen <translator@legisign.org>, 2023.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-24 21:33+0300\n"
|
||||
"Last-Translator: Tommi Nieminen <translator@legisign.org>\n"
|
||||
"Language-Team: Finnish <kde-i18n-doc@kde.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Tommi Nieminen"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "translator@legisign.org"
|
||||
@@ -0,0 +1,26 @@
|
||||
# SPDX-FileCopyrightText: 2023 Xavier Besnard <xavier.besnard@kde.org>
|
||||
# SPDX-FileCopyrightText: 2023 Xavier Besnard <xavier.besnard@kde.org>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-12-20 09:33+0100\n"
|
||||
"Last-Translator: Xavier Besnard <xavier.besnard@kde.org>\n"
|
||||
"Language-Team: French <kde-francophone@kde.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Lokalize 23.08.4\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Xavier Besnard"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "xavier.besnard@kde.org"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Adrián Chaves (Gallaecio) <adrian@chaves.io>, 2023.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-29 07:52+0200\n"
|
||||
"Last-Translator: Adrián Chaves (Gallaecio) <adrian@chaves.io>\n"
|
||||
"Language-Team: Galician <proxecto@trasno.gal>\n"
|
||||
"Language: gl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Adrian Chaves (Gallaecio)"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "adrian@chaves.io"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2024 Yaron Shahrabani <sh.yaron@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-03-19 07:50+0200\n"
|
||||
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
|
||||
"Language-Team: צוות התרגום של KDE ישראל\n"
|
||||
"Language: he\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
|
||||
"n % 10 == 0) ? 2 : 3));\n"
|
||||
"X-Generator: Lokalize 23.08.5\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "צוות התרגום של KDE ישראל"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "kde-l10n-he@kde.org"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Hindi translations for ksvg package.
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Kali <EMAIL@ADDRESS>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-12-15 17:36+0530\n"
|
||||
"Last-Translator: Kali <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Hindi <fedora-trans-hi@redhat.com>\n"
|
||||
"Language: hi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "तुम्हारे नाम"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "आपके ईमेल"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2024 Kristof Kiszel <ulysses@fsf.hu>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-01-07 22:36+0100\n"
|
||||
"Last-Translator: Kristof Kiszel <ulysses@fsf.hu>\n"
|
||||
"Language-Team: Hungarian <kde-l10n-hu@kde.org>\n"
|
||||
"Language: hu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 23.08.4\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Kiszel Kristóf"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "ulysses@fsf.hu"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# giovanni <g.sora@tiscali.it>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-08-13 15:13+0200\n"
|
||||
"Last-Translator: giovanni <g.sora@tiscali.it>\n"
|
||||
"Language-Team: Interlingua <kde-i18n-doc@kde.org>\n"
|
||||
"Language: ia\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 21.12.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Giovanni Sora"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "g.sora@tiscali.it"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Sveinn í Felli <sv1@fellsnet.is>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-02-19 09:43+0000\n"
|
||||
"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
|
||||
"Language-Team: Icelandic\n"
|
||||
"Language: is\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 22.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Sveinn í Felli"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "sv1@fellsnet.is"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Vincenzo Reale <smart2128vr@gmail.com>, 2023.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-15 23:42+0200\n"
|
||||
"Last-Translator: Vincenzo Reale <smart2128vr@gmail.com>\n"
|
||||
"Language-Team: Italian <kde-i18n-it@kde.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Vincenzo Reale"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "smart2128vr@gmail.com"
|
||||
@@ -0,0 +1,25 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-14 21:55-0700\n"
|
||||
"Last-Translator: Japanese KDE translation team <kde-jp@kde.org>\n"
|
||||
"Language-Team: Japanese <kde-jp@kde.org>\n"
|
||||
"Language: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Accelerator-Marker: &\n"
|
||||
"X-Text-Markup: kde4\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr ""
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,29 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-14 05:42+0200\n"
|
||||
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
|
||||
"Language-Team: Georgian <kde-i18n-doc@kde.org>\n"
|
||||
"Language: ka\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 3.3.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Temuri Doghonadze"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "Temuri.doghonadze@gmail.com"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Shinjo Park <kde@peremen.name>, 2023.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-25 01:00+0200\n"
|
||||
"Last-Translator: Shinjo Park <kde@peremen.name>\n"
|
||||
"Language-Team: Korean <kde-kr@kde.org>\n"
|
||||
"Language: ko\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Lokalize 22.12.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "박신조"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "kde@peremen.name"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Lithuanian translations for ksvg package.
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Automatically generated, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-13 02:10+0000\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n"
|
||||
"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr ""
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Freek de Kruijf <freekdekruijf@kde.nl>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-13 12:27+0200\n"
|
||||
"Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Freek de Kruijf - 2023"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "freekdekruijf@kde.nl"
|
||||
@@ -0,0 +1,30 @@
|
||||
# Translation of libksvg6 to Norwegian Nynorsk
|
||||
#
|
||||
# Karl Ove Hufthammer <karl@huftis.org>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-29 12:34+0200\n"
|
||||
"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
|
||||
"Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n"
|
||||
"Language: nn\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.3\n"
|
||||
"X-Environment: kde\n"
|
||||
"X-Accelerator-Marker: &\n"
|
||||
"X-Text-Markup: kde4\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Karl Ove Hufthammer"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "karl@huftis.org"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-09-24 08:17+0200\n"
|
||||
"Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>\n"
|
||||
"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
|
||||
"Language: pl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Łukasz Wojniłowicz"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "lukasz.wojnilowicz@gmail.com"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Luiz Fernando Ranghetti <elchevive@opensuse.org>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-25 10:06-0300\n"
|
||||
"Last-Translator: Luiz Fernando Ranghetti <elchevive@opensuse.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Lokalize 22.12.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Luiz Fernando Ranghetti"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "elchevive@opensuse.org"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
# Sergiu Bivol <sergiu@cip.md>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-02-18 14:48+0000\n"
|
||||
"Last-Translator: Sergiu Bivol <sergiu@cip.md>\n"
|
||||
"Language-Team: Romanian <kde-i18n-ro@kde.org>\n"
|
||||
"Language: ro\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
|
||||
"20)) ? 1 : 2;\n"
|
||||
"X-Generator: Lokalize 21.12.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Sergiu Bivol"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "sergiu@cip.md"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Alexander Yavorsky <kekcuha@gmail.com>, 2024.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-01-05 22:09+0300\n"
|
||||
"Last-Translator: Alexander Yavorsky <kekcuha@gmail.com>\n"
|
||||
"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
|
||||
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Lokalize 21.08.3\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Александр Яворский"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "kekcuha@gmail.com"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2024 kali <shreekantkalwar@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-12-24 20:39+0530\n"
|
||||
"Last-Translator: kali <shreekantkalwar@gmail.com>\n"
|
||||
"Language-Team: Sanskrit <kde-i18n-doc@kde.org>\n"
|
||||
"Language: sa\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Lokalize 24.08.2\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n>2);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "श्रीकान्त् कलवार्"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "skkalwar999@gmail.com"
|
||||
@@ -0,0 +1,26 @@
|
||||
# translation of libksvg6.po to Slovak
|
||||
# SPDX-FileCopyrightText: 2023 Roman Paholík <wizzardsk@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: libksvg6\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-12-09 09:08+0100\n"
|
||||
"Last-Translator: Roman Paholik <wizzardsk@gmail.com>\n"
|
||||
"Language-Team: Slovak <kde-sk@linux.sk>\n"
|
||||
"Language: sk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Lokalize 23.08.3\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Roman Paholík"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "wizzardsk@gmail.com"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Matjaž Jeran <matjaz.jeran@amis.net>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-14 06:33+0200\n"
|
||||
"Last-Translator: Matjaž Jeran <matjaz.jeran@amis.net>\n"
|
||||
"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Lokalize 23.04.2\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
|
||||
"%100==4 ? 3 : 0);\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Matjaž Jeran"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "matjaz.jeran@amis.net"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) 2024 This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2024 Stefan Asserhäll <stefan.asserhall@gmail.com>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-06-21 14:32+0200\n"
|
||||
"Last-Translator: Stefan Asserhäll <stefan.asserhall@gmail.com>\n"
|
||||
"Language-Team: Swedish <kde-i18n-doc@kde.org>\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.08.5\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Stefan Asserhäll"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "stefan.asserhall@gmail.com"
|
||||
@@ -0,0 +1,28 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Emir SARI <emir_sari@icloud.com>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-13 13:03+0300\n"
|
||||
"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
|
||||
"Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Lokalize 23.07.70\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Emir SARI"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "emir_sari@icloud.com"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Copyright (C) YEAR This file is copyright:
|
||||
# This file is distributed under the same license as the ksvg package.
|
||||
#
|
||||
# Yuri Chornoivan <yurchor@ukr.net>, 2023.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ksvg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2023-07-13 08:52+0300\n"
|
||||
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
|
||||
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
|
||||
"Language: uk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
|
||||
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Lokalize 20.12.0\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Юрій Чорноіван"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "yurchor@ukr.net"
|
||||
@@ -0,0 +1,28 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: kdeorg\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-07-13 02:10+0000\n"
|
||||
"PO-Revision-Date: 2024-04-22 15:58\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: Chinese Simplified\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Crowdin-Project: kdeorg\n"
|
||||
"X-Crowdin-Project-ID: 269464\n"
|
||||
"X-Crowdin-Language: zh-CN\n"
|
||||
"X-Crowdin-File: /kf6-trunk/messages/ksvg/libksvg6.pot\n"
|
||||
"X-Crowdin-File-ID: 44419\n"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "NAME OF TRANSLATORS"
|
||||
msgid "Your names"
|
||||
msgstr "Tyson Tan"
|
||||
|
||||
#, kde-format
|
||||
msgctxt "EMAIL OF TRANSLATORS"
|
||||
msgid "Your emails"
|
||||
msgstr "tds00@qq.com"
|
||||
@@ -0,0 +1,12 @@
|
||||
add_subdirectory(ksvg)
|
||||
#add_subdirectory(declarativeimports)
|
||||
|
||||
if (BUILD_TOOLS)
|
||||
add_subdirectory(tools)
|
||||
endif()
|
||||
|
||||
ecm_qt_install_logging_categories(
|
||||
EXPORT KSVG
|
||||
FILE ksvg.categories
|
||||
DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}
|
||||
)
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Invoke the extractrc script on all .ui, .rc, and .kcfg files in the sources.
|
||||
# The results are stored in a pseudo .cpp file to be picked up by xgettext.
|
||||
lst=`find . -name \*.rc -o -name \*.ui -o -name \*.kcfg`
|
||||
if [ -n "$lst" ] ; then
|
||||
$EXTRACTRC $lst >> rc.cpp
|
||||
fi
|
||||
|
||||
# Run xgettext to extract strings from all source files.
|
||||
$XGETTEXT `find . -name \*.cpp -o -name \*.h -o -name \*.qml` -o $podir/libksvg6.pot
|
||||
@@ -0,0 +1,27 @@
|
||||
ecm_add_qml_module(corebindingsplugin URI "org.kde.ksvg" VERSION 1.0 DEPENDENCIES QtQuick GENERATE_PLUGIN_SOURCE)
|
||||
|
||||
target_sources(corebindingsplugin PRIVATE
|
||||
svgitem.cpp
|
||||
framesvgitem.cpp
|
||||
managedtexturenode.cpp
|
||||
imagetexturescache.cpp
|
||||
types.h
|
||||
)
|
||||
|
||||
target_link_libraries(corebindingsplugin PRIVATE
|
||||
Qt6::Quick
|
||||
Qt6::Qml
|
||||
Qt6::Svg
|
||||
KF6::Svg
|
||||
KF6::ColorScheme
|
||||
KF6::KirigamiPlatform
|
||||
)
|
||||
|
||||
ecm_qt_declare_logging_category(corebindingsplugin
|
||||
HEADER debug_p.h
|
||||
IDENTIFIER LOG_KSVGQML
|
||||
CATEGORY_NAME kf.svg
|
||||
DESCRIPTION "KSvg QML plugin"
|
||||
)
|
||||
|
||||
ecm_finalize_qml_module(corebindingsplugin DESTINATION ${KDE_INSTALL_QMLDIR})
|
||||
@@ -0,0 +1,782 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2010 Marco Martin <mart@kde.org>
|
||||
SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "framesvgitem.h"
|
||||
|
||||
#include "imagetexturescache.h"
|
||||
#include "managedtexturenode.h"
|
||||
|
||||
#include <QQuickWindow>
|
||||
#include <QSGGeometry>
|
||||
#include <QSGTexture>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QPainter>
|
||||
|
||||
#include <ksvg/private/framesvg_helpers.h>
|
||||
#include <ksvg/private/framesvg_p.h>
|
||||
|
||||
#include <cmath> //floor()
|
||||
|
||||
#include <Kirigami/Platform/PlatformTheme>
|
||||
#include <debug_p.h>
|
||||
|
||||
namespace KSvg
|
||||
{
|
||||
Q_GLOBAL_STATIC(ImageTexturesCache, s_cache)
|
||||
|
||||
class FrameNode : public QSGNode
|
||||
{
|
||||
public:
|
||||
FrameNode(const QString &prefix, FrameSvg *svg)
|
||||
: QSGNode()
|
||||
, leftWidth(0)
|
||||
, rightWidth(0)
|
||||
, topHeight(0)
|
||||
, bottomHeight(0)
|
||||
{
|
||||
if (svg->enabledBorders() & FrameSvg::LeftBorder) {
|
||||
leftWidth = svg->elementSize(prefix % QLatin1String("left")).width();
|
||||
}
|
||||
if (svg->enabledBorders() & FrameSvg::RightBorder) {
|
||||
rightWidth = svg->elementSize(prefix % QLatin1String("right")).width();
|
||||
}
|
||||
if (svg->enabledBorders() & FrameSvg::TopBorder) {
|
||||
topHeight = svg->elementSize(prefix % QLatin1String("top")).height();
|
||||
}
|
||||
if (svg->enabledBorders() & FrameSvg::BottomBorder) {
|
||||
bottomHeight = svg->elementSize(prefix % QLatin1String("bottom")).height();
|
||||
}
|
||||
}
|
||||
|
||||
QRect contentsRect(const QSize &size) const
|
||||
{
|
||||
const QSize contentSize(size.width() - leftWidth - rightWidth, size.height() - topHeight - bottomHeight);
|
||||
|
||||
return QRect(QPoint(leftWidth, topHeight), contentSize);
|
||||
}
|
||||
|
||||
private:
|
||||
int leftWidth;
|
||||
int rightWidth;
|
||||
int topHeight;
|
||||
int bottomHeight;
|
||||
};
|
||||
|
||||
class FrameItemNode : public ManagedTextureNode
|
||||
{
|
||||
public:
|
||||
enum FitMode {
|
||||
// render SVG at native resolution then stretch it in openGL
|
||||
FastStretch,
|
||||
// on resize re-render the part of the frame from the SVG
|
||||
Stretch,
|
||||
Tile,
|
||||
};
|
||||
|
||||
FrameItemNode(FrameSvgItem *frameSvg, FrameSvg::EnabledBorders borders, FitMode fitMode, QSGNode *parent)
|
||||
: ManagedTextureNode()
|
||||
, m_frameSvg(frameSvg)
|
||||
, m_border(borders)
|
||||
, m_fitMode(fitMode)
|
||||
{
|
||||
parent->appendChildNode(this);
|
||||
|
||||
if (m_fitMode == Tile) {
|
||||
if (m_border == FrameSvg::TopBorder || m_border == FrameSvg::BottomBorder || m_border == FrameSvg::NoBorder) {
|
||||
static_cast<QSGTextureMaterial *>(material())->setHorizontalWrapMode(QSGTexture::Repeat);
|
||||
static_cast<QSGOpaqueTextureMaterial *>(opaqueMaterial())->setHorizontalWrapMode(QSGTexture::Repeat);
|
||||
}
|
||||
if (m_border == FrameSvg::LeftBorder || m_border == FrameSvg::RightBorder || m_border == FrameSvg::NoBorder) {
|
||||
static_cast<QSGTextureMaterial *>(material())->setVerticalWrapMode(QSGTexture::Repeat);
|
||||
static_cast<QSGOpaqueTextureMaterial *>(opaqueMaterial())->setVerticalWrapMode(QSGTexture::Repeat);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_fitMode == Tile || m_fitMode == FastStretch) {
|
||||
QString elementId = m_frameSvg->frameSvg()->actualPrefix() + FrameSvgHelpers::borderToElementId(m_border);
|
||||
m_elementNativeSize = m_frameSvg->frameSvg()->elementSize(elementId).toSize();
|
||||
|
||||
if (m_elementNativeSize.isEmpty()) {
|
||||
// if the default element is empty, we can avoid the slower tiling path
|
||||
// this also avoids a divide by 0 error
|
||||
m_fitMode = FastStretch;
|
||||
}
|
||||
|
||||
updateTexture(m_elementNativeSize, elementId);
|
||||
}
|
||||
}
|
||||
|
||||
void updateTexture(const QSize &size, const QString &elementId)
|
||||
{
|
||||
QQuickWindow::CreateTextureOptions options;
|
||||
if (m_fitMode != Tile) {
|
||||
options = QQuickWindow::TextureCanUseAtlas;
|
||||
}
|
||||
setTexture(s_cache->loadTexture(m_frameSvg->window(), m_frameSvg->frameSvg()->image(size, elementId), options));
|
||||
}
|
||||
|
||||
void reposition(const QRect &frameGeometry, QSize &fullSize)
|
||||
{
|
||||
QRectF nodeRect = FrameSvgHelpers::sectionRect(m_border, frameGeometry, fullSize);
|
||||
|
||||
// ensure we're not passing a weird rectangle to updateTexturedRectGeometry
|
||||
if (!nodeRect.isValid() || nodeRect.isEmpty()) {
|
||||
nodeRect = QRect();
|
||||
}
|
||||
|
||||
// the position of the relevant texture within this texture ID.
|
||||
// for atlas' this will only be a small part of the texture
|
||||
QRectF textureRect;
|
||||
|
||||
if (m_fitMode == Tile) {
|
||||
textureRect = QRectF(0, 0, 1, 1); // we can never be in an atlas for tiled images.
|
||||
|
||||
// if tiling horizontally
|
||||
if (m_border == FrameSvg::TopBorder || m_border == FrameSvg::BottomBorder || m_border == FrameSvg::NoBorder) {
|
||||
// cmp. CSS3's border-image-repeat: "repeat", though with first tile not centered, but aligned to left
|
||||
textureRect.setWidth((qreal)nodeRect.width() / m_elementNativeSize.width());
|
||||
}
|
||||
// if tiling vertically
|
||||
if (m_border == FrameSvg::LeftBorder || m_border == FrameSvg::RightBorder || m_border == FrameSvg::NoBorder) {
|
||||
// cmp. CSS3's border-image-repeat: "repeat", though with first tile not centered, but aligned to top
|
||||
textureRect.setHeight((qreal)nodeRect.height() / m_elementNativeSize.height());
|
||||
}
|
||||
} else if (m_fitMode == Stretch) {
|
||||
QString prefix = m_frameSvg->frameSvg()->actualPrefix();
|
||||
|
||||
QString elementId = prefix + FrameSvgHelpers::borderToElementId(m_border);
|
||||
|
||||
// re-render the SVG at new size
|
||||
updateTexture(nodeRect.size().toSize(), elementId);
|
||||
textureRect = texture()->normalizedTextureSubRect();
|
||||
} else if (texture()) { // for fast stretch.
|
||||
textureRect = texture()->normalizedTextureSubRect();
|
||||
}
|
||||
|
||||
QSGGeometry::updateTexturedRectGeometry(geometry(), nodeRect, textureRect);
|
||||
markDirty(QSGNode::DirtyGeometry);
|
||||
}
|
||||
|
||||
private:
|
||||
FrameSvgItem *m_frameSvg;
|
||||
FrameSvg::EnabledBorders m_border;
|
||||
QSize m_elementNativeSize;
|
||||
FitMode m_fitMode;
|
||||
};
|
||||
|
||||
FrameSvgItemMargins::FrameSvgItemMargins(KSvg::FrameSvg *frameSvg, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_frameSvg(frameSvg)
|
||||
, m_fixed(false)
|
||||
, m_inset(false)
|
||||
{
|
||||
// qDebug() << "margins at: " << left() << top() << right() << bottom();
|
||||
}
|
||||
|
||||
qreal FrameSvgItemMargins::left() const
|
||||
{
|
||||
if (m_fixed) {
|
||||
return m_frameSvg->fixedMarginSize(FrameSvg::LeftMargin);
|
||||
} else if (m_inset) {
|
||||
return m_frameSvg->insetSize(FrameSvg::LeftMargin);
|
||||
} else {
|
||||
return m_frameSvg->marginSize(FrameSvg::LeftMargin);
|
||||
}
|
||||
}
|
||||
|
||||
qreal FrameSvgItemMargins::top() const
|
||||
{
|
||||
if (m_fixed) {
|
||||
return m_frameSvg->fixedMarginSize(FrameSvg::TopMargin);
|
||||
} else if (m_inset) {
|
||||
return m_frameSvg->insetSize(FrameSvg::TopMargin);
|
||||
} else {
|
||||
return m_frameSvg->marginSize(FrameSvg::TopMargin);
|
||||
}
|
||||
}
|
||||
|
||||
qreal FrameSvgItemMargins::right() const
|
||||
{
|
||||
if (m_fixed) {
|
||||
return m_frameSvg->fixedMarginSize(FrameSvg::RightMargin);
|
||||
} else if (m_inset) {
|
||||
return m_frameSvg->insetSize(FrameSvg::RightMargin);
|
||||
} else {
|
||||
return m_frameSvg->marginSize(FrameSvg::RightMargin);
|
||||
}
|
||||
}
|
||||
|
||||
qreal FrameSvgItemMargins::bottom() const
|
||||
{
|
||||
if (m_fixed) {
|
||||
return m_frameSvg->fixedMarginSize(FrameSvg::BottomMargin);
|
||||
} else if (m_inset) {
|
||||
return m_frameSvg->insetSize(FrameSvg::BottomMargin);
|
||||
} else {
|
||||
return m_frameSvg->marginSize(FrameSvg::BottomMargin);
|
||||
}
|
||||
}
|
||||
|
||||
qreal FrameSvgItemMargins::horizontal() const
|
||||
{
|
||||
return left() + right();
|
||||
}
|
||||
|
||||
qreal FrameSvgItemMargins::vertical() const
|
||||
{
|
||||
return top() + bottom();
|
||||
}
|
||||
|
||||
QList<qreal> FrameSvgItemMargins::margins() const
|
||||
{
|
||||
qreal left;
|
||||
qreal top;
|
||||
qreal right;
|
||||
qreal bottom;
|
||||
m_frameSvg->getMargins(left, top, right, bottom);
|
||||
return {left, top, right, bottom};
|
||||
}
|
||||
|
||||
void FrameSvgItemMargins::update()
|
||||
{
|
||||
Q_EMIT marginsChanged();
|
||||
}
|
||||
|
||||
void FrameSvgItemMargins::setFixed(bool fixed)
|
||||
{
|
||||
if (fixed == m_fixed) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_fixed = fixed;
|
||||
Q_EMIT marginsChanged();
|
||||
}
|
||||
|
||||
bool FrameSvgItemMargins::isFixed() const
|
||||
{
|
||||
return m_fixed;
|
||||
}
|
||||
|
||||
void FrameSvgItemMargins::setInset(bool inset)
|
||||
{
|
||||
if (inset == m_inset) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_inset = inset;
|
||||
Q_EMIT marginsChanged();
|
||||
}
|
||||
|
||||
bool FrameSvgItemMargins::isInset() const
|
||||
{
|
||||
return m_inset;
|
||||
}
|
||||
|
||||
FrameSvgItem::FrameSvgItem(QQuickItem *parent)
|
||||
: QQuickItem(parent)
|
||||
, m_margins(nullptr)
|
||||
, m_fixedMargins(nullptr)
|
||||
, m_insetMargins(nullptr)
|
||||
, m_textureChanged(false)
|
||||
, m_sizeChanged(false)
|
||||
, m_fastPath(true)
|
||||
{
|
||||
m_frameSvg = new KSvg::FrameSvg(this);
|
||||
|
||||
setFlag(QQuickItem::ItemHasContents, true);
|
||||
setFlag(ItemHasContents, true);
|
||||
connect(m_frameSvg, &FrameSvg::repaintNeeded, this, &FrameSvgItem::doUpdate);
|
||||
connect(m_frameSvg, &Svg::fromCurrentImageSetChanged, this, &FrameSvgItem::fromCurrentImageSetChanged);
|
||||
connect(m_frameSvg, &Svg::statusChanged, this, &FrameSvgItem::statusChanged);
|
||||
}
|
||||
|
||||
FrameSvgItem::~FrameSvgItem()
|
||||
{
|
||||
}
|
||||
|
||||
class CheckMarginsChange
|
||||
{
|
||||
public:
|
||||
CheckMarginsChange(QList<qreal> &oldMargins, FrameSvgItemMargins *marginsObject)
|
||||
: m_oldMargins(oldMargins)
|
||||
, m_marginsObject(marginsObject)
|
||||
{
|
||||
}
|
||||
|
||||
~CheckMarginsChange()
|
||||
{
|
||||
const QList<qreal> oldMarginsBefore = m_oldMargins;
|
||||
m_oldMargins = m_marginsObject ? m_marginsObject->margins() : QList<qreal>();
|
||||
|
||||
if (m_marginsObject && oldMarginsBefore != m_oldMargins) {
|
||||
m_marginsObject->update();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QList<qreal> &m_oldMargins;
|
||||
FrameSvgItemMargins *const m_marginsObject;
|
||||
};
|
||||
|
||||
void FrameSvgItem::setImagePath(const QString &path)
|
||||
{
|
||||
if (m_frameSvg->imagePath() == path) {
|
||||
return;
|
||||
}
|
||||
|
||||
CheckMarginsChange checkMargins(m_oldMargins, m_margins);
|
||||
CheckMarginsChange checkFixedMargins(m_oldFixedMargins, m_fixedMargins);
|
||||
CheckMarginsChange checkInsetMargins(m_oldInsetMargins, m_insetMargins);
|
||||
|
||||
updateDevicePixelRatio();
|
||||
m_frameSvg->setImagePath(path);
|
||||
|
||||
if (implicitWidth() <= 0) {
|
||||
setImplicitWidth(m_frameSvg->marginSize(KSvg::FrameSvg::LeftMargin) + m_frameSvg->marginSize(KSvg::FrameSvg::RightMargin));
|
||||
}
|
||||
|
||||
if (implicitHeight() <= 0) {
|
||||
setImplicitHeight(m_frameSvg->marginSize(KSvg::FrameSvg::TopMargin) + m_frameSvg->marginSize(KSvg::FrameSvg::BottomMargin));
|
||||
}
|
||||
|
||||
Q_EMIT imagePathChanged();
|
||||
|
||||
if (isComponentComplete()) {
|
||||
applyPrefixes();
|
||||
|
||||
m_frameSvg->resizeFrame(size());
|
||||
m_textureChanged = true;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
QString FrameSvgItem::imagePath() const
|
||||
{
|
||||
return m_frameSvg->imagePath();
|
||||
}
|
||||
|
||||
void FrameSvgItem::setPrefix(const QVariant &prefixes)
|
||||
{
|
||||
QStringList prefixList;
|
||||
// is this a simple string?
|
||||
if (prefixes.canConvert<QString>()) {
|
||||
prefixList << prefixes.toString();
|
||||
} else if (prefixes.canConvert<QStringList>()) {
|
||||
prefixList = prefixes.toStringList();
|
||||
}
|
||||
|
||||
if (m_prefixes == prefixList) {
|
||||
return;
|
||||
}
|
||||
|
||||
CheckMarginsChange checkMargins(m_oldMargins, m_margins);
|
||||
CheckMarginsChange checkFixedMargins(m_oldFixedMargins, m_fixedMargins);
|
||||
CheckMarginsChange checkInsetMargins(m_oldInsetMargins, m_insetMargins);
|
||||
|
||||
m_prefixes = prefixList;
|
||||
applyPrefixes();
|
||||
|
||||
if (implicitWidth() <= 0) {
|
||||
setImplicitWidth(m_frameSvg->marginSize(KSvg::FrameSvg::LeftMargin) + m_frameSvg->marginSize(KSvg::FrameSvg::RightMargin));
|
||||
}
|
||||
|
||||
if (implicitHeight() <= 0) {
|
||||
setImplicitHeight(m_frameSvg->marginSize(KSvg::FrameSvg::TopMargin) + m_frameSvg->marginSize(KSvg::FrameSvg::BottomMargin));
|
||||
}
|
||||
|
||||
Q_EMIT prefixChanged();
|
||||
|
||||
if (isComponentComplete()) {
|
||||
m_frameSvg->resizeFrame(QSizeF(width(), height()));
|
||||
m_textureChanged = true;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
QVariant FrameSvgItem::prefix() const
|
||||
{
|
||||
return m_prefixes;
|
||||
}
|
||||
|
||||
QString FrameSvgItem::usedPrefix() const
|
||||
{
|
||||
return m_frameSvg->prefix();
|
||||
}
|
||||
|
||||
FrameSvgItemMargins *FrameSvgItem::margins()
|
||||
{
|
||||
if (!m_margins) {
|
||||
m_margins = new FrameSvgItemMargins(m_frameSvg, this);
|
||||
}
|
||||
return m_margins;
|
||||
}
|
||||
|
||||
FrameSvgItemMargins *FrameSvgItem::fixedMargins()
|
||||
{
|
||||
if (!m_fixedMargins) {
|
||||
m_fixedMargins = new FrameSvgItemMargins(m_frameSvg, this);
|
||||
m_fixedMargins->setFixed(true);
|
||||
}
|
||||
return m_fixedMargins;
|
||||
}
|
||||
|
||||
FrameSvgItemMargins *FrameSvgItem::inset()
|
||||
{
|
||||
if (!m_insetMargins) {
|
||||
m_insetMargins = new FrameSvgItemMargins(m_frameSvg, this);
|
||||
m_insetMargins->setInset(true);
|
||||
}
|
||||
return m_insetMargins;
|
||||
}
|
||||
|
||||
bool FrameSvgItem::fromCurrentImageSet() const
|
||||
{
|
||||
return m_frameSvg->fromCurrentImageSet();
|
||||
}
|
||||
|
||||
void FrameSvgItem::setStatus(KSvg::Svg::Status status)
|
||||
{
|
||||
m_frameSvg->setStatus(status);
|
||||
}
|
||||
|
||||
KSvg::Svg::Status FrameSvgItem::status() const
|
||||
{
|
||||
return m_frameSvg->status();
|
||||
}
|
||||
|
||||
void FrameSvgItem::setEnabledBorders(const KSvg::FrameSvg::EnabledBorders borders)
|
||||
{
|
||||
if (m_frameSvg->enabledBorders() == borders) {
|
||||
return;
|
||||
}
|
||||
|
||||
CheckMarginsChange checkMargins(m_oldMargins, m_margins);
|
||||
|
||||
m_frameSvg->setEnabledBorders(borders);
|
||||
Q_EMIT enabledBordersChanged();
|
||||
m_textureChanged = true;
|
||||
update();
|
||||
}
|
||||
|
||||
KSvg::FrameSvg::EnabledBorders FrameSvgItem::enabledBorders() const
|
||||
{
|
||||
return m_frameSvg->enabledBorders();
|
||||
}
|
||||
|
||||
void FrameSvgItem::setColorSet(KSvg::Svg::ColorSet colorSet)
|
||||
{
|
||||
if (m_frameSvg->colorSet() == colorSet) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_frameSvg->setColorSet(colorSet);
|
||||
m_textureChanged = true;
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
KSvg::Svg::ColorSet FrameSvgItem::colorSet() const
|
||||
{
|
||||
return m_frameSvg->colorSet();
|
||||
}
|
||||
|
||||
bool FrameSvgItem::hasElementPrefix(const QString &prefix) const
|
||||
{
|
||||
return m_frameSvg->hasElementPrefix(prefix);
|
||||
}
|
||||
|
||||
bool FrameSvgItem::hasElement(const QString &elementName) const
|
||||
{
|
||||
return m_frameSvg->hasElement(elementName);
|
||||
}
|
||||
|
||||
QRegion FrameSvgItem::mask() const
|
||||
{
|
||||
return m_frameSvg->mask();
|
||||
}
|
||||
|
||||
int FrameSvgItem::minimumDrawingHeight() const
|
||||
{
|
||||
return m_frameSvg->minimumDrawingHeight();
|
||||
}
|
||||
|
||||
int FrameSvgItem::minimumDrawingWidth() const
|
||||
{
|
||||
return m_frameSvg->minimumDrawingWidth();
|
||||
}
|
||||
|
||||
void FrameSvgItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
|
||||
{
|
||||
const bool isComponentComplete = this->isComponentComplete();
|
||||
if (isComponentComplete) {
|
||||
m_frameSvg->resizeFrame(newGeometry.size());
|
||||
m_sizeChanged = true;
|
||||
}
|
||||
|
||||
QQuickItem::geometryChange(newGeometry, oldGeometry);
|
||||
|
||||
// the above only triggers updatePaintNode, so we have to inform subscribers
|
||||
// about the potential change of the mask explicitly here
|
||||
if (isComponentComplete) {
|
||||
Q_EMIT maskChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void FrameSvgItem::doUpdate()
|
||||
{
|
||||
if (m_frameSvg->isRepaintBlocked()) {
|
||||
return;
|
||||
}
|
||||
|
||||
CheckMarginsChange checkMargins(m_oldMargins, m_margins);
|
||||
CheckMarginsChange checkFixedMargins(m_oldFixedMargins, m_fixedMargins);
|
||||
CheckMarginsChange checkInsetMargins(m_oldInsetMargins, m_insetMargins);
|
||||
|
||||
// if the theme changed, the available prefix may have changed as well
|
||||
applyPrefixes();
|
||||
|
||||
if (implicitWidth() <= 0) {
|
||||
setImplicitWidth(m_frameSvg->marginSize(KSvg::FrameSvg::LeftMargin) + m_frameSvg->marginSize(KSvg::FrameSvg::RightMargin));
|
||||
}
|
||||
|
||||
if (implicitHeight() <= 0) {
|
||||
setImplicitHeight(m_frameSvg->marginSize(KSvg::FrameSvg::TopMargin) + m_frameSvg->marginSize(KSvg::FrameSvg::BottomMargin));
|
||||
}
|
||||
|
||||
QString prefix = m_frameSvg->actualPrefix();
|
||||
bool hasOverlay = (!prefix.startsWith(QLatin1String("mask-")) //
|
||||
&& m_frameSvg->hasElement(prefix % QLatin1String("overlay")));
|
||||
bool hasComposeOverBorder = m_frameSvg->hasElement(prefix % QLatin1String("hint-compose-over-border"))
|
||||
&& m_frameSvg->hasElement(QLatin1String("mask-") % prefix % QLatin1String("center"));
|
||||
m_fastPath = !hasOverlay && !hasComposeOverBorder;
|
||||
|
||||
// Software rendering (at time of writing Qt5.10) doesn't seem to like our
|
||||
// tiling/stretching in the 9-tiles.
|
||||
// Also when using QPainter it's arguably faster to create and cache pixmaps
|
||||
// of the whole frame, which is what the slow path does
|
||||
if (QQuickWindow::sceneGraphBackend() == QLatin1String("software")) {
|
||||
m_fastPath = false;
|
||||
}
|
||||
m_textureChanged = true;
|
||||
|
||||
update();
|
||||
|
||||
Q_EMIT maskChanged();
|
||||
Q_EMIT repaintNeeded();
|
||||
}
|
||||
|
||||
KSvg::FrameSvg *FrameSvgItem::frameSvg() const
|
||||
{
|
||||
return m_frameSvg;
|
||||
}
|
||||
|
||||
QSGNode *FrameSvgItem::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *)
|
||||
{
|
||||
if (!window() || !m_frameSvg //
|
||||
|| (!m_frameSvg->hasElementPrefix(m_frameSvg->actualPrefix()) //
|
||||
&& !m_frameSvg->hasElementPrefix(m_frameSvg->prefix()))) {
|
||||
delete oldNode;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const QSGTexture::Filtering filtering = smooth() ? QSGTexture::Linear : QSGTexture::Nearest;
|
||||
|
||||
if (m_fastPath) {
|
||||
if (m_textureChanged) {
|
||||
delete oldNode;
|
||||
oldNode = nullptr;
|
||||
}
|
||||
|
||||
if (!oldNode) {
|
||||
QString prefix = m_frameSvg->actualPrefix();
|
||||
oldNode = new FrameNode(prefix, m_frameSvg);
|
||||
|
||||
bool tileCenter = (m_frameSvg->hasElement(QStringLiteral("hint-tile-center")) //
|
||||
|| m_frameSvg->hasElement(prefix % QLatin1String("hint-tile-center")));
|
||||
bool stretchBorders = (m_frameSvg->hasElement(QStringLiteral("hint-stretch-borders")) //
|
||||
|| m_frameSvg->hasElement(prefix % QLatin1String("hint-stretch-borders")));
|
||||
FrameItemNode::FitMode borderFitMode = stretchBorders ? FrameItemNode::Stretch : FrameItemNode::Tile;
|
||||
FrameItemNode::FitMode centerFitMode = tileCenter ? FrameItemNode::Tile : FrameItemNode::Stretch;
|
||||
|
||||
new FrameItemNode(this, FrameSvg::NoBorder, centerFitMode, oldNode);
|
||||
if (enabledBorders() & (FrameSvg::TopBorder | FrameSvg::LeftBorder)) {
|
||||
new FrameItemNode(this, FrameSvg::TopBorder | FrameSvg::LeftBorder, FrameItemNode::FastStretch, oldNode);
|
||||
}
|
||||
if (enabledBorders() & (FrameSvg::TopBorder | FrameSvg::RightBorder)) {
|
||||
new FrameItemNode(this, FrameSvg::TopBorder | FrameSvg::RightBorder, FrameItemNode::FastStretch, oldNode);
|
||||
}
|
||||
if (enabledBorders() & FrameSvg::TopBorder) {
|
||||
new FrameItemNode(this, FrameSvg::TopBorder, borderFitMode, oldNode);
|
||||
}
|
||||
if (enabledBorders() & FrameSvg::BottomBorder) {
|
||||
new FrameItemNode(this, FrameSvg::BottomBorder, borderFitMode, oldNode);
|
||||
}
|
||||
if (enabledBorders() & (FrameSvg::BottomBorder | FrameSvg::LeftBorder)) {
|
||||
new FrameItemNode(this, FrameSvg::BottomBorder | FrameSvg::LeftBorder, FrameItemNode::FastStretch, oldNode);
|
||||
}
|
||||
if (enabledBorders() & (FrameSvg::BottomBorder | FrameSvg::RightBorder)) {
|
||||
new FrameItemNode(this, FrameSvg::BottomBorder | FrameSvg::RightBorder, FrameItemNode::FastStretch, oldNode);
|
||||
}
|
||||
if (enabledBorders() & FrameSvg::LeftBorder) {
|
||||
new FrameItemNode(this, FrameSvg::LeftBorder, borderFitMode, oldNode);
|
||||
}
|
||||
if (enabledBorders() & FrameSvg::RightBorder) {
|
||||
new FrameItemNode(this, FrameSvg::RightBorder, borderFitMode, oldNode);
|
||||
}
|
||||
|
||||
m_sizeChanged = true;
|
||||
m_textureChanged = false;
|
||||
}
|
||||
|
||||
QSGNode *node = oldNode->firstChild();
|
||||
while (node) {
|
||||
static_cast<FrameItemNode *>(node)->setFiltering(filtering);
|
||||
node = node->nextSibling();
|
||||
}
|
||||
|
||||
if (m_sizeChanged) {
|
||||
FrameNode *frameNode = static_cast<FrameNode *>(oldNode);
|
||||
QSize frameSize(width(), height());
|
||||
QRect geometry = frameNode->contentsRect(frameSize);
|
||||
QSGNode *node = oldNode->firstChild();
|
||||
while (node) {
|
||||
static_cast<FrameItemNode *>(node)->reposition(geometry, frameSize);
|
||||
node = node->nextSibling();
|
||||
}
|
||||
|
||||
m_sizeChanged = false;
|
||||
}
|
||||
} else {
|
||||
ManagedTextureNode *textureNode = dynamic_cast<ManagedTextureNode *>(oldNode);
|
||||
if (!textureNode) {
|
||||
delete oldNode;
|
||||
textureNode = new ManagedTextureNode;
|
||||
m_textureChanged = true; // force updating the texture on our newly created node
|
||||
oldNode = textureNode;
|
||||
}
|
||||
textureNode->setFiltering(filtering);
|
||||
|
||||
if ((m_textureChanged || m_sizeChanged) || textureNode->texture()->textureSize() != m_frameSvg->size()) {
|
||||
QImage image = m_frameSvg->framePixmap().toImage();
|
||||
textureNode->setTexture(s_cache->loadTexture(window(), image));
|
||||
textureNode->setRect(0, 0, width(), height());
|
||||
|
||||
m_textureChanged = false;
|
||||
m_sizeChanged = false;
|
||||
}
|
||||
}
|
||||
|
||||
return oldNode;
|
||||
}
|
||||
|
||||
void FrameSvgItem::classBegin()
|
||||
{
|
||||
QQuickItem::classBegin();
|
||||
m_frameSvg->setRepaintBlocked(true);
|
||||
}
|
||||
|
||||
void FrameSvgItem::componentComplete()
|
||||
{
|
||||
m_kirigamiTheme = qobject_cast<Kirigami::Platform::PlatformTheme *>(qmlAttachedPropertiesObject<Kirigami::Platform::PlatformTheme>(this, true));
|
||||
if (!m_kirigamiTheme) {
|
||||
qCWarning(LOG_KSVGQML) << "no theme!" << qmlAttachedPropertiesObject<Kirigami::Platform::PlatformTheme>(this, true) << this;
|
||||
return;
|
||||
}
|
||||
|
||||
auto checkApplyTheme = [this]() {
|
||||
if (!m_frameSvg->imageSet()->filePath(QStringLiteral("colors")).isEmpty()) {
|
||||
m_frameSvg->clearCache();
|
||||
m_frameSvg->clearColorOverrides();
|
||||
}
|
||||
};
|
||||
auto applyTheme = [this]() {
|
||||
if (!m_frameSvg->imageSet()->filePath(QStringLiteral("colors")).isEmpty()) {
|
||||
m_frameSvg->clearCache();
|
||||
m_frameSvg->clearColorOverrides();
|
||||
|
||||
return;
|
||||
}
|
||||
m_frameSvg->setColor(Svg::Text, m_kirigamiTheme->textColor());
|
||||
m_frameSvg->setColor(Svg::Background, m_kirigamiTheme->backgroundColor());
|
||||
m_frameSvg->setColor(Svg::Highlight, m_kirigamiTheme->highlightColor());
|
||||
m_frameSvg->setColor(Svg::HighlightedText, m_kirigamiTheme->highlightedTextColor());
|
||||
m_frameSvg->setColor(Svg::PositiveText, m_kirigamiTheme->positiveTextColor());
|
||||
m_frameSvg->setColor(Svg::NeutralText, m_kirigamiTheme->neutralTextColor());
|
||||
m_frameSvg->setColor(Svg::NegativeText, m_kirigamiTheme->negativeTextColor());
|
||||
};
|
||||
applyTheme();
|
||||
connect(m_kirigamiTheme, &Kirigami::Platform::PlatformTheme::colorsChanged, this, applyTheme);
|
||||
connect(m_frameSvg->imageSet(), &ImageSet::imageSetChanged, this, checkApplyTheme);
|
||||
connect(m_frameSvg, &Svg::imageSetChanged, this, checkApplyTheme);
|
||||
|
||||
CheckMarginsChange checkMargins(m_oldMargins, m_margins);
|
||||
CheckMarginsChange checkFixedMargins(m_oldFixedMargins, m_fixedMargins);
|
||||
CheckMarginsChange checkInsetMargins(m_oldInsetMargins, m_insetMargins);
|
||||
|
||||
QQuickItem::componentComplete();
|
||||
m_frameSvg->resizeFrame(size());
|
||||
m_frameSvg->setRepaintBlocked(false);
|
||||
m_textureChanged = true;
|
||||
}
|
||||
|
||||
void FrameSvgItem::updateDevicePixelRatio()
|
||||
{
|
||||
const auto newDevicePixelRatio = std::max<qreal>(1.0, (window() ? window()->devicePixelRatio() : qApp->devicePixelRatio()));
|
||||
if (newDevicePixelRatio != m_frameSvg->devicePixelRatio()) {
|
||||
m_frameSvg->setDevicePixelRatio(newDevicePixelRatio);
|
||||
m_textureChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
void FrameSvgItem::applyPrefixes()
|
||||
{
|
||||
if (m_frameSvg->imagePath().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const QString oldPrefix = m_frameSvg->prefix();
|
||||
|
||||
if (m_prefixes.isEmpty()) {
|
||||
m_frameSvg->setElementPrefix(QString());
|
||||
if (oldPrefix != m_frameSvg->prefix()) {
|
||||
Q_EMIT usedPrefixChanged();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
bool found = false;
|
||||
for (const QString &prefix : std::as_const(m_prefixes)) {
|
||||
if (m_frameSvg->hasElementPrefix(prefix)) {
|
||||
m_frameSvg->setElementPrefix(prefix);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
// this setElementPrefix is done to keep the same behavior as before, when it was a simple string
|
||||
m_frameSvg->setElementPrefix(m_prefixes.constLast());
|
||||
}
|
||||
if (oldPrefix != m_frameSvg->prefix()) {
|
||||
Q_EMIT usedPrefixChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void FrameSvgItem::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value)
|
||||
{
|
||||
if (change == ItemSceneChange && value.window) {
|
||||
updateDevicePixelRatio();
|
||||
} else if (change == QQuickItem::ItemDevicePixelRatioHasChanged) {
|
||||
updateDevicePixelRatio();
|
||||
}
|
||||
|
||||
QQuickItem::itemChange(change, value);
|
||||
}
|
||||
|
||||
} // KSvg namespace
|
||||
|
||||
#include "moc_framesvgitem.cpp"
|
||||
@@ -0,0 +1,328 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2010 Marco Martin <mart@kde.org>
|
||||
SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#ifndef FRAMESVGITEM_P
|
||||
#define FRAMESVGITEM_P
|
||||
|
||||
#include <QQmlParserStatus>
|
||||
#include <QQuickItem>
|
||||
|
||||
#include <KSvg/FrameSvg>
|
||||
|
||||
#include <qqmlregistration.h>
|
||||
|
||||
namespace Kirigami
|
||||
{
|
||||
namespace Platform
|
||||
{
|
||||
class PlatformTheme;
|
||||
}
|
||||
};
|
||||
|
||||
namespace KSvg
|
||||
{
|
||||
class FrameSvg;
|
||||
|
||||
/**
|
||||
* @class FrameSvgItemMargins
|
||||
*
|
||||
* @short The sizes of a frame's margins.
|
||||
*/
|
||||
class FrameSvgItemMargins : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
QML_UNCREATABLE("FrameSvgItemMargins are read-only properties of FrameSvgItem")
|
||||
|
||||
/**
|
||||
* @brief This property holds the left margin's width in pixels.
|
||||
* @property real left
|
||||
*/
|
||||
Q_PROPERTY(qreal left READ left NOTIFY marginsChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the top margin's width in pixels.
|
||||
* @property real top
|
||||
*/
|
||||
Q_PROPERTY(qreal top READ top NOTIFY marginsChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the right margin's width in pixels.
|
||||
* @property real right
|
||||
*/
|
||||
Q_PROPERTY(qreal right READ right NOTIFY marginsChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the bottom margin's width in pixels.
|
||||
* @property real bottom
|
||||
*/
|
||||
Q_PROPERTY(qreal bottom READ bottom NOTIFY marginsChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the combined width of the left and right margins.
|
||||
* @property real horizontal
|
||||
*/
|
||||
Q_PROPERTY(qreal horizontal READ horizontal NOTIFY marginsChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the combined width of the top and bottom margins.
|
||||
* @property real vertical
|
||||
*/
|
||||
Q_PROPERTY(qreal vertical READ vertical NOTIFY marginsChanged)
|
||||
|
||||
public:
|
||||
FrameSvgItemMargins(KSvg::FrameSvg *frameSvg, QObject *parent = nullptr);
|
||||
|
||||
qreal left() const;
|
||||
qreal top() const;
|
||||
qreal right() const;
|
||||
qreal bottom() const;
|
||||
qreal horizontal() const;
|
||||
qreal vertical() const;
|
||||
|
||||
/// returns a vector with left, top, right, bottom
|
||||
QList<qreal> margins() const;
|
||||
|
||||
void setFixed(bool fixed);
|
||||
bool isFixed() const;
|
||||
|
||||
void setInset(bool inset);
|
||||
bool isInset() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
void update();
|
||||
|
||||
Q_SIGNALS:
|
||||
void marginsChanged();
|
||||
|
||||
private:
|
||||
FrameSvg *m_frameSvg;
|
||||
bool m_fixed;
|
||||
bool m_inset;
|
||||
};
|
||||
|
||||
/**
|
||||
* @class FrameSvgItem
|
||||
* @short An SVG Item with borders.
|
||||
* @import org.kde.ksvg
|
||||
*/
|
||||
class FrameSvgItem : public QQuickItem
|
||||
{
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
Q_INTERFACES(QQmlParserStatus)
|
||||
|
||||
/**
|
||||
* @brief This property specifies the relative path of the SVG in the theme.
|
||||
*
|
||||
* Example: "widgets/background"
|
||||
*
|
||||
* @property QString imagePath
|
||||
*/
|
||||
Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath NOTIFY imagePathChanged)
|
||||
|
||||
/**
|
||||
* This property holds the prefix for the SVG.
|
||||
* prefix for the 9-piece SVG, like "pushed" or "normal" for a button.
|
||||
* see https://techbase.kde.org/Development/Tutorials/Plasma5/ThemeDetails
|
||||
* for a list of paths and prefixes
|
||||
* It can also be an array of strings, specifying a fallback chain in case
|
||||
* the first element isn't found in the theme, eg ["toolbutton-normal", "normal"]
|
||||
* so it's easy to keep backwards compatibility with old themes
|
||||
* (Note: fallback chain is supported only @since 5.32)
|
||||
*/
|
||||
Q_PROPERTY(QVariant prefix READ prefix WRITE setPrefix NOTIFY prefixChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the actual prefix that was used, if a fallback
|
||||
* chain array was set as "prefix".
|
||||
*
|
||||
* @since 5.34
|
||||
* @property QString usedPrefix
|
||||
*/
|
||||
Q_PROPERTY(QString usedPrefix READ usedPrefix NOTIFY usedPrefixChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the frame's margins.
|
||||
* @see FrameSvgItemMargins
|
||||
* @property FrameSvgItemMargins margins
|
||||
*/
|
||||
Q_PROPERTY(KSvg::FrameSvgItemMargins *margins READ margins CONSTANT)
|
||||
|
||||
/**
|
||||
* @brief This property holds the fixed margins of the frame which are used
|
||||
* regardless of any margins being enabled or not.
|
||||
*
|
||||
* @see FrameSvgItemMargins
|
||||
* @property FrameSvgItemMargins margins
|
||||
*/
|
||||
Q_PROPERTY(KSvg::FrameSvgItemMargins *fixedMargins READ fixedMargins CONSTANT)
|
||||
|
||||
/**
|
||||
* @brief This property holds the frame's inset.
|
||||
*
|
||||
* @see FrameSvgItemMargins
|
||||
*
|
||||
* @since 5.77
|
||||
* @property FrameSvgItemMargins margins
|
||||
*/
|
||||
Q_PROPERTY(KSvg::FrameSvgItemMargins *inset READ inset CONSTANT)
|
||||
|
||||
/**
|
||||
* @brief This property specifies which borders are shown.
|
||||
* @see KSvg::FrameSvg::EnabledBorder
|
||||
* @property flags<KSvg::FrameSvg::EnabledBorder> enabledBorders
|
||||
*/
|
||||
Q_PROPERTY(KSvg::FrameSvg::EnabledBorders enabledBorders READ enabledBorders WRITE setEnabledBorders NOTIFY enabledBordersChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds whether the current SVG is present in
|
||||
* the currently-used theme and no fallback is involved.
|
||||
*/
|
||||
Q_PROPERTY(bool fromCurrentImageSet READ fromCurrentImageSet NOTIFY fromCurrentImageSetChanged)
|
||||
|
||||
/**
|
||||
* @brief This property specifies the SVG's status.
|
||||
*
|
||||
* Depending on the specified status, the SVG will use different colors:
|
||||
* * Normal: text's color is textColor, and background color is
|
||||
* backgroundColor.
|
||||
* * Selected: text color becomes highlightedText and background color is
|
||||
* changed to highlightColor.
|
||||
*
|
||||
* @see Kirigami::PlatformTheme
|
||||
* @see KSvg::Svg::status
|
||||
* @since 5.23
|
||||
* @property enum<KSvg::Svg::Status> status
|
||||
*/
|
||||
Q_PROPERTY(KSvg::Svg::Status status READ status WRITE setStatus NOTIFY statusChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the mask that contains the SVG's painted areas.
|
||||
* @since 5.58
|
||||
* @property QRegion mask
|
||||
*/
|
||||
Q_PROPERTY(QRegion mask READ mask NOTIFY maskChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the minimum height required to correctly draw
|
||||
* this SVG.
|
||||
*
|
||||
* @since 5.101
|
||||
* @property int minimumDrawingHeight
|
||||
*/
|
||||
Q_PROPERTY(int minimumDrawingHeight READ minimumDrawingHeight NOTIFY repaintNeeded)
|
||||
|
||||
/**
|
||||
* @brief This property holds the minimum width required to correctly draw
|
||||
* this SVG.
|
||||
*
|
||||
* @since 5.101
|
||||
* @property int minimumDrawingWidth
|
||||
*/
|
||||
Q_PROPERTY(int minimumDrawingWidth READ minimumDrawingWidth NOTIFY repaintNeeded)
|
||||
|
||||
public:
|
||||
/**
|
||||
* @return whether the svg has the necessary elements with the given prefix
|
||||
* to draw a frame.
|
||||
*
|
||||
* @param prefix the given prefix we want to check if drawable
|
||||
*/
|
||||
Q_INVOKABLE bool hasElementPrefix(const QString &prefix) const;
|
||||
|
||||
/**
|
||||
* @return whether the SVG includes the given element.
|
||||
*
|
||||
* This is a convenience function that forwards to hasElement().
|
||||
*
|
||||
* @see KSvg::Svg::hasElement()
|
||||
*/
|
||||
Q_INVOKABLE bool hasElement(const QString &elementName) const;
|
||||
|
||||
/// @cond INTERNAL_DOCS
|
||||
FrameSvgItem(QQuickItem *parent = nullptr);
|
||||
~FrameSvgItem() override;
|
||||
|
||||
void setImagePath(const QString &path);
|
||||
QString imagePath() const;
|
||||
|
||||
void setPrefix(const QVariant &prefix);
|
||||
QVariant prefix() const;
|
||||
|
||||
QString usedPrefix() const;
|
||||
|
||||
void setEnabledBorders(const KSvg::FrameSvg::EnabledBorders borders);
|
||||
KSvg::FrameSvg::EnabledBorders enabledBorders() const;
|
||||
|
||||
void setColorSet(KSvg::Svg::ColorSet colorSet);
|
||||
KSvg::Svg::ColorSet colorSet() const;
|
||||
|
||||
FrameSvgItemMargins *margins();
|
||||
FrameSvgItemMargins *fixedMargins();
|
||||
FrameSvgItemMargins *inset();
|
||||
|
||||
bool fromCurrentImageSet() const;
|
||||
|
||||
void setStatus(KSvg::Svg::Status status);
|
||||
KSvg::Svg::Status status() const;
|
||||
int minimumDrawingHeight() const;
|
||||
int minimumDrawingWidth() const;
|
||||
|
||||
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
|
||||
|
||||
QRegion mask() const;
|
||||
|
||||
/**
|
||||
* Only to be used from inside this library, is not intended to be invokable
|
||||
*/
|
||||
KSvg::FrameSvg *frameSvg() const;
|
||||
|
||||
QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override;
|
||||
|
||||
void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) override;
|
||||
|
||||
protected:
|
||||
void classBegin() override;
|
||||
void componentComplete() override;
|
||||
|
||||
/// @endcond
|
||||
|
||||
Q_SIGNALS:
|
||||
void imagePathChanged();
|
||||
void prefixChanged();
|
||||
void enabledBordersChanged();
|
||||
void fromCurrentImageSetChanged();
|
||||
void repaintNeeded();
|
||||
void statusChanged();
|
||||
void usedPrefixChanged();
|
||||
void maskChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
void doUpdate();
|
||||
|
||||
private:
|
||||
void updateDevicePixelRatio();
|
||||
void applyPrefixes();
|
||||
|
||||
KSvg::FrameSvg *m_frameSvg;
|
||||
Kirigami::Platform::PlatformTheme *m_kirigamiTheme;
|
||||
FrameSvgItemMargins *m_margins;
|
||||
FrameSvgItemMargins *m_fixedMargins;
|
||||
FrameSvgItemMargins *m_insetMargins;
|
||||
// logged margins to check for changes
|
||||
QList<qreal> m_oldMargins;
|
||||
QList<qreal> m_oldFixedMargins;
|
||||
QList<qreal> m_oldInsetMargins;
|
||||
QStringList m_prefixes;
|
||||
bool m_textureChanged;
|
||||
bool m_sizeChanged;
|
||||
bool m_fastPath;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "imagetexturescache.h"
|
||||
#include <QSGTexture>
|
||||
|
||||
typedef QHash<qint64, QHash<QWindow *, QWeakPointer<QSGTexture>>> TexturesCache;
|
||||
|
||||
class ImageTexturesCachePrivate
|
||||
{
|
||||
public:
|
||||
TexturesCache cache;
|
||||
};
|
||||
|
||||
ImageTexturesCache::ImageTexturesCache()
|
||||
: d(new ImageTexturesCachePrivate)
|
||||
{
|
||||
}
|
||||
|
||||
ImageTexturesCache::~ImageTexturesCache()
|
||||
{
|
||||
}
|
||||
|
||||
QSharedPointer<QSGTexture> ImageTexturesCache::loadTexture(QQuickWindow *window, const QImage &image, QQuickWindow::CreateTextureOptions options)
|
||||
{
|
||||
qint64 id = image.cacheKey();
|
||||
QSharedPointer<QSGTexture> texture = d->cache.value(id).value(window).toStrongRef();
|
||||
|
||||
if (!texture) {
|
||||
auto cleanAndDelete = [this, window, id](QSGTexture *texture) {
|
||||
QHash<QWindow *, QWeakPointer<QSGTexture>> &textures = (d->cache)[id];
|
||||
textures.remove(window);
|
||||
if (textures.isEmpty()) {
|
||||
d->cache.remove(id);
|
||||
}
|
||||
delete texture;
|
||||
};
|
||||
texture = QSharedPointer<QSGTexture>(window->createTextureFromImage(image, options), cleanAndDelete);
|
||||
(d->cache)[id][window] = texture.toWeakRef();
|
||||
}
|
||||
|
||||
// if we have a cache in an atlas but our request cannot use an atlassed texture
|
||||
// create a new texture and use that
|
||||
// don't use removedFromAtlas() as that requires keeping a reference to the non atlased version
|
||||
if (!(options & QQuickWindow::TextureCanUseAtlas) && texture->isAtlasTexture()) {
|
||||
texture = QSharedPointer<QSGTexture>(window->createTextureFromImage(image, options));
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
QSharedPointer<QSGTexture> ImageTexturesCache::loadTexture(QQuickWindow *window, const QImage &image)
|
||||
{
|
||||
return loadTexture(window, image, QQuickWindow::CreateTextureOptions());
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef IMAGETEXTURESCACHE_H
|
||||
#define IMAGETEXTURESCACHE_H
|
||||
|
||||
#include <QQuickWindow>
|
||||
#include <QSharedPointer>
|
||||
|
||||
class QImage;
|
||||
class QSGTexture;
|
||||
class ImageTexturesCachePrivate;
|
||||
|
||||
/**
|
||||
* @class ImageTexturesCache imagetexturescache.h KQuickAddons/ImageTexturesCache
|
||||
*
|
||||
* @short Helps to manage textures by creating images and reference counts them.
|
||||
*
|
||||
* Use this class as a factory for textures, when creating them from a QImage
|
||||
* instance. Keeps track of all the created textures in a map between the
|
||||
* QImage::cacheKey() and the cached texture until it gets de-referenced.
|
||||
*
|
||||
* @see ManagedTextureNode
|
||||
*/
|
||||
class ImageTexturesCache
|
||||
{
|
||||
public:
|
||||
ImageTexturesCache();
|
||||
~ImageTexturesCache();
|
||||
|
||||
/**
|
||||
* @returns the texture for a given @p window and @p image.
|
||||
*
|
||||
* If @p image id is the same as one already provided before, we will not
|
||||
* create a new texture, and will instead return a shared pointer to the existing texture.
|
||||
*/
|
||||
QSharedPointer<QSGTexture> loadTexture(QQuickWindow *window, const QImage &image, QQuickWindow::CreateTextureOptions options);
|
||||
|
||||
QSharedPointer<QSGTexture> loadTexture(QQuickWindow *window, const QImage &image);
|
||||
|
||||
private:
|
||||
QScopedPointer<ImageTexturesCachePrivate> d;
|
||||
};
|
||||
|
||||
#endif // IMAGETEXTURESCACHE_H
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "managedtexturenode.h"
|
||||
|
||||
ManagedTextureNode::ManagedTextureNode()
|
||||
{
|
||||
}
|
||||
|
||||
void ManagedTextureNode::setTexture(QSharedPointer<QSGTexture> texture)
|
||||
{
|
||||
m_texture = texture;
|
||||
QSGSimpleTextureNode::setTexture(texture.data());
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef MANAGEDTEXTURENODE_H
|
||||
#define MANAGEDTEXTURENODE_H
|
||||
|
||||
#include <QSGSimpleTextureNode>
|
||||
#include <QSGTexture>
|
||||
#include <QSharedPointer>
|
||||
#include <qglobal.h>
|
||||
|
||||
class ManagedTextureNode : public QSGSimpleTextureNode
|
||||
{
|
||||
Q_DISABLE_COPY(ManagedTextureNode)
|
||||
public:
|
||||
ManagedTextureNode();
|
||||
|
||||
void setTexture(QSharedPointer<QSGTexture> texture);
|
||||
|
||||
private:
|
||||
QSharedPointer<QSGTexture> m_texture;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2010 Marco Martin <mart@kde.org>
|
||||
SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "svgitem.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QQuickWindow>
|
||||
#include <QRectF>
|
||||
#include <QSGTexture>
|
||||
|
||||
#include "ksvg/svg.h"
|
||||
|
||||
#include "managedtexturenode.h"
|
||||
|
||||
#include <Kirigami/Platform/PlatformTheme>
|
||||
#include <debug_p.h>
|
||||
|
||||
namespace KSvg
|
||||
{
|
||||
SvgItem::SvgItem(QQuickItem *parent)
|
||||
: QQuickItem(parent)
|
||||
, m_textureChanged(false)
|
||||
{
|
||||
m_svg = new KSvg::Svg(this);
|
||||
setFlag(QQuickItem::ItemHasContents, true);
|
||||
|
||||
connect(m_svg, &Svg::repaintNeeded, this, &SvgItem::updateNeeded);
|
||||
connect(m_svg, &Svg::repaintNeeded, this, &SvgItem::naturalSizeChanged);
|
||||
connect(m_svg, &Svg::sizeChanged, this, &SvgItem::naturalSizeChanged);
|
||||
connect(m_svg, &Svg::repaintNeeded, this, &SvgItem::elementRectChanged);
|
||||
connect(m_svg, &Svg::sizeChanged, this, &SvgItem::elementRectChanged);
|
||||
}
|
||||
|
||||
SvgItem::~SvgItem()
|
||||
{
|
||||
// Make sure to not call anything on m_svg when this is shutting down
|
||||
// Kirigami::PlatformTheme will lose its window at that point so will
|
||||
// emit colorschanged, which we shouldn't react to during destructor
|
||||
disconnect(m_kirigamiTheme, nullptr, this, nullptr);
|
||||
}
|
||||
|
||||
void SvgItem::componentComplete()
|
||||
{
|
||||
m_kirigamiTheme = qobject_cast<Kirigami::Platform::PlatformTheme *>(qmlAttachedPropertiesObject<Kirigami::Platform::PlatformTheme>(this, true));
|
||||
if (!m_kirigamiTheme) {
|
||||
qCWarning(LOG_KSVGQML) << "No theme!" << qmlAttachedPropertiesObject<Kirigami::Platform::PlatformTheme>(this, true) << this;
|
||||
return;
|
||||
}
|
||||
|
||||
auto checkApplyTheme = [this]() {
|
||||
if (!m_svg->imageSet()->filePath(QStringLiteral("colors")).isEmpty()) {
|
||||
m_svg->clearColorOverrides();
|
||||
}
|
||||
};
|
||||
auto applyTheme = [this]() {
|
||||
if (!m_svg) {
|
||||
return;
|
||||
}
|
||||
if (!m_svg->imageSet()->filePath(QStringLiteral("colors")).isEmpty()) {
|
||||
m_svg->clearColorOverrides();
|
||||
return;
|
||||
}
|
||||
m_svg->setColor(Svg::Text, m_kirigamiTheme->textColor());
|
||||
m_svg->setColor(Svg::Background, m_kirigamiTheme->backgroundColor());
|
||||
m_svg->setColor(Svg::Highlight, m_kirigamiTheme->highlightColor());
|
||||
m_svg->setColor(Svg::HighlightedText, m_kirigamiTheme->highlightedTextColor());
|
||||
m_svg->setColor(Svg::PositiveText, m_kirigamiTheme->positiveTextColor());
|
||||
m_svg->setColor(Svg::NeutralText, m_kirigamiTheme->neutralTextColor());
|
||||
m_svg->setColor(Svg::NegativeText, m_kirigamiTheme->negativeTextColor());
|
||||
};
|
||||
applyTheme();
|
||||
connect(m_kirigamiTheme, &Kirigami::Platform::PlatformTheme::colorsChanged, this, applyTheme);
|
||||
connect(m_svg->imageSet(), &ImageSet::imageSetChanged, this, checkApplyTheme);
|
||||
connect(m_svg, &Svg::imageSetChanged, this, checkApplyTheme);
|
||||
|
||||
QQuickItem::componentComplete();
|
||||
}
|
||||
|
||||
void SvgItem::setImagePath(const QString &path)
|
||||
{
|
||||
if (!m_svg || m_svg->imagePath() == path) {
|
||||
return;
|
||||
}
|
||||
|
||||
updateDevicePixelRatio();
|
||||
m_svg->setImagePath(path);
|
||||
|
||||
Q_EMIT imagePathChanged();
|
||||
|
||||
if (isComponentComplete()) {
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
QString SvgItem::imagePath() const
|
||||
{
|
||||
return m_svg->imagePath();
|
||||
}
|
||||
|
||||
void SvgItem::setElementId(const QString &elementID)
|
||||
{
|
||||
if (elementID == m_elementID) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (implicitWidth() <= 0) {
|
||||
setImplicitWidth(naturalSize().width());
|
||||
}
|
||||
if (implicitHeight() <= 0) {
|
||||
setImplicitHeight(naturalSize().height());
|
||||
}
|
||||
|
||||
m_elementID = elementID;
|
||||
Q_EMIT elementIdChanged();
|
||||
Q_EMIT naturalSizeChanged();
|
||||
Q_EMIT elementRectChanged();
|
||||
|
||||
scheduleImageUpdate();
|
||||
}
|
||||
|
||||
QString SvgItem::elementId() const
|
||||
{
|
||||
return m_elementID;
|
||||
}
|
||||
|
||||
void SvgItem::setSvg(KSvg::Svg *svg)
|
||||
{
|
||||
if (m_svg) {
|
||||
disconnect(m_svg.data(), nullptr, this, nullptr);
|
||||
}
|
||||
m_svg = svg;
|
||||
|
||||
if (svg) {
|
||||
connect(svg, &Svg::repaintNeeded, this, &SvgItem::updateNeeded);
|
||||
connect(svg, &Svg::repaintNeeded, this, &SvgItem::naturalSizeChanged);
|
||||
connect(svg, &Svg::repaintNeeded, this, &SvgItem::elementRectChanged);
|
||||
connect(svg, &Svg::sizeChanged, this, &SvgItem::naturalSizeChanged);
|
||||
connect(svg, &Svg::sizeChanged, this, &SvgItem::elementRectChanged);
|
||||
}
|
||||
|
||||
if (implicitWidth() <= 0) {
|
||||
setImplicitWidth(naturalSize().width());
|
||||
}
|
||||
if (implicitHeight() <= 0) {
|
||||
setImplicitHeight(naturalSize().height());
|
||||
}
|
||||
|
||||
scheduleImageUpdate();
|
||||
|
||||
Q_EMIT svgChanged();
|
||||
Q_EMIT naturalSizeChanged();
|
||||
Q_EMIT elementRectChanged();
|
||||
Q_EMIT imagePathChanged();
|
||||
}
|
||||
|
||||
KSvg::Svg *SvgItem::svg() const
|
||||
{
|
||||
return m_svg.data();
|
||||
}
|
||||
|
||||
QSizeF SvgItem::naturalSize() const
|
||||
{
|
||||
if (!m_svg) {
|
||||
return QSizeF();
|
||||
} else if (!m_elementID.isEmpty()) {
|
||||
return m_svg->elementSize(m_elementID);
|
||||
}
|
||||
|
||||
return m_svg->size();
|
||||
}
|
||||
|
||||
QRectF SvgItem::elementRect() const
|
||||
{
|
||||
if (!m_svg) {
|
||||
return QRectF();
|
||||
} else if (!m_elementID.isEmpty()) {
|
||||
return m_svg->elementRect(m_elementID);
|
||||
}
|
||||
|
||||
return QRectF(QPointF(0, 0), m_svg->size());
|
||||
}
|
||||
|
||||
QSGNode *SvgItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData)
|
||||
{
|
||||
Q_UNUSED(updatePaintNodeData);
|
||||
if (!window() || !m_svg) {
|
||||
delete oldNode;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// this is more than just an optimization, uploading a null image to QSGAtlasTexture causes a crash
|
||||
if (width() == 0.0 || height() == 0.0) {
|
||||
delete oldNode;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ManagedTextureNode *textureNode = static_cast<ManagedTextureNode *>(oldNode);
|
||||
if (!textureNode) {
|
||||
textureNode = new ManagedTextureNode;
|
||||
m_textureChanged = true;
|
||||
}
|
||||
|
||||
// TODO use a heuristic to work out when to redraw
|
||||
// if !m_smooth and size is approximate simply change the textureNode.rect without
|
||||
// updating the material
|
||||
|
||||
if (m_textureChanged || textureNode->texture()->textureSize() != QSize(width(), height())) {
|
||||
// despite having a valid size sometimes we still get a null QImage from KSvg::Svg
|
||||
// loading a null texture to an atlas fatals
|
||||
// Dave E fixed this in Qt in 5.3.something onwards but we need this for now
|
||||
if (m_image.isNull()) {
|
||||
delete textureNode;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QSharedPointer<QSGTexture> texture(window()->createTextureFromImage(m_image, QQuickWindow::TextureCanUseAtlas));
|
||||
textureNode->setTexture(texture);
|
||||
m_textureChanged = false;
|
||||
|
||||
textureNode->setRect(0, 0, width(), height());
|
||||
}
|
||||
|
||||
textureNode->setFiltering(smooth() ? QSGTexture::Linear : QSGTexture::Nearest);
|
||||
|
||||
return textureNode;
|
||||
}
|
||||
|
||||
void SvgItem::updateNeeded()
|
||||
{
|
||||
if (implicitWidth() <= 0) {
|
||||
setImplicitWidth(naturalSize().width());
|
||||
}
|
||||
if (implicitHeight() <= 0) {
|
||||
setImplicitHeight(naturalSize().height());
|
||||
}
|
||||
scheduleImageUpdate();
|
||||
}
|
||||
|
||||
void SvgItem::scheduleImageUpdate()
|
||||
{
|
||||
polish();
|
||||
update();
|
||||
}
|
||||
|
||||
void SvgItem::updatePolish()
|
||||
{
|
||||
QQuickItem::updatePolish();
|
||||
|
||||
if (m_svg) {
|
||||
// setContainsMultipleImages has to be done there since m_svg can be shared with somebody else
|
||||
m_textureChanged = true;
|
||||
m_svg->setContainsMultipleImages(!m_elementID.isEmpty());
|
||||
m_image = m_svg->image(QSize(width(), height()), m_elementID);
|
||||
}
|
||||
}
|
||||
|
||||
void SvgItem::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
|
||||
{
|
||||
if (newGeometry.size() != oldGeometry.size() && newGeometry.isValid()) {
|
||||
scheduleImageUpdate();
|
||||
}
|
||||
|
||||
QQuickItem::geometryChange(newGeometry, oldGeometry);
|
||||
}
|
||||
|
||||
void SvgItem::updateDevicePixelRatio()
|
||||
{
|
||||
const auto newDevicePixelRatio = std::max<qreal>(1.0, (window() ? window()->devicePixelRatio() : qApp->devicePixelRatio()));
|
||||
if (newDevicePixelRatio != m_svg->devicePixelRatio()) {
|
||||
m_svg->setDevicePixelRatio(newDevicePixelRatio);
|
||||
m_textureChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SvgItem::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value)
|
||||
{
|
||||
if (change == ItemSceneChange && value.window) {
|
||||
updateDevicePixelRatio();
|
||||
} else if (change == QQuickItem::ItemDevicePixelRatioHasChanged) {
|
||||
updateDevicePixelRatio();
|
||||
}
|
||||
|
||||
QQuickItem::itemChange(change, value);
|
||||
}
|
||||
|
||||
} // KSvg namespace
|
||||
|
||||
#include "moc_svgitem.cpp"
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2010 Marco Martin <mart@kde.org>
|
||||
SPDX-FileCopyrightText: 2014 David Edmundson <davidedmundson@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#ifndef SVGITEM_P
|
||||
#define SVGITEM_P
|
||||
|
||||
#include <QImage>
|
||||
#include <QQuickItem>
|
||||
|
||||
#include <qqmlregistration.h>
|
||||
|
||||
namespace Kirigami
|
||||
{
|
||||
namespace Platform
|
||||
{
|
||||
class PlatformTheme;
|
||||
}
|
||||
};
|
||||
|
||||
namespace KSvg
|
||||
{
|
||||
class Svg;
|
||||
|
||||
/**
|
||||
* @class SvgItem
|
||||
* @short Displays an SVG or an element from an SVG file
|
||||
*/
|
||||
class SvgItem : public QQuickItem
|
||||
{
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
|
||||
/**
|
||||
* @brief This property specifies the relative path of the Svg in the theme.
|
||||
*
|
||||
* Example: "widgets/background"
|
||||
*
|
||||
* @property QString imagePath
|
||||
*/
|
||||
Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath NOTIFY imagePathChanged)
|
||||
|
||||
/**
|
||||
* @brief This property specifies the sub-element of the SVG to be
|
||||
* rendered.
|
||||
*
|
||||
* If this is empty, the whole SVG document will be rendered.
|
||||
*
|
||||
* @property QString elementId
|
||||
*/
|
||||
Q_PROPERTY(QString elementId READ elementId WRITE setElementId NOTIFY elementIdChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the SVG's natural, unscaled size.
|
||||
*
|
||||
* This is useful if a pixel-perfect rendering of outlines is needed.
|
||||
*
|
||||
* @property QSizeF naturalSize
|
||||
*/
|
||||
Q_PROPERTY(QSizeF naturalSize READ naturalSize NOTIFY naturalSizeChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the rectangle of the selected elementId
|
||||
* relative to the unscaled size of the SVG document.
|
||||
*
|
||||
* Note that this property will holds the entire SVG if element id is not
|
||||
* selected.
|
||||
*
|
||||
* @property QRectF elementRect
|
||||
*/
|
||||
Q_PROPERTY(QRectF elementRect READ elementRect NOTIFY elementRectChanged)
|
||||
|
||||
/**
|
||||
* @brief This property holds the internal SVG instance.
|
||||
*
|
||||
* Usually, specifying just the imagePath is enough. Use this if you have
|
||||
* many items taking the same SVG as source, and you want to share the
|
||||
* internal SVG object.
|
||||
*
|
||||
* @property KSvg::Svg svg
|
||||
*/
|
||||
Q_PROPERTY(KSvg::Svg *svg READ svg WRITE setSvg NOTIFY svgChanged)
|
||||
|
||||
public:
|
||||
/// @cond INTERNAL_DOCS
|
||||
|
||||
explicit SvgItem(QQuickItem *parent = nullptr);
|
||||
~SvgItem() override;
|
||||
|
||||
void setImagePath(const QString &path);
|
||||
QString imagePath() const;
|
||||
|
||||
void setElementId(const QString &elementID);
|
||||
QString elementId() const;
|
||||
|
||||
void setSvg(KSvg::Svg *svg);
|
||||
KSvg::Svg *svg() const;
|
||||
|
||||
QSizeF naturalSize() const;
|
||||
|
||||
QRectF elementRect() const;
|
||||
|
||||
QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *updatePaintNodeData) override;
|
||||
/// @endcond
|
||||
|
||||
void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data) override;
|
||||
|
||||
protected:
|
||||
void componentComplete() override;
|
||||
|
||||
Q_SIGNALS:
|
||||
void imagePathChanged();
|
||||
void elementIdChanged();
|
||||
void svgChanged();
|
||||
void naturalSizeChanged();
|
||||
void elementRectChanged();
|
||||
|
||||
protected Q_SLOTS:
|
||||
/// @cond INTERNAL_DOCS
|
||||
void updateNeeded();
|
||||
/// @endcond
|
||||
|
||||
private:
|
||||
void updateDevicePixelRatio();
|
||||
void scheduleImageUpdate();
|
||||
void updatePolish() override;
|
||||
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
|
||||
|
||||
QPointer<KSvg::Svg> m_svg;
|
||||
Kirigami::Platform::PlatformTheme *m_kirigamiTheme;
|
||||
QString m_elementID;
|
||||
QImage m_image;
|
||||
bool m_textureChanged;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2023 Nicolas Fella <nicolas.fella@gmx.de>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef KSVG_TYPES_H
|
||||
#define KSVG_TYPES_H
|
||||
|
||||
#include <QQmlEngine>
|
||||
|
||||
#include <Kirigami/Platform/PlatformTheme>
|
||||
|
||||
#include <framesvg.h>
|
||||
#include <svg.h>
|
||||
|
||||
struct PlatformThemeForeign {
|
||||
Q_GADGET
|
||||
QML_ANONYMOUS
|
||||
QML_FOREIGN(Kirigami::Platform::PlatformTheme)
|
||||
};
|
||||
|
||||
struct SvgForeign {
|
||||
Q_GADGET
|
||||
QML_ELEMENT
|
||||
QML_NAMED_ELEMENT(Svg)
|
||||
QML_FOREIGN(KSvg::Svg)
|
||||
};
|
||||
|
||||
struct FrameSvgForeign {
|
||||
Q_GADGET
|
||||
QML_ELEMENT
|
||||
QML_NAMED_ELEMENT(FrameSvg)
|
||||
QML_FOREIGN(KSvg::FrameSvg)
|
||||
};
|
||||
|
||||
struct ImageSetForeign {
|
||||
Q_GADGET
|
||||
QML_ELEMENT
|
||||
QML_SINGLETON
|
||||
QML_NAMED_ELEMENT(ImageSet)
|
||||
QML_FOREIGN(KSvg::ImageSet)
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,2 @@
|
||||
EXTRA defines,kdebug,qenums,tipsandthis
|
||||
SKIP /widgets/template\.h
|
||||
@@ -0,0 +1,119 @@
|
||||
|
||||
|
||||
# Consumer's include dir which has to be explicitly used to make headers of this lib visible to documented includes
|
||||
# Results in duplicate of prefix-dir & C++ namespace below, but part of different things, so by design:
|
||||
# <visibility-layer>/<C++ namespace>/class header files
|
||||
set(KSVG_INSTALL_INCLUDEDIR "${KDE_INSTALL_INCLUDEDIR_KF}/KSvg")
|
||||
|
||||
add_library(KF6Svg)
|
||||
add_library(KF6::Svg ALIAS KF6Svg)
|
||||
|
||||
qt_extract_metatypes(KF6Svg)
|
||||
|
||||
set_target_properties(KF6Svg PROPERTIES
|
||||
VERSION ${KSVG_VERSION}
|
||||
SOVERSION ${KSVG_SOVERSION}
|
||||
EXPORT_NAME Svg
|
||||
)
|
||||
|
||||
target_sources(KF6Svg PRIVATE
|
||||
framesvg.cpp
|
||||
svg.cpp
|
||||
imageset.cpp
|
||||
private/imageset_p.cpp
|
||||
)
|
||||
|
||||
ecm_qt_declare_logging_category(KF6Svg
|
||||
HEADER debug_p.h
|
||||
IDENTIFIER LOG_KSVG
|
||||
CATEGORY_NAME kf.svg
|
||||
DESCRIPTION "KSvg lib"
|
||||
EXPORT KSVG
|
||||
)
|
||||
|
||||
ecm_generate_export_header(KF6Svg
|
||||
EXPORT_FILE_NAME ksvg/ksvg_export.h
|
||||
BASE_NAME KSvg
|
||||
GROUP_BASE_NAME KF
|
||||
VERSION ${KF_VERSION}
|
||||
USE_VERSION_HEADER
|
||||
DEPRECATED_BASE_VERSION 0
|
||||
EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
|
||||
DEPRECATION_VERSIONS
|
||||
)
|
||||
|
||||
target_link_libraries(KF6Svg
|
||||
PUBLIC
|
||||
Qt6::Gui
|
||||
KF6::ConfigCore
|
||||
PRIVATE
|
||||
Qt6::Svg
|
||||
KF6::Archive
|
||||
KF6::CoreAddons
|
||||
KF6::GuiAddons #kimagecache
|
||||
KF6::ConfigCore
|
||||
KF6::ColorScheme
|
||||
)
|
||||
|
||||
set(KSvg_BUILD_INCLUDE_DIRS
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/KSvg
|
||||
)
|
||||
target_include_directories(KF6Svg
|
||||
PUBLIC
|
||||
"$<BUILD_INTERFACE:${KSvg_BUILD_INCLUDE_DIRS}>"
|
||||
INTERFACE
|
||||
"$<INSTALL_INTERFACE:${KSVG_INSTALL_INCLUDEDIR}>"
|
||||
)
|
||||
|
||||
########### install files ###############
|
||||
ecm_generate_headers(KSvg_CamelCase_HEADERS
|
||||
HEADER_NAMES
|
||||
FrameSvg
|
||||
Svg
|
||||
ImageSet
|
||||
REQUIRED_HEADERS KSvg_namespaced_HEADERS
|
||||
PREFIX KSvg
|
||||
)
|
||||
|
||||
install(
|
||||
FILES ${KSvg_namespaced_HEADERS}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/ksvg/ksvg_export.h
|
||||
DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KSvg/ksvg # C++ namespace
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
install(
|
||||
FILES ${KSvg_CamelCase_HEADERS}
|
||||
DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KSvg/KSvg # C++ namespace
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
install(TARGETS KF6Svg EXPORT KF6SvgTargets ${KF_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||
|
||||
if(BUILD_QCH)
|
||||
ecm_add_qch(
|
||||
KF6Svg_QCH
|
||||
NAME KSvg
|
||||
BASE_NAME KF6Svg
|
||||
VERSION ${KF_VERSION}
|
||||
ORG_DOMAIN org.kde
|
||||
SOURCES # using only public headers, to cover only public API
|
||||
${KSvg_namespaced_HEADERS}
|
||||
../../Mainpage.dox
|
||||
MD_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md"
|
||||
LINK_QCHS
|
||||
Qt6Gui_QCH
|
||||
INCLUDE_DIRS
|
||||
${KSvg_BUILD_INCLUDE_DIRS}
|
||||
BLANK_MACROS
|
||||
KSVG_EXPORT
|
||||
KSVG_DEPRECATED
|
||||
KSVG_DEPRECATED_EXPORT
|
||||
"KSVG_DEPRECATED_VERSION(x, y, t)"
|
||||
TAGFILE_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
|
||||
QCH_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
|
||||
COMPONENT Devel
|
||||
)
|
||||
endif()
|
||||
@@ -0,0 +1,22 @@
|
||||
KSvg
|
||||
|
||||
This directory contains the classes making up KSvg, which provides rendering api for Svg files,
|
||||
and support for the themes used in the Plasma Desktop.
|
||||
|
||||
Domain specific sets of functionality, e.g. for network awareness or sensors,
|
||||
are not found here but as Applet, Wallpaper,
|
||||
ContainmentActions, Containment and other plugins.
|
||||
|
||||
Commit Guidelines:
|
||||
* If your patch is not an obvious or trivial bug fix, have it peer reviewed
|
||||
by another Frameworks developer; https://phabricator.kde.org is your friend :)
|
||||
|
||||
* All code MUST follow the KDE Frameworks coding style, as found at:
|
||||
https://techbase.kde.org/Policies/Frameworks_Coding_Style
|
||||
|
||||
* All new public API MUST have apidox written before committing and must go
|
||||
through an API review with another Frameworks developer. We have to maintain
|
||||
binary compatibility, remember!
|
||||
|
||||
Unit tests are next to godliness.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,420 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2008 Aaron Seigo <aseigo@kde.org>
|
||||
SPDX-FileCopyrightText: 2008 Marco Martin <notmart@gmail.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef KSVG_FRAMESVG_H
|
||||
#define KSVG_FRAMESVG_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QPixmap>
|
||||
|
||||
#include <ksvg/ksvg_export.h>
|
||||
|
||||
#include <ksvg/svg.h>
|
||||
|
||||
class QPainter;
|
||||
class QPoint;
|
||||
class QPointF;
|
||||
class QRect;
|
||||
class QRectF;
|
||||
class QSize;
|
||||
class QSizeF;
|
||||
class QMatrix;
|
||||
|
||||
namespace KSvg
|
||||
{
|
||||
class FrameSvgPrivate;
|
||||
|
||||
/**
|
||||
* @class FrameSvg ksvg/framesvg.h <KSvg/FrameSvg>
|
||||
*
|
||||
* @short Provides an SVG with borders.
|
||||
*
|
||||
* When using SVG images for a background of an object that may change
|
||||
* its aspect ratio, such as a dialog, simply scaling a single image
|
||||
* may not be enough.
|
||||
*
|
||||
* FrameSvg allows SVGs to provide several elements for borders as well
|
||||
* as a central element, each of which are scaled individually. These elements
|
||||
* should be named:
|
||||
* * @c center - the central element, which will be scaled in both directions
|
||||
* * @c top - the top border; the height is fixed, but it will be scaled
|
||||
* horizontally to the same width as @c center
|
||||
* * @c bottom - the bottom border; scaled in the same way as @c top
|
||||
* * @c left - the left border; the width is fixed, but it will be scaled
|
||||
* vertically to the same height as @c center
|
||||
* * @c right - the right border; scaled in the same way as @c left
|
||||
* * @c topleft - fixed size; must be the same height as @c top and the same
|
||||
* width as @c left
|
||||
* * @c bottomleft, @c topright, @c bottomright - similar to @c topleft
|
||||
*
|
||||
* @c center must exist, but all the others are optional. @c topleft and
|
||||
* @c topright will be ignored if @c top does not exist, and similarly for
|
||||
* @c bottomleft and @c bottomright.
|
||||
*
|
||||
* @see KSvg::Svg
|
||||
**/
|
||||
class KSVG_EXPORT FrameSvg : public Svg
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(EnabledBorders enabledBorders READ enabledBorders WRITE setEnabledBorders)
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief This flag enum specifies which borders should be drawn.
|
||||
*/
|
||||
enum EnabledBorder {
|
||||
NoBorder = 0,
|
||||
TopBorder = 1,
|
||||
BottomBorder = 2,
|
||||
LeftBorder = 4,
|
||||
RightBorder = 8,
|
||||
AllBorders = TopBorder | BottomBorder | LeftBorder | RightBorder,
|
||||
};
|
||||
Q_DECLARE_FLAGS(EnabledBorders, EnabledBorder)
|
||||
Q_FLAG(EnabledBorders)
|
||||
|
||||
// TODO: merge those two?
|
||||
enum LocationPrefix {
|
||||
Floating = 0, /**< Free floating.*/
|
||||
TopEdge, /**< Along the top of the screen*/
|
||||
BottomEdge, /**< Along the bottom of the screen*/
|
||||
LeftEdge, /**< Along the left side of the screen */
|
||||
RightEdge, /**< Along the right side of the screen */
|
||||
};
|
||||
Q_ENUM(LocationPrefix)
|
||||
|
||||
enum MarginEdge {
|
||||
TopMargin = 0, /**< The top margin **/
|
||||
BottomMargin, /**< The bottom margin **/
|
||||
LeftMargin, /**< The left margin **/
|
||||
RightMargin, /**< The right margin **/
|
||||
};
|
||||
Q_ENUM(MarginEdge)
|
||||
|
||||
/**
|
||||
* Constructs a new FrameSvg that paints the proper named subelements
|
||||
* as borders. It may also be used as a regular KSvg::Svg object
|
||||
* for direct access to elements in the Svg.
|
||||
*
|
||||
* @param parent options QObject to parent this to
|
||||
*
|
||||
* @related KSvg::Theme
|
||||
*/
|
||||
explicit FrameSvg(QObject *parent = nullptr);
|
||||
~FrameSvg() override;
|
||||
|
||||
/**
|
||||
* Loads a new Svg
|
||||
* @param imagePath the new file
|
||||
*/
|
||||
Q_INVOKABLE void setImagePath(const QString &path) override;
|
||||
|
||||
/**
|
||||
* @brief This method sets which borders should be painted.
|
||||
* @param flags borders we want to paint
|
||||
*
|
||||
* @see ::EnabledBorder
|
||||
* @param borders
|
||||
*/
|
||||
void setEnabledBorders(const EnabledBorders borders);
|
||||
|
||||
/**
|
||||
* @brief This is a convenience method to get the enabled borders.
|
||||
* @return what borders are painted
|
||||
*/
|
||||
EnabledBorders enabledBorders() const;
|
||||
|
||||
/**
|
||||
* @brief This method resizes the frame, maintaining the same border size.
|
||||
* @param size the new size of the frame
|
||||
*/
|
||||
Q_INVOKABLE void resizeFrame(const QSizeF &size);
|
||||
|
||||
/**
|
||||
* @returns the size of the frame
|
||||
*/
|
||||
Q_INVOKABLE QSizeF frameSize() const;
|
||||
|
||||
/**
|
||||
*
|
||||
* @brief This method returns the margin size for the given edge.
|
||||
*
|
||||
* Note that @c 0 will be returned if the given margin is disabled.
|
||||
*
|
||||
* If you don't care about the margin being on or off, use
|
||||
* ::fixedMarginSize() instead.
|
||||
*
|
||||
* @param edge the margin edge we want, top, bottom, left or right
|
||||
* @return the margin size
|
||||
*/
|
||||
Q_INVOKABLE qreal marginSize(const FrameSvg::MarginEdge edge) const;
|
||||
|
||||
/**
|
||||
* @brief This is a convenience method that extracts the size of the four
|
||||
* margins and saves their size into the passed variables.
|
||||
*
|
||||
* If you don't care about the margins being on or off, use
|
||||
* ::getFixedMargins() instead.
|
||||
*
|
||||
* @param left left margin size
|
||||
* @param top top margin size
|
||||
* @param right right margin size
|
||||
* @param bottom bottom margin size
|
||||
*/
|
||||
Q_INVOKABLE void getMargins(qreal &left, qreal &top, qreal &right, qreal &bottom) const;
|
||||
|
||||
/**
|
||||
* @brief This method returns the margin size for the specified edge.
|
||||
*
|
||||
* Compared to ::marginSize(), this does not depend on whether the margin is
|
||||
* enabled or not.
|
||||
*
|
||||
* @param edge the margin edge we want, top, bottom, left or right
|
||||
* @return the margin size
|
||||
*/
|
||||
Q_INVOKABLE qreal fixedMarginSize(const FrameSvg::MarginEdge edge) const;
|
||||
|
||||
/**
|
||||
* @brief This is a convenience method that extracts the size of the four
|
||||
* margins and saves their size into the passed variables.
|
||||
*
|
||||
* Compared to ::getMargins(), this doesn't depend on whether the margins are
|
||||
* enabled or not.
|
||||
*
|
||||
* @param left left margin size
|
||||
* @param top top margin size
|
||||
* @param right right margin size
|
||||
* @param bottom bottom margin size
|
||||
*/
|
||||
Q_INVOKABLE void getFixedMargins(qreal &left, qreal &top, qreal &right, qreal &bottom) const;
|
||||
|
||||
/**
|
||||
* @brief This method returns the insets margin size for the specified edge.
|
||||
* @param edge the margin edge we want, top, bottom, left or right
|
||||
* @return the margin size
|
||||
* @since 5.77
|
||||
*/
|
||||
Q_INVOKABLE qreal insetSize(const FrameSvg::MarginEdge edge) const;
|
||||
|
||||
/**
|
||||
* @brief This is a convenience method that extracts the size of the four
|
||||
* inset margins and saves their size into the passed variables.
|
||||
*
|
||||
* @param left left margin size
|
||||
* @param top top margin size
|
||||
* @param right right margin size
|
||||
* @param bottom bottom margin size
|
||||
* @since 5.77
|
||||
*/
|
||||
Q_INVOKABLE void getInset(qreal &left, qreal &top, qreal &right, qreal &bottom) const;
|
||||
|
||||
/**
|
||||
* @brief This method returns the rectangle of the center element, taking
|
||||
* the margins into account.
|
||||
*/
|
||||
Q_INVOKABLE QRectF contentsRect() const;
|
||||
|
||||
/**
|
||||
* @brief This method sets the prefix (@see setElementPrefix) to 'north',
|
||||
* 'south', 'west' and 'east' when the location is TopEdge, BottomEdge,
|
||||
* LeftEdge and RightEdge, respectively. Clears the prefix in other cases.
|
||||
*
|
||||
* The prefix must exist in the SVG document, which means that this can only
|
||||
* be called successfully after setImagePath is called.
|
||||
*
|
||||
* @param location location in the UI this frame will be drawn
|
||||
*/
|
||||
Q_INVOKABLE void setElementPrefix(KSvg::FrameSvg::LocationPrefix location);
|
||||
|
||||
/**
|
||||
* @brief This method sets the prefix for the SVG elements to be used for
|
||||
* painting.
|
||||
*
|
||||
* For example, if prefix is 'active', then instead of using the 'top'
|
||||
* element of the SVG file to paint the top border, the 'active-top' element
|
||||
* will be used. The same goes for other SVG elements.
|
||||
*
|
||||
* If the elements with prefixes are not present, the default ones are used.
|
||||
* (for the sake of speed, the test is present only for the 'center' element)
|
||||
*
|
||||
* Setting the prefix manually resets the location to Floating.
|
||||
*
|
||||
* The prefix must exist in the SVG document, which means that this can only be
|
||||
* called successfully after setImagePath is called.
|
||||
*
|
||||
* @param prefix prefix for the SVG elements that make up the frame
|
||||
*/
|
||||
Q_INVOKABLE void setElementPrefix(const QString &prefix);
|
||||
|
||||
/**
|
||||
* @brief This method returns whether the SVG has the necessary elements
|
||||
* with the given prefix to draw a frame.
|
||||
*
|
||||
* @param prefix the given prefix we want to check if drawable (can have trailing '-' since 5.59)
|
||||
*/
|
||||
Q_INVOKABLE bool hasElementPrefix(const QString &prefix) const;
|
||||
|
||||
/**
|
||||
* @brief This is an overloaded method provided for convenience that is
|
||||
* equivalent to hasElementPrefix("north"), hasElementPrefix("south")
|
||||
* hasElementPrefix("west") and hasElementPrefix("east").
|
||||
*
|
||||
* @return true if the svg has the necessary elements with the given prefix
|
||||
* to draw a frame.
|
||||
*
|
||||
* @param location the given prefix we want to check if drawable
|
||||
*/
|
||||
Q_INVOKABLE bool hasElementPrefix(KSvg::FrameSvg::LocationPrefix location) const;
|
||||
|
||||
/**
|
||||
* @brief This method returns the prefix for SVG elements of the FrameSvg
|
||||
* (including a '-' at the end if not empty).
|
||||
*
|
||||
* @return the prefix
|
||||
* @see actualPrefix()
|
||||
*/
|
||||
Q_INVOKABLE QString prefix();
|
||||
|
||||
/**
|
||||
* @brief This method returns a mask that tightly contains the fully opaque
|
||||
* areas of the SVG.
|
||||
*
|
||||
* @return a region of opaque areas
|
||||
*/
|
||||
Q_INVOKABLE QRegion mask() const;
|
||||
|
||||
/**
|
||||
* @brief This method returns a pixmap whose alpha channel is the opacity of
|
||||
* the frame. It may be the frame itself or a special frame with the
|
||||
* "mask-" prefix.
|
||||
*/
|
||||
QPixmap alphaMask() const;
|
||||
|
||||
/**
|
||||
* @brief This method sets whether saving all the rendered prefixes in a
|
||||
* cache or not.
|
||||
*
|
||||
* @param cache whether to use the cache.
|
||||
*/
|
||||
Q_INVOKABLE void setCacheAllRenderedFrames(bool cache);
|
||||
|
||||
/**
|
||||
* @brief This method returns whether all the different prefixes should be
|
||||
* kept in a cache when rendered.
|
||||
*/
|
||||
Q_INVOKABLE bool cacheAllRenderedFrames() const;
|
||||
|
||||
/**
|
||||
* @brief This method deletes the internal cache.
|
||||
*
|
||||
* Calling this method frees memeory. Use this if you want to switch the
|
||||
* rendered element and you don't plan to switch back to the previous one
|
||||
* for a long time.
|
||||
*
|
||||
* This only works if setUsingRenderingCache(@c true) has been called.
|
||||
*
|
||||
* @see KSvg::Svg::setUsingRenderingCache()
|
||||
*/
|
||||
Q_INVOKABLE void clearCache();
|
||||
|
||||
/**
|
||||
* @brief This method returns a pixmap of the SVG represented by this
|
||||
* object.
|
||||
*
|
||||
* @param elementId the ID string of the element to render, or an empty
|
||||
* string for the whole SVG (the default).
|
||||
*
|
||||
* @return a QPixmap of the rendered SVG
|
||||
*/
|
||||
Q_INVOKABLE QPixmap framePixmap();
|
||||
|
||||
/**
|
||||
* @brief This method paints the loaded SVG with the elements that
|
||||
* represents the border.
|
||||
*
|
||||
* @param painter the QPainter to use
|
||||
* @param target the target rectangle on the paint device
|
||||
* @param source the portion rectangle of the source image
|
||||
*/
|
||||
Q_INVOKABLE void paintFrame(QPainter *painter, const QRectF &target, const QRectF &source = QRectF());
|
||||
|
||||
/**
|
||||
* @brief This method paints the loaded SVG with the elements that
|
||||
* represents the border.
|
||||
*
|
||||
* This is an overloaded member provided for convenience
|
||||
*
|
||||
* @param painter the QPainter to use
|
||||
* @param pos where to paint the svg
|
||||
*/
|
||||
Q_INVOKABLE void paintFrame(QPainter *painter, const QPointF &pos = QPointF(0, 0));
|
||||
|
||||
/**
|
||||
* @brief This method returns the prefix that is actually being used
|
||||
* (including a '-' at the end if not empty).
|
||||
*
|
||||
* @see ::prefix()
|
||||
*/
|
||||
QString actualPrefix() const;
|
||||
|
||||
/**
|
||||
* @brief This method returns whether we are in a transaction of many
|
||||
* changes at once.
|
||||
*
|
||||
* This is used to restrict rebuilding generated graphics for each change
|
||||
* made.
|
||||
*
|
||||
* @since 5.31
|
||||
*/
|
||||
bool isRepaintBlocked() const;
|
||||
|
||||
/**
|
||||
* @brief This method sets whether we should block rebuilding generated
|
||||
* graphics for each change made.
|
||||
*
|
||||
* Setting this to @c true will block rebuilding the generated graphics for
|
||||
* each change made and will do these changes in blocks instead.
|
||||
*
|
||||
* How to use this method:
|
||||
* When making several changes at once to the frame properties--such as
|
||||
* prefix, enabled borders, and size--set this property to true to avoid
|
||||
* regenerating the graphics for each change. Set it to false again after
|
||||
* applying all required changes.
|
||||
*
|
||||
* Note that any change will not be visible in the painted frame while this
|
||||
* property is set to true.
|
||||
* @since 5.31
|
||||
*/
|
||||
void setRepaintBlocked(bool blocked);
|
||||
|
||||
/**
|
||||
* @brief This method returns the minimum height required to correctly draw
|
||||
* this SVG.
|
||||
*
|
||||
* @since 5.101
|
||||
*/
|
||||
Q_INVOKABLE int minimumDrawingHeight();
|
||||
|
||||
/**
|
||||
* @brief This method returns the minimum width required to correctly draw
|
||||
* this SVG.
|
||||
*
|
||||
* @since 5.101
|
||||
*/
|
||||
Q_INVOKABLE int minimumDrawingWidth();
|
||||
|
||||
private:
|
||||
FrameSvgPrivate *const d;
|
||||
friend class FrameData;
|
||||
};
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(FrameSvg::EnabledBorders)
|
||||
|
||||
} // KSvg namespace
|
||||
|
||||
#endif // multiple inclusion guard
|
||||
@@ -0,0 +1,263 @@
|
||||
/*
|
||||
SPDX-FileCopyrightText: 2006-2007 Aaron Seigo <aseigo@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "imageset.h"
|
||||
#include "private/imageset_p.h"
|
||||
#include "private/svg_p.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QMutableListIterator>
|
||||
#include <QPair>
|
||||
#include <QStringBuilder>
|
||||
#include <QThread>
|
||||
#include <QTimer>
|
||||
|
||||
#include <KConfigGroup>
|
||||
#include <KDirWatch>
|
||||
#include <KImageCache>
|
||||
|
||||
#include "debug_p.h"
|
||||
|
||||
namespace KSvg
|
||||
{
|
||||
ImageSet::ImageSet(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
if (!ImageSetPrivate::globalImageSet) {
|
||||
ImageSetPrivate::globalImageSet = new ImageSetPrivate;
|
||||
if (QCoreApplication::instance()) {
|
||||
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, ImageSetPrivate::globalImageSet, &ImageSetPrivate::onAppExitCleanup);
|
||||
}
|
||||
}
|
||||
ImageSetPrivate::globalImageSet->ref.ref();
|
||||
d = ImageSetPrivate::globalImageSet;
|
||||
|
||||
connect(d, &ImageSetPrivate::imageSetChanged, this, &ImageSet::imageSetChanged);
|
||||
}
|
||||
|
||||
ImageSet::ImageSet(const QString &imageSetName, const QString &basePath, QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
auto &priv = ImageSetPrivate::themes[imageSetName];
|
||||
if (!priv) {
|
||||
priv = new ImageSetPrivate;
|
||||
if (QCoreApplication::instance()) {
|
||||
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, priv, &ImageSetPrivate::onAppExitCleanup);
|
||||
}
|
||||
}
|
||||
|
||||
priv->ref.ref();
|
||||
d = priv;
|
||||
|
||||
// turn off caching so we don't accidentally trigger unnecessary disk activity at this point
|
||||
bool useCache = d->cacheImageSet;
|
||||
d->cacheImageSet = false;
|
||||
if (!basePath.isEmpty()) {
|
||||
d->basePath = basePath;
|
||||
if (!d->basePath.endsWith(QDir::separator())) {
|
||||
d->basePath += QDir::separator();
|
||||
}
|
||||
}
|
||||
d->setImageSetName(imageSetName, false);
|
||||
d->cacheImageSet = useCache;
|
||||
d->fixedName = true;
|
||||
connect(d, &ImageSetPrivate::imageSetChanged, this, &ImageSet::imageSetChanged);
|
||||
}
|
||||
|
||||
ImageSet::~ImageSet()
|
||||
{
|
||||
if (d == ImageSetPrivate::globalImageSet) {
|
||||
if (!d->ref.deref()) {
|
||||
disconnect(ImageSetPrivate::globalImageSet, nullptr, this, nullptr);
|
||||
delete ImageSetPrivate::globalImageSet;
|
||||
ImageSetPrivate::globalImageSet = nullptr;
|
||||
d = nullptr;
|
||||
}
|
||||
} else {
|
||||
if (!d->ref.deref()) {
|
||||
delete ImageSetPrivate::themes.take(d->imageSetName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ImageSet::setBasePath(const QString &basePath)
|
||||
{
|
||||
if (d->basePath == basePath) {
|
||||
return;
|
||||
}
|
||||
|
||||
d->basePath = basePath;
|
||||
if (!d->basePath.endsWith(QDir::separator())) {
|
||||
d->basePath += QDir::separator();
|
||||
}
|
||||
|
||||
// Don't use scheduleImageSetChangeNotification as we want things happening immediately there,
|
||||
// we don't want in the client code to be setting things like the svg size right after thing just to
|
||||
// be reset right after in an async fashion
|
||||
d->discardCache(PixmapCache | SvgElementsCache);
|
||||
d->cachesToDiscard = NoCache;
|
||||
|
||||
Q_EMIT basePathChanged(basePath);
|
||||
Q_EMIT imageSetChanged(d->imageSetName);
|
||||
}
|
||||
|
||||
QString ImageSet::basePath() const
|
||||
{
|
||||
return d->basePath;
|
||||
}
|
||||
|
||||
void ImageSet::setSelectors(const QStringList &selectors)
|
||||
{
|
||||
d->selectors = selectors;
|
||||
d->scheduleImageSetChangeNotification(PixmapCache | SvgElementsCache);
|
||||
}
|
||||
|
||||
QStringList ImageSet::selectors() const
|
||||
{
|
||||
return d->selectors;
|
||||
}
|
||||
|
||||
void ImageSet::setImageSetName(const QString &imageSetName)
|
||||
{
|
||||
if (d->imageSetName == imageSetName) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (d != ImageSetPrivate::globalImageSet) {
|
||||
disconnect(QCoreApplication::instance(), nullptr, d, nullptr);
|
||||
if (!d->ref.deref()) {
|
||||
delete ImageSetPrivate::themes.take(d->imageSetName);
|
||||
}
|
||||
|
||||
auto &priv = ImageSetPrivate::themes[imageSetName];
|
||||
if (!priv) {
|
||||
priv = new ImageSetPrivate;
|
||||
if (QCoreApplication::instance()) {
|
||||
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, priv, &ImageSetPrivate::onAppExitCleanup);
|
||||
}
|
||||
}
|
||||
priv->ref.ref();
|
||||
d = priv;
|
||||
connect(d, &ImageSetPrivate::imageSetChanged, this, &ImageSet::imageSetChanged);
|
||||
}
|
||||
|
||||
d->setImageSetName(imageSetName, true);
|
||||
}
|
||||
|
||||
QString ImageSet::imageSetName() const
|
||||
{
|
||||
return d->imageSetName;
|
||||
}
|
||||
|
||||
QString ImageSet::imagePath(const QString &name) const
|
||||
{
|
||||
// look for a compressed svg file in the theme
|
||||
if (name.contains(QLatin1String("../")) || name.isEmpty()) {
|
||||
// we don't support relative paths
|
||||
// qCDebug(LOG_KSVG) << "ImageSet says: bad image path " << name;
|
||||
return QString();
|
||||
}
|
||||
|
||||
const QString svgzName = name % QLatin1String(".svgz");
|
||||
QString path = d->findInImageSet(svgzName, d->imageSetName);
|
||||
|
||||
if (path.isEmpty()) {
|
||||
// try for an uncompressed svg file
|
||||
const QString svgName = name % QLatin1String(".svg");
|
||||
path = d->findInImageSet(svgName, d->imageSetName);
|
||||
|
||||
// search in fallback themes if necessary
|
||||
for (int i = 0; path.isEmpty() && i < d->fallbackImageSets.count(); ++i) {
|
||||
if (d->imageSetName == d->fallbackImageSets[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// try a compressed svg file in the fallback theme
|
||||
path = d->findInImageSet(svgzName, d->fallbackImageSets[i]);
|
||||
|
||||
if (path.isEmpty()) {
|
||||
// try an uncompressed svg file in the fallback theme
|
||||
path = d->findInImageSet(svgName, d->fallbackImageSets[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
QString ImageSet::filePath(const QString &name) const
|
||||
{
|
||||
// look for a compressed svg file in the theme
|
||||
if (name.contains(QLatin1String("../")) || name.isEmpty()) {
|
||||
// we don't support relative paths
|
||||
// qCDebug(LOG_KSVG) << "ImageSet says: bad image path " << name;
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString path = d->findInImageSet(name, d->imageSetName);
|
||||
|
||||
if (path.isEmpty()) {
|
||||
// search in fallback themes if necessary
|
||||
for (int i = 0; path.isEmpty() && i < d->fallbackImageSets.count(); ++i) {
|
||||
if (d->imageSetName == d->fallbackImageSets[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
path = d->findInImageSet(name, d->fallbackImageSets[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
bool ImageSet::currentImageSetHasImage(const QString &name) const
|
||||
{
|
||||
if (name.contains(QLatin1String("../"))) {
|
||||
// we don't support relative paths
|
||||
return false;
|
||||
}
|
||||
|
||||
QString path = d->findInImageSet(name % QLatin1String(".svgz"), d->imageSetName);
|
||||
if (path.isEmpty()) {
|
||||
path = d->findInImageSet(name % QLatin1String(".svg"), d->imageSetName);
|
||||
}
|
||||
return path.contains(d->basePath % d->imageSetName);
|
||||
}
|
||||
|
||||
void ImageSet::setUseGlobalSettings(bool useGlobal)
|
||||
{
|
||||
if (d->useGlobal == useGlobal) {
|
||||
return;
|
||||
}
|
||||
|
||||
d->useGlobal = useGlobal;
|
||||
d->cfg = KConfigGroup();
|
||||
d->imageSetName.clear();
|
||||
}
|
||||
|
||||
bool ImageSet::useGlobalSettings() const
|
||||
{
|
||||
return d->useGlobal;
|
||||
}
|
||||
|
||||
void ImageSet::setCacheLimit(int kbytes)
|
||||
{
|
||||
d->cacheSize = kbytes;
|
||||
delete d->pixmapCache;
|
||||
d->pixmapCache = nullptr;
|
||||
}
|
||||
|
||||
KPluginMetaData ImageSet::metadata() const
|
||||
{
|
||||
return d->pluginMetaData;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#include "moc_imageset.cpp"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user