From 8e3ac2fce27b146caed636f9943e80ae63042fd3 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Mon, 3 Feb 2025 11:50:40 +0100 Subject: [PATCH] glyph2qvg added --- CMakeLists.txt | 4 +- LICENSES | 15 +++++-- cmake/QskBuildFunctions.cmake | 39 +++++++++++++++++++ tools/CMakeLists.txt | 2 + tools/glyph2qvg/CMakeLists.txt | 19 +++++++++ tools/glyph2qvg/main.cpp | 71 ++++++++++++++++++++++++++++++++++ tools/svg2qvg/CMakeLists.txt | 35 ++--------------- tools/svg2qvg/main.cpp | 2 +- 8 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 tools/glyph2qvg/CMakeLists.txt create mode 100644 tools/glyph2qvg/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c0f0fac1..7020a9d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,9 +18,9 @@ macro(qsk_setup_options) # we actually want to use cmake_dependent_option - minimum cmake version ?? - option( BUILD_SVG2QVG_STANDALONE "Build svg2qvg without qskinny library dependency" ON ) + option( BUILD_TOOLS_STANDALONE "Build tools without qskinny library dependency" ON ) if( NOT BUILD_TOOLS ) - set( BUILD_SVG2QVG_STANDALONE OFF ) + set( BUILD_TOOLS_STANDALONE OFF ) endif() if( NOT BUILD_INPUTCONTEXT ) diff --git a/LICENSES b/LICENSES index 6c7da6d7..64b56064 100644 --- a/LICENSES +++ b/LICENSES @@ -14,18 +14,25 @@ a) HCT color system SPDX-License-Identifier: Apache License 2.0 Copyright (C) 2021 Google LLC -b) Cassowary constraint solving algorithm +b) Cassowary constraint solving algorithm ( examples ) Code: https://github.com/nucleic/kiwi SPDX-License-Identifier: BSD 3-Clause "New" or "Revised" License Copyright (c) 2013, Nucleic Development Team -c) Material3 Icons +fonts ( only for running the examples ): - Code: https://github.com/marella/material-design-icons +a) Material3 Icons + + Code: https://github.com/google/material-design-icons SPDX-License-Identifier: Apache License 2.0 -d) Fluent2 Icons +b) Fluent2 Icons Code: https://github.com/microsoft/fluentui-system-icons SPDX-License-Identifier: MIT License + +c) Segoe-UI Fonts + + Code: https://github.com/mrbvrz/segoe-ui-linux + License: https://github.com/mrbvrz/segoe-ui-linux/blob/master/license.txt diff --git a/cmake/QskBuildFunctions.cmake b/cmake/QskBuildFunctions.cmake index ebc20a23..5bee0e28 100644 --- a/cmake/QskBuildFunctions.cmake +++ b/cmake/QskBuildFunctions.cmake @@ -20,6 +20,45 @@ function(qsk_add_executable target) endfunction() +function(qsk_embed_sources target) + + # In cross platform scenarios you might need the qvg converter + # tools for the build - not the target - platform. To avoid having + # to build all libraries those tools offer a standalone + # mode that includes some source files instead. + + # Some moc files are transitively required: + # - f.e #include -> #include "moc_QskGraphic.cpp" + # Those will be generated when adding the dependency below + + add_dependencies(${target} qskinny) + + # TODO hack for standalone qvg2svg + get_target_property(qskinny_AUTOGEN_DIR qskinny AUTOGEN_BUILD_DIR) + if (${qskinny_AUTOGEN_DIR} STREQUAL "") + message(FATAL_ERROR "Directory '${qskinny_AUTOGEN_DIR}' doesn't exist") + endif() + + # TODO fix multi configuration generators + if(CMAKE_GENERATOR MATCHES "Visual Studio.*") + add_definitions("/I${qskinny_AUTOGEN_DIR}/include_\$(Configuration)") + elseif(CMAKE_GENERATOR MATCHES "Ninja Multi.*") + target_include_directories(${target} + PRIVATE + ${qskinny_AUTOGEN_DIR}/include_$) + else() + target_include_directories(${target} PRIVATE ${qskinny_AUTOGEN_DIR}/include) + endif() + + target_include_directories(${target} + PRIVATE + ${QSK_SOURCE_DIR}/src/common + ${QSK_SOURCE_DIR}/src/graphic) + + target_compile_definitions(${target} PRIVATE QSK_STANDALONE) + target_link_libraries(${target} PRIVATE Qt::Gui Qt::GuiPrivate) +endfunction() + function(qsk_add_library target) if(QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 3052d313..929fc05c 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -8,3 +8,5 @@ if(TARGET Qt::Svg) COMPONENT Devel) endif() + +add_subdirectory(glyph2qvg) diff --git a/tools/glyph2qvg/CMakeLists.txt b/tools/glyph2qvg/CMakeLists.txt new file mode 100644 index 00000000..f2a6cc55 --- /dev/null +++ b/tools/glyph2qvg/CMakeLists.txt @@ -0,0 +1,19 @@ +############################################################################ +# QSkinny - Copyright (C) The authors +# SPDX-License-Identifier: BSD-3-Clause +############################################################################ + +set(target glyph2qvg) +qsk_add_executable(${target} main.cpp) + +if(BUILD_TOOLS_STANDALONE) + qsk_embed_sources(${target}) +else() + target_link_libraries(${target} PRIVATE qskinny) +endif() + +set_target_properties(${target} PROPERTIES FOLDER tools) + +install(TARGETS ${target}) + +# packaging TODO ... diff --git a/tools/glyph2qvg/main.cpp b/tools/glyph2qvg/main.cpp new file mode 100644 index 00000000..d86a7bb6 --- /dev/null +++ b/tools/glyph2qvg/main.cpp @@ -0,0 +1,71 @@ +/****************************************************************************** + * QSkinny - Copyright (C) The authors + * SPDX-License-Identifier: BSD-3-Clause + *****************************************************************************/ + +#if defined( QSK_STANDALONE ) +#include +#include +#include +#include +#include +#include +#else +#include +#include +#endif + +#include +#include +#include +#include +#include + +static void usage( const char* appName ) +{ + qWarning() << "usage: " << appName << " "; +} + +int main( int argc, char* argv[] ) +{ + if ( argc != 4 ) + { + usage( argv[0] ); + return -1; + } + + QGuiApplication app( argc, argv ); + + QRawFont font( QString( argv[1] ), 16 ); + if ( !font.isValid() ) + { + qWarning() << "invalid font name:" << argv[1]; + return -2; + } + + bool ok; + + const auto glyphIndex = QString( argv[2] ).toUInt( &ok ); + if ( !ok ) + { + qWarning() << "invalid glyph index:" << argv[2]; + return -3; + } + + const auto path = font.pathForGlyph( glyphIndex ); + if ( path.isEmpty() ) + { + qWarning() << "no glyph for index:" << argv[2]; + return -3; + } + + QskGraphic graphic; + + QPainter painter( &graphic ); + painter.setRenderHint( QPainter::Antialiasing, true ); + painter.fillPath( path, Qt::black ); + + QskGraphicIO::write( graphic, argv[3] ); + + return 0; +} diff --git a/tools/svg2qvg/CMakeLists.txt b/tools/svg2qvg/CMakeLists.txt index 90ea5a87..87a764d6 100644 --- a/tools/svg2qvg/CMakeLists.txt +++ b/tools/svg2qvg/CMakeLists.txt @@ -6,37 +6,8 @@ set(target svg2qvg) qsk_add_executable(${target} main.cpp) -if(BUILD_SVG2QVG_STANDALONE) - - # NOTE: when building standalone some moc files are transitively required. - # These files are being created by the qskinny build, hence we add an explicit dependency. - # E.g. main.cpp -> #include -> #include "moc_QskGraphic.cpp" - add_dependencies(${target} qskinny) - - # TODO hack for standalone qvg2svg - get_target_property(qskinny_AUTOGEN_DIR qskinny AUTOGEN_BUILD_DIR) - if (${qskinny_AUTOGEN_DIR} STREQUAL "") - message(FATAL_ERROR "Directory '${qskinny_AUTOGEN_DIR}' doesn't exist") - endif() - - # TODO fix multi configuration generators - if(CMAKE_GENERATOR MATCHES "Visual Studio.*") - add_definitions("/I${qskinny_AUTOGEN_DIR}/include_\$(Configuration)") - elseif(CMAKE_GENERATOR MATCHES "Ninja Multi.*") - target_include_directories(${target} - PRIVATE - ${qskinny_AUTOGEN_DIR}/include_$) - else() - target_include_directories(${target} PRIVATE ${qskinny_AUTOGEN_DIR}/include) - endif() - - target_include_directories(${target} - PRIVATE - ${QSK_SOURCE_DIR}/src/common - ${QSK_SOURCE_DIR}/src/graphic) - - target_compile_definitions(${target} PRIVATE QSK_STANDALONE) - target_link_libraries(${target} PRIVATE Qt::Gui Qt::GuiPrivate) +if(BUILD_TOOLS_STANDALONE) + qsk_embed_sources(${target}) else() target_link_libraries(${target} PRIVATE qskinny) endif() @@ -70,4 +41,4 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) -endif() \ No newline at end of file +endif() diff --git a/tools/svg2qvg/main.cpp b/tools/svg2qvg/main.cpp index 3988076a..2695a80f 100644 --- a/tools/svg2qvg/main.cpp +++ b/tools/svg2qvg/main.cpp @@ -22,7 +22,7 @@ static void usage( const char* appName ) { - qWarning() << "usage: " << appName << "svgfile qvgfile"; + qWarning() << "usage: " << appName << " "; } static QRectF viewBox( QSvgRenderer& renderer )