From 7018d9e6c8bad4bd120fdb8af2fffa3f7cc906ba Mon Sep 17 00:00:00 2001 From: kleuter Date: Wed, 1 Nov 2023 18:02:52 +0100 Subject: [PATCH] 6.5.3 clean --- .cmake.conf | 2 +- .gitattributes | 2 - .release-timestamp | 2 +- .tag | 2 +- CMakeLists.txt | 25 +- .../find-modules/FindEGL.cmake | 3 +- cmake/FindGSSAPI.cmake | 21 +- cmake/FindPPS.cmake | 8 +- cmake/FindWrapOpenGL.cmake | 8 +- cmake/QtAppHelpers.cmake | 1 + cmake/QtBaseConfigureTests.cmake | 53 +- cmake/QtBaseGlobalTargets.cmake | 11 +- cmake/QtBuild.cmake | 31 +- cmake/QtBuildInformation.cmake | 2 +- .../QtBuildInternalsConfig.cmake | 31 +- cmake/QtCompilerOptimization.cmake | 2 +- cmake/QtExecutableHelpers.cmake | 26 + cmake/QtFindPackageHelpers.cmake | 17 +- cmake/QtFlagHandlingHelpers.cmake | 125 +- cmake/QtHeadersClean.cmake | 6 +- cmake/QtInternalTargets.cmake | 29 +- cmake/QtJavaHelpers.cmake | 8 + cmake/QtModuleHelpers.cmake | 15 +- cmake/QtPkgConfigHelpers.cmake | 11 + cmake/QtPluginHelpers.cmake | 2 + cmake/QtPriHelpers.cmake | 5 + cmake/QtProcessConfigureArgs.cmake | 14 +- cmake/QtPublicAppleHelpers.cmake | 124 +- cmake/QtPublicTargetHelpers.cmake | 12 +- cmake/QtRpathHelpers.cmake | 2 +- cmake/QtSeparateDebugInfo.cmake | 18 +- cmake/QtSetup.cmake | 6 +- cmake/QtSyncQtHelpers.cmake | 28 +- cmake/QtTargetHelpers.cmake | 17 +- cmake/QtTestHelpers.cmake | 16 + cmake/QtToolHelpers.cmake | 66 +- cmake/QtToolchainHelpers.cmake | 24 +- cmake/QtWriteArgsFile.cmake | 59 +- cmake/modulecppexports.h.in | 10 +- ..._build_and_upload_test_artifacts_host.yaml | 11 +- ...uild_and_upload_test_artifacts_target.yaml | 11 +- ...compilation_module_build_instructions.yaml | 44 +- ...compilation_qtbase_build_instructions.yaml | 44 +- .../cmake_qtbase_build_instructions.yaml | 22 +- coin/instructions/prepare_building_env.yaml | 8 + conanfile.py | 300 - configure | 144 +- configure.bat | 26 +- configure.cmake | 38 +- doc/config/exampleurl-qtpositioning.qdocconf | 1 + doc/global/config.qdocconf | 5 +- doc/global/html-header-offline.qdocconf | 6 +- doc/global/html-header-online.qdocconf | 3 + doc/global/macros.qdocconf | 18 + doc/global/manifest-meta.qdocconf | 2 - doc/global/template/style/offline.css | 14 + doc/global/template/style/online.css | 12 + doc/global/template/style/tech_preview.svg | 1 + doc/src/images/application-menus.png | Bin 30529 -> 0 bytes doc/src/images/application.png | Bin 39984 -> 0 bytes doc/src/images/classwizard-flow.png | Bin 9745 -> 0 bytes doc/src/images/classwizard.png | Bin 8348 -> 0 bytes doc/src/images/extension-example.png | Bin 9929 -> 0 bytes doc/src/images/extension_more.png | Bin 13523 -> 0 bytes doc/src/images/screenshot-example.png | Bin 24606 -> 227655 bytes examples/CMakeLists.txt | 1 - examples/corelib/CMakeLists.txt | 3 - .../bindablesubscription.cpp | 3 +- .../bindablesubscription/main.cpp | 11 +- .../doc/src/androidnotifier-example.qdoc | 1 + examples/corelib/serialization/CMakeLists.txt | 9 +- .../serialization/cbordump/CMakeLists.txt | 4 + .../cbordump/doc/images/cbordump.png | Bin 48004 -> 19325 bytes .../cbordump/doc/src/cbordump.qdoc | 3 +- .../corelib/serialization/cbordump/main.cpp | 90 +- .../serialization/convert/CMakeLists.txt | 5 + .../serialization/convert/cborconverter.cpp | 53 +- .../serialization/convert/cborconverter.h | 30 +- .../corelib/serialization/convert/convert.pro | 14 +- .../corelib/serialization/convert/converter.h | 27 +- .../convert/datastreamconverter.cpp | 118 +- .../convert/datastreamconverter.h | 28 +- .../serialization/convert/debugtextdumper.cpp | 89 + .../serialization/convert/debugtextdumper.h | 23 + .../convert/doc/src/convert.qdoc | 5 +- .../serialization/convert/jsonconverter.cpp | 34 +- .../serialization/convert/jsonconverter.h | 18 +- .../corelib/serialization/convert/main.cpp | 88 +- .../serialization/convert/nullconverter.cpp | 26 +- .../serialization/convert/nullconverter.h | 15 +- .../serialization/convert/textconverter.cpp | 45 +- .../serialization/convert/textconverter.h | 16 +- .../serialization/convert/xmlconverter.cpp | 102 +- .../serialization/convert/xmlconverter.h | 15 +- .../corelib/serialization/rsslisting/main.cpp | 26 - .../serialization/rsslisting/rsslisting.cpp | 211 - .../serialization/savegame/CMakeLists.txt | 4 + .../serialization/savegame/character.cpp | 51 +- .../serialization/savegame/character.h | 13 +- .../savegame/doc/src/savegame.qdoc | 148 +- .../corelib/serialization/savegame/game.cpp | 126 +- .../corelib/serialization/savegame/game.h | 11 +- .../corelib/serialization/savegame/level.cpp | 57 +- .../corelib/serialization/savegame/level.h | 9 +- .../corelib/serialization/savegame/main.cpp | 9 +- .../corelib/serialization/serialization.pro | 2 - .../streambookmarks/doc/images/filemenu.png | Bin 0 -> 3728 bytes .../streambookmarks/doc/images/helpmenu.png | Bin 0 -> 2099 bytes .../streambookmarks/doc/images/screenshot.png | Bin 0 -> 66567 bytes .../doc/images/xmlstreamexample-filemenu.png | Bin 9380 -> 0 bytes .../doc/images/xmlstreamexample-helpmenu.png | Bin 10856 -> 0 bytes .../images/xmlstreamexample-screenshot.png | Bin 22323 -> 0 bytes .../doc/src/qxmlstreambookmarks.qdoc | 238 +- .../streambookmarks/jennifer.xbel | 46 +- .../serialization/streambookmarks/main.cpp | 4 +- .../streambookmarks/mainwindow.cpp | 171 +- .../streambookmarks/mainwindow.h | 4 +- .../streambookmarks/streambookmarks.pro | 2 +- .../streambookmarks/xbelreader.cpp | 142 +- .../streambookmarks/xbelreader.h | 5 - .../streambookmarks/xbelwriter.cpp | 31 +- examples/corelib/threads/CMakeLists.txt | 6 +- .../corelib/threads/doc/src/mandelbrot.qdoc | 4 +- examples/corelib/threads/mandelbrot/main.cpp | 11 +- .../threads/mandelbrot/mandelbrotwidget.cpp | 50 +- .../threads/mandelbrot/mandelbrotwidget.h | 9 +- .../threads/mandelbrot/renderthread.cpp | 7 +- .../corelib/threads/semaphores/CMakeLists.txt | 4 + .../corelib/threads/semaphores/semaphores.cpp | 4 +- .../threads/waitconditions/CMakeLists.txt | 4 + examples/dbus/CMakeLists.txt | 8 +- examples/dbus/complexpingpong/CMakeLists.txt | 4 + examples/dbus/doc/src/chat.qdoc | 1 + examples/dbus/doc/src/complexpingpong.qdoc | 1 + examples/dbus/doc/src/pingpong.qdoc | 1 + examples/dbus/pingpong/CMakeLists.txt | 4 + .../doc/src/dbus-remotecontrolledcar.qdoc | 1 + examples/embedded/flightinfo/flightinfo.cpp | 2 - examples/embedded/styleexample/main.cpp | 1 - examples/examples.pro | 3 +- examples/gui/doc/src/rasterwindow.qdoc | 1 + examples/network/CMakeLists.txt | 3 +- examples/network/dnslookup/CMakeLists.txt | 4 + examples/network/dnslookup/dnslookup.cpp | 10 +- examples/network/doc/src/secureudpclient.qdoc | 1 + examples/network/doc/src/secureudpserver.qdoc | 1 + examples/network/doc/src/torrent.qdoc | 1 + examples/network/network.pro | 14 +- .../rsslisting/CMakeLists.txt | 2 +- .../rsslisting/doc/images/rsslisting.png | Bin 0 -> 19739 bytes .../rsslisting/doc/src/rsslisting.qdoc | 129 + .../part1 => network/rsslisting}/main.cpp | 13 +- examples/network/rsslisting/rsslisting.cpp | 126 + .../rsslisting/rsslisting.h | 19 +- .../rsslisting/rsslisting.pro | 2 +- examples/network/securesocketclient/main.cpp | 2 - examples/network/torrent/main.cpp | 2 - examples/opengl/CMakeLists.txt | 1 - examples/opengl/doc/src/2dpainting.qdoc | 1 + examples/opengl/doc/src/cube.qdoc | 11 +- examples/opengl/doc/src/hellogl2.qdoc | 1 + examples/opengl/doc/src/hellogles3.qdoc | 142 +- examples/opengl/doc/src/openglwindow.qdoc | 2 + .../opengl/doc/src/stereoqopenglwidget.qdoc | 2 +- examples/opengl/hellogl2/window.h | 6 +- examples/opengl/hellogles3/glwindow.h | 12 +- examples/opengl/opengl.pro | 1 - examples/opengl/openglwindow/openglwindow.h | 8 +- .../opengl/stereoqopenglwidget/CMakeLists.txt | 10 +- examples/opengl/textures/main.cpp | 2 - .../doc/src/qtconcurrent-imagescaling.qdoc | 1 + .../doc/src/qtconcurrent-primecounter.qdoc | 1 + .../doc/src/qtconcurrent-wordcount.qdoc | 1 + examples/sql/books/bookwindow.cpp | 1 + examples/sql/books/bookwindow.h | 4 +- examples/sql/books/bookwindow.ui | 3 + examples/sql/books/main.cpp | 2 - examples/sql/doc/src/books.qdoc | 1 + examples/sql/doc/src/cachedtable.qdoc | 3 +- examples/sql/doc/src/drilldown.qdoc | 1 + examples/sql/doc/src/masterdetail.qdoc | 1 + examples/sql/doc/src/querymodel.qdoc | 1 + .../sql/doc/src/relationaltablemodel.qdoc | 1 + examples/sql/doc/src/sqlbrowser.qdoc | 1 + examples/sql/doc/src/sqlwidgetmapper.qdoc | 4 +- examples/sql/doc/src/tablemodel.qdoc | 1 + examples/sql/drilldown/main.cpp | 2 - examples/sql/masterdetail/main.cpp | 2 - examples/vulkan/doc/src/hellovulkancubes.qdoc | 1 + .../vulkan/doc/src/hellovulkantriangle.qdoc | 1 + .../vulkan/doc/src/hellovulkanwidget.qdoc | 1 + examples/vulkan/hellovulkancubes/mainwindow.h | 10 +- .../hellovulkanwidget/hellovulkanwidget.h | 10 +- examples/widgets/CMakeLists.txt | 5 - examples/widgets/animation/easing/main.cpp | 1 - .../desktop/systray/doc/src/systray.qdoc | 1 + examples/widgets/desktop/systray/main.cpp | 2 - examples/widgets/dialogs/CMakeLists.txt | 8 +- examples/widgets/dialogs/dialogs.pro | 4 +- .../dialogs/licensewizard/licensewizard.cpp | 5 +- .../widgets/dialogs/licensewizard/main.cpp | 2 - .../dialogs/trivialwizard/trivialwizard.cpp | 2 + examples/widgets/doc/dropsite.qdoc | 1 + .../widgets/doc/images/calendar-example.png | Bin 13539 -> 0 bytes .../doc/images/draganddroppuzzle-example.png | Bin 259104 -> 0 bytes .../fademessageeffect-example-faded.png | Bin 81894 -> 0 bytes .../doc/images/fademessageeffect-example.png | Bin 104987 -> 0 bytes .../doc/images/fridgemagnets-example.png | Bin 31707 -> 0 bytes .../doc/images/graphicsflowlayout-example.png | Bin 18988 -> 0 bytes .../images/imageviewer-fit_to_window_1.png | Bin 84584 -> 0 bytes .../images/imageviewer-fit_to_window_2.png | Bin 145998 -> 0 bytes .../doc/images/imageviewer-original_size.png | Bin 61567 -> 0 bytes .../doc/images/imageviewer-zoom_in_1.png | Bin 84559 -> 0 bytes .../doc/images/imageviewer-zoom_in_2.png | Bin 85537 -> 0 bytes .../doc/images/itemviewspuzzle-example.png | Bin 196251 -> 0 bytes .../widgets/doc/images/mainwindow-demo.png | Bin 85771 -> 0 bytes .../doc/images/plugandpaint-plugindialog.png | Bin 8706 -> 0 bytes examples/widgets/doc/images/plugandpaint.png | Bin 7540 -> 0 bytes .../doc/images/stylesheet-pagefold.png | Bin 29118 -> 0 bytes examples/widgets/doc/images/textedit-demo.png | Bin 46980 -> 0 bytes examples/widgets/doc/src/addressbook.qdoc | 1 + examples/widgets/doc/src/affine.qdoc | 3 +- examples/widgets/doc/src/analogclock.qdoc | 2 +- examples/widgets/doc/src/application.qdoc | 370 - examples/widgets/doc/src/basicdrawing.qdoc | 1 + .../widgets/doc/src/basicgraphicslayouts.qdoc | 1 + examples/widgets/doc/src/basiclayouts.qdoc | 1 + .../widgets/doc/src/basicsortfiltermodel.qdoc | 1 + examples/widgets/doc/src/borderlayout.qdoc | 46 - examples/widgets/doc/src/calculator.qdoc | 1 + examples/widgets/doc/src/calendar.qdoc | 202 - examples/widgets/doc/src/calendarwidget.qdoc | 1 + examples/widgets/doc/src/charactermap.qdoc | 251 - examples/widgets/doc/src/chart.qdoc | 58 - examples/widgets/doc/src/chip.qdoc | 1 + examples/widgets/doc/src/classwizard.qdoc | 167 - .../doc/src/collidingmice-example.qdoc | 1 + .../widgets/doc/src/coloreditorfactory.qdoc | 1 + .../widgets/doc/src/combowidgetmapper.qdoc | 13 +- examples/widgets/doc/src/completer.qdoc | 5 +- examples/widgets/doc/src/composition.qdoc | 3 +- .../widgets/doc/src/concentriccircles.qdoc | 3 +- .../doc/src/customsortfiltermodel.qdoc | 1 + examples/widgets/doc/src/deform.qdoc | 1 + examples/widgets/doc/src/diagramscene.qdoc | 9 +- examples/widgets/doc/src/digitalclock.qdoc | 51 - examples/widgets/doc/src/dirview.qdoc | 49 - examples/widgets/doc/src/dockwidgets.qdoc | 140 - .../widgets/doc/src/draganddroppuzzle.qdoc | 18 - examples/widgets/doc/src/dragdroprobot.qdoc | 1 + examples/widgets/doc/src/draggableicons.qdoc | 1 + examples/widgets/doc/src/draggabletext.qdoc | 1 + examples/widgets/doc/src/dynamiclayouts.qdoc | 91 - examples/widgets/doc/src/easing.qdoc | 1 + examples/widgets/doc/src/echoplugin.qdoc | 5 +- .../widgets/doc/src/editabletreemodel.qdoc | 3 +- examples/widgets/doc/src/elasticnodes.qdoc | 1 + examples/widgets/doc/src/embeddeddialogs.qdoc | 15 - examples/widgets/doc/src/extension.qdoc | 121 - examples/widgets/doc/src/fademessage.qdoc | 15 - examples/widgets/doc/src/fetchmore.qdoc | 1 + examples/widgets/doc/src/flowlayout.qdoc | 1 + examples/widgets/doc/src/fontsampler.qdoc | 13 - examples/widgets/doc/src/fridgemagnets.qdoc | 338 - examples/widgets/doc/src/frozencolumn.qdoc | 1 + examples/widgets/doc/src/gallery.qdoc | 1 + examples/widgets/doc/src/gradients.qdoc | 1 + .../doc/src/graphicsview-flowlayout.qdoc | 28 - .../src/graphicsview-simpleanchorlayout.qdoc | 1 + examples/widgets/doc/src/groupbox.qdoc | 1 + examples/widgets/doc/src/icons.qdoc | 805 - .../widgets/doc/src/imagecomposition.qdoc | 1 + examples/widgets/doc/src/imageviewer.qdoc | 320 - examples/widgets/doc/src/interview.qdoc | 15 - examples/widgets/doc/src/itemviewspuzzle.qdoc | 19 - examples/widgets/doc/src/licensewizard.qdoc | 5 +- examples/widgets/doc/src/lineedits.qdoc | 1 + examples/widgets/doc/src/mainwindow.qdoc | 13 - examples/widgets/doc/src/mdi.qdoc | 14 - examples/widgets/doc/src/menus.qdoc | 1 + examples/widgets/doc/src/movie.qdoc | 16 - examples/widgets/doc/src/orderform.qdoc | 1 + examples/widgets/doc/src/painterpaths.qdoc | 1 + examples/widgets/doc/src/pathstroke.qdoc | 1 + examples/widgets/doc/src/pixelator.qdoc | 231 - examples/widgets/doc/src/plugandpaint.qdoc | 527 - .../widgets/doc/src/regularexpression.qdoc | 1 + examples/widgets/doc/src/screenshot.qdoc | 3 +- examples/widgets/doc/src/scribble.qdoc | 1 + examples/widgets/doc/src/settingseditor.qdoc | 1 + examples/widgets/doc/src/shapedclock.qdoc | 74 +- examples/widgets/doc/src/shortcuteditor.qdoc | 1 + examples/widgets/doc/src/simpledommodel.qdoc | 256 - examples/widgets/doc/src/simpletreemodel.qdoc | 1 + .../widgets/doc/src/simplewidgetmapper.qdoc | 101 - examples/widgets/doc/src/sliders.qdoc | 1 + examples/widgets/doc/src/spinboxdelegate.qdoc | 1 + examples/widgets/doc/src/spinboxes.qdoc | 1 + examples/widgets/doc/src/spreadsheet.qdoc | 1 + examples/widgets/doc/src/standarddialogs.qdoc | 1 + examples/widgets/doc/src/stardelegate.qdoc | 1 + examples/widgets/doc/src/styleplugin.qdoc | 4 +- examples/widgets/doc/src/styles.qdoc | 448 - examples/widgets/doc/src/stylesheet.qdoc | 64 - .../widgets/doc/src/syntaxhighlighter.qdoc | 1 + examples/widgets/doc/src/tabdialog.qdoc | 1 + examples/widgets/doc/src/tablet.qdoc | 7 +- examples/widgets/doc/src/tetrix.qdoc | 407 - examples/widgets/doc/src/textedit.qdoc | 15 - examples/widgets/doc/src/tooltips.qdoc | 1 + examples/widgets/doc/src/transformations.qdoc | 1 + .../widgets/doc/src/treemodelcompleter.qdoc | 1 + examples/widgets/doc/src/trivialwizard.qdoc | 3 +- examples/widgets/doc/src/undoframework.qdoc | 1 + examples/widgets/doc/src/validators.qdoc | 11 - examples/widgets/doc/src/windowflags.qdoc | 1 + examples/widgets/draganddrop/CMakeLists.txt | 2 - examples/widgets/draganddrop/draganddrop.pro | 4 +- .../draganddrop/draggableicons/main.cpp | 2 - .../draganddrop/draggabletext/main.cpp | 2 - examples/widgets/effects/CMakeLists.txt | 2 - examples/widgets/effects/effects.pro | 5 - .../imagegestures/doc/src/imagegestures.qdoc | 1 + .../gestures/imagegestures/imagewidget.cpp | 22 +- .../gestures/imagegestures/imagewidget.h | 5 +- examples/widgets/graphicsview/CMakeLists.txt | 2 - examples/widgets/graphicsview/chip/main.cpp | 2 - .../graphicsview/diagramscene/main.cpp | 2 - .../widgets/graphicsview/graphicsview.pro | 2 - examples/widgets/itemviews/CMakeLists.txt | 14 - .../itemviews/editabletreemodel/main.cpp | 2 - .../itemviews/flattreeview/CMakeLists.txt | 36 - .../itemviews/flattreeview/flattreeview.pro | 7 - .../widgets/itemviews/flattreeview/main.cpp | 37 - .../widgets/itemviews/frozencolumn/main.cpp | 3 - examples/widgets/itemviews/itemviews.pro | 13 +- .../itemviews/simpletreemodel/main.cpp | 2 - .../widgets/itemviews/spreadsheet/main.cpp | 4 - examples/widgets/layouts/CMakeLists.txt | 2 - examples/widgets/layouts/layouts.pro | 2 - examples/widgets/mainwindows/CMakeLists.txt | 4 - examples/widgets/mainwindows/mainwindows.pro | 6 +- examples/widgets/painting/CMakeLists.txt | 1 - examples/widgets/painting/affine/main.cpp | 2 - .../widgets/painting/basicdrawing/main.cpp | 2 - examples/widgets/painting/deform/main.cpp | 2 - examples/widgets/painting/gradients/main.cpp | 2 - .../painting/imagecomposition/main.cpp | 2 - examples/widgets/painting/painting.pro | 3 +- examples/widgets/painting/pathstroke/main.cpp | 2 - .../widgets/qnx/foreignwindows/collector.cpp | 2 +- .../widgets/qnx/foreignwindows/collector.h | 2 +- examples/widgets/qnx/foreignwindows/main.cpp | 2 +- examples/widgets/richtext/CMakeLists.txt | 2 - examples/widgets/richtext/richtext.pro | 6 +- examples/widgets/tools/CMakeLists.txt | 4 - examples/widgets/tools/completer/main.cpp | 2 - .../widgets/tools/customcompleter/main.cpp | 2 - .../widgets/tools/echoplugin/CMakeLists.txt | 2 +- .../tools/settingseditor/mainwindow.cpp | 2 +- examples/widgets/tools/tools.pro | 4 +- .../widgets/tools/treemodelcompleter/main.cpp | 2 - examples/widgets/tools/undoframework/main.cpp | 2 - examples/widgets/touch/CMakeLists.txt | 3 - .../touch/knobs/doc/src/touch-knobs.qdoc | 1 + examples/widgets/touch/touch.pro | 2 +- examples/widgets/tutorials/CMakeLists.txt | 2 - .../tutorials/gettingStarted/CMakeLists.txt | 1 - .../gettingStarted/gettingStarted.pro | 4 - .../gettingStarted/gsQt/CMakeLists.txt | 8 - .../tutorials/gettingStarted/gsQt/gsqt.pro | 7 - .../gettingStarted/gsQt/part1/CMakeLists.txt | 36 - .../gettingStarted/gsQt/part1/part1.pro | 8 - .../gettingStarted/gsQt/part2/CMakeLists.txt | 36 - .../gettingStarted/gsQt/part2/main.cpp | 27 - .../gettingStarted/gsQt/part2/part2.pro | 8 - .../gettingStarted/gsQt/part3/CMakeLists.txt | 36 - .../gettingStarted/gsQt/part3/main.cpp | 61 - .../gettingStarted/gsQt/part3/part3.pro | 8 - .../gettingStarted/gsQt/part4/CMakeLists.txt | 36 - .../gettingStarted/gsQt/part4/main.cpp | 73 - .../gettingStarted/gsQt/part4/part4.pro | 8 - .../gettingStarted/gsQt/part5/CMakeLists.txt | 36 - .../gettingStarted/gsQt/part5/main.cpp | 99 - .../gettingStarted/gsQt/part5/part5.pro | 8 - .../{ => notepad}/gettingstartedqt.qdoc | 5 +- examples/widgets/tutorials/tutorials.pro | 2 +- examples/widgets/widgets.pro | 5 - examples/widgets/widgets/CMakeLists.txt | 11 - .../widgets/shapedclock/shapedclock.cpp | 14 +- .../widgets/widgets/shapedclock/shapedclock.h | 1 - .../shortcuteditor/shortcuteditormodel.cpp | 10 +- examples/widgets/widgets/tooltips/main.cpp | 2 - examples/widgets/widgets/widgets.pro | 9 - .../doc/images/dombookmarks-example.png | Bin 19405 -> 0 bytes .../dombookmarks/doc/images/screenshot.png | Bin 0 -> 67075 bytes .../dombookmarks/doc/src/dombookmarks.qdoc | 90 +- examples/xml/dombookmarks/dombookmarks.pro | 2 +- examples/xml/dombookmarks/jennifer.xbel | 46 +- examples/xml/dombookmarks/mainwindow.cpp | 49 +- examples/xml/dombookmarks/mainwindow.h | 2 + examples/xml/dombookmarks/xbeltree.cpp | 84 +- examples/xml/dombookmarks/xbeltree.h | 6 +- mkspecs/common/macx.conf | 2 +- mkspecs/features/qt.prf | 5 +- mkspecs/features/toolchain.prf | 9 +- qmake/CMakeLists.txt | 20 +- .../snippets/code/doc_src_qmake-manual.pro | 22 + qmake/doc/src/qmake-manual.qdoc | 275 +- qmake/propertyprinter.cpp | 15 +- qt_cmdline.cmake | 2 + .../double-conversion/bignum.cc | 12 +- .../double-conversion/double-to-string.cc | 9 +- .../double-conversion/double-to-string.h | 27 +- .../double-conversion/qt_attribution.json | 4 +- src/3rdparty/freetype/README | 8 +- src/3rdparty/freetype/docs/CHANGES | 64 +- src/3rdparty/freetype/docs/DEBUG | 6 +- src/3rdparty/freetype/include/dlg/dlg.h | 190 +- .../include/freetype/config/ftoption.h | 47 +- .../include/freetype/config/ftstdlib.h | 14 +- .../freetype/include/freetype/freetype.h | 565 +- .../freetype/include/freetype/ftcache.h | 74 +- .../freetype/include/freetype/ftchapters.h | 23 +- .../freetype/include/freetype/ftdriver.h | 11 +- .../freetype/include/freetype/ftimage.h | 10 +- .../freetype/include/freetype/ftlogging.h | 2 +- src/3rdparty/freetype/include/freetype/ftmm.h | 57 +- .../freetype/include/freetype/ftoutln.h | 2 +- .../freetype/include/freetype/ftrender.h | 2 +- .../freetype/include/freetype/ftsynth.h | 12 + .../freetype/include/freetype/ftsystem.h | 16 +- .../freetype/internal/compiler-macros.h | 7 +- .../include/freetype/internal/ftcalc.h | 4 +- .../include/freetype/internal/ftdrv.h | 1 + .../include/freetype/internal/ftmmtypes.h | 20 +- .../freetype/internal/services/svmetric.h | 10 +- .../include/freetype/internal/services/svmm.h | 109 +- .../freetype/internal/services/svpscmap.h | 2 +- .../include/freetype/internal/t1types.h | 26 +- .../include/freetype/internal/tttypes.h | 137 +- src/3rdparty/freetype/qt_attribution.json | 6 +- src/3rdparty/freetype/src/autofit/afblue.dat | 2 +- src/3rdparty/freetype/src/autofit/afcjk.c | 62 +- src/3rdparty/freetype/src/autofit/afcjk.h | 20 +- src/3rdparty/freetype/src/autofit/afglobal.c | 5 +- src/3rdparty/freetype/src/autofit/afglobal.h | 2 +- src/3rdparty/freetype/src/autofit/afhints.c | 58 +- src/3rdparty/freetype/src/autofit/afindic.c | 32 +- src/3rdparty/freetype/src/autofit/aflatin.c | 87 +- src/3rdparty/freetype/src/autofit/aflatin.h | 4 +- src/3rdparty/freetype/src/autofit/afloader.c | 6 +- src/3rdparty/freetype/src/autofit/afmodule.c | 37 +- src/3rdparty/freetype/src/autofit/afshaper.c | 6 +- src/3rdparty/freetype/src/autofit/ft-hb.c | 2 +- src/3rdparty/freetype/src/base/ftbbox.c | 42 +- src/3rdparty/freetype/src/base/ftcalc.c | 88 +- src/3rdparty/freetype/src/base/ftdbgmem.c | 2 +- src/3rdparty/freetype/src/base/ftmac.c | 2 +- src/3rdparty/freetype/src/base/ftmm.c | 146 +- src/3rdparty/freetype/src/base/ftobjs.c | 26 +- src/3rdparty/freetype/src/base/ftoutln.c | 52 +- src/3rdparty/freetype/src/base/ftstream.c | 8 +- src/3rdparty/freetype/src/base/ftstroke.c | 21 +- src/3rdparty/freetype/src/base/ftsynth.c | 20 +- src/3rdparty/freetype/src/base/ftsystem.c | 9 +- src/3rdparty/freetype/src/base/ftver.rc | 4 +- src/3rdparty/freetype/src/bdf/bdf.h | 4 - src/3rdparty/freetype/src/bdf/bdfdrivr.c | 116 +- src/3rdparty/freetype/src/bdf/bdflib.c | 67 +- src/3rdparty/freetype/src/bzip2/ftbzip2.c | 19 +- src/3rdparty/freetype/src/cache/ftcbasic.c | 8 +- src/3rdparty/freetype/src/cache/ftccache.c | 125 +- src/3rdparty/freetype/src/cache/ftccache.h | 17 +- src/3rdparty/freetype/src/cache/ftcglyph.c | 46 +- src/3rdparty/freetype/src/cache/ftcglyph.h | 15 +- src/3rdparty/freetype/src/cache/ftcmanag.c | 42 +- src/3rdparty/freetype/src/cache/ftcmru.c | 30 +- src/3rdparty/freetype/src/cache/ftcsbits.c | 17 +- src/3rdparty/freetype/src/cache/ftcsbits.h | 11 - src/3rdparty/freetype/src/cff/cffcmap.c | 107 +- src/3rdparty/freetype/src/cff/cffdrivr.c | 443 +- src/3rdparty/freetype/src/cff/cffgload.c | 6 +- src/3rdparty/freetype/src/cff/cffload.c | 40 +- src/3rdparty/freetype/src/cff/cffload.h | 4 +- src/3rdparty/freetype/src/cff/cffobjs.c | 24 +- src/3rdparty/freetype/src/cff/cffparse.c | 252 +- src/3rdparty/freetype/src/cff/cffparse.h | 13 +- src/3rdparty/freetype/src/cid/cidgload.c | 141 +- src/3rdparty/freetype/src/cid/cidgload.h | 8 + src/3rdparty/freetype/src/cid/cidload.c | 51 +- src/3rdparty/freetype/src/cid/cidobjs.c | 14 +- src/3rdparty/freetype/src/cid/cidparse.c | 18 +- src/3rdparty/freetype/src/cid/cidriver.c | 93 +- src/3rdparty/freetype/src/dlg/dlgwrap.c | 2 +- src/3rdparty/freetype/src/gxvalid/gxvfgen.c | 3 +- .../freetype/src/gzip/README.freetype | 2 +- src/3rdparty/freetype/src/gzip/ftgzip.c | 5 +- src/3rdparty/freetype/src/gzip/infback.c | 644 - src/3rdparty/freetype/src/gzip/rules.mk | 34 +- src/3rdparty/freetype/src/pcf/pcfdrivr.c | 122 +- src/3rdparty/freetype/src/pfr/pfrcmap.c | 48 +- src/3rdparty/freetype/src/pfr/pfrdrivr.c | 26 +- src/3rdparty/freetype/src/pfr/pfrgload.c | 3 +- src/3rdparty/freetype/src/pfr/pfrload.c | 60 +- src/3rdparty/freetype/src/pfr/pfrobjs.c | 6 +- src/3rdparty/freetype/src/psaux/afmparse.c | 2 +- src/3rdparty/freetype/src/psaux/cffdecode.c | 6 +- src/3rdparty/freetype/src/psaux/pshints.c | 2 +- src/3rdparty/freetype/src/psaux/t1cmap.c | 141 +- src/3rdparty/freetype/src/psaux/t1decode.c | 4 +- src/3rdparty/freetype/src/pshinter/pshalgo.c | 2 +- src/3rdparty/freetype/src/pshinter/pshmod.c | 9 +- src/3rdparty/freetype/src/pshinter/pshrec.c | 63 +- src/3rdparty/freetype/src/psnames/psmodule.c | 42 +- src/3rdparty/freetype/src/raster/ftraster.c | 44 +- src/3rdparty/freetype/src/raster/ftrend1.c | 21 +- src/3rdparty/freetype/src/sdf/ftbsdf.c | 7 +- src/3rdparty/freetype/src/sdf/ftsdf.c | 21 +- src/3rdparty/freetype/src/sdf/ftsdfrend.c | 35 +- src/3rdparty/freetype/src/sfnt/pngshim.c | 7 +- src/3rdparty/freetype/src/sfnt/sfdriver.c | 143 +- src/3rdparty/freetype/src/sfnt/sfobjs.c | 30 +- src/3rdparty/freetype/src/sfnt/sfwoff.c | 2 +- src/3rdparty/freetype/src/sfnt/sfwoff2.c | 20 +- src/3rdparty/freetype/src/sfnt/ttbdf.c | 13 +- src/3rdparty/freetype/src/sfnt/ttbdf.h | 2 +- src/3rdparty/freetype/src/sfnt/ttcmap.c | 547 +- src/3rdparty/freetype/src/sfnt/ttcolr.c | 10 +- src/3rdparty/freetype/src/sfnt/ttcpal.c | 2 +- src/3rdparty/freetype/src/sfnt/ttload.c | 7 + src/3rdparty/freetype/src/sfnt/ttmtx.c | 2 +- src/3rdparty/freetype/src/sfnt/ttpost.c | 288 +- src/3rdparty/freetype/src/sfnt/ttsbit.c | 2 +- src/3rdparty/freetype/src/sfnt/ttsvg.c | 2 +- src/3rdparty/freetype/src/sfnt/woff2tags.c | 2 +- src/3rdparty/freetype/src/smooth/ftgrays.c | 54 +- src/3rdparty/freetype/src/smooth/ftsmooth.c | 22 +- src/3rdparty/freetype/src/svg/ftsvg.c | 45 +- src/3rdparty/freetype/src/tools/apinames.c | 44 +- .../freetype/src/tools/ftrandom/ftrandom.c | 2 +- .../freetype/src/tools/vms_shorten_symbol.c | 250 + src/3rdparty/freetype/src/truetype/rules.mk | 3 +- src/3rdparty/freetype/src/truetype/truetype.c | 1 - src/3rdparty/freetype/src/truetype/ttdriver.c | 157 +- src/3rdparty/freetype/src/truetype/ttgload.c | 565 +- src/3rdparty/freetype/src/truetype/ttgxvar.c | 524 +- src/3rdparty/freetype/src/truetype/ttgxvar.h | 40 +- src/3rdparty/freetype/src/truetype/ttinterp.c | 963 +- src/3rdparty/freetype/src/truetype/ttinterp.h | 84 +- src/3rdparty/freetype/src/truetype/ttobjs.c | 88 +- src/3rdparty/freetype/src/truetype/ttobjs.h | 8 +- src/3rdparty/freetype/src/truetype/ttpload.c | 37 +- src/3rdparty/freetype/src/truetype/ttpload.h | 6 +- src/3rdparty/freetype/src/truetype/ttsubpix.c | 1013 -- src/3rdparty/freetype/src/truetype/ttsubpix.h | 110 - src/3rdparty/freetype/src/type1/t1afm.c | 4 +- src/3rdparty/freetype/src/type1/t1driver.c | 93 +- src/3rdparty/freetype/src/type1/t1load.c | 260 +- src/3rdparty/freetype/src/type1/t1load.h | 22 +- src/3rdparty/freetype/src/type1/t1objs.c | 8 +- src/3rdparty/freetype/src/type42/t42drivr.c | 43 +- src/3rdparty/freetype/src/type42/t42parse.c | 94 +- src/3rdparty/freetype/src/winfonts/winfnt.c | 40 +- src/3rdparty/harfbuzz-ng/CMakeLists.txt | 1 + src/3rdparty/harfbuzz-ng/NEWS | 111 + src/3rdparty/harfbuzz-ng/README.md | 11 +- src/3rdparty/harfbuzz-ng/qt_attribution.json | 4 +- .../harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh | 11 +- .../harfbuzz-ng/src/OT/Color/COLR/COLR.hh | 78 +- .../harfbuzz-ng/src/OT/Color/sbix/sbix.hh | 5 - .../src/OT/Layout/Common/Coverage.hh | 26 +- .../src/OT/Layout/Common/CoverageFormat1.hh | 2 +- .../src/OT/Layout/Common/CoverageFormat2.hh | 19 +- .../src/OT/Layout/Common/RangeRecord.hh | 12 + .../harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh | 60 +- .../src/OT/Layout/GPOS/AnchorFormat3.hh | 9 +- .../src/OT/Layout/GPOS/AnchorMatrix.hh | 20 +- .../src/OT/Layout/GPOS/CursivePosFormat1.hh | 36 +- .../harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh | 2 +- .../src/OT/Layout/GPOS/LigatureArray.hh | 13 +- .../src/OT/Layout/GPOS/MarkArray.hh | 8 +- .../src/OT/Layout/GPOS/MarkBasePosFormat1.hh | 15 +- .../src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 14 +- .../src/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 18 +- .../src/OT/Layout/GPOS/MarkRecord.hh | 11 +- .../src/OT/Layout/GPOS/PairPosFormat1.hh | 4 +- .../src/OT/Layout/GPOS/PairPosFormat2.hh | 48 +- .../harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh | 9 +- .../src/OT/Layout/GPOS/PairValueRecord.hh | 2 +- .../src/OT/Layout/GPOS/SinglePosFormat1.hh | 3 +- .../src/OT/Layout/GPOS/SinglePosFormat2.hh | 3 +- .../src/OT/Layout/GPOS/ValueFormat.hh | 64 +- .../harfbuzz-ng/src/OT/Layout/GSUB/Common.hh | 2 - .../src/OT/Layout/GSUB/Ligature.hh | 4 +- .../src/OT/Layout/GSUB/LigatureSet.hh | 61 +- .../GSUB/ReverseChainSingleSubstFormat1.hh | 1 - .../src/OT/Layout/GSUB/Sequence.hh | 2 +- .../src/OT/Layout/GSUB/SingleSubst.hh | 2 +- .../harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh | 51 +- src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh | 224 +- .../harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh | 39 +- .../harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh | 4 +- .../src/OT/glyf/VarCompositeGlyph.hh | 244 +- .../harfbuzz-ng/src/OT/glyf/coord-setter.hh | 2 + .../harfbuzz-ng/src/OT/glyf/glyf-helpers.hh | 67 +- src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh | 82 +- .../harfbuzz-ng/src/OT/glyf/path-builder.hh | 31 +- src/3rdparty/harfbuzz-ng/src/OT/name/name.hh | 19 +- .../harfbuzz-ng/src/graph/classdef-graph.hh | 10 +- .../harfbuzz-ng/src/graph/coverage-graph.hh | 10 +- src/3rdparty/harfbuzz-ng/src/graph/graph.hh | 275 +- .../harfbuzz-ng/src/graph/gsubgpos-context.cc | 6 +- .../harfbuzz-ng/src/graph/gsubgpos-context.hh | 6 +- .../harfbuzz-ng/src/graph/gsubgpos-graph.hh | 37 +- .../src/graph/markbasepos-graph.hh | 9 +- .../harfbuzz-ng/src/graph/pairpos-graph.hh | 12 +- .../harfbuzz-ng/src/graph/serialize.hh | 7 +- .../src/graph/test-classdef-graph.cc | 2 +- src/3rdparty/harfbuzz-ng/src/harfbuzz.cc | 2 + .../src/hb-aat-layout-trak-table.hh | 4 +- src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc | 8 +- src/3rdparty/harfbuzz-ng/src/hb-algs.hh | 193 +- src/3rdparty/harfbuzz-ng/src/hb-array.hh | 64 +- src/3rdparty/harfbuzz-ng/src/hb-atomic.hh | 1 + src/3rdparty/harfbuzz-ng/src/hb-bimap.hh | 77 +- src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh | 40 +- .../harfbuzz-ng/src/hb-bit-set-invertible.hh | 7 +- src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh | 36 +- .../harfbuzz-ng/src/hb-buffer-verify.cc | 76 +- src/3rdparty/harfbuzz-ng/src/hb-buffer.cc | 12 +- src/3rdparty/harfbuzz-ng/src/hb-buffer.h | 2 +- src/3rdparty/harfbuzz-ng/src/hb-buffer.hh | 17 +- src/3rdparty/harfbuzz-ng/src/hb-cache.hh | 8 +- .../harfbuzz-ng/src/hb-cairo-utils.cc | 4 +- src/3rdparty/harfbuzz-ng/src/hb-cairo.cc | 29 +- .../harfbuzz-ng/src/hb-cff-interp-common.hh | 4 +- .../src/hb-cff-interp-cs-common.hh | 8 +- src/3rdparty/harfbuzz-ng/src/hb-common.cc | 2 +- src/3rdparty/harfbuzz-ng/src/hb-common.h | 10 + src/3rdparty/harfbuzz-ng/src/hb-config.hh | 39 +- src/3rdparty/harfbuzz-ng/src/hb-debug.hh | 23 +- src/3rdparty/harfbuzz-ng/src/hb-deprecated.h | 46 + src/3rdparty/harfbuzz-ng/src/hb-draw.hh | 30 +- src/3rdparty/harfbuzz-ng/src/hb-font.cc | 9 +- src/3rdparty/harfbuzz-ng/src/hb-font.h | 45 +- src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh | 36 +- src/3rdparty/harfbuzz-ng/src/hb-ft.cc | 2 +- .../harfbuzz-ng/src/hb-gobject-structs.cc | 2 +- src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc | 42 +- src/3rdparty/harfbuzz-ng/src/hb-iter.hh | 9 +- src/3rdparty/harfbuzz-ng/src/hb-kern.hh | 4 +- src/3rdparty/harfbuzz-ng/src/hb-limits.hh | 6 +- src/3rdparty/harfbuzz-ng/src/hb-machinery.hh | 11 +- src/3rdparty/harfbuzz-ng/src/hb-map.cc | 2 +- src/3rdparty/harfbuzz-ng/src/hb-map.h | 2 +- src/3rdparty/harfbuzz-ng/src/hb-map.hh | 192 +- src/3rdparty/harfbuzz-ng/src/hb-meta.hh | 8 +- src/3rdparty/harfbuzz-ng/src/hb-multimap.hh | 34 +- src/3rdparty/harfbuzz-ng/src/hb-null.hh | 10 +- src/3rdparty/harfbuzz-ng/src/hb-open-file.hh | 4 +- src/3rdparty/harfbuzz-ng/src/hb-open-type.hh | 39 +- .../harfbuzz-ng/src/hb-ot-cff-common.hh | 269 +- .../harfbuzz-ng/src/hb-ot-cff1-table.cc | 6 +- .../harfbuzz-ng/src/hb-ot-cff1-table.hh | 292 +- .../harfbuzz-ng/src/hb-ot-cff2-table.hh | 39 +- .../harfbuzz-ng/src/hb-ot-cmap-table.hh | 38 +- src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc | 46 +- .../harfbuzz-ng/src/hb-ot-hdmx-table.hh | 43 +- .../harfbuzz-ng/src/hb-ot-hmtx-table.hh | 80 +- .../src/hb-ot-layout-base-table.hh | 21 +- .../harfbuzz-ng/src/hb-ot-layout-common.hh | 207 +- .../harfbuzz-ng/src/hb-ot-layout-gsubgpos.hh | 605 +- src/3rdparty/harfbuzz-ng/src/hb-ot-layout.cc | 257 +- src/3rdparty/harfbuzz-ng/src/hb-ot-layout.h | 37 + src/3rdparty/harfbuzz-ng/src/hb-ot-layout.hh | 14 +- src/3rdparty/harfbuzz-ng/src/hb-ot-map.cc | 30 +- src/3rdparty/harfbuzz-ng/src/hb-ot-map.hh | 8 + .../harfbuzz-ng/src/hb-ot-math-table.hh | 13 +- src/3rdparty/harfbuzz-ng/src/hb-ot-math.cc | 2 +- src/3rdparty/harfbuzz-ng/src/hb-ot-metrics.cc | 2 +- .../harfbuzz-ng/src/hb-ot-os2-table.hh | 7 +- .../src/hb-ot-post-table-v2subset.hh | 12 +- .../harfbuzz-ng/src/hb-ot-post-table.hh | 5 +- .../harfbuzz-ng/src/hb-ot-shape-normalize.cc | 15 +- src/3rdparty/harfbuzz-ng/src/hb-ot-shape.cc | 28 +- .../src/hb-ot-shaper-arabic-fallback.hh | 2 +- .../harfbuzz-ng/src/hb-ot-shaper-arabic.cc | 31 +- .../harfbuzz-ng/src/hb-ot-shaper-syllabic.cc | 12 + .../src/hb-ot-shaper-use-machine.hh | 1925 +-- .../harfbuzz-ng/src/hb-ot-shaper-use.cc | 3 + .../harfbuzz-ng/src/hb-ot-stat-table.hh | 53 +- src/3rdparty/harfbuzz-ng/src/hb-ot-tag.cc | 2 +- .../harfbuzz-ng/src/hb-ot-var-avar-table.hh | 164 + .../harfbuzz-ng/src/hb-ot-var-common.hh | 1179 +- .../harfbuzz-ng/src/hb-ot-var-cvar-table.hh | 75 +- .../harfbuzz-ng/src/hb-ot-var-fvar-table.hh | 116 +- .../harfbuzz-ng/src/hb-ot-var-gvar-table.hh | 565 +- .../harfbuzz-ng/src/hb-ot-var-hvar-table.hh | 86 +- .../harfbuzz-ng/src/hb-ot-vorg-table.hh | 2 +- src/3rdparty/harfbuzz-ng/src/hb-paint.cc | 25 + src/3rdparty/harfbuzz-ng/src/hb-paint.h | 42 + src/3rdparty/harfbuzz-ng/src/hb-paint.hh | 8 + src/3rdparty/harfbuzz-ng/src/hb-pool.hh | 2 +- .../harfbuzz-ng/src/hb-priority-queue.hh | 27 +- src/3rdparty/harfbuzz-ng/src/hb-repacker.hh | 20 +- src/3rdparty/harfbuzz-ng/src/hb-sanitize.hh | 105 +- src/3rdparty/harfbuzz-ng/src/hb-serialize.hh | 36 +- src/3rdparty/harfbuzz-ng/src/hb-set-digest.hh | 24 +- src/3rdparty/harfbuzz-ng/src/hb-set.cc | 24 +- src/3rdparty/harfbuzz-ng/src/hb-set.h | 2 +- src/3rdparty/harfbuzz-ng/src/hb-set.hh | 4 +- src/3rdparty/harfbuzz-ng/src/hb-shape.cc | 2 +- .../harfbuzz-ng/src/hb-shaper-list.hh | 5 + src/3rdparty/harfbuzz-ng/src/hb-static.cc | 3 + .../harfbuzz-ng/src/hb-subset-accelerator.hh | 53 +- .../harfbuzz-ng/src/hb-subset-cff-common.cc | 29 +- .../harfbuzz-ng/src/hb-subset-cff-common.hh | 112 +- .../harfbuzz-ng/src/hb-subset-cff1.cc | 296 +- .../harfbuzz-ng/src/hb-subset-cff2.cc | 93 +- .../harfbuzz-ng/src/hb-subset-input.cc | 89 +- .../harfbuzz-ng/src/hb-subset-input.hh | 4 +- .../src/hb-subset-instancer-solver.cc | 227 +- .../src/hb-subset-instancer-solver.hh | 112 + .../src/hb-subset-plan-member-list.hh | 135 + .../harfbuzz-ng/src/hb-subset-plan.cc | 300 +- .../harfbuzz-ng/src/hb-subset-plan.hh | 201 +- src/3rdparty/harfbuzz-ng/src/hb-subset.cc | 165 +- src/3rdparty/harfbuzz-ng/src/hb-subset.h | 11 + src/3rdparty/harfbuzz-ng/src/hb-uniscribe.cc | 6 +- src/3rdparty/harfbuzz-ng/src/hb-vector.hh | 146 +- src/3rdparty/harfbuzz-ng/src/hb-version.h | 4 +- .../harfbuzz-ng/src/hb-wasm-api-blob.hh | 50 + .../harfbuzz-ng/src/hb-wasm-api-buffer.hh | 217 + ...b-subset-cff2.hh => hb-wasm-api-common.hh} | 27 +- .../harfbuzz-ng/src/hb-wasm-api-face.hh | 109 + .../harfbuzz-ng/src/hb-wasm-api-font.hh | 263 + .../harfbuzz-ng/src/hb-wasm-api-shape.hh | 70 + .../src/{hb-subset-cff1.hh => hb-wasm-api.cc} | 29 +- src/3rdparty/harfbuzz-ng/src/hb-wasm-api.h | 319 + src/3rdparty/harfbuzz-ng/src/hb-wasm-api.hh | 117 + src/3rdparty/harfbuzz-ng/src/hb-wasm-shape.cc | 470 + src/3rdparty/harfbuzz-ng/src/hb.hh | 13 +- src/3rdparty/harfbuzz-ng/src/main.cc | 532 - src/3rdparty/harfbuzz-ng/src/test.cc | 95 - src/3rdparty/libjpeg/CMakeLists.txt | 148 +- src/3rdparty/libjpeg/COPYRIGHT.txt | 1 + .../libjpeg/import_from_libjpeg_tarball.sh | 14 +- src/3rdparty/libjpeg/qt_attribution.json | 4 +- src/3rdparty/libjpeg/src/ChangeLog.md | 222 +- src/3rdparty/libjpeg/src/README.ijg | 24 +- src/3rdparty/libjpeg/src/README.md | 12 +- src/3rdparty/libjpeg/src/jcapimin.c | 27 +- src/3rdparty/libjpeg/src/jcapistd.c | 53 +- src/3rdparty/libjpeg/src/jccoefct.c | 47 +- src/3rdparty/libjpeg/src/jccolext.c | 50 +- src/3rdparty/libjpeg/src/jccolor.c | 233 +- src/3rdparty/libjpeg/src/jcdctmgr.c | 94 +- src/3rdparty/libjpeg/src/jcdiffct.c | 411 + src/3rdparty/libjpeg/src/jchuff.c | 145 +- src/3rdparty/libjpeg/src/jchuff.h | 6 - src/3rdparty/libjpeg/src/jcicc.c | 105 + src/3rdparty/libjpeg/src/jcinit.c | 121 +- src/3rdparty/libjpeg/src/jclhuff.c | 587 + src/3rdparty/libjpeg/src/jclossls.c | 319 + src/3rdparty/libjpeg/src/jcmainct.c | 45 +- src/3rdparty/libjpeg/src/jcmarker.c | 36 +- src/3rdparty/libjpeg/src/jcmaster.c | 193 +- src/3rdparty/libjpeg/src/jcmaster.h | 43 + src/3rdparty/libjpeg/src/jconfig.h | 8 +- src/3rdparty/libjpeg/src/jconfig.h.in | 47 +- src/3rdparty/libjpeg/src/jconfigint.h | 31 +- src/3rdparty/libjpeg/src/jconfigint.h.in | 29 + src/3rdparty/libjpeg/src/jcparam.c | 52 +- src/3rdparty/libjpeg/src/jcphuff.c | 16 +- src/3rdparty/libjpeg/src/jcprepct.c | 88 +- src/3rdparty/libjpeg/src/jcsample.c | 103 +- src/3rdparty/libjpeg/src/jctrans.c | 16 +- src/3rdparty/libjpeg/src/jdapimin.c | 9 +- src/3rdparty/libjpeg/src/jdapistd.c | 149 +- src/3rdparty/libjpeg/src/jdatadst.c | 10 - src/3rdparty/libjpeg/src/jdatasrc.c | 6 - src/3rdparty/libjpeg/src/jdcoefct.c | 48 +- src/3rdparty/libjpeg/src/jdcoefct.h | 5 + src/3rdparty/libjpeg/src/jdcol565.c | 62 +- src/3rdparty/libjpeg/src/jdcolext.c | 48 +- src/3rdparty/libjpeg/src/jdcolor.c | 192 +- src/3rdparty/libjpeg/src/jdct.h | 135 +- src/3rdparty/libjpeg/src/jddctmgr.c | 61 +- src/3rdparty/libjpeg/src/jddiffct.c | 403 + src/3rdparty/libjpeg/src/jdhuff.c | 20 +- src/3rdparty/libjpeg/src/jdhuff.h | 7 +- src/3rdparty/libjpeg/src/jdicc.c | 167 + src/3rdparty/libjpeg/src/jdinput.c | 63 +- src/3rdparty/libjpeg/src/jdlhuff.c | 302 + src/3rdparty/libjpeg/src/jdlossls.c | 289 + src/3rdparty/libjpeg/src/jdmainct.c | 111 +- src/3rdparty/libjpeg/src/jdmainct.h | 15 +- src/3rdparty/libjpeg/src/jdmarker.c | 26 +- src/3rdparty/libjpeg/src/jdmaster.c | 643 +- src/3rdparty/libjpeg/src/jdmerge.c | 71 +- src/3rdparty/libjpeg/src/jdmerge.h | 9 +- src/3rdparty/libjpeg/src/jdmrg565.c | 43 +- src/3rdparty/libjpeg/src/jdmrgext.c | 40 +- src/3rdparty/libjpeg/src/jdphuff.c | 4 +- src/3rdparty/libjpeg/src/jdpostct.c | 109 +- src/3rdparty/libjpeg/src/jdsample.c | 128 +- src/3rdparty/libjpeg/src/jdsample.h | 9 +- src/3rdparty/libjpeg/src/jdtrans.c | 12 +- src/3rdparty/libjpeg/src/jerror.h | 13 +- src/3rdparty/libjpeg/src/jfdctfst.c | 2 +- src/3rdparty/libjpeg/src/jfdctint.c | 4 +- src/3rdparty/libjpeg/src/jidctflt.c | 14 +- src/3rdparty/libjpeg/src/jidctfst.c | 18 +- src/3rdparty/libjpeg/src/jidctint.c | 136 +- src/3rdparty/libjpeg/src/jidctred.c | 38 +- src/3rdparty/libjpeg/src/jinclude.h | 4 +- src/3rdparty/libjpeg/src/jlossls.h | 101 + src/3rdparty/libjpeg/src/jmemmgr.c | 179 +- src/3rdparty/libjpeg/src/jmorecfg.h | 41 +- .../libjpeg/src/{jpegcomp.h => jpegapicomp.h} | 2 +- src/3rdparty/libjpeg/src/jpegint.h | 226 +- src/3rdparty/libjpeg/src/jpeglib.h | 149 +- src/3rdparty/libjpeg/src/jquant1.c | 164 +- src/3rdparty/libjpeg/src/jquant2.c | 130 +- src/3rdparty/libjpeg/src/jsamplecomp.h | 336 + src/3rdparty/libjpeg/src/jsimd.h | 4 + src/3rdparty/libjpeg/src/jsimd_none.c | 431 - src/3rdparty/libjpeg/src/jutils.c | 25 +- src/3rdparty/libjpeg/src/jversion.h | 1 + src/3rdparty/libpng/ANNOUNCE | 30 +- src/3rdparty/libpng/CHANGES | 20 +- src/3rdparty/libpng/LICENSE | 4 +- src/3rdparty/libpng/README | 162 +- src/3rdparty/libpng/libpng-manual.txt | 6 +- src/3rdparty/libpng/png.c | 8 +- src/3rdparty/libpng/png.h | 22 +- src/3rdparty/libpng/pngconf.h | 2 +- src/3rdparty/libpng/pngget.c | 13 +- src/3rdparty/libpng/pnglibconf.h | 4 +- src/3rdparty/libpng/pngpriv.h | 6 +- src/3rdparty/libpng/pngset.c | 62 +- src/3rdparty/libpng/pngwrite.c | 10 +- src/3rdparty/libpng/qt_attribution.json | 8 +- src/3rdparty/libpsl/psl_data.cpp | 8348 +++++----- src/3rdparty/libpsl/qt_attribution.json | 2 +- src/3rdparty/sqlite/qt_attribution.json | 4 +- src/3rdparty/sqlite/sqlite3.c | 13034 +++++++++++----- src/3rdparty/sqlite/sqlite3.h | 302 +- src/3rdparty/tinycbor/tests/encoder/data.cpp | 6 +- src/3rdparty/zlib/import_from_zlib_tarball.sh | 22 +- src/3rdparty/zlib/qt_attribution.json | 6 +- src/3rdparty/zlib/qtpatches.diff | 96 +- src/3rdparty/zlib/src/ChangeLog | 22 +- src/3rdparty/zlib/src/README | 19 +- src/3rdparty/zlib/src/adler32.c | 32 +- src/3rdparty/zlib/src/compress.c | 21 +- src/3rdparty/zlib/src/crc32.c | 248 +- src/3rdparty/zlib/src/deflate.c | 569 +- src/3rdparty/zlib/src/deflate.h | 16 +- src/3rdparty/zlib/src/gzclose.c | 4 +- src/3rdparty/zlib/src/gzguts.h | 23 +- src/3rdparty/zlib/src/gzlib.c | 101 +- src/3rdparty/zlib/src/gzread.c | 88 +- src/3rdparty/zlib/src/gzwrite.c | 84 +- src/3rdparty/zlib/src/infback.c | 30 +- src/3rdparty/zlib/src/inffast.c | 5 +- src/3rdparty/zlib/src/inffast.h | 2 +- src/3rdparty/zlib/src/inflate.c | 129 +- src/3rdparty/zlib/src/inftrees.c | 17 +- src/3rdparty/zlib/src/inftrees.h | 6 +- src/3rdparty/zlib/src/trees.c | 526 +- src/3rdparty/zlib/src/uncompr.c | 16 +- src/3rdparty/zlib/src/zconf.h | 8 +- src/3rdparty/zlib/src/zlib.h | 379 +- src/3rdparty/zlib/src/zutil.c | 60 +- src/3rdparty/zlib/src/zutil.h | 20 +- .../qtproject/qt/android/EditContextView.java | 18 + .../qtproject/qt/android/EditPopupMenu.java | 11 +- .../org/qtproject/qt/android/QtNative.java | 27 +- .../qt/android/bindings/QtActivity.java | 15 +- .../android-manifest-file-configuration.qdoc | 12 +- src/concurrent/doc/src/qt6-changes.qdoc | 2 +- src/concurrent/qtconcurrentrun.cpp | 11 +- src/corelib/CMakeLists.txt | 26 +- src/corelib/Qt6AndroidMacros.cmake | 16 +- src/corelib/Qt6CoreMacros.cmake | 21 +- src/corelib/animation/qabstractanimation.cpp | 41 +- src/corelib/animation/qabstractanimation_p.h | 6 +- src/corelib/animation/qpauseanimation.cpp | 7 +- src/corelib/animation/qpropertyanimation.cpp | 24 +- src/corelib/animation/qvariantanimation.cpp | 16 +- .../doc/snippets/code/doc_src_qset.cpp | 26 +- .../code/src_corelib_io_qsettings.cpp | 6 +- .../src_corelib_serialization_qcborstream.cpp | 2 +- .../code/src_corelib_text_qbytearray.cpp | 6 +- .../code/src_corelib_thread_qfuture.cpp | 2 +- .../snippets/code/src_corelib_tools_qhash.cpp | 52 +- .../snippets/code/src_corelib_tools_qlist.cpp | 16 +- .../snippets/code/src_corelib_tools_qmap.cpp | 36 +- .../code/src_corelib_tools_qmultimap.cpp | 44 +- .../code/src_corelib_tools_qqueue.cpp | 2 +- src/corelib/doc/snippets/qstringlist/main.cpp | 2 +- .../snippets/resource-system/application.pro | 4 +- src/corelib/doc/src/animation.qdoc | 2 +- .../src/cmake/cmake-configure-variables.qdoc | 19 + .../doc/src/cmake/qt_add_resources.qdoc | 4 +- .../doc/src/objectmodel/signalsandslots.qdoc | 6 +- src/corelib/doc/src/qt6-changes.qdoc | 2 +- src/corelib/doc/src/qtcore-index.qdoc | 1 + src/corelib/doc/src/resource-system.qdoc | 31 +- src/corelib/global/qcompare.h | 81 +- src/corelib/global/qcompare.qdoc | 59 +- src/corelib/global/qcompare_impl.h | 2 +- src/corelib/global/qcompilerdetection.h | 26 +- src/corelib/global/qfloat16.cpp | 14 + src/corelib/global/qfloat16.h | 5 + src/corelib/global/qglobalstatic.h | 1 + src/corelib/global/qlibraryinfo.cpp | 4 +- src/corelib/global/qlogging.cpp | 80 +- src/corelib/global/qnamespace.qdoc | 5 +- .../global/qoperatingsystemversion.cpp | 7 + src/corelib/global/qoperatingsystemversion.h | 1 + src/corelib/global/qsimd_p.h | 28 +- src/corelib/global/qsysinfo.h | 3 + src/corelib/global/qtdeprecationmarkers.h | 2 + src/corelib/global/qtnoop.h | 9 +- src/corelib/global/qtypeinfo.h | 4 +- src/corelib/io/qloggingcategory.h | 7 +- src/corelib/io/qprocess.cpp | 46 +- src/corelib/io/qprocess_p.h | 56 +- src/corelib/io/qprocess_unix.cpp | 83 +- src/corelib/io/qprocess_win.cpp | 11 +- src/corelib/io/qresource.cpp | 2 +- src/corelib/io/qsettings.cpp | 50 +- src/corelib/io/qstandardpaths_win.cpp | 11 +- src/corelib/io/qstorageinfo_unix.cpp | 4 +- src/corelib/io/qurl.cpp | 2 +- src/corelib/io/qurlidna.cpp | 10 +- src/corelib/itemmodels/qabstractitemmodel.cpp | 9 +- .../itemmodels/qabstractproxymodel.cpp | 26 +- .../itemmodels/qitemselectionmodel.cpp | 100 +- src/corelib/itemmodels/qitemselectionmodel.h | 7 - .../itemmodels/qitemselectionmodel_p.h | 29 +- .../itemmodels/qsortfilterproxymodel.cpp | 15 +- src/corelib/kernel/qcore_mac.mm | 99 +- src/corelib/kernel/qcore_mac_p.h | 2 +- src/corelib/kernel/qcoreapplication.cpp | 70 +- src/corelib/kernel/qcoreevent.h | 2 +- src/corelib/kernel/qeventdispatcher_wasm.cpp | 24 +- src/corelib/kernel/qeventdispatcher_win.cpp | 9 +- src/corelib/kernel/qfunctions_win.cpp | 38 +- src/corelib/kernel/qmetacontainer.h | 2 + src/corelib/kernel/qmetaobject.cpp | 13 +- src/corelib/kernel/qmetatype.cpp | 14 +- src/corelib/kernel/qobject.cpp | 146 +- src/corelib/kernel/qobject_p.h | 39 +- src/corelib/kernel/qobjectdefs_impl.h | 50 +- src/corelib/kernel/qpermissions.h | 6 +- src/corelib/kernel/qpermissions_wasm.cpp | 3 - src/corelib/kernel/qproperty.cpp | 16 +- src/corelib/kernel/qproperty_p.h | 1 + src/corelib/kernel/qtimer.cpp | 22 +- src/corelib/kernel/qtimer.h | 2 +- src/corelib/kernel/qvariant.cpp | 31 +- src/corelib/kernel/qvariant.h | 3 +- src/corelib/mimetypes/qmimedatabase.cpp | 13 + src/corelib/mimetypes/qmimeprovider.cpp | 46 +- src/corelib/mimetypes/qmimeprovider_p.h | 31 + src/corelib/mimetypes/qmimetype.cpp | 42 +- src/corelib/mimetypes/qmimetype_p.h | 1 + src/corelib/mimetypes/qmimetypeparser.cpp | 1 + .../qdarwinpermissionplugin_bluetooth.mm | 6 +- .../qdarwinpermissionplugin_calendar.mm | 22 +- .../qdarwinpermissionplugin_location.mm | 9 +- .../darwin/qdarwinpermissionplugin_p_p.h | 4 +- src/corelib/plugin/qelfparser_p.cpp | 9 +- src/corelib/plugin/qfactoryloader.cpp | 31 +- src/corelib/plugin/qlibrary.cpp | 8 +- src/corelib/plugin/qlibrary_p.h | 8 + src/corelib/plugin/qplugin.qdoc | 9 +- .../serialization/qcborstreamreader.cpp | 4 +- src/corelib/serialization/qcborvalue.cpp | 10 +- src/corelib/serialization/qcborvalue.h | 3 + src/corelib/serialization/qdatastream.cpp | 7 +- src/corelib/serialization/qjsonvalue.h | 3 + src/corelib/serialization/qtextstream.cpp | 2 +- src/corelib/serialization/qxmlstream.cpp | 177 +- src/corelib/serialization/qxmlstream.g | 13 +- src/corelib/serialization/qxmlstream_p.h | 17 +- .../serialization/qxmlstreamparser_p.h | 13 +- src/corelib/text/qanystringview.qdoc | 17 + src/corelib/text/qbytearray.cpp | 6 +- src/corelib/text/qlocale.cpp | 14 +- src/corelib/text/qlocale.h | 11 +- src/corelib/text/qlocale.qdoc | 7 +- src/corelib/text/qlocale_data_p.h | 5964 +++---- src/corelib/text/qlocale_mac.mm | 42 +- src/corelib/text/qlocale_p.h | 10 +- src/corelib/text/qstring.cpp | 13 +- src/corelib/text/qstring.h | 232 +- src/corelib/text/qstringbuilder.h | 3 +- src/corelib/text/qstringconverter.h | 2 - src/corelib/text/qstringview.cpp | 14 +- src/corelib/text/qt_attribution.json | 2 +- src/corelib/text/qutf8stringview.qdoc | 12 +- src/corelib/thread/qfutex_p.h | 33 + src/corelib/thread/qfuture.qdoc | 9 +- src/corelib/thread/qfuture_impl.h | 2 + src/corelib/thread/qfutureinterface.cpp | 1 - src/corelib/thread/qfuturesynchronizer.h | 12 +- src/corelib/thread/qfuturesynchronizer.qdoc | 6 +- src/corelib/thread/qmutex.cpp | 2 - src/corelib/thread/qmutex.h | 3 - src/corelib/thread/qmutex_p.h | 2 - src/corelib/thread/qmutex_win.cpp | 30 - src/corelib/thread/qorderedmutexlocker_p.h | 31 - src/corelib/thread/qreadwritelock.cpp | 45 +- src/corelib/thread/qreadwritelock.h | 5 +- src/corelib/thread/qreadwritelock_p.h | 44 +- src/corelib/thread/qthread.cpp | 4 +- src/corelib/thread/qthread_p.h | 2 +- src/corelib/thread/qwaitcondition_unix.cpp | 10 +- src/corelib/thread/qwaitcondition_win.cpp | 10 +- src/corelib/time/qdatetime.cpp | 26 +- src/corelib/time/qdatetimeparser.cpp | 96 +- src/corelib/time/qdatetimeparser_p.h | 2 +- src/corelib/time/qhijricalendar_data_p.h | 32 +- src/corelib/time/qjalalicalendar_data_p.h | 396 +- src/corelib/time/qlocaltime.cpp | 17 +- src/corelib/time/qromancalendar_data_p.h | 5910 +++---- src/corelib/time/qtimezoneprivate.cpp | 6 +- src/corelib/time/qtimezoneprivate_data_p.h | 1585 +- src/corelib/time/qtimezoneprivate_p.h | 2 +- src/corelib/time/qtimezoneprivate_tz.cpp | 36 +- src/corelib/time/qtimezoneprivate_win.cpp | 6 +- src/corelib/tools/qarraydata.cpp | 6 +- .../tools/qatomicscopedvaluerollback_p.h | 7 + src/corelib/tools/qcommandlineparser.cpp | 45 +- src/corelib/tools/qcryptographichash.cpp | 2 +- src/corelib/tools/qduplicatetracker_p.h | 2 +- src/corelib/tools/qflatmap_p.h | 7 +- src/corelib/tools/qfreelist.cpp | 10 +- src/corelib/tools/qhash.cpp | 2 +- src/corelib/tools/qhash.h | 34 +- src/corelib/tools/qlist.qdoc | 5 +- src/corelib/tools/qmap.qdoc | 2 +- src/corelib/tools/qmultimap.qdoc | 2 +- src/corelib/tools/qset.qdoc | 11 +- src/corelib/tools/qsharedpointer_impl.h | 8 +- src/corelib/tools/qtimeline.cpp | 42 +- src/dbus/doc/src/qt6-changes.qdoc | 2 +- src/dbus/qdbusabstractadaptor.cpp | 4 +- src/dbus/qdbusintegrator.cpp | 2 +- src/dbus/qdbusmetatype.cpp | 20 +- src/dbus/qdbusserver.cpp | 33 +- src/dbus/qdbusservicewatcher.cpp | 77 +- src/gui/CMakeLists.txt | 3 +- src/gui/accessible/linux/atspiadaptor.cpp | 10 +- src/gui/accessible/linux/dbusconnection.cpp | 11 +- src/gui/accessible/linux/dbusxml/Socket.xml | 2 +- .../windows/apisupport/qwindowsuiawrapper.cpp | 10 +- .../windows/apisupport/qwindowsuiawrapper_p.h | 3 - .../windows/apisupport/uiatypes_p.h | 16 - .../code/src_gui_painting_qpainter.cpp | 4 +- .../code/src_gui_vulkan_qvulkanfunctions.cpp | 10 +- src/gui/doc/src/qt6-changes.qdoc | 2 +- src/gui/doc/src/richtext.qdoc | 6 +- src/gui/image/qicon.cpp | 16 +- src/gui/image/qiconloader.cpp | 108 +- src/gui/image/qiconloader_p.h | 4 +- src/gui/image/qimage.cpp | 6 +- src/gui/image/qimage_p.h | 8 +- src/gui/image/qimagereader.cpp | 4 +- src/gui/image/qmovie.cpp | 2 +- src/gui/image/qpixmapcache.cpp | 72 +- src/gui/image/qpixmapcache_p.h | 1 + src/gui/itemmodels/qfilesystemmodel.cpp | 25 +- src/gui/kernel/qaction.cpp | 2 +- src/gui/kernel/qdrag.cpp | 2 +- src/gui/kernel/qevent.cpp | 4 - src/gui/kernel/qeventpoint.cpp | 1 + src/gui/kernel/qguiapplication.cpp | 48 +- src/gui/kernel/qguiapplication_p.h | 4 +- src/gui/kernel/qinputdevice.cpp | 9 +- src/gui/kernel/qoffscreensurface.h | 2 +- src/gui/kernel/qpaintdevicewindow_p.h | 2 +- src/gui/kernel/qplatformdialoghelper.cpp | 2 +- .../kernel/qplatformgraphicsbufferhelper.cpp | 4 +- src/gui/kernel/qplatformscreen.cpp | 5 +- src/gui/kernel/qpointingdevice.cpp | 2 +- src/gui/kernel/qscreen.cpp | 7 +- src/gui/kernel/qsessionmanager_p.h | 2 +- src/gui/kernel/qsimpledrag.cpp | 7 +- src/gui/kernel/qwindow.cpp | 11 +- src/gui/kernel/qwindowsysteminterface.h | 2 + src/gui/math3d/qquaternion.cpp | 4 +- .../qbackingstoredefaultcompositor.cpp | 81 +- .../qbackingstoredefaultcompositor_p.h | 21 +- src/gui/painting/qblendfunctions.cpp | 4 +- src/gui/painting/qblendfunctions_p.h | 4 +- src/gui/painting/qcoregraphics.mm | 13 +- src/gui/painting/qdatabuffer_p.h | 3 + src/gui/painting/qdrawhelper.cpp | 14 +- src/gui/painting/qdrawhelper_mips_dsp.cpp | 4 +- src/gui/painting/qdrawhelper_neon.cpp | 6 +- src/gui/painting/qdrawhelper_sse2.cpp | 12 +- src/gui/painting/qdrawhelper_sse4.cpp | 8 +- src/gui/painting/qpaintengine_raster.cpp | 3 +- src/gui/painting/qpathclipper.cpp | 3 +- src/gui/painting/qpolygon.cpp | 14 +- src/gui/painting/qt_attribution.json | 2 +- .../platform/unix/qgenericunixservices.cpp | 14 +- src/gui/platform/unix/qgenericunixthemes.cpp | 303 +- src/gui/platform/unix/qxkbcommon_p.h | 2 +- src/gui/platform/wasm/qlocalfileapi.cpp | 94 +- src/gui/platform/wasm/qlocalfileapi_p.h | 22 +- .../platform/wasm/qwasmlocalfileaccess.cpp | 68 +- src/gui/rhi/qrhi.cpp | 25 +- src/gui/rhi/qrhi_p_p.h | 17 +- src/gui/rhi/qrhid3d11.cpp | 402 +- src/gui/rhi/qrhid3d11_p_p.h | 4 - src/gui/rhi/qrhigles2.cpp | 45 +- src/gui/rhi/qrhimetal.mm | 136 +- src/gui/rhi/qrhinull.cpp | 40 +- src/gui/rhi/qrhivulkan.cpp | 9 +- .../text/coretext/qcoretextfontdatabase.mm | 2 +- src/gui/text/freetype/qfontengine_ft.cpp | 6 +- src/gui/text/qfont.cpp | 4 +- src/gui/text/qfontdatabase.cpp | 2 +- src/gui/text/qfontmetrics.cpp | 2 +- src/gui/text/qtextdocumentlayout.cpp | 11 +- src/gui/text/qtextformat.cpp | 2 +- src/gui/text/qtextmarkdownimporter.cpp | 2 + .../text/windows/qwindowsfontdatabasebase.cpp | 11 +- src/gui/util/qastchandler.cpp | 6 +- src/gui/vulkan/qvulkaninstance.cpp | 7 +- src/gui/vulkan/qvulkanwindow.cpp | 6 +- src/network/CMakeLists.txt | 2 + src/network/access/qhttpnetworkconnection.cpp | 15 +- .../access/qhttpnetworkconnectionchannel.cpp | 7 + src/network/access/qhttpthreaddelegate.cpp | 7 +- src/network/access/qnetworkaccesscache.cpp | 3 - src/network/access/qnetworkaccesscache_p.h | 3 - src/network/access/qnetworkaccessmanager.cpp | 4 +- src/network/access/qnetworkreplyfileimpl_p.h | 6 +- src/network/access/qnetworkreplyhttpimpl.cpp | 14 +- src/network/access/qnetworkreplyimpl.cpp | 7 +- src/network/access/qnetworkreplywasmimpl.cpp | 2 +- src/network/doc/qtnetwork.qdocconf | 2 +- src/network/doc/src/ssl.qdoc | 2 + src/network/kernel/qdnslookup.cpp | 8 +- src/network/kernel/qdnslookup_p.h | 3 +- src/network/kernel/qdnslookup_unix.cpp | 4 + src/network/kernel/qdnslookup_win.cpp | 1 + src/network/kernel/qhostinfo.cpp | 47 +- src/network/kernel/qhostinfo_p.h | 19 +- .../kernel/qnetworkinterface_linux.cpp | 9 +- .../socket/qnativesocketengine_unix.cpp | 4 + .../socket/qnativesocketengine_win.cpp | 3 - src/network/ssl/qsslconfiguration.cpp | 12 +- .../ssl/qssldiffiehellmanparameters.cpp | 13 +- src/network/ssl/qsslserver.cpp | 2 + src/network/ssl/qsslsocket.cpp | 5 + src/opengl/doc/qtopengl.qdocconf | 13 +- src/opengl/doc/src/qt6-changes.qdoc | 2 +- src/opengl/doc/src/qtopengl-examples.qdoc | 2 +- src/opengl/doc/src/qtopengl-index.qdoc | 2 +- src/opengl/qopenglfunctions_2_0.cpp | 1 - src/opengl/qopenglfunctions_2_0.h | 2 +- src/opengl/qopenglfunctions_2_1.cpp | 1 - src/opengl/qopenglfunctions_2_1.h | 2 +- src/opengl/qopenglfunctions_3_0.cpp | 2 - src/opengl/qopenglfunctions_3_0.h | 4 +- .../qopenglfunctions_3_2_compatibility.cpp | 2 - .../qopenglfunctions_3_2_compatibility.h | 4 +- .../qopenglfunctions_3_3_compatibility.cpp | 1 - .../qopenglfunctions_3_3_compatibility.h | 2 +- .../qopenglfunctions_4_0_compatibility.cpp | 1 - .../qopenglfunctions_4_0_compatibility.h | 2 +- .../qopenglfunctions_4_1_compatibility.cpp | 1 - .../qopenglfunctions_4_1_compatibility.h | 2 +- .../qopenglfunctions_4_2_compatibility.cpp | 1 - .../qopenglfunctions_4_2_compatibility.h | 2 +- .../qopenglfunctions_4_3_compatibility.cpp | 1 - .../qopenglfunctions_4_3_compatibility.h | 2 +- src/openglwidgets/qopenglwidget.cpp | 10 +- src/plugins/imageformats/ico/qicohandler.cpp | 2 +- .../networklistmanager/CMakeLists.txt | 1 + .../android/androidcontentfileengine.cpp | 25 +- .../platforms/android/androidjniclipboard.cpp | 10 +- .../platforms/android/androidjniinput.cpp | 34 +- .../platforms/android/androidjniinput.h | 3 + .../qandroidassetsfileenginehandler.cpp | 13 +- .../android/qandroidinputcontext.cpp | 98 +- .../android/qandroidplatformbackingstore.cpp | 12 +- .../android/qandroidplatformbackingstore.h | 1 - .../android/qandroidplatformscreen.cpp | 43 +- .../platforms/cocoa/qcocoaaccessibility.mm | 1 + .../cocoa/qcocoaaccessibilityelement.mm | 14 +- src/plugins/platforms/cocoa/qcocoadrag.h | 2 +- src/plugins/platforms/cocoa/qcocoadrag.mm | 10 +- .../platforms/cocoa/qcocoafiledialoghelper.mm | 67 +- .../platforms/cocoa/qcocoaintegration.mm | 1 + src/plugins/platforms/cocoa/qcocoamenu.mm | 13 + src/plugins/platforms/cocoa/qcocoamenuitem.mm | 15 +- .../platforms/cocoa/qcocoamessagedialog.h | 1 + .../platforms/cocoa/qcocoamessagedialog.mm | 18 +- src/plugins/platforms/cocoa/qcocoascreen.mm | 52 +- src/plugins/platforms/cocoa/qcocoawindow.mm | 43 +- .../platforms/cocoa/qnsview_drawing.mm | 6 +- src/plugins/platforms/cocoa/qnsview_mouse.mm | 30 +- src/plugins/platforms/direct2d/CMakeLists.txt | 1 + .../ios/qiosplatformaccessibility.mm | 17 +- .../platforms/ios/qiostextinputoverlay.mm | 31 +- src/plugins/platforms/ios/qiostheme.mm | 16 +- .../platforms/ios/qiosviewcontroller.mm | 5 +- src/plugins/platforms/ios/qioswindow.mm | 1 + .../platforms/ios/quiview_accessibility.mm | 1 - .../platforms/wasm/qwasmaccessibility.cpp | 12 +- .../platforms/wasm/qwasmaccessibility.h | 4 + .../platforms/wasm/qwasmcompositor.cpp | 13 +- src/plugins/platforms/wasm/qwasmcssstyle.cpp | 25 +- src/plugins/platforms/wasm/qwasmcursor.cpp | 7 +- .../platforms/wasm/qwasminputcontext.cpp | 35 +- .../platforms/wasm/qwasminputcontext.h | 4 +- .../platforms/wasm/qwasmintegration.cpp | 12 +- src/plugins/platforms/wasm/qwasmplatform.cpp | 5 +- src/plugins/platforms/wasm/qwasmplatform.h | 2 +- src/plugins/platforms/wasm/qwasmwindow.cpp | 53 +- src/plugins/platforms/wasm/qwasmwindow.h | 6 + .../platforms/wasm/qwasmwindowclientarea.cpp | 5 +- src/plugins/platforms/windows/CMakeLists.txt | 1 + .../platforms/windows/qwin10helpers.cpp | 86 +- .../platforms/windows/qwindowsapplication.cpp | 2 +- .../platforms/windows/qwindowscombase.h | 2 + .../platforms/windows/qwindowscontext.cpp | 150 +- .../platforms/windows/qwindowscontext.h | 91 - .../platforms/windows/qwindowsdrag.cpp | 4 +- .../platforms/windows/qwindowskeymapper.cpp | 31 +- .../windows/qwindowspointerhandler.cpp | 24 +- .../platforms/windows/qwindowsscreen.cpp | 295 +- .../platforms/windows/qwindowsscreen.h | 9 +- .../platforms/windows/qwindowsservices.cpp | 5 + .../platforms/windows/qwindowstheme.cpp | 194 +- src/plugins/platforms/windows/qwindowstheme.h | 2 +- .../platforms/windows/qwindowswindow.cpp | 255 +- .../platforms/windows/qwindowswindow.h | 8 + .../uiautomation/qwindowsuiamainprovider.cpp | 26 +- .../uiautomation/qwindowsuiatextprovider.cpp | 7 +- src/plugins/platforms/xcb/qxcbatom.cpp | 6 +- .../platforms/xcb/qxcbconnection_xi2.cpp | 38 +- .../platformthemes/gtk3/qgtk3interface.cpp | 20 +- .../platformthemes/gtk3/qgtk3interface_p.h | 2 +- .../platformthemes/gtk3/qgtk3storage.cpp | 2 +- .../qxdgdesktopportalfiledialog.cpp | 23 +- .../qxdgdesktopportaltheme.cpp | 2 + src/plugins/sqldrivers/.cmake.conf | 2 +- src/plugins/sqldrivers/ibase/qsql_ibase.cpp | 6 + src/plugins/sqldrivers/oci/qsql_oci.cpp | 7 - .../windowsvista/qwindowsvistastyle.cpp | 38 +- .../windowsvista/qwindowsvistastyle_p_p.h | 3 + src/plugins/tls/openssl/qdtls_openssl.cpp | 4 - .../qssldiffiehellmanparameters_openssl.cpp | 1 + .../openssl/qsslsocket_openssl_symbols.cpp | 29 +- .../openssl/qsslsocket_openssl_symbols_p.h | 10 +- src/plugins/tls/schannel/qtls_schannel.cpp | 21 + src/plugins/tracing/qctflib.cpp | 120 +- src/plugins/tracing/qctflib_p.h | 2 +- src/printsupport/dialogs/qprintdialog_mac.mm | 5 +- src/printsupport/doc/src/qt6-changes.qdoc | 2 +- src/printsupport/kernel/qprinterinfo.cpp | 2 +- src/sql/doc/src/qt6-changes.qdoc | 2 +- src/sql/kernel/qsqldatabase.cpp | 32 +- src/sql/models/qsqltablemodel.cpp | 2 +- src/testlib/3rdparty/linux_perf_event_p.h | 2 +- src/testlib/3rdparty/qt_attribution.json | 2 +- src/testlib/doc/src/qt6-changes.qdoc | 2 +- .../doc/src/qttest-best-practices.qdoc | 19 +- src/testlib/doc/src/qttestlib-manual.qdoc | 470 - src/testlib/doc/src/qttestlib-tutorial1.qdoc | 76 + src/testlib/doc/src/qttestlib-tutorial2.qdoc | 132 + src/testlib/doc/src/qttestlib-tutorial3.qdoc | 75 + src/testlib/doc/src/qttestlib-tutorial4.qdoc | 95 + src/testlib/doc/src/qttestlib-tutorial5.qdoc | 57 + src/testlib/doc/src/qttestlib-tutorial6.qdoc | 50 + src/testlib/qjunittestlogger.cpp | 7 - src/testlib/qplaintestlogger.cpp | 7 - src/testlib/qtestassert.h | 5 +- src/testlib/qtestblacklist.cpp | 3 +- src/testlib/qtestcase.cpp | 4 +- src/testlib/qtestcase.h | 7 +- src/tools/androiddeployqt/main.cpp | 2 +- src/tools/macdeployqt/shared/shared.cpp | 5 +- src/tools/macdeployqt/shared/shared.h | 5 +- src/tools/moc/CMakeLists.txt | 1 + src/tools/moc/generator.cpp | 94 +- src/tools/moc/main.cpp | 21 +- src/tools/moc/moc.cpp | 130 +- src/tools/moc/moc.h | 9 +- src/tools/moc/parser.cpp | 17 +- src/tools/moc/parser.h | 6 +- src/tools/moc/preprocessor.cpp | 37 +- src/tools/moc/preprocessor.h | 5 +- src/tools/moc/symbols.h | 69 +- src/tools/moc/utils.h | 11 +- src/tools/qdbuscpp2xml/CMakeLists.txt | 2 + src/tools/qdbuscpp2xml/qdbuscpp2xml.cpp | 14 +- src/tools/qdbusxml2cpp/CMakeLists.txt | 1 + src/tools/qdbusxml2cpp/qdbusxml2cpp.cpp | 12 +- src/tools/qtpaths/CMakeLists.txt | 4 +- src/tools/rcc/CMakeLists.txt | 1 + src/tools/syncqt/CMakeLists.txt | 27 +- src/tools/syncqt/main.cpp | 195 +- src/tools/tracegen/ctf.cpp | 2 +- src/tools/tracepointgen/parser.cpp | 31 +- src/tools/uic/CMakeLists.txt | 1 + src/tools/uic/cpp/cppwriteinitialization.cpp | 12 + src/tools/uic/ui4.cpp | 18 + src/tools/uic/ui4.h | 9 +- src/tools/windeployqt/main.cpp | 31 +- src/tools/windeployqt/qtmoduleinfo.cpp | 4 +- src/widgets/CMakeLists.txt | 15 +- src/widgets/accessible/complexwidgets.cpp | 10 +- src/widgets/accessible/itemviews.cpp | 226 +- src/widgets/accessible/qaccessiblewidgets.cpp | 2 +- src/widgets/dialogs/qcolordialog.cpp | 44 +- src/widgets/dialogs/qdialog.cpp | 48 +- src/widgets/dialogs/qdialog_p.h | 4 +- src/widgets/dialogs/qfiledialog.cpp | 104 +- src/widgets/dialogs/qfiledialog_p.h | 5 +- src/widgets/dialogs/qfontdialog.cpp | 29 +- src/widgets/dialogs/qfontdialog_p.h | 1 + src/widgets/dialogs/qmessagebox.cpp | 88 +- src/widgets/dialogs/qmessagebox.h | 2 +- src/widgets/dialogs/qprogressdialog.cpp | 2 +- src/widgets/dialogs/qsidebar.cpp | 32 +- src/widgets/dialogs/qwizard.cpp | 55 +- src/widgets/dialogs/qwizard_win.cpp | 4 +- src/widgets/dialogs/qwizard_win_p.h | 2 +- .../images/stylesheet-coffee-cleanlooks.png | Bin 14820 -> 0 bytes .../doc/images/stylesheet-pagefold-mac.png | Bin 20618 -> 0 bytes .../code/src_gui_widgets_qspinbox.cpp | 20 + .../code/src_gui_widgets_qstatusbar.cpp | 8 + src/widgets/doc/snippets/dialogs/dialogs.cpp | 27 + .../doc/src/model-view-programming.qdoc | 8 - src/widgets/doc/src/qt6-changes.qdoc | 2 +- .../doc/src/widgets-and-layouts/layout.qdoc | 4 +- .../src/widgets-and-layouts/stylesheet.qdoc | 23 +- src/widgets/doc/src/widgets-tutorial.qdoc | 4 + .../itemviews/qabstractitemdelegate.cpp | 2 +- src/widgets/itemviews/qabstractitemview.cpp | 14 +- src/widgets/itemviews/qabstractitemview_p.h | 2 + src/widgets/itemviews/qheaderview.cpp | 20 +- src/widgets/itemviews/qitemdelegate.cpp | 9 +- src/widgets/itemviews/qlistview.cpp | 8 +- src/widgets/itemviews/qtableview.cpp | 2 +- src/widgets/itemviews/qtreeview.cpp | 120 +- src/widgets/itemviews/qtreeview_p.h | 15 + src/widgets/kernel/qaction_widgets.cpp | 5 +- src/widgets/kernel/qapplication.cpp | 9 +- src/widgets/kernel/qgesturemanager.cpp | 8 +- src/widgets/kernel/qgesturemanager_p.h | 11 - src/widgets/kernel/qlayout.cpp | 7 +- src/widgets/kernel/qlayoutitem.cpp | 2 +- src/widgets/kernel/qwhatsthis.cpp | 8 - src/widgets/kernel/qwidget.cpp | 53 +- src/widgets/kernel/qwidget.h | 3 - src/widgets/kernel/qwidget_p.h | 2 +- src/widgets/kernel/qwidgetrepaintmanager.cpp | 31 +- src/widgets/styles/qfusionstyle.cpp | 18 +- src/widgets/styles/qstyle.cpp | 5 +- src/widgets/styles/qstyleoption.cpp | 72 - src/widgets/styles/qstylesheetstyle.cpp | 40 +- src/widgets/util/qscroller.cpp | 3 - src/widgets/widgets/qabstractscrollarea.cpp | 16 +- src/widgets/widgets/qcalendarwidget.cpp | 6 +- src/widgets/widgets/qcombobox.cpp | 29 +- src/widgets/widgets/qdialogbuttonbox.cpp | 289 +- src/widgets/widgets/qdialogbuttonbox.h | 2 - src/widgets/widgets/qdialogbuttonbox_p.h | 80 + src/widgets/widgets/qdockarealayout.cpp | 33 + src/widgets/widgets/qdockarealayout_p.h | 4 + src/widgets/widgets/qdockwidget.cpp | 18 +- src/widgets/widgets/qdockwidget.h | 2 +- src/widgets/widgets/qfontcombobox.cpp | 10 +- src/widgets/widgets/qlabel.cpp | 7 +- src/widgets/widgets/qlcdnumber.cpp | 2 +- src/widgets/widgets/qlineedit.cpp | 10 +- src/widgets/widgets/qmainwindow.cpp | 3 +- src/widgets/widgets/qmainwindowlayout.cpp | 29 +- src/widgets/widgets/qmainwindowlayout_p.h | 1 + src/widgets/widgets/qmdiarea.cpp | 69 +- src/widgets/widgets/qmenu.cpp | 27 +- src/widgets/widgets/qplaintextedit.cpp | 3 +- src/widgets/widgets/qscrollarea.cpp | 6 +- src/widgets/widgets/qspinbox.cpp | 7 +- src/widgets/widgets/qstatusbar.cpp | 6 +- src/widgets/widgets/qtabbar.cpp | 15 +- src/widgets/widgets/qtabbar_p.h | 8 + src/widgets/widgets/qtextedit.cpp | 5 +- src/widgets/widgets/qtoolbar.cpp | 6 +- src/widgets/widgets/qwidgettextcontrol.cpp | 2 +- src/widgets/widgets/qwidgettextcontrol_p.h | 5 + src/xml/doc/src/qt6-changes.qdoc | 2 +- src/xml/doc/src/xml-processing.qdoc | 6 +- src/xml/dom/qdom.cpp | 8 +- tests/auto/CMakeLists.txt | 48 +- tests/auto/cmake/CMakeLists.txt | 2 +- tests/auto/cmake/mockplugins/.cmake.conf | 2 +- .../test_generating_cpp_exports/.cmake.conf | 2 +- .../cmake/test_static_resources/.cmake.conf | 2 +- .../tst_qparallelanimationgroup.cpp | 2 + .../animation/qpauseanimation/CMakeLists.txt | 1 + .../qpauseanimation/tst_qpauseanimation.cpp | 7 + .../qsequentialanimationgroup/CMakeLists.txt | 2 + .../tst_qsequentialanimationgroup.cpp | 11 + .../corelib/global/qlogging/tst_qlogging.cpp | 8 + .../corelib/global/qnumeric/tst_qnumeric.cpp | 76 +- tests/auto/corelib/io/qfile/tst_qfile.cpp | 12 +- .../corelib/io/qfileinfo/tst_qfileinfo.cpp | 17 +- .../auto/corelib/io/qprocess/tst_qprocess.cpp | 77 +- .../tst_qabstractproxymodel.cpp | 10 +- .../tst_qitemselectionmodel.cpp | 52 + .../tst_qsortfilterproxymodel.cpp | 49 +- .../qdeadlinetimer/tst_qdeadlinetimer.cpp | 95 +- .../kernel/qmetatype/tst_qmetatype.cpp | 20 + .../corelib/kernel/qobject/tst_qobject.cpp | 10 + .../kernel/qproperty/tst_qproperty.cpp | 29 +- .../corelib/kernel/qsocketnotifier/BLACKLIST | 3 - .../qsocketnotifier/tst_qsocketnotifier.cpp | 13 +- .../auto/corelib/kernel/qtimer/CMakeLists.txt | 1 + .../auto/corelib/kernel/qtimer/tst_qtimer.cpp | 180 + .../corelib/kernel/qtranslator/CMakeLists.txt | 2 +- .../corelib/kernel/qvariant/tst_qvariant.cpp | 145 +- .../mime/packages/webm-glob-deleteall.xml | 7 + .../tst_qmimedatabase-cache.cpp | 6 - .../tst_qmimedatabase-xml.cpp | 3 +- .../qmimedatabase/tst_qmimedatabase.cpp | 33 +- .../qmimedatabase/tst_qmimedatabase.h | 1 + .../assets/top_level_dir/file_in_top_dir.txt | 1 + .../top_level_dir/sub_dir/file_in_sub_dir.txt | 1 + .../sub_dir_2/sub_dir_3/file_in_sub_dir_3.txt | 1 + .../corelib/platform/android/tst_android.cpp | 30 + .../corelib/plugin/qplugin/tst_qplugin.cpp | 4 - .../qpluginloader/tst_qpluginloader.cpp | 4 +- .../serialization/qxmlstream/CMakeLists.txt | 8 +- .../qxmlstream/tokenError/dtdInBody.xml | 20 + .../qxmlstream/tokenError/multipleDtd.xml | 20 + .../qxmlstream/tokenError/wellFormed.xml | 15 + .../qxmlstream/tst_qxmlstream.cpp | 83 + .../qanystringview/tst_qanystringview.cpp | 4 +- .../text/qbytearray/tst_qbytearray.cpp | 18 +- .../auto/corelib/text/qlocale/tst_qlocale.cpp | 415 +- .../auto/corelib/text/qstring/CMakeLists.txt | 8 +- .../auto/corelib/text/qstring/tst_qstring.cpp | 603 +- .../corelib/text/qstring/tst_qstring_mac.mm | 11 +- .../corelib/thread/qfuture/tst_qfuture.cpp | 13 - .../tst_qfuturesynchronizer.cpp | 33 + .../corelib/thread/qpromise/tst_qpromise.cpp | 121 +- .../corelib/time/qdatetime/tst_qdatetime.cpp | 7 +- .../qdatetimeparser/tst_qdatetimeparser.cpp | 36 +- .../corelib/time/qtimezone/tst_qtimezone.cpp | 12 +- .../tst_containerapisymmetry.cpp | 3 +- .../tst_qatomicscopedvaluerollback.cpp | 7 + .../qhashfunctions/tst_qhashfunctions.cpp | 85 +- .../tst_qmacautoreleasepool.mm | 21 - .../tools/qscopeguard/tst_qscopeguard.cpp | 21 + tests/auto/dbus/CMakeLists.txt | 1 + .../tst_qdbusabstractadaptor.cpp | 3 +- .../qdbusconnection/tst_qdbusconnection.cpp | 33 + .../qdbusconnection/tst_qdbusconnection.h | 10 + .../CMakeLists.txt | 13 + .../tst_qdbusconnection_signalorder.cpp | 103 + .../qicoimageformat/icons/masked/24bpp.ico | Bin 0 -> 12862 bytes .../qicoimageformat/icons/masked/24bpp.png | Bin 0 -> 3911 bytes .../qicoimageformat/icons/masked/32bpp.ico | Bin 0 -> 16958 bytes .../qicoimageformat/icons/masked/32bpp.png | Bin 0 -> 5536 bytes .../qicoimageformat/tst_qicoimageformat.cpp | 29 + tests/auto/gui/image/qicon/CMakeLists.txt | 4 + .../icons/fallbacktheme/16x16/edit-cut.png | Bin 0 -> 267 bytes .../qicon/icons/fallbacktheme/index.theme | 8 + .../icons/hicolor/16x16/hicolor-icon.png | Bin 0 -> 267 bytes .../gui/image/qicon/icons/hicolor/index.theme | 11 + .../image/qicon/icons/testtheme/index.theme | 2 +- .../image/qicon/icons/themeparent/index.theme | 1 - tests/auto/gui/image/qicon/tst_qicon.cpp | 24 + tests/auto/gui/image/qimage/tst_qimage.cpp | 5 +- .../image/qimagereader/tst_qimagereader.cpp | 119 +- tests/auto/gui/image/qmovie/CMakeLists.txt | 1 + tests/auto/gui/image/qmovie/tst_qmovie.cpp | 20 + .../image/qpixmapcache/tst_qpixmapcache.cpp | 136 +- .../qfilesystemmodel/tst_qfilesystemmodel.cpp | 5 +- .../qstandarditemmodel/CMakeLists.txt | 1 + .../tst_qstandarditemmodel.cpp | 4 + tests/auto/gui/kernel/CMakeLists.txt | 2 +- .../auto/gui/kernel/qclipboard/test/BLACKLIST | 5 + .../gui/kernel/qclipboard/tst_qclipboard.cpp | 21 +- .../qguiapplication/tst_qguiapplication.cpp | 4 +- .../auto/gui/kernel/qguitimer/CMakeLists.txt | 1 + tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 7 + tests/auto/gui/rhi/qrhi/tst_qrhi.cpp | 23 +- .../text/qfontdatabase/tst_qfontdatabase.cpp | 4 +- tests/auto/gui/text/qrawfont/tst_qrawfont.cpp | 4 +- .../auto/gui/text/qstatictext/CMakeLists.txt | 2 +- .../tst_qtextscriptengine.cpp | 9 +- .../qdoublevalidator/tst_qdoublevalidator.cpp | 28 +- .../util/qintvalidator/tst_qintvalidator.cpp | 6 +- .../auto/network/access/http2/CMakeLists.txt | 1 + .../publicsuffix/public_suffix_list.dafsa | Bin 51157 -> 51561 bytes .../tst_qnetworkcookiejar.cpp | 4 +- .../tst_qnetworkdiskcache.cpp | 1 + .../access/qnetworkreply/test/CMakeLists.txt | 1 + .../qnetworkreply/tst_qnetworkreply.cpp | 61 +- .../qnetworkrequest/tst_qnetworkrequest.cpp | 4 +- .../auto/network/kernel/qdnslookup/BLACKLIST | 2 - .../network/kernel/qdnslookup/CMakeLists.txt | 1 + .../kernel/qdnslookup/tst_qdnslookup.cpp | 127 +- .../kernel/qhostinfo/tst_qhostinfo.cpp | 28 +- .../tst_qnetworkinterface.cpp | 4 +- .../socket/qlocalsocket/CMakeLists.txt | 1 + .../socket/qlocalsocket/tst_qlocalsocket.cpp | 20 +- .../socket/qsctpsocket/tst_qsctpsocket.cpp | 11 +- .../socket/qtcpserver/tst_qtcpserver.cpp | 2 - .../socket/qtcpsocket/tst_qtcpsocket.cpp | 8 +- .../network/ssl/qasn1element/CMakeLists.txt | 1 + tests/auto/network/ssl/qdtls/CMakeLists.txt | 1 + tests/auto/network/ssl/qdtls/tst_qdtls.cpp | 26 +- .../network/ssl/qdtlscookie/CMakeLists.txt | 1 + tests/auto/network/ssl/qocsp/CMakeLists.txt | 1 + .../ssl/qpassworddigestor/CMakeLists.txt | 1 + .../ssl/qsslcertificate/CMakeLists.txt | 1 + .../qsslcertificate/tst_qsslcertificate.cpp | 4 +- .../network/ssl/qsslcipher/CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + .../ssl/qsslellipticcurve/CMakeLists.txt | 1 + .../auto/network/ssl/qsslerror/CMakeLists.txt | 1 + tests/auto/network/ssl/qsslkey/CMakeLists.txt | 5 +- .../network/ssl/qsslserver/CMakeLists.txt | 1 + .../network/ssl/qsslsocket/CMakeLists.txt | 1 + .../network/ssl/qsslsocket/tst_qsslsocket.cpp | 28 + .../CMakeLists.txt | 1 + .../CMakeLists.txt | 1 + tests/auto/other/gestures/BLACKLIST | 55 - .../dynamictreemodel.cpp | 12 +- .../qaccessibility/tst_qaccessibility.cpp | 53 + .../tst_qaccessibilitylinux.cpp | 2 +- .../tst_qaccessibilitymac.mm | 92 +- .../tst_qabstractprintdialog.cpp | 33 + .../kernel/qprinterinfo/tst_qprinterinfo.cpp | 4 +- tests/auto/sql/kernel/qsql/tst_qsql.cpp | 4 + .../tst_qabstractitemmodeltester.cpp | 1 + .../testlib/selftests/cmptest/tst_cmptest.cpp | 21 + .../selftests/expected_cmptest.junitxml | 3 +- .../selftests/expected_cmptest.lightxml | 4 + .../testlib/selftests/expected_cmptest.tap | 71 +- .../selftests/expected_cmptest.teamcity | 2 + .../testlib/selftests/expected_cmptest.txt | 3 +- .../testlib/selftests/expected_cmptest.xml | 4 + .../selftests/generate_expected_output.py | 2 +- .../auto/testlib/selftests/tst_selftests.cpp | 17 +- tests/auto/tools/CMakeLists.txt | 2 +- .../tools/macdeployqt/tst_macdeployqt.cpp | 59 +- tests/auto/tools/moc/tst_moc.cpp | 42 + tests/auto/tools/qdbuscpp2xml/CMakeLists.txt | 2 +- .../tools/qdbuscpp2xml/tst_qdbuscpp2xml.cpp | 77 +- .../tools/qdbusxml2cpp/tst_qdbusxml2cpp.cpp | 49 + tests/auto/tools/rcc/tst_rcc.cpp | 10 +- .../dialogs/qcolordialog/tst_qcolordialog.cpp | 29 + .../dialogs/qfiledialog/tst_qfiledialog.cpp | 53 +- .../dialogs/qfiledialog2/tst_qfiledialog2.cpp | 10 +- .../dialogs/qfontdialog/tst_qfontdialog.cpp | 28 + .../dialogs/qmessagebox/tst_qmessagebox.cpp | 70 + .../widgets/dialogs/qwizard/tst_qwizard.cpp | 56 +- .../qgraphicseffect/tst_qgraphicseffect.cpp | 4 +- .../graphicsview/qgraphicsitem/BLACKLIST | 3 + .../tst_qgraphicsproxywidget.cpp | 3 +- .../qgraphicsview/tst_qgraphicsview.cpp | 10 +- .../itemviews/qabstractitemview/BLACKLIST | 2 + .../itemviews/qlistview/tst_qlistview.cpp | 5 +- .../itemviews/qtableview/tst_qtableview.cpp | 21 + .../qtablewidget/tst_qtablewidget.cpp | 10 + .../itemviews/qtreewidget/tst_qtreewidget.cpp | 7 + .../kernel/qgridlayout/tst_qgridlayout.cpp | 3 +- .../widgets/kernel/qtooltip/tst_qtooltip.cpp | 3 +- tests/auto/widgets/kernel/qwidget/BLACKLIST | 2 + .../qstylesheetstyle/tst_qstylesheetstyle.cpp | 92 +- .../util/qcompleter/tst_qcompleter.cpp | 1 + .../tst_qabstractscrollarea.cpp | 53 + .../widgets/qcombobox/tst_qcombobox.cpp | 77 +- .../qdatetimeedit/tst_qdatetimeedit.cpp | 2 +- .../widgets/qdialogbuttonbox/CMakeLists.txt | 1 + .../qdialogbuttonbox/tst_qdialogbuttonbox.cpp | 71 + .../widgets/qdockwidget/tst_qdockwidget.cpp | 84 +- .../widgets/qgroupbox/tst_qgroupbox.cpp | 6 +- .../widgets/widgets/qlabel/tst_qlabel.cpp | 39 + .../widgets/qlineedit/tst_qlineedit.cpp | 86 +- .../widgets/widgets/qmainwindow/BLACKLIST | 2 + .../widgets/qmainwindow/tst_qmainwindow.cpp | 56 +- .../widgets/widgets/qmdiarea/tst_qmdiarea.cpp | 47 +- .../auto/widgets/widgets/qmenu/tst_qmenu.cpp | 80 + .../widgets/widgets/qmenubar/tst_qmenubar.cpp | 7 +- .../qopenglwidget/tst_qopenglwidget.cpp | 60 +- .../qplaintextedit/tst_qplaintextedit.cpp | 5 +- .../widgets/widgets/qspinbox/tst_qspinbox.cpp | 4 - .../widgets/qsplitter/tst_qsplitter.cpp | 2 +- .../widgets/widgets/qtabbar/tst_qtabbar.cpp | 56 + .../widgets/qtabwidget/tst_qtabwidget.cpp | 37 + .../widgets/qtextedit/tst_qtextedit.cpp | 5 +- tests/baseline/shared/paintcommands.cpp | 4 +- tests/benchmarks/corelib/CMakeLists.txt | 1 + .../qmimedatabase/tst_bench_qmimedatabase.cpp | 35 +- .../corelib/serialization/CMakeLists.txt | 4 + .../serialization/qcborvalue/CMakeLists.txt | 10 + .../qcborvalue/tst_bench_qcborvalue.cpp | 72 + .../time/qtimezone/tst_bench_qtimezone.cpp | 7 +- .../widgets/abstractscrollarea.cpp | 4 +- .../itemviews/qtableview/tst_qtableview.cpp | 16 +- .../manual/android_content_uri/CMakeLists.txt | 6 + .../embeddedintoforeignwindow/itemwindow.h | 3 +- .../corelib/permissions/CMakeLists.txt | 0 .../examples}/corelib/permissions/Info.plist | 0 .../permissions/android/AndroidManifest.xml | 0 .../examples}/corelib/permissions/main.cpp | 0 .../opengl/qopenglwidget/CMakeLists.txt | 0 .../examples}/opengl/qopenglwidget/bubble.cpp | 0 .../examples}/opengl/qopenglwidget/bubble.h | 0 .../opengl/qopenglwidget/glwidget.cpp | 0 .../examples}/opengl/qopenglwidget/glwidget.h | 0 .../examples}/opengl/qopenglwidget/main.cpp | 1 - .../opengl/qopenglwidget/mainwindow.cpp | 0 .../opengl/qopenglwidget/mainwindow.h | 0 .../opengl/qopenglwidget/qopenglwidget.pro | 0 .../examples}/opengl/qopenglwidget/qt.png | Bin .../opengl/qopenglwidget/texture.qrc | 0 .../manual/examples}/qpa/CMakeLists.txt | 0 .../manual/examples}/qpa/qpa.pro | 0 .../qpa/qrasterwindow/CMakeLists.txt | 0 .../examples}/qpa/qrasterwindow/main.cpp | 0 .../qpa/qrasterwindow/qrasterwindow.pro | 0 .../examples}/qpa/windows/CMakeLists.txt | 0 .../manual/examples}/qpa/windows/main.cpp | 0 .../manual/examples}/qpa/windows/window.cpp | 0 .../manual/examples}/qpa/windows/window.h | 0 .../manual/examples}/qpa/windows/windows.pro | 0 .../widgets}/application/CMakeLists.txt | 0 .../widgets}/application/application.pro | 0 .../widgets}/application/application.qrc | 0 .../widgets}/application/images/copy.png | Bin .../widgets}/application/images/cut.png | Bin .../widgets}/application/images/new.png | Bin .../widgets}/application/images/open.png | Bin .../widgets}/application/images/paste.png | Bin .../widgets}/application/images/save.png | Bin .../examples/widgets}/application/main.cpp | 4 - .../widgets}/application/mainwindow.cpp | 68 +- .../widgets}/application/mainwindow.h | 2 - .../dialogs/classwizard/CMakeLists.txt | 0 .../dialogs/classwizard/classwizard.cpp | 0 .../widgets/dialogs/classwizard/classwizard.h | 0 .../dialogs/classwizard/classwizard.pro | 0 .../dialogs/classwizard/classwizard.qrc | 0 .../dialogs/classwizard/images/background.png | Bin .../dialogs/classwizard/images/banner.png | Bin .../dialogs/classwizard/images/logo1.png | Bin .../dialogs/classwizard/images/logo2.png | Bin .../dialogs/classwizard/images/logo3.png | Bin .../dialogs/classwizard/images/watermark1.png | Bin .../dialogs/classwizard/images/watermark2.png | Bin .../widgets/dialogs/classwizard/main.cpp | 2 - .../widgets/dialogs/extension/CMakeLists.txt | 0 .../widgets/dialogs/extension/extension.pro | 0 .../widgets/dialogs/extension/finddialog.cpp | 0 .../widgets/dialogs/extension/finddialog.h | 0 .../widgets/dialogs/extension/main.cpp | 0 .../draganddrop/fridgemagnets/CMakeLists.txt | 0 .../draganddrop/fridgemagnets/draglabel.cpp | 0 .../draganddrop/fridgemagnets/draglabel.h | 0 .../draganddrop/fridgemagnets/dragwidget.cpp | 0 .../draganddrop/fridgemagnets/dragwidget.h | 0 .../fridgemagnets/fridgemagnets.pro | 0 .../fridgemagnets/fridgemagnets.qrc | 0 .../draganddrop/fridgemagnets/main.cpp | 2 - .../draganddrop/fridgemagnets/words.txt | 0 .../widgets/draganddrop/puzzle/CMakeLists.txt | 0 .../widgets/draganddrop/puzzle/example.jpg | Bin .../widgets/draganddrop/puzzle/main.cpp | 2 - .../widgets/draganddrop/puzzle/mainwindow.cpp | 0 .../widgets/draganddrop/puzzle/mainwindow.h | 0 .../widgets/draganddrop/puzzle/pieceslist.cpp | 0 .../widgets/draganddrop/puzzle/pieceslist.h | 0 .../widgets/draganddrop/puzzle/puzzle.pro | 0 .../widgets/draganddrop/puzzle/puzzle.qrc | 0 .../draganddrop/puzzle/puzzlewidget.cpp | 0 .../widgets/draganddrop/puzzle/puzzlewidget.h | 0 .../effects/fademessage/CMakeLists.txt | 0 .../widgets/effects/fademessage/README | 0 .../effects/fademessage/background.jpg | Bin .../effects/fademessage/fademessage.cpp | 0 .../widgets/effects/fademessage/fademessage.h | 0 .../effects/fademessage/fademessage.pro | 0 .../effects/fademessage/fademessage.qrc | 0 .../widgets/effects/fademessage/main.cpp | 0 .../embeddeddialogs/CMakeLists.txt | 0 .../embeddeddialogs/No-Ones-Laughing-3.jpg | Bin .../embeddeddialogs/customproxy.cpp | 0 .../embeddeddialogs/customproxy.h | 0 .../embeddeddialogs/embeddeddialog.cpp | 0 .../embeddeddialogs/embeddeddialog.h | 0 .../embeddeddialogs/embeddeddialog.ui | 0 .../embeddeddialogs/embeddeddialogs.pro | 0 .../embeddeddialogs/embeddeddialogs.qrc | 0 .../graphicsview/embeddeddialogs/main.cpp | 1 - .../graphicsview/flowlayout/CMakeLists.txt | 0 .../graphicsview/flowlayout/flowlayout.cpp | 0 .../graphicsview/flowlayout/flowlayout.h | 0 .../graphicsview/flowlayout/flowlayout.pro | 0 .../widgets/graphicsview/flowlayout/main.cpp | 0 .../graphicsview/flowlayout/window.cpp | 0 .../widgets/graphicsview/flowlayout/window.h | 0 .../widgets/itemviews/chart/CMakeLists.txt | 0 .../widgets/itemviews/chart/chart.pro | 0 .../widgets/itemviews/chart/chart.qrc | 0 .../widgets/itemviews/chart}/main.cpp | 0 .../widgets/itemviews/chart/mainwindow.cpp | 0 .../widgets/itemviews/chart/mainwindow.h | 0 .../widgets/itemviews/chart/pieview.cpp | 0 .../widgets/itemviews/chart/pieview.h | 0 .../widgets/itemviews/chart/qtdata.cht | 0 .../widgets/itemviews/dirview/CMakeLists.txt | 0 .../widgets/itemviews/dirview/dirview.pro | 0 .../widgets/itemviews/dirview/main.cpp | 0 .../itemviews/interview/CMakeLists.txt | 0 .../widgets/itemviews/interview/README | 0 .../itemviews/interview/images/folder.png | Bin .../itemviews/interview/images/interview.png | Bin .../itemviews/interview/images/services.png | Bin .../widgets/itemviews/interview/interview.pro | 0 .../widgets/itemviews/interview/interview.qrc | 0 .../widgets/itemviews/interview/main.cpp | 2 - .../widgets/itemviews/interview/model.cpp | 0 .../widgets/itemviews/interview/model.h | 0 .../itemviews/pixelator/CMakeLists.txt | 0 .../itemviews/pixelator/imagemodel.cpp | 0 .../widgets/itemviews/pixelator/imagemodel.h | 0 .../widgets/itemviews/pixelator/images.qrc | 0 .../widgets/itemviews/pixelator/images/qt.png | Bin .../widgets/itemviews/pixelator/main.cpp | 2 - .../itemviews/pixelator/mainwindow.cpp | 0 .../widgets/itemviews/pixelator/mainwindow.h | 0 .../widgets/itemviews/pixelator/pixelator.pro | 0 .../itemviews/pixelator/pixeldelegate.cpp | 0 .../itemviews/pixelator/pixeldelegate.h | 0 .../widgets/itemviews/puzzle/CMakeLists.txt | 0 .../widgets/itemviews/puzzle/example.jpg | Bin .../widgets/itemviews/puzzle/main.cpp | 2 - .../widgets/itemviews/puzzle/mainwindow.cpp | 0 .../widgets/itemviews/puzzle/mainwindow.h | 0 .../widgets/itemviews/puzzle/piecesmodel.cpp | 0 .../widgets/itemviews/puzzle/piecesmodel.h | 0 .../widgets/itemviews/puzzle/puzzle.pro | 0 .../widgets/itemviews/puzzle/puzzle.qrc | 0 .../widgets/itemviews/puzzle/puzzlewidget.cpp | 0 .../widgets/itemviews/puzzle/puzzlewidget.h | 0 .../itemviews/simpledommodel/CMakeLists.txt | 0 .../itemviews/simpledommodel/domitem.cpp | 0 .../itemviews/simpledommodel/domitem.h | 0 .../itemviews/simpledommodel/dommodel.cpp | 0 .../itemviews/simpledommodel/dommodel.h | 0 .../widgets/itemviews/simpledommodel/main.cpp | 0 .../itemviews/simpledommodel/mainwindow.cpp | 0 .../itemviews/simpledommodel/mainwindow.h | 0 .../simpledommodel/simpledommodel.pro | 0 .../simplewidgetmapper/CMakeLists.txt | 0 .../itemviews/simplewidgetmapper/main.cpp | 0 .../simplewidgetmapper/simplewidgetmapper.pro | 0 .../itemviews/simplewidgetmapper/window.cpp | 0 .../itemviews/simplewidgetmapper/window.h | 0 .../itemviews/storageview/CMakeLists.txt | 0 .../widgets/itemviews/storageview/main.cpp | 0 .../itemviews/storageview/storagemodel.cpp | 0 .../itemviews/storageview/storagemodel.h | 0 .../itemviews/storageview/storageview.pro | 0 .../layouts/borderlayout/CMakeLists.txt | 0 .../layouts/borderlayout/borderlayout.cpp | 0 .../layouts/borderlayout/borderlayout.h | 0 .../layouts/borderlayout/borderlayout.pro | 0 .../widgets/layouts/borderlayout/main.cpp | 0 .../widgets/layouts/borderlayout/window.cpp | 0 .../widgets/layouts/borderlayout/window.h | 0 .../layouts/dynamiclayouts/CMakeLists.txt | 0 .../widgets/layouts/dynamiclayouts/dialog.cpp | 0 .../widgets/layouts/dynamiclayouts/dialog.h | 0 .../layouts/dynamiclayouts/dynamiclayouts.pro | 0 .../widgets/layouts/dynamiclayouts/main.cpp | 0 .../mainwindows/dockwidgets/CMakeLists.txt | 0 .../mainwindows/dockwidgets/dockwidgets.pro | 0 .../mainwindows/dockwidgets/dockwidgets.qrc | 0 .../mainwindows/dockwidgets/images/new.png | Bin .../mainwindows/dockwidgets/images/print.png | Bin .../mainwindows/dockwidgets/images/save.png | Bin .../mainwindows/dockwidgets/images/undo.png | Bin .../widgets/mainwindows/dockwidgets/main.cpp | 1 - .../mainwindows/dockwidgets/mainwindow.cpp | 0 .../mainwindows/dockwidgets/mainwindow.h | 0 .../mainwindows/mainwindow/CMakeLists.txt | 0 .../mainwindows/mainwindow/colorswatch.cpp | 0 .../mainwindows/mainwindow/colorswatch.h | 0 .../widgets/mainwindows/mainwindow/main.cpp | 0 .../mainwindows/mainwindow/mainwindow.cpp | 0 .../mainwindows/mainwindow/mainwindow.h | 0 .../mainwindows/mainwindow/mainwindow.pro | 2 + .../mainwindows/mainwindow/mainwindow.qrc | 0 .../widgets/mainwindows/mainwindow/qt.png | Bin .../mainwindows/mainwindow/titlebarCenter.png | Bin .../mainwindows/mainwindow/titlebarLeft.png | Bin .../mainwindows/mainwindow/titlebarRight.png | Bin .../mainwindows/mainwindow/toolbar.cpp | 0 .../widgets/mainwindows/mainwindow/toolbar.h | 0 .../widgets/mainwindows/mdi/CMakeLists.txt | 0 .../widgets/mainwindows/mdi/images/copy.png | Bin .../widgets/mainwindows/mdi/images/cut.png | Bin .../widgets/mainwindows/mdi/images/new.png | Bin .../widgets/mainwindows/mdi/images/open.png | Bin .../widgets/mainwindows/mdi/images/paste.png | Bin .../widgets/mainwindows/mdi/images/save.png | Bin .../widgets/mainwindows/mdi/main.cpp | 2 - .../widgets/mainwindows/mdi/mainwindow.cpp | 2 + .../widgets/mainwindows/mdi/mainwindow.h | 0 .../examples}/widgets/mainwindows/mdi/mdi.pro | 0 .../examples}/widgets/mainwindows/mdi/mdi.qrc | 0 .../widgets/mainwindows/mdi/mdichild.cpp | 0 .../widgets/mainwindows/mdi/mdichild.h | 0 .../painting/fontsampler/CMakeLists.txt | 0 .../painting/fontsampler/fontsampler.pro | 0 .../widgets/painting/fontsampler}/main.cpp | 0 .../painting/fontsampler/mainwindow.cpp | 0 .../widgets/painting/fontsampler/mainwindow.h | 0 .../painting/fontsampler/mainwindowbase.ui | 0 .../widgets/richtext/calendar/CMakeLists.txt | 0 .../widgets/richtext/calendar/calendar.pro | 0 .../widgets/richtext/calendar/main.cpp | 0 .../widgets/richtext/calendar/mainwindow.cpp | 0 .../widgets/richtext/calendar/mainwindow.h | 0 .../widgets/richtext/textedit/CMakeLists.txt | 0 .../widgets/richtext/textedit/example.html | 0 .../widgets/richtext/textedit/example.md | 0 .../richtext/textedit/images/logo32.png | Bin .../textedit/images/mac/checkbox-checked.png | Bin .../richtext/textedit/images/mac/checkbox.png | Bin .../richtext/textedit/images/mac/editcopy.png | Bin .../richtext/textedit/images/mac/editcut.png | Bin .../textedit/images/mac/editpaste.png | Bin .../richtext/textedit/images/mac/editredo.png | Bin .../richtext/textedit/images/mac/editundo.png | Bin .../textedit/images/mac/exportpdf.png | Bin .../richtext/textedit/images/mac/filenew.png | Bin .../richtext/textedit/images/mac/fileopen.png | Bin .../textedit/images/mac/fileprint.png | Bin .../richtext/textedit/images/mac/filesave.png | Bin .../images/mac/format-indent-less.png | Bin .../images/mac/format-indent-more.png | Bin .../richtext/textedit/images/mac/textbold.png | Bin .../textedit/images/mac/textcenter.png | Bin .../textedit/images/mac/textitalic.png | Bin .../textedit/images/mac/textjustify.png | Bin .../richtext/textedit/images/mac/textleft.png | Bin .../textedit/images/mac/textright.png | Bin .../textedit/images/mac/textunder.png | Bin .../textedit/images/mac/textundercolor.png | Bin .../richtext/textedit/images/mac/zoomin.png | Bin .../richtext/textedit/images/mac/zoomout.png | Bin .../textedit/images/win/checkbox-checked.png | Bin .../richtext/textedit/images/win/checkbox.png | Bin .../richtext/textedit/images/win/editcopy.png | Bin .../richtext/textedit/images/win/editcut.png | Bin .../textedit/images/win/editpaste.png | Bin .../richtext/textedit/images/win/editredo.png | Bin .../richtext/textedit/images/win/editundo.png | Bin .../textedit/images/win/exportpdf.png | Bin .../richtext/textedit/images/win/filenew.png | Bin .../richtext/textedit/images/win/fileopen.png | Bin .../textedit/images/win/fileprint.png | Bin .../richtext/textedit/images/win/filesave.png | Bin .../images/win/format-indent-less.png | Bin .../images/win/format-indent-more.png | Bin .../richtext/textedit/images/win/textbold.png | Bin .../textedit/images/win/textcenter.png | Bin .../textedit/images/win/textitalic.png | Bin .../textedit/images/win/textjustify.png | Bin .../richtext/textedit/images/win/textleft.png | Bin .../textedit/images/win/textright.png | Bin .../textedit/images/win/textunder.png | Bin .../textedit/images/win/textundercolor.png | Bin .../richtext/textedit/images/win/zoomin.png | Bin .../richtext/textedit/images/win/zoomout.png | Bin .../widgets/richtext/textedit/main.cpp | 2 - .../widgets/richtext/textedit/textedit.cpp | 2 + .../widgets/richtext/textedit/textedit.h | 0 .../widgets/richtext/textedit/textedit.pro | 0 .../widgets/richtext/textedit/textedit.qdoc | 0 .../widgets/richtext/textedit/textedit.qrc | 0 .../examples}/widgets/scroller/CMakeLists.txt | 0 .../scroller/graphicsview/CMakeLists.txt | 0 .../scroller/graphicsview/graphicsview.pro | 0 .../widgets/scroller/graphicsview/main.cpp | 0 .../examples}/widgets/scroller/scroller.pro | 0 .../widgets/tools/plugandpaint/CMakeLists.txt | 0 .../tools/plugandpaint/app/CMakeLists.txt | 0 .../widgets/tools/plugandpaint/app/app.pro | 0 .../tools/plugandpaint/app/interfaces.h | 0 .../widgets/tools/plugandpaint/app/main.cpp | 0 .../tools/plugandpaint/app/mainwindow.cpp | 0 .../tools/plugandpaint/app/mainwindow.h | 0 .../tools/plugandpaint/app/paintarea.cpp | 0 .../tools/plugandpaint/app/paintarea.h | 0 .../tools/plugandpaint/app/plugindialog.cpp | 0 .../tools/plugandpaint/app/plugindialog.h | 0 .../tools/plugandpaint/plugandpaint.pro | 0 .../tools/plugandpaint/plugins/CMakeLists.txt | 0 .../plugins/basictools/CMakeLists.txt | 0 .../plugins/basictools/basictools.json | 0 .../plugins/basictools/basictools.pro | 0 .../plugins/basictools/basictoolsplugin.cpp | 0 .../plugins/basictools/basictoolsplugin.h | 0 .../plugins/extrafilters/CMakeLists.txt | 0 .../plugins/extrafilters/extrafilters.json | 0 .../plugins/extrafilters/extrafilters.pro | 0 .../extrafilters/extrafiltersplugin.cpp | 0 .../plugins/extrafilters/extrafiltersplugin.h | 0 .../tools/plugandpaint/plugins/plugins.pro | 0 .../widgets/touch/dials/CMakeLists.txt | 0 .../examples}/widgets/touch/dials/dials.pro | 0 .../examples}/widgets/touch/dials/dials.ui | 0 .../dials/doc/images/touch-dials-example.png | Bin .../touch/dials/doc/src/touch-dials.qdoc | 0 .../examples}/widgets/touch/dials/main.cpp | 0 .../widgets/touch/fingerpaint/CMakeLists.txt | 0 .../fingerpaint/doc/src/fingerpaint.qdoc | 0 .../widgets/touch/fingerpaint/fingerpaint.pro | 0 .../widgets/touch/fingerpaint/main.cpp | 0 .../widgets/touch/fingerpaint/mainwindow.cpp | 0 .../widgets/touch/fingerpaint/mainwindow.h | 0 .../touch/fingerpaint/scribblearea.cpp | 0 .../widgets/touch/fingerpaint/scribblearea.h | 0 .../widgets/touch/pinchzoom/CMakeLists.txt | 0 .../doc/images/pinch-zoom-example.png | Bin .../touch/pinchzoom/doc/src/pinchzoom.qdoc | 0 .../widgets/touch/pinchzoom/graphicsview.cpp | 0 .../widgets/touch/pinchzoom/graphicsview.h | 0 .../widgets/touch/pinchzoom/images/cheese.jpg | Bin .../widgets/touch/pinchzoom/main.cpp | 0 .../widgets/touch/pinchzoom/mice.qrc | 0 .../widgets/touch/pinchzoom/mouse.cpp | 0 .../examples}/widgets/touch/pinchzoom/mouse.h | 0 .../widgets/touch/pinchzoom/pinchzoom.pro | 0 .../tutorials/addressbook/CMakeLists.txt | 0 .../widgets/tutorials/addressbook/README | 0 ...ressbook-tutorial-part1-labeled-layout.png | Bin ...book-tutorial-part1-labeled-screenshot.png | Bin .../addressbook-tutorial-part1-screenshot.png | Bin ...addressbook-tutorial-part2-add-contact.png | Bin ...dressbook-tutorial-part2-add-flowchart.png | Bin ...ressbook-tutorial-part2-add-successful.png | Bin ...ressbook-tutorial-part2-labeled-layout.png | Bin ...sbook-tutorial-part2-signals-and-slots.png | Bin ...essbook-tutorial-part2-stretch-effects.png | Bin ...ressbook-tutorial-part3-labeled-layout.png | Bin .../addressbook-tutorial-part3-linkedlist.png | Bin .../addressbook-tutorial-part3-screenshot.png | Bin .../addressbook-tutorial-part4-remove.png | Bin .../addressbook-tutorial-part5-finddialog.png | Bin .../addressbook-tutorial-part5-notfound.png | Bin .../addressbook-tutorial-part5-screenshot.png | Bin ...sbook-tutorial-part5-signals-and-slots.png | Bin .../addressbook-tutorial-part6-load.png | Bin .../addressbook-tutorial-part6-save.png | Bin .../addressbook-tutorial-part6-screenshot.png | Bin .../addressbook-tutorial-part7-screenshot.png | Bin .../addressbook-tutorial-screenshot.png | Bin .../addressbook}/addressbook-tutorial.qdoc | 0 .../tutorials/addressbook/addressbook.pro | 0 .../addressbook/part1/CMakeLists.txt | 0 .../addressbook/part1/addressbook.cpp | 0 .../tutorials/addressbook/part1/addressbook.h | 0 .../tutorials/addressbook/part1/main.cpp | 0 .../tutorials/addressbook/part1/part1.pro | 0 .../addressbook/part2/CMakeLists.txt | 0 .../addressbook/part2/addressbook.cpp | 0 .../tutorials/addressbook/part2/addressbook.h | 0 .../tutorials/addressbook/part2/main.cpp | 0 .../tutorials/addressbook/part2/part2.pro | 0 .../addressbook/part3/CMakeLists.txt | 0 .../addressbook/part3/addressbook.cpp | 0 .../tutorials/addressbook/part3/addressbook.h | 0 .../tutorials/addressbook/part3/main.cpp | 0 .../tutorials/addressbook/part3/part3.pro | 0 .../addressbook/part4/CMakeLists.txt | 0 .../addressbook/part4/addressbook.cpp | 0 .../tutorials/addressbook/part4/addressbook.h | 0 .../tutorials/addressbook/part4/main.cpp | 0 .../tutorials/addressbook/part4/part4.pro | 0 .../addressbook/part5/CMakeLists.txt | 0 .../addressbook/part5/addressbook.cpp | 0 .../tutorials/addressbook/part5/addressbook.h | 0 .../addressbook/part5/finddialog.cpp | 0 .../tutorials/addressbook/part5/finddialog.h | 0 .../tutorials/addressbook/part5/main.cpp | 0 .../tutorials/addressbook/part5/part5.pro | 0 .../addressbook/part6/CMakeLists.txt | 0 .../addressbook/part6/addressbook.cpp | 0 .../tutorials/addressbook/part6/addressbook.h | 0 .../addressbook/part6/finddialog.cpp | 0 .../tutorials/addressbook/part6/finddialog.h | 0 .../tutorials/addressbook/part6/main.cpp | 0 .../tutorials/addressbook/part6/part6.pro | 0 .../addressbook/part7/CMakeLists.txt | 0 .../addressbook/part7/addressbook.cpp | 0 .../tutorials/addressbook/part7/addressbook.h | 0 .../addressbook/part7/finddialog.cpp | 0 .../tutorials/addressbook/part7/finddialog.h | 0 .../tutorials/addressbook/part7/main.cpp | 0 .../tutorials/addressbook/part7/part7.pro | 0 .../widgets/charactermap/CMakeLists.txt | 0 .../widgets/charactermap/charactermap.pro | 0 .../widgets/charactermap/characterwidget.cpp | 0 .../widgets/charactermap/characterwidget.h | 0 .../widgets/widgets/charactermap}/main.cpp | 2 - .../widgets/charactermap/mainwindow.cpp | 0 .../widgets/widgets/charactermap/mainwindow.h | 0 .../widgets/digitalclock/CMakeLists.txt | 0 .../widgets/digitalclock/digitalclock.cpp | 0 .../widgets/digitalclock/digitalclock.h | 0 .../widgets/digitalclock/digitalclock.pro | 0 .../widgets/widgets/digitalclock/main.cpp | 0 .../widgets/widgets/icons/CMakeLists.txt | 0 .../widgets/widgets/icons/iconpreviewarea.cpp | 0 .../widgets/widgets/icons/iconpreviewarea.h | 0 .../examples}/widgets/widgets/icons/icons.pro | 0 .../widgets/widgets/icons/iconsizespinbox.cpp | 0 .../widgets/widgets/icons/iconsizespinbox.h | 0 .../widgets/widgets/icons/imagedelegate.cpp | 0 .../widgets/widgets/icons/imagedelegate.h | 0 .../widgets/widgets/icons/images/designer.png | Bin .../widgets/icons/images/find_disabled.png | Bin .../widgets/icons/images/find_normal.png | Bin .../icons/images/monkey_off_128x128.png | Bin .../widgets/icons/images/monkey_off_16x16.png | Bin .../widgets/icons/images/monkey_off_32x32.png | Bin .../widgets/icons/images/monkey_off_64x64.png | Bin .../icons/images/monkey_on_128x128.png | Bin .../widgets/icons/images/monkey_on_16x16.png | Bin .../widgets/icons/images/monkey_on_32x32.png | Bin .../widgets/icons/images/monkey_on_64x64.png | Bin .../icons/images/qt_extended_16x16.png | Bin .../icons/images/qt_extended_32x32.png | Bin .../icons/images/qt_extended_48x48.png | Bin .../examples}/widgets/widgets/icons/main.cpp | 0 .../widgets/widgets/icons/mainwindow.cpp | 0 .../widgets/widgets/icons/mainwindow.h | 0 .../widgets/imageviewer/CMakeLists.txt | 0 .../widgets/imageviewer/imageviewer.cpp | 0 .../widgets/widgets/imageviewer/imageviewer.h | 0 .../widgets/imageviewer/imageviewer.pro | 0 .../widgets/widgets/imageviewer/main.cpp | 0 .../widgets/widgets/movie/CMakeLists.txt | 0 .../widgets/widgets/movie/animation.gif | Bin .../examples}/widgets/widgets/movie/main.cpp | 0 .../examples}/widgets/widgets/movie/movie.pro | 0 .../widgets/widgets/movie/movieplayer.cpp | 0 .../widgets/widgets/movie/movieplayer.h | 0 .../widgets/widgets/styles/CMakeLists.txt | 0 .../widgets/styles/images/woodbackground.png | Bin .../widgets/styles/images/woodbutton.png | Bin .../examples}/widgets/widgets/styles/main.cpp | 2 - .../widgets/styles/norwegianwoodstyle.cpp | 0 .../widgets/styles/norwegianwoodstyle.h | 0 .../widgets/widgets/styles/styles.pro | 0 .../widgets/widgets/styles/styles.qrc | 0 .../widgets/widgets/styles/widgetgallery.cpp | 0 .../widgets/widgets/styles/widgetgallery.h | 0 .../widgets/widgets/stylesheet/CMakeLists.txt | 0 .../stylesheet/images/checkbox_checked.png | Bin .../images/checkbox_checked_hover.png | Bin .../images/checkbox_checked_pressed.png | Bin .../stylesheet/images/checkbox_unchecked.png | Bin .../images/checkbox_unchecked_hover.png | Bin .../images/checkbox_unchecked_pressed.png | Bin .../widgets/stylesheet/images/down_arrow.png | Bin .../stylesheet/images/down_arrow_disabled.png | Bin .../widgets/stylesheet/images/frame.png | Bin .../widgets/stylesheet/images/pagefold.png | Bin .../widgets/stylesheet/images/pushbutton.png | Bin .../stylesheet/images/pushbutton_hover.png | Bin .../stylesheet/images/pushbutton_pressed.png | Bin .../stylesheet/images/radiobutton_checked.png | Bin .../images/radiobutton_checked_hover.png | Bin .../images/radiobutton_checked_pressed.png | Bin .../images/radiobutton_unchecked.png | Bin .../images/radiobutton_unchecked_hover.png | Bin .../images/radiobutton_unchecked_pressed.png | Bin .../widgets/stylesheet/images/sizegrip.png | Bin .../widgets/stylesheet/images/spindown.png | Bin .../stylesheet/images/spindown_hover.png | Bin .../stylesheet/images/spindown_off.png | Bin .../stylesheet/images/spindown_pressed.png | Bin .../widgets/stylesheet/images/spinup.png | Bin .../stylesheet/images/spinup_hover.png | Bin .../widgets/stylesheet/images/spinup_off.png | Bin .../stylesheet/images/spinup_pressed.png | Bin .../widgets/stylesheet/images/up_arrow.png | Bin .../stylesheet/images/up_arrow_disabled.png | Bin .../widgets/stylesheet/layouts/default.ui | 0 .../widgets/stylesheet/layouts/pagefold.ui | 0 .../widgets/widgets/stylesheet/main.cpp | 2 - .../widgets/widgets/stylesheet/mainwindow.cpp | 0 .../widgets/widgets/stylesheet/mainwindow.h | 0 .../widgets/widgets/stylesheet/mainwindow.ui | 0 .../widgets/widgets/stylesheet/qss/coffee.qss | 0 .../widgets/stylesheet/qss/default.qss | 0 .../widgets/stylesheet/qss/pagefold.qss | 0 .../widgets/widgets/stylesheet/stylesheet.pro | 0 .../widgets/widgets/stylesheet/stylesheet.qrc | 0 .../widgets/stylesheet/stylesheeteditor.cpp | 0 .../widgets/stylesheet/stylesheeteditor.h | 0 .../widgets/stylesheet/stylesheeteditor.ui | 0 .../widgets/widgets/tetrix/CMakeLists.txt | 0 .../examples}/widgets/widgets/tetrix/main.cpp | 0 .../widgets/widgets/tetrix/tetrix.pro | 0 .../widgets/widgets/tetrix/tetrixboard.cpp | 0 .../widgets/widgets/tetrix/tetrixboard.h | 0 .../widgets/widgets/tetrix/tetrixpiece.cpp | 0 .../widgets/widgets/tetrix/tetrixpiece.h | 0 .../widgets/widgets/tetrix/tetrixwindow.cpp | 0 .../widgets/widgets/tetrix/tetrixwindow.h | 0 .../widgets/widgets/validators/CMakeLists.txt | 0 .../widgets/widgets/validators/ledoff.png | Bin .../widgets/widgets/validators/ledon.png | Bin .../widgets/widgets/validators/ledwidget.cpp | 0 .../widgets/widgets/validators/ledwidget.h | 0 .../widgets/validators/localeselector.cpp | 0 .../widgets/validators/localeselector.h | 0 .../widgets/widgets/validators/main.cpp | 2 - .../widgets/widgets/validators/validators.pro | 0 .../widgets/widgets/validators/validators.qrc | 0 .../widgets/widgets/validators/validators.ui | 0 .../widgets/validators/validatorwidget.cpp | 0 .../widgets/validators/validatorwidget.h | 0 .../widgets/windowcontainer/CMakeLists.txt | 0 .../windowcontainer/windowcontainer.cpp | 0 .../windowcontainer/windowcontainer.pro | 0 tests/manual/gestures/graphicsview/main.cpp | 4 +- .../manual/highdpi/kitchensink/dragwidget.cpp | 6 +- .../network/ssl/client-auth/CMakeLists.txt | 24 + .../client-auth/certs/accepted-client.conf | 14 + .../network/ssl/client-auth/certs/generate.sh | 33 + .../tst_manual_ssl_client_auth.cpp | 136 + .../manual/qgraphicsitemgroup/customitem.cpp | 8 +- tests/manual/qgraphicsitemgroup/widget.cpp | 12 +- tests/manual/qlocale/window.cpp | 4 +- tests/manual/qscreen/propertywatcher.cpp | 4 +- tests/manual/qsslsocket/main.cpp | 15 +- tests/manual/qstorageinfo/main.cpp | 2 +- tests/manual/qstorageinfo/printvolumes.cpp | 2 +- tests/manual/repaint/shared/shared.h | 16 +- util/cmake/pro2cmake.py | 2 +- util/locale_database/cldr.py | 16 +- util/locale_database/enumdata.py | 22 +- util/locale_database/ldml.py | 27 +- util/locale_database/qlocalexml.py | 6 +- 2170 files changed, 57471 insertions(+), 43550 deletions(-) delete mode 100644 .gitattributes delete mode 100644 conanfile.py create mode 100644 doc/config/exampleurl-qtpositioning.qdocconf create mode 100644 doc/global/template/style/tech_preview.svg delete mode 100644 doc/src/images/application-menus.png delete mode 100644 doc/src/images/application.png delete mode 100644 doc/src/images/classwizard-flow.png delete mode 100644 doc/src/images/classwizard.png delete mode 100644 doc/src/images/extension-example.png delete mode 100644 doc/src/images/extension_more.png create mode 100644 examples/corelib/serialization/convert/debugtextdumper.cpp create mode 100644 examples/corelib/serialization/convert/debugtextdumper.h delete mode 100644 examples/corelib/serialization/rsslisting/main.cpp delete mode 100644 examples/corelib/serialization/rsslisting/rsslisting.cpp create mode 100644 examples/corelib/serialization/streambookmarks/doc/images/filemenu.png create mode 100644 examples/corelib/serialization/streambookmarks/doc/images/helpmenu.png create mode 100644 examples/corelib/serialization/streambookmarks/doc/images/screenshot.png delete mode 100644 examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-filemenu.png delete mode 100644 examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-helpmenu.png delete mode 100644 examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-screenshot.png rename examples/{corelib/serialization => network}/rsslisting/CMakeLists.txt (90%) create mode 100644 examples/network/rsslisting/doc/images/rsslisting.png create mode 100644 examples/network/rsslisting/doc/src/rsslisting.qdoc rename examples/{widgets/tutorials/gettingStarted/gsQt/part1 => network/rsslisting}/main.cpp (50%) create mode 100644 examples/network/rsslisting/rsslisting.cpp rename examples/{corelib/serialization => network}/rsslisting/rsslisting.h (81%) rename examples/{corelib/serialization => network}/rsslisting/rsslisting.pro (66%) delete mode 100644 examples/widgets/doc/images/calendar-example.png delete mode 100644 examples/widgets/doc/images/draganddroppuzzle-example.png delete mode 100644 examples/widgets/doc/images/fademessageeffect-example-faded.png delete mode 100644 examples/widgets/doc/images/fademessageeffect-example.png delete mode 100644 examples/widgets/doc/images/fridgemagnets-example.png delete mode 100644 examples/widgets/doc/images/graphicsflowlayout-example.png delete mode 100644 examples/widgets/doc/images/imageviewer-fit_to_window_1.png delete mode 100644 examples/widgets/doc/images/imageviewer-fit_to_window_2.png delete mode 100644 examples/widgets/doc/images/imageviewer-original_size.png delete mode 100644 examples/widgets/doc/images/imageviewer-zoom_in_1.png delete mode 100644 examples/widgets/doc/images/imageviewer-zoom_in_2.png delete mode 100644 examples/widgets/doc/images/itemviewspuzzle-example.png delete mode 100644 examples/widgets/doc/images/mainwindow-demo.png delete mode 100644 examples/widgets/doc/images/plugandpaint-plugindialog.png delete mode 100644 examples/widgets/doc/images/plugandpaint.png delete mode 100644 examples/widgets/doc/images/stylesheet-pagefold.png delete mode 100644 examples/widgets/doc/images/textedit-demo.png delete mode 100644 examples/widgets/doc/src/application.qdoc delete mode 100644 examples/widgets/doc/src/borderlayout.qdoc delete mode 100644 examples/widgets/doc/src/calendar.qdoc delete mode 100644 examples/widgets/doc/src/charactermap.qdoc delete mode 100644 examples/widgets/doc/src/chart.qdoc delete mode 100644 examples/widgets/doc/src/classwizard.qdoc delete mode 100644 examples/widgets/doc/src/digitalclock.qdoc delete mode 100644 examples/widgets/doc/src/dirview.qdoc delete mode 100644 examples/widgets/doc/src/dockwidgets.qdoc delete mode 100644 examples/widgets/doc/src/draganddroppuzzle.qdoc delete mode 100644 examples/widgets/doc/src/dynamiclayouts.qdoc delete mode 100644 examples/widgets/doc/src/embeddeddialogs.qdoc delete mode 100644 examples/widgets/doc/src/extension.qdoc delete mode 100644 examples/widgets/doc/src/fademessage.qdoc delete mode 100644 examples/widgets/doc/src/fontsampler.qdoc delete mode 100644 examples/widgets/doc/src/fridgemagnets.qdoc delete mode 100644 examples/widgets/doc/src/graphicsview-flowlayout.qdoc delete mode 100644 examples/widgets/doc/src/icons.qdoc delete mode 100644 examples/widgets/doc/src/imageviewer.qdoc delete mode 100644 examples/widgets/doc/src/interview.qdoc delete mode 100644 examples/widgets/doc/src/itemviewspuzzle.qdoc delete mode 100644 examples/widgets/doc/src/mainwindow.qdoc delete mode 100644 examples/widgets/doc/src/mdi.qdoc delete mode 100644 examples/widgets/doc/src/movie.qdoc delete mode 100644 examples/widgets/doc/src/pixelator.qdoc delete mode 100644 examples/widgets/doc/src/plugandpaint.qdoc delete mode 100644 examples/widgets/doc/src/simpledommodel.qdoc delete mode 100644 examples/widgets/doc/src/simplewidgetmapper.qdoc delete mode 100644 examples/widgets/doc/src/styles.qdoc delete mode 100644 examples/widgets/doc/src/stylesheet.qdoc delete mode 100644 examples/widgets/doc/src/tetrix.qdoc delete mode 100644 examples/widgets/doc/src/textedit.qdoc delete mode 100644 examples/widgets/doc/src/validators.qdoc delete mode 100644 examples/widgets/effects/CMakeLists.txt delete mode 100644 examples/widgets/effects/effects.pro delete mode 100644 examples/widgets/itemviews/flattreeview/CMakeLists.txt delete mode 100644 examples/widgets/itemviews/flattreeview/flattreeview.pro delete mode 100644 examples/widgets/itemviews/flattreeview/main.cpp delete mode 100644 examples/widgets/tutorials/gettingStarted/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gettingStarted.pro delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/gsqt.pro delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part1/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part1/part1.pro delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part2/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part2/main.cpp delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part2/part2.pro delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part3/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part3/main.cpp delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part3/part3.pro delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part4/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part4/main.cpp delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part4/part4.pro delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part5/CMakeLists.txt delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part5/main.cpp delete mode 100644 examples/widgets/tutorials/gettingStarted/gsQt/part5/part5.pro rename examples/widgets/tutorials/{ => notepad}/gettingstartedqt.qdoc (99%) delete mode 100644 examples/xml/dombookmarks/doc/images/dombookmarks-example.png create mode 100644 examples/xml/dombookmarks/doc/images/screenshot.png delete mode 100644 src/3rdparty/freetype/src/gzip/infback.c create mode 100644 src/3rdparty/freetype/src/tools/vms_shorten_symbol.c delete mode 100644 src/3rdparty/freetype/src/truetype/ttsubpix.c delete mode 100644 src/3rdparty/freetype/src/truetype/ttsubpix.h create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-subset-instancer-solver.hh create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-subset-plan-member-list.hh create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api-blob.hh create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api-buffer.hh rename src/3rdparty/harfbuzz-ng/src/{hb-subset-cff2.hh => hb-wasm-api-common.hh} (71%) create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api-face.hh create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api-font.hh create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api-shape.hh rename src/3rdparty/harfbuzz-ng/src/{hb-subset-cff1.hh => hb-wasm-api.cc} (72%) create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api.h create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-api.hh create mode 100644 src/3rdparty/harfbuzz-ng/src/hb-wasm-shape.cc delete mode 100644 src/3rdparty/harfbuzz-ng/src/main.cc delete mode 100644 src/3rdparty/harfbuzz-ng/src/test.cc create mode 100644 src/3rdparty/libjpeg/src/jcdiffct.c create mode 100644 src/3rdparty/libjpeg/src/jcicc.c create mode 100644 src/3rdparty/libjpeg/src/jclhuff.c create mode 100644 src/3rdparty/libjpeg/src/jclossls.c create mode 100644 src/3rdparty/libjpeg/src/jcmaster.h create mode 100644 src/3rdparty/libjpeg/src/jddiffct.c create mode 100644 src/3rdparty/libjpeg/src/jdicc.c create mode 100644 src/3rdparty/libjpeg/src/jdlhuff.c create mode 100644 src/3rdparty/libjpeg/src/jdlossls.c create mode 100644 src/3rdparty/libjpeg/src/jlossls.h rename src/3rdparty/libjpeg/src/{jpegcomp.h => jpegapicomp.h} (98%) create mode 100644 src/3rdparty/libjpeg/src/jsamplecomp.h delete mode 100644 src/3rdparty/libjpeg/src/jsimd_none.c delete mode 100644 src/corelib/thread/qmutex_win.cpp create mode 100644 src/testlib/doc/src/qttestlib-tutorial1.qdoc create mode 100644 src/testlib/doc/src/qttestlib-tutorial2.qdoc create mode 100644 src/testlib/doc/src/qttestlib-tutorial3.qdoc create mode 100644 src/testlib/doc/src/qttestlib-tutorial4.qdoc create mode 100644 src/testlib/doc/src/qttestlib-tutorial5.qdoc create mode 100644 src/testlib/doc/src/qttestlib-tutorial6.qdoc delete mode 100644 src/widgets/doc/images/stylesheet-coffee-cleanlooks.png delete mode 100644 src/widgets/doc/images/stylesheet-pagefold-mac.png create mode 100644 src/widgets/widgets/qdialogbuttonbox_p.h delete mode 100644 tests/auto/corelib/kernel/qsocketnotifier/BLACKLIST create mode 100644 tests/auto/corelib/mimetypes/qmimedatabase/mimetypes-override/mime/packages/webm-glob-deleteall.xml create mode 100644 tests/auto/corelib/platform/android/testdata/assets/top_level_dir/file_in_top_dir.txt create mode 100644 tests/auto/corelib/platform/android/testdata/assets/top_level_dir/sub_dir/file_in_sub_dir.txt create mode 100644 tests/auto/corelib/platform/android/testdata/assets/top_level_dir/sub_dir/sub_dir_2/sub_dir_3/file_in_sub_dir_3.txt create mode 100644 tests/auto/corelib/serialization/qxmlstream/tokenError/dtdInBody.xml create mode 100644 tests/auto/corelib/serialization/qxmlstream/tokenError/multipleDtd.xml create mode 100644 tests/auto/corelib/serialization/qxmlstream/tokenError/wellFormed.xml create mode 100644 tests/auto/dbus/qdbusconnection_signalorder/CMakeLists.txt create mode 100644 tests/auto/dbus/qdbusconnection_signalorder/tst_qdbusconnection_signalorder.cpp create mode 100644 tests/auto/gui/image/qicoimageformat/icons/masked/24bpp.ico create mode 100644 tests/auto/gui/image/qicoimageformat/icons/masked/24bpp.png create mode 100644 tests/auto/gui/image/qicoimageformat/icons/masked/32bpp.ico create mode 100644 tests/auto/gui/image/qicoimageformat/icons/masked/32bpp.png create mode 100644 tests/auto/gui/image/qicon/icons/fallbacktheme/16x16/edit-cut.png create mode 100644 tests/auto/gui/image/qicon/icons/fallbacktheme/index.theme create mode 100644 tests/auto/gui/image/qicon/icons/hicolor/16x16/hicolor-icon.png create mode 100644 tests/auto/gui/image/qicon/icons/hicolor/index.theme create mode 100644 tests/auto/gui/kernel/qclipboard/test/BLACKLIST delete mode 100644 tests/auto/network/kernel/qdnslookup/BLACKLIST create mode 100644 tests/auto/widgets/widgets/qmainwindow/BLACKLIST create mode 100644 tests/benchmarks/corelib/serialization/CMakeLists.txt create mode 100644 tests/benchmarks/corelib/serialization/qcborvalue/CMakeLists.txt create mode 100644 tests/benchmarks/corelib/serialization/qcborvalue/tst_bench_qcborvalue.cpp rename {examples => tests/manual/examples}/corelib/permissions/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/corelib/permissions/Info.plist (100%) rename {examples => tests/manual/examples}/corelib/permissions/android/AndroidManifest.xml (100%) rename {examples => tests/manual/examples}/corelib/permissions/main.cpp (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/bubble.cpp (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/bubble.h (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/glwidget.cpp (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/glwidget.h (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/main.cpp (97%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/mainwindow.h (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/qopenglwidget.pro (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/qt.png (100%) rename {examples => tests/manual/examples}/opengl/qopenglwidget/texture.qrc (100%) rename {examples => tests/manual/examples}/qpa/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/qpa/qpa.pro (100%) rename {examples => tests/manual/examples}/qpa/qrasterwindow/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/qpa/qrasterwindow/main.cpp (100%) rename {examples => tests/manual/examples}/qpa/qrasterwindow/qrasterwindow.pro (100%) rename {examples => tests/manual/examples}/qpa/windows/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/qpa/windows/main.cpp (100%) rename {examples => tests/manual/examples}/qpa/windows/window.cpp (100%) rename {examples => tests/manual/examples}/qpa/windows/window.h (100%) rename {examples => tests/manual/examples}/qpa/windows/windows.pro (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/CMakeLists.txt (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/application.pro (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/application.qrc (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/images/copy.png (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/images/cut.png (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/images/new.png (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/images/open.png (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/images/paste.png (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/images/save.png (100%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/main.cpp (94%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/mainwindow.cpp (92%) rename {examples/widgets/mainwindows => tests/manual/examples/widgets}/application/mainwindow.h (98%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/classwizard.cpp (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/classwizard.h (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/classwizard.pro (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/classwizard.qrc (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/background.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/banner.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/logo1.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/logo2.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/logo3.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/watermark1.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/images/watermark2.png (100%) rename {examples => tests/manual/examples}/widgets/dialogs/classwizard/main.cpp (95%) rename {examples => tests/manual/examples}/widgets/dialogs/extension/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/dialogs/extension/extension.pro (100%) rename {examples => tests/manual/examples}/widgets/dialogs/extension/finddialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/dialogs/extension/finddialog.h (100%) rename {examples => tests/manual/examples}/widgets/dialogs/extension/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/draglabel.cpp (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/draglabel.h (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/dragwidget.cpp (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/dragwidget.h (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/fridgemagnets.pro (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/fridgemagnets.qrc (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/main.cpp (93%) rename {examples => tests/manual/examples}/widgets/draganddrop/fridgemagnets/words.txt (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/example.jpg (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/main.cpp (92%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/pieceslist.cpp (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/pieceslist.h (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/puzzle.pro (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/puzzle.qrc (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/puzzlewidget.cpp (100%) rename {examples => tests/manual/examples}/widgets/draganddrop/puzzle/puzzlewidget.h (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/README (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/background.jpg (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/fademessage.cpp (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/fademessage.h (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/fademessage.pro (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/fademessage.qrc (100%) rename {examples => tests/manual/examples}/widgets/effects/fademessage/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/No-Ones-Laughing-3.jpg (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/customproxy.cpp (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/customproxy.h (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/embeddeddialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/embeddeddialog.h (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/embeddeddialog.ui (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/embeddeddialogs.pro (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/embeddeddialogs.qrc (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/embeddeddialogs/main.cpp (97%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/flowlayout.cpp (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/flowlayout.h (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/flowlayout.pro (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/window.cpp (100%) rename {examples => tests/manual/examples}/widgets/graphicsview/flowlayout/window.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/chart.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/chart.qrc (100%) rename {examples/widgets/painting/fontsampler => tests/manual/examples/widgets/itemviews/chart}/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/pieview.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/pieview.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/chart/qtdata.cht (100%) rename {examples => tests/manual/examples}/widgets/itemviews/dirview/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/dirview/dirview.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/dirview/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/README (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/images/folder.png (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/images/interview.png (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/images/services.png (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/interview.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/interview.qrc (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/main.cpp (98%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/model.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/interview/model.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/imagemodel.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/imagemodel.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/images.qrc (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/images/qt.png (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/main.cpp (91%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/pixelator.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/pixeldelegate.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/pixelator/pixeldelegate.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/example.jpg (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/main.cpp (92%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/piecesmodel.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/piecesmodel.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/puzzle.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/puzzle.qrc (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/puzzlewidget.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/puzzle/puzzlewidget.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/domitem.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/domitem.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/dommodel.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/dommodel.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simpledommodel/simpledommodel.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simplewidgetmapper/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simplewidgetmapper/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simplewidgetmapper/simplewidgetmapper.pro (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simplewidgetmapper/window.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/simplewidgetmapper/window.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/storageview/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/itemviews/storageview/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/storageview/storagemodel.cpp (100%) rename {examples => tests/manual/examples}/widgets/itemviews/storageview/storagemodel.h (100%) rename {examples => tests/manual/examples}/widgets/itemviews/storageview/storageview.pro (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/borderlayout.cpp (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/borderlayout.h (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/borderlayout.pro (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/window.cpp (100%) rename {examples => tests/manual/examples}/widgets/layouts/borderlayout/window.h (100%) rename {examples => tests/manual/examples}/widgets/layouts/dynamiclayouts/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/layouts/dynamiclayouts/dialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/layouts/dynamiclayouts/dialog.h (100%) rename {examples => tests/manual/examples}/widgets/layouts/dynamiclayouts/dynamiclayouts.pro (100%) rename {examples => tests/manual/examples}/widgets/layouts/dynamiclayouts/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/dockwidgets.pro (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/dockwidgets.qrc (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/images/new.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/images/print.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/images/save.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/images/undo.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/main.cpp (89%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/dockwidgets/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/colorswatch.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/colorswatch.h (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/mainwindow.pro (95%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/mainwindow.qrc (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/qt.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/titlebarCenter.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/titlebarLeft.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/titlebarRight.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/toolbar.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mainwindow/toolbar.h (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/images/copy.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/images/cut.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/images/new.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/images/open.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/images/paste.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/images/save.png (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/main.cpp (97%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/mainwindow.cpp (99%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/mdi.pro (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/mdi.qrc (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/mdichild.cpp (100%) rename {examples => tests/manual/examples}/widgets/mainwindows/mdi/mdichild.h (100%) rename {examples => tests/manual/examples}/widgets/painting/fontsampler/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/painting/fontsampler/fontsampler.pro (100%) rename {examples/widgets/widgets/charactermap => tests/manual/examples/widgets/painting/fontsampler}/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/painting/fontsampler/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/painting/fontsampler/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/painting/fontsampler/mainwindowbase.ui (100%) rename {examples => tests/manual/examples}/widgets/richtext/calendar/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/richtext/calendar/calendar.pro (100%) rename {examples => tests/manual/examples}/widgets/richtext/calendar/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/richtext/calendar/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/richtext/calendar/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/example.html (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/example.md (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/logo32.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/checkbox-checked.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/checkbox.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/editcopy.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/editcut.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/editpaste.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/editredo.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/editundo.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/exportpdf.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/filenew.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/fileopen.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/fileprint.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/filesave.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/format-indent-less.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/format-indent-more.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textbold.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textcenter.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textitalic.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textjustify.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textleft.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textright.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textunder.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/textundercolor.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/zoomin.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/mac/zoomout.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/checkbox-checked.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/checkbox.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/editcopy.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/editcut.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/editpaste.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/editredo.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/editundo.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/exportpdf.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/filenew.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/fileopen.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/fileprint.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/filesave.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/format-indent-less.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/format-indent-more.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textbold.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textcenter.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textitalic.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textjustify.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textleft.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textright.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textunder.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/textundercolor.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/zoomin.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/images/win/zoomout.png (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/main.cpp (97%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/textedit.cpp (99%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/textedit.h (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/textedit.pro (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/textedit.qdoc (100%) rename {examples => tests/manual/examples}/widgets/richtext/textedit/textedit.qrc (100%) rename {examples => tests/manual/examples}/widgets/scroller/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/scroller/graphicsview/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/scroller/graphicsview/graphicsview.pro (100%) rename {examples => tests/manual/examples}/widgets/scroller/graphicsview/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/scroller/scroller.pro (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/app.pro (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/interfaces.h (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/paintarea.cpp (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/paintarea.h (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/plugindialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/app/plugindialog.h (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugandpaint.pro (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/basictools/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/basictools/basictools.json (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/basictools/basictools.pro (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/basictools/basictoolsplugin.h (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/extrafilters/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/extrafilters/extrafilters.json (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/extrafilters/extrafilters.pro (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/extrafilters/extrafiltersplugin.cpp (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/extrafilters/extrafiltersplugin.h (100%) rename {examples => tests/manual/examples}/widgets/tools/plugandpaint/plugins/plugins.pro (100%) rename {examples => tests/manual/examples}/widgets/touch/dials/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/touch/dials/dials.pro (100%) rename {examples => tests/manual/examples}/widgets/touch/dials/dials.ui (100%) rename {examples => tests/manual/examples}/widgets/touch/dials/doc/images/touch-dials-example.png (100%) rename {examples => tests/manual/examples}/widgets/touch/dials/doc/src/touch-dials.qdoc (100%) rename {examples => tests/manual/examples}/widgets/touch/dials/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/doc/src/fingerpaint.qdoc (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/fingerpaint.pro (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/scribblearea.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/fingerpaint/scribblearea.h (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/doc/images/pinch-zoom-example.png (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/doc/src/pinchzoom.qdoc (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/graphicsview.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/graphicsview.h (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/images/cheese.jpg (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/mice.qrc (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/mouse.cpp (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/mouse.h (100%) rename {examples => tests/manual/examples}/widgets/touch/pinchzoom/pinchzoom.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/README (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part1-labeled-layout.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part1-labeled-screenshot.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part1-screenshot.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part2-add-contact.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part2-add-flowchart.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part2-add-successful.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part2-labeled-layout.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part2-signals-and-slots.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part2-stretch-effects.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part3-labeled-layout.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part3-linkedlist.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part3-screenshot.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part4-remove.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part5-finddialog.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part5-notfound.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part5-screenshot.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part5-signals-and-slots.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part6-load.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part6-save.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part6-screenshot.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-part7-screenshot.png (100%) rename {src/widgets/doc/images => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial-screenshot.png (100%) rename {examples/widgets/doc/src => tests/manual/examples/widgets/tutorials/addressbook}/addressbook-tutorial.qdoc (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/addressbook.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part1/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part1/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part1/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part1/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part1/part1.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part2/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part2/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part2/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part2/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part2/part2.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part3/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part3/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part3/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part3/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part3/part3.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part4/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part4/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part4/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part4/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part4/part4.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/finddialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/finddialog.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part5/part5.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/finddialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/finddialog.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part6/part6.pro (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/addressbook.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/addressbook.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/finddialog.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/finddialog.h (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/tutorials/addressbook/part7/part7.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/charactermap/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/charactermap/charactermap.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/charactermap/characterwidget.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/charactermap/characterwidget.h (100%) rename {examples/widgets/itemviews/chart => tests/manual/examples/widgets/widgets/charactermap}/main.cpp (91%) rename {examples => tests/manual/examples}/widgets/widgets/charactermap/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/charactermap/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/digitalclock/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/digitalclock/digitalclock.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/digitalclock/digitalclock.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/digitalclock/digitalclock.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/digitalclock/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/iconpreviewarea.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/iconpreviewarea.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/icons.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/iconsizespinbox.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/iconsizespinbox.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/imagedelegate.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/imagedelegate.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/designer.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/find_disabled.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/find_normal.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_off_128x128.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_off_16x16.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_off_32x32.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_off_64x64.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_on_128x128.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_on_16x16.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_on_32x32.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/monkey_on_64x64.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/qt_extended_16x16.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/qt_extended_32x32.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/images/qt_extended_48x48.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/icons/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/imageviewer/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/imageviewer/imageviewer.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/imageviewer/imageviewer.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/imageviewer/imageviewer.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/imageviewer/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/movie/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/movie/animation.gif (100%) rename {examples => tests/manual/examples}/widgets/widgets/movie/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/movie/movie.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/movie/movieplayer.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/movie/movieplayer.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/images/woodbackground.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/images/woodbutton.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/main.cpp (92%) rename {examples => tests/manual/examples}/widgets/widgets/styles/norwegianwoodstyle.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/norwegianwoodstyle.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/styles.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/styles.qrc (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/widgetgallery.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/styles/widgetgallery.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/checkbox_checked.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/checkbox_checked_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/checkbox_checked_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/checkbox_unchecked.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/checkbox_unchecked_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/checkbox_unchecked_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/down_arrow.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/down_arrow_disabled.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/frame.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/pagefold.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/pushbutton.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/pushbutton_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/pushbutton_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/radiobutton_checked.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/radiobutton_checked_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/radiobutton_checked_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/radiobutton_unchecked.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/radiobutton_unchecked_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/radiobutton_unchecked_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/sizegrip.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spindown.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spindown_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spindown_off.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spindown_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spinup.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spinup_hover.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spinup_off.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/spinup_pressed.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/up_arrow.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/images/up_arrow_disabled.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/layouts/default.ui (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/layouts/pagefold.ui (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/main.cpp (89%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/mainwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/mainwindow.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/mainwindow.ui (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/qss/coffee.qss (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/qss/default.qss (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/qss/pagefold.qss (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/stylesheet.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/stylesheet.qrc (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/stylesheeteditor.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/stylesheeteditor.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/stylesheet/stylesheeteditor.ui (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/main.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrix.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrixboard.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrixboard.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrixpiece.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrixpiece.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrixwindow.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/tetrix/tetrixwindow.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/ledoff.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/ledon.png (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/ledwidget.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/ledwidget.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/localeselector.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/localeselector.h (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/main.cpp (89%) rename {examples => tests/manual/examples}/widgets/widgets/validators/validators.pro (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/validators.qrc (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/validators.ui (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/validatorwidget.cpp (100%) rename {examples => tests/manual/examples}/widgets/widgets/validators/validatorwidget.h (100%) rename {examples => tests/manual/examples}/widgets/windowcontainer/CMakeLists.txt (100%) rename {examples => tests/manual/examples}/widgets/windowcontainer/windowcontainer.cpp (100%) rename {examples => tests/manual/examples}/widgets/windowcontainer/windowcontainer.pro (100%) create mode 100644 tests/manual/network/ssl/client-auth/CMakeLists.txt create mode 100644 tests/manual/network/ssl/client-auth/certs/accepted-client.conf create mode 100644 tests/manual/network/ssl/client-auth/certs/generate.sh create mode 100644 tests/manual/network/ssl/client-auth/tst_manual_ssl_client_auth.cpp diff --git a/.cmake.conf b/.cmake.conf index 0ea15e5d..889ca7d8 100644 --- a/.cmake.conf +++ b/.cmake.conf @@ -8,7 +8,7 @@ if (NOT DEFINED QT_SUPERBUILD OR DEFINED QT_REPO_MODULE_VERSION) list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1") endif() -set(QT_REPO_MODULE_VERSION "6.5.1") +set(QT_REPO_MODULE_VERSION "6.5.3") set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1") set(QT_COPYRIGHT_YEAR "2023") diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index dfe07704..00000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/.release-timestamp b/.release-timestamp index 476c7efc..e6b6e860 100644 --- a/.release-timestamp +++ b/.release-timestamp @@ -1 +1 @@ -QT_PACKAGEDATE_STR=2023-05-22 \ No newline at end of file +QT_PACKAGEDATE_STR=2023-09-25 \ No newline at end of file diff --git a/.tag b/.tag index e64403e9..dd5a7f29 100644 --- a/.tag +++ b/.tag @@ -1 +1 @@ -55aee8697512af105dfefabc1e2ec41d4df1e45e +372eaedc5b8c771c46acc4c96e91bbade4ca3624 diff --git a/CMakeLists.txt b/CMakeLists.txt index 15142a6f..fd370a54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,11 +40,26 @@ function(qt_internal_check_if_path_has_symlinks path) endwhile() endif() if(is_symlink) - message(FATAL_ERROR "The path \"${path}\" contains symlinks. \ - This is not supported. Possible solutions: - - map directories using a transparent mechanism such as mount --bind - - pass the real path of the build directory to CMake, e.g. using \ - cd $(realpath ) before invoking cmake .") + set(possible_solutions_for_resolving_symlink [[ + - Map directories using a transparent mechanism such as mount --bind + - Pass the real path of the build directory to CMake, e.g. using + cd $(realpath ) before invoking cmake . + ]]) + if(QT_ALLOW_SYMLINK_IN_PATHS) + # In some cases, e.g., Homebrew, it is beneficial to skip this check. + # Before this, Homebrew had to patch this out to be able to get their build. + message(WARNING + "The path \"${path}\" contains symlinks. " + "This is not recommended, and it may lead to unexpected issues. If you do " + "not have a good reason for enabling 'QT_ALLOW_SYMLINK_IN_PATHS', disable " + "it, and follow one of the following solutions: \n" + "${possible_solutions_for_resolving_symlink} ") + else() + message(FATAL_ERROR + "The path \"${path}\" contains symlinks. " + "This is not supported. Possible solutions: \n" + "${possible_solutions_for_resolving_symlink} ") + endif() endif() endfunction() qt_internal_check_if_path_has_symlinks("${CMAKE_BINARY_DIR}") diff --git a/cmake/3rdparty/extra-cmake-modules/find-modules/FindEGL.cmake b/cmake/3rdparty/extra-cmake-modules/find-modules/FindEGL.cmake index 0733f1f7..9ac8e2fa 100644 --- a/cmake/3rdparty/extra-cmake-modules/find-modules/FindEGL.cmake +++ b/cmake/3rdparty/extra-cmake-modules/find-modules/FindEGL.cmake @@ -128,7 +128,8 @@ check_cxx_source_compiles(" #include int main(int, char **) { - EGLint x = 0; EGLDisplay dpy = 0; EGLContext ctx = 0; + [[maybe_unused]] EGLint x = 0; + EGLDisplay dpy = 0; EGLContext ctx = 0; eglDestroyContext(dpy, ctx); }" HAVE_EGL) diff --git a/cmake/FindGSSAPI.cmake b/cmake/FindGSSAPI.cmake index cc89406a..44594941 100644 --- a/cmake/FindGSSAPI.cmake +++ b/cmake/FindGSSAPI.cmake @@ -12,12 +12,24 @@ find_path(GSSAPI_INCLUDE_DIRS HINTS ${PC_GSSAPI_INCLUDEDIR} ) +# On macOS, vcpkg opts for finding frameworks LAST. This is generally fine; +# however, in the case of GSSAPI, `usr/lib/libgssapi_krb5.tbd` which is a +# symlink to `Kerberos.framework` misses a few symols, e.g., +# `___gss_c_nt_hostbased_service_oid_desc`, and it causes build failure. +# So, we need to make sure that we find `GSS.framework`. +set(gssapi_library_names + GSS # framework + gss # solaris + gssapi # FreeBSD + gssapi_krb5 +) +if(APPLE) + list(REMOVE_ITEM gssapi_library_names "gssapi_krb5") +endif() + find_library(GSSAPI_LIBRARIES NAMES - GSS # framework - gss # solaris - gssapi # FreeBSD - gssapi_krb5 + ${gssapi_library_names} HINTS ${PC_GSSAPI_LIBDIR} ) @@ -44,4 +56,3 @@ mark_as_advanced(GSSAPI_INCLUDE_DIRS GSSAPI_LIBRARIES) include(FeatureSummary) set_package_properties(GSSAPI PROPERTIES DESCRIPTION "Generic Security Services Application Program Interface") - diff --git a/cmake/FindPPS.cmake b/cmake/FindPPS.cmake index 6556091c..09901924 100644 --- a/cmake/FindPPS.cmake +++ b/cmake/FindPPS.cmake @@ -18,9 +18,7 @@ find_package_handle_standard_args(PPS DEFAULT_MSG PPS_INCLUDE_DIR PPS_LIBRARY) mark_as_advanced(PPS_INCLUDE_DIR PPS_LIBRARY) if(PPS_FOUND) - add_library(__PPS INTERFACE IMPORTED) - target_link_libraries(__PPS INTERFACE "${PPS_LIBRARY}") - target_include_directories(__PPS INTERFACE "${PPS_INCLUDE_DIR}") - - add_library(PPS::PPS ALIAS __PPS) + add_library(PPS::PPS INTERFACE IMPORTED) + target_link_libraries(PPS::PPS INTERFACE "${PPS_LIBRARY}") + target_include_directories(PPS::PPS INTERFACE "${PPS_INCLUDE_DIR}") endif() diff --git a/cmake/FindWrapOpenGL.cmake b/cmake/FindWrapOpenGL.cmake index c4e0fe5d..48bc8fe2 100644 --- a/cmake/FindWrapOpenGL.cmake +++ b/cmake/FindWrapOpenGL.cmake @@ -17,14 +17,18 @@ if (OpenGL_FOUND) add_library(WrapOpenGL::WrapOpenGL INTERFACE IMPORTED) if(APPLE) + # CMake 3.27 and older: # On Darwin platforms FindOpenGL sets IMPORTED_LOCATION to the absolute path of the library # within the framework. This ends up as an absolute path link flag, which we don't want, # because that makes our .prl files un-relocatable. # Extract the framework path instead, and use that in INTERFACE_LINK_LIBRARIES, - # which CMake ends up transforming into a reloctable -framework flag. + # which CMake ends up transforming into a relocatable -framework flag. # See https://gitlab.kitware.com/cmake/cmake/-/issues/20871 for details. + # + # CMake 3.28 and above: + # IMPORTED_LOCATION is the absolute path the the OpenGL.framework folder. get_target_property(__opengl_fw_lib_path OpenGL::GL IMPORTED_LOCATION) - if(__opengl_fw_lib_path) + if(__opengl_fw_lib_path AND NOT __opengl_fw_lib_path MATCHES "/([^/]+)\\.framework$") get_filename_component(__opengl_fw_path "${__opengl_fw_lib_path}" DIRECTORY) endif() diff --git a/cmake/QtAppHelpers.cmake b/cmake/QtAppHelpers.cmake index 4be5c7d5..c0ad53ab 100644 --- a/cmake/QtAppHelpers.cmake +++ b/cmake/QtAppHelpers.cmake @@ -53,6 +53,7 @@ function(qt_internal_add_app target) ${arg_NO_UNITY_BUILD} ${forward_install_dir} SOURCES ${arg_SOURCES} + NO_PCH_SOURCES ${arg_NO_PCH_SOURCES} NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES} INCLUDE_DIRECTORIES ${arg_INCLUDE_DIRECTORIES} diff --git a/cmake/QtBaseConfigureTests.cmake b/cmake/QtBaseConfigureTests.cmake index b7929426..b62eec84 100644 --- a/cmake/QtBaseConfigureTests.cmake +++ b/cmake/QtBaseConfigureTests.cmake @@ -115,43 +115,38 @@ endfunction() function(qt_run_linker_version_script_support) - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version_flag.map" "VERS_1 { global: sym; }; -VERS_2 { global: sym; } -VERS_1; -") - if(DEFINED CMAKE_REQUIRED_FLAGS) - set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) - else() - set(CMAKE_REQUIRED_FLAGS "") - endif() - set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Wl,--version-script=\"${CMAKE_CURRENT_BINARY_DIR}/version_flag.map\"") - - # Pass the linker that the main project uses to the version script compile test. - qt_internal_get_active_linker_flags(linker_flags) - if(linker_flags) - set(CMAKE_REQUIRED_LINK_OPTIONS ${linker_flags}) - endif() - - check_cxx_source_compiles("int main(void){return 0;}" HAVE_LD_VERSION_SCRIPT) - if(DEFINED CMAKE_REQUIRED_FLAGS_SAVE) - set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) - endif() - file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map") - # For some reason the linker command line written by the XCode generator, which is # subsequently executed by xcodebuild, ignores the linker flag, and thus the test # seemingly succeeds. Explicitly disable the version script test on darwin platforms. - if(APPLE) - set(HAVE_LD_VERSION_SCRIPT OFF) - endif() # Also makes no sense with MSVC-style command-line - if(MSVC) + if(NOT APPLE AND NOT MSVC) + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version_flag.map" [=[ + VERS_1 { global: sym1; }; + VERS_2 { global: sym2; } VERS_1; + ]=]) + set(CMAKE_REQUIRED_LINK_OPTIONS "") + list(APPEND CMAKE_REQUIRED_LINK_OPTIONS + "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/version_flag.map") + # Pass the linker that the main project uses to the version script compile test. + qt_internal_get_active_linker_flags(linker_flags) + if(linker_flags) + list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${linker_flags}) + endif() + check_cxx_source_compiles([=[ + int sym1; + int sym2; + int main(void) { return 0; } + ]=] HAVE_LD_VERSION_SCRIPT) + file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/version_flag.map") + else() set(HAVE_LD_VERSION_SCRIPT OFF) endif() - set(TEST_ld_version_script "${HAVE_LD_VERSION_SCRIPT}" CACHE INTERNAL "linker version script support") + set(TEST_ld_version_script "${HAVE_LD_VERSION_SCRIPT}" + CACHE INTERNAL "linker version script support") list(APPEND QT_BASE_CONFIGURE_TESTS_VARS_TO_EXPORT TEST_ld_version_script) - set(QT_BASE_CONFIGURE_TESTS_VARS_TO_EXPORT ${QT_BASE_CONFIGURE_TESTS_VARS_TO_EXPORT} CACHE INTERNAL "Test variables that should be exported") + set(QT_BASE_CONFIGURE_TESTS_VARS_TO_EXPORT ${QT_BASE_CONFIGURE_TESTS_VARS_TO_EXPORT} + CACHE INTERNAL "Test variables that should be exported") endfunction() function(qt_internal_ensure_latest_win_nt_api) diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake index e8d31006..cb5b6736 100644 --- a/cmake/QtBaseGlobalTargets.cmake +++ b/cmake/QtBaseGlobalTargets.cmake @@ -101,7 +101,8 @@ if(MACOS AND QT_IS_MACOS_UNIVERSAL QT_FEATURE_x86intrin) endif() -if(MACOS AND QT_IS_MACOS_UNIVERSAL AND __qt_osx_first_arch STREQUAL "x86_64") +if(MACOS AND QT_IS_MACOS_UNIVERSAL AND + (__qt_osx_first_arch STREQUAL "x86_64" OR __qt_osx_first_arch STREQUAL "x86_64h")) set(QT_FORCE_FEATURE_neon ON CACHE INTERNAL "Force enable neon due to platform requirements.") set(__QtFeature_custom_enabled_cache_variables TEST_subarch_neon @@ -373,6 +374,10 @@ qt_copy_or_install(DIRECTORY cmake/ FILES_MATCHING PATTERN "Find*.cmake" PATTERN "tests" EXCLUDE PATTERN "3rdparty" EXCLUDE + PATTERN "macos" EXCLUDE + PATTERN "ios" EXCLUDE + PATTERN "platforms" EXCLUDE + PATTERN "QtBuildInternals" EXCLUDE ) # In prefix builds we also need to copy the files into the build config directory, so that the @@ -383,6 +388,10 @@ if(QT_WILL_INSTALL) FILES_MATCHING PATTERN "Find*.cmake" PATTERN "tests" EXCLUDE PATTERN "3rdparty" EXCLUDE + PATTERN "macos" EXCLUDE + PATTERN "ios" EXCLUDE + PATTERN "platforms" EXCLUDE + PATTERN "QtBuildInternals" EXCLUDE ) endif() diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index 1469abf1..97aa76fe 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -284,21 +284,21 @@ if(WIN32) if(CMAKE_SIZEOF_VOID_P EQUAL 8) list(APPEND QT_DEFAULT_PLATFORM_DEFINITIONS WIN64 _WIN64) endif() - if(MSVC) - if (CLANG) + + if(CLANG) + if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC" OR MSVC) set(QT_DEFAULT_MKSPEC win32-clang-msvc) - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + elseif(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU" OR MINGW) + set(QT_DEFAULT_MKSPEC win32-clang-g++) + endif() + elseif(MSVC) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") set(QT_DEFAULT_MKSPEC win32-arm64-msvc) else() set(QT_DEFAULT_MKSPEC win32-msvc) endif() - elseif(CLANG AND MINGW) - set(QT_DEFAULT_MKSPEC win32-clang-g++) elseif(MINGW) set(QT_DEFAULT_MKSPEC win32-g++) - endif() - - if (MINGW) list(APPEND QT_DEFAULT_PLATFORM_DEFINITIONS MINGW_HAS_SECURE_API=1) endif() elseif(LINUX) @@ -376,15 +376,23 @@ else() set(QT_QMAKE_HOST_MKSPEC "${QT_QMAKE_TARGET_MKSPEC}") endif() -if(NOT EXISTS "${QT_MKSPECS_DIR}/${QT_QMAKE_TARGET_MKSPEC}") +if(NOT QT_QMAKE_TARGET_MKSPEC OR NOT EXISTS "${QT_MKSPECS_DIR}/${QT_QMAKE_TARGET_MKSPEC}") + if(NOT QT_QMAKE_TARGET_MKSPEC) + set(reason "Platform is not detected. Please make sure your build environment is configured" + " properly or specify it manually using QT_QMAKE_TARGET_MKSPEC variable and one of the" + " known platforms.") + else() + set(reason "Unknown platform ${QT_QMAKE_TARGET_MKSPEC}") + endif() + file(GLOB known_platforms LIST_DIRECTORIES true RELATIVE "${QT_MKSPECS_DIR}" "${QT_MKSPECS_DIR}/*" ) list(JOIN known_platforms "\n " known_platforms) - message(FATAL_ERROR "Unknown platform ${QT_QMAKE_TARGET_MKSPEC}\n\ -Known platforms:\n ${known_platforms}") + message(FATAL_ERROR "${reason}\n" + "Known platforms:\n ${known_platforms}") endif() if(NOT DEFINED QT_DEFAULT_PLATFORM_DEFINITIONS) @@ -459,6 +467,7 @@ set(__default_private_args DISABLE_AUTOGEN_TOOLS ENABLE_AUTOGEN_TOOLS PLUGIN_TYPES + NO_PCH_SOURCES NO_UNITY_BUILD_SOURCES ) set(__default_public_args diff --git a/cmake/QtBuildInformation.cmake b/cmake/QtBuildInformation.cmake index 9d8a11cb..6929f913 100644 --- a/cmake/QtBuildInformation.cmake +++ b/cmake/QtBuildInformation.cmake @@ -109,7 +109,7 @@ from the build directory") set(QT_INTERNAL_BUILD_INSTRUCTIONS_SHOWN "TRUE" CACHE STRING "" FORCE) if(QT_SUPERBUILD) - qt_internal_save_previously_found_packages() + qt_internal_save_previously_visited_packages() endif() endfunction() diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake index 7a69a635..fe4cbe3e 100644 --- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake +++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake @@ -308,24 +308,19 @@ function(qt_build_internals_add_toplevel_targets) endfunction() macro(qt_enable_cmake_languages) - include(CheckLanguage) set(__qt_required_language_list C CXX) - set(__qt_optional_language_list ) + set(__qt_platform_required_language_list ) - # https://gitlab.kitware.com/cmake/cmake/-/issues/20545 if(APPLE) - list(APPEND __qt_optional_language_list OBJC OBJCXX) + list(APPEND __qt_platform_required_language_list OBJC OBJCXX) endif() foreach(__qt_lang ${__qt_required_language_list}) enable_language(${__qt_lang}) endforeach() - foreach(__qt_lang ${__qt_optional_language_list}) - check_language(${__qt_lang}) - if(CMAKE_${__qt_lang}_COMPILER) - enable_language(${__qt_lang}) - endif() + foreach(__qt_lang ${__qt_platform_required_language_list}) + enable_language(${__qt_lang}) endforeach() # The qtbase call is handled in qtbase/CMakeLists.txt. @@ -434,6 +429,12 @@ macro(qt_build_repo_begin) add_custom_target(sync_headers) endif() + # The special target that we use to sync 3rd-party headers before the gn run when building + # qtwebengine in top-level builds. + if(NOT TARGET thirdparty_sync_headers) + add_custom_target(thirdparty_sync_headers) + endif() + # Add global qt_plugins, qpa_plugins and qpa_default_plugins convenience custom targets. # Internal executables will add a dependency on the qpa_default_plugins target, # so that building and running a test ensures it won't fail at runtime due to a missing qpa @@ -562,7 +563,7 @@ macro(qt_build_repo_end) endif() if(NOT QT_SUPERBUILD) - qt_internal_save_previously_found_packages() + qt_internal_save_previously_visited_packages() endif() if(QT_INTERNAL_FRESH_REQUESTED) @@ -1415,3 +1416,13 @@ function(qt_internal_run_common_config_tests) qt_internal_check_cmp0099_available() qt_configure_end_summary_section() endfunction() + +# It is used in QtWebEngine to replace the REALPATH with ABSOLUTE path, which is +# useful for building Qt in Homebrew. +function(qt_internal_get_filename_path_mode out_var) + set(mode REALPATH) + if(APPLE AND QT_ALLOW_SYMLINK_IN_PATHS) + set(mode ABSOLUTE) + endif() + set(${out_var} ${mode} PARENT_SCOPE) +endfunction() diff --git a/cmake/QtCompilerOptimization.cmake b/cmake/QtCompilerOptimization.cmake index b5b49ab7..a093ed4d 100644 --- a/cmake/QtCompilerOptimization.cmake +++ b/cmake/QtCompilerOptimization.cmake @@ -124,5 +124,5 @@ endif() # Emscripten Clang if(WASM) set(QT_CFLAGS_OPTIMIZE_DEBUG "-O2 -g") # -Og is not supported - set(QT_CFLAGS_SSE2 -O2 -msimd128 -msse -msse2) + set(QT_CFLAGS_SSE2 "-O2 -msimd128 -msse -msse2") endif() diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake index 8ebcadf3..c863d3f4 100644 --- a/cmake/QtExecutableHelpers.cmake +++ b/cmake/QtExecutableHelpers.cmake @@ -30,6 +30,7 @@ function(qt_internal_add_executable name) endif() _qt_internal_create_executable(${name}) + qt_internal_mark_as_internal_target(${name}) if(ANDROID) _qt_internal_android_executable_finalizer(${name}) endif() @@ -119,6 +120,7 @@ function(qt_internal_add_executable name) qt_internal_extend_target("${name}" ${arg_NO_UNITY_BUILD} SOURCES ${arg_SOURCES} + NO_PCH_SOURCES ${arg_NO_PCH_SOURCES} NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES} INCLUDE_DIRECTORIES ${private_includes} DEFINES ${arg_DEFINES} @@ -369,6 +371,7 @@ function(qt_internal_add_configure_time_executable target) set(target_binary_dir "${CMAKE_CURRENT_BINARY_DIR}/configure_time_bins") if(arg_CONFIG) set(CMAKE_TRY_COMPILE_CONFIGURATION "${arg_CONFIG}") + string(TOUPPER "_${arg_CONFIG}" config_suffix) endif() get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) @@ -462,6 +465,29 @@ function(qt_internal_add_configure_time_executable target) set(cmake_flags_arg CMAKE_FLAGS "${arg_CMAKE_FLAGS}") endif() configure_file("${template}" "${target_binary_dir}/CMakeLists.txt" @ONLY) + + qt_internal_get_enabled_languages_for_flag_manipulation(enabled_languages) + foreach(lang IN LISTS enabled_languages) + set(compiler_flags_var "CMAKE_${lang}_FLAGS") + list(APPEND cmake_flags_arg "-D${compiler_flags_var}:STRING=${${compiler_flags_var}}") + if(arg_CONFIG) + set(compiler_flags_var_config "${compiler_flags_var}${config_suffix}") + list(APPEND cmake_flags_arg + "-D${compiler_flags_var_config}:STRING=${${compiler_flags_var_config}}") + endif() + endforeach() + + qt_internal_get_target_link_types_for_flag_manipulation(target_link_types) + foreach(linker_type IN LISTS target_link_types) + set(linker_flags_var "CMAKE_${linker_type}_LINKER_FLAGS") + list(APPEND cmake_flags_arg "-D${linker_flags_var}:STRING=${${linker_flags_var}}") + if(arg_CONFIG) + set(linker_flags_var_config "${linker_flags_var}${config_suffix}") + list(APPEND cmake_flags_arg + "-D${linker_flags_var_config}:STRING=${${linker_flags_var_config}}") + endif() + endforeach() + try_compile(result "${target_binary_dir}" "${target_binary_dir}" diff --git a/cmake/QtFindPackageHelpers.cmake b/cmake/QtFindPackageHelpers.cmake index 407e41b8..15651b31 100644 --- a/cmake/QtFindPackageHelpers.cmake +++ b/cmake/QtFindPackageHelpers.cmake @@ -41,10 +41,13 @@ macro(qt_find_package) # Due to this behavior being different from what general CMake projects expect, it is only # done for -developer-builds. if(QT_INTERNAL_PREVIOUSLY_FOUND_PACKAGES AND - NOT "${ARGV0}" IN_LIST QT_INTERNAL_PREVIOUSLY_FOUND_PACKAGES) + NOT "${ARGV0}" IN_LIST QT_INTERNAL_PREVIOUSLY_FOUND_PACKAGES + AND "${ARGV0}" IN_LIST QT_INTERNAL_PREVIOUSLY_SEARCHED_PACKAGES) set(_qt_find_package_skip_find_package TRUE) endif() + set_property(GLOBAL APPEND PROPERTY _qt_previously_searched_packages "${ARGV0}") + if(QT_DEBUG_QT_FIND_PACKAGE AND ${ARGV0}_FOUND AND arg_PROVIDED_TARGETS) set(_qt_find_package_skip_find_package TRUE) foreach(qt_find_package_target_name ${arg_PROVIDED_TARGETS}) @@ -221,7 +224,7 @@ endmacro() # Only applies to -developer-builds by default. # Can also be opted in or opted out via QT_INTERNAL_SAVE_PREVIOUSLY_FOUND_PACKAGES. # Opting out will need two reconfigurations to take effect. -function(qt_internal_save_previously_found_packages) +function(qt_internal_save_previously_visited_packages) if(DEFINED QT_INTERNAL_SAVE_PREVIOUSLY_FOUND_PACKAGES) set(should_save "${QT_INTERNAL_SAVE_PREVIOUSLY_FOUND_PACKAGES}") else() @@ -235,6 +238,7 @@ function(qt_internal_save_previously_found_packages) if(NOT should_save) # When the value is flipped to OFF, remove any previously saved packages. unset(QT_INTERNAL_PREVIOUSLY_FOUND_PACKAGES CACHE) + unset(QT_INTERNAL_PREVIOUSLY_SEARCHED_PACKAGES CACHE) return() endif() @@ -244,6 +248,15 @@ function(qt_internal_save_previously_found_packages) set(QT_INTERNAL_PREVIOUSLY_FOUND_PACKAGES "${_qt_previously_found_packages}" CACHE INTERNAL "List of CMake packages found during configuration using qt_find_package.") endif() + + get_property(_qt_previously_searched_packages GLOBAL PROPERTY _qt_previously_searched_packages) + if(_qt_previously_searched_packages) + list(REMOVE_DUPLICATES _qt_previously_searched_packages) + set(QT_INTERNAL_PREVIOUSLY_SEARCHED_PACKAGES + "${_qt_previously_searched_packages}" CACHE INTERNAL + "List of CMake packages searched during configuration using qt_find_package." + ) + endif() endfunction() # Return qmake library name for the given target, e.g. return "vulkan" for "Vulkan::Vulkan". diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake index d8597326..4ef1bd78 100644 --- a/cmake/QtFlagHandlingHelpers.cmake +++ b/cmake/QtFlagHandlingHelpers.cmake @@ -33,22 +33,15 @@ function(qt_internal_add_linker_version_script target) endif() string(APPEND contents "};\n") set(current "Qt_${PROJECT_VERSION_MAJOR}") - if (QT_NAMESPACE STREQUAL "") - set(tag_symbol "qt_version_tag") - else() - set(tag_symbol "qt_version_tag_${QT_NAMESPACE}") - endif() string(APPEND contents "${current} { *; };\n") - foreach(minor_version RANGE ${PROJECT_VERSION_MINOR}) - set(previous "${current}") - set(current "Qt_${PROJECT_VERSION_MAJOR}.${minor_version}") - if (minor_version EQUAL ${PROJECT_VERSION_MINOR}) - string(APPEND contents "${current} { ${tag_symbol}; } ${previous};\n") - else() - string(APPEND contents "${current} {} ${previous};\n") - endif() - endforeach() + get_target_property(type ${target} TYPE) + if(NOT target_type STREQUAL "INTERFACE_LIBRARY") + set(property_genex "$") + set(check_genex "$") + string(APPEND contents + "$<${check_genex}:${property_genex}>") + endif() set(infile "${CMAKE_CURRENT_BINARY_DIR}/${target}.version.in") set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${target}.version") @@ -87,6 +80,11 @@ function(qt_internal_add_link_flags_no_undefined target) if (NOT QT_BUILD_SHARED_LIBS OR WASM) return() endif() + if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + # ld64 defaults to -undefined,error, and in Xcode 15 + # passing this option is deprecated, causing a warning. + return() + endif() if ((GCC OR CLANG) AND NOT MSVC) if(CLANG AND QT_FEATURE_sanitizer) return() @@ -124,11 +122,20 @@ endfunction() function(qt_internal_apply_gc_binaries target visibility) set(possible_visibilities PRIVATE INTERFACE PUBLIC) - list(FIND possible_visibilities "${visibility}" known_visibility) - if (known_visibility EQUAL "-1") + if(NOT visibility IN_LIST possible_visibilities) message(FATAL_ERROR "Visibitily setting must be one of PRIVATE, INTERFACE or PUBLIC.") endif() + string(JOIN "" clang_or_gcc_begin + "$<$," + "$," + "$," + "$" + ">:" + ) + set(clang_or_gcc_end ">") + if ((GCC OR CLANG) AND NOT WASM AND NOT UIKIT AND NOT MSVC) if(APPLE) set(gc_sections_flag "-Wl,-dead_strip") @@ -137,16 +144,26 @@ function(qt_internal_apply_gc_binaries target visibility) elseif(LINUX OR BSD OR WIN32 OR ANDROID) set(gc_sections_flag "-Wl,--gc-sections") endif() + + # Save the flag value with and without genex wrapping, so we can remove the wrapping + # when generating .pc pkgconfig files. + set_property(GLOBAL PROPERTY _qt_internal_gc_sections_without_genex "${gc_sections_flag}") + + set(gc_sections_flag + "${clang_or_gcc_begin}${gc_sections_flag}${clang_or_gcc_end}") + + set_property(GLOBAL PROPERTY _qt_internal_gc_sections_with_genex "${gc_sections_flag}") endif() if(gc_sections_flag) target_link_options("${target}" ${visibility} "${gc_sections_flag}") endif() if((GCC OR CLANG) AND NOT WASM AND NOT UIKIT AND NOT MSVC) - set(split_sections_flags "-ffunction-sections" "-fdata-sections") + set(split_sections_flags + "${clang_or_gcc_begin}-ffunction-sections;-fdata-sections${clang_or_gcc_end}") endif() if(split_sections_flags) - target_compile_options("${target}" ${visibility} ${split_sections_flags}) + target_compile_options("${target}" ${visibility} "${split_sections_flags}") endif() endfunction() @@ -156,13 +173,17 @@ function(qt_internal_apply_intel_cet target visibility) endif() set(possible_visibilities PRIVATE INTERFACE PUBLIC) - list(FIND possible_visibilities "${visibility}" known_visibility) - if (known_visibility EQUAL "-1") + if(NOT visibility IN_LIST possible_visibilities) message(FATAL_ERROR "Visibitily setting must be one of PRIVATE, INTERFACE or PUBLIC.") endif() if(GCC) - set(flags "-mshstk") + string(JOIN "" flags + "$<$," + "$," + "$" + ">:-mshstk>") endif() if(flags) target_compile_options("${target}" ${visibility} "${flags}") @@ -287,14 +308,15 @@ function(qt_set_msvc_cplusplus_options target visibility) # Check qt_config_compile_test for more info. if(MSVC AND MSVC_VERSION GREATER_EQUAL 1913) set(flags "-Zc:__cplusplus" "-permissive-") - target_compile_options("${target}" ${visibility} "$<$:${flags}>") + target_compile_options("${target}" ${visibility} + "$<$,$>:${flags}>") endif() endfunction() function(qt_enable_utf8_sources target) set(utf8_flags "") if(MSVC) - list(APPEND utf8_flags "-utf-8") + list(APPEND utf8_flags "$<$:-utf-8>") endif() if(utf8_flags) @@ -557,12 +579,20 @@ endfunction() # Removes specified flags from CMAKE__FLAGS[_CONFIGS] variables # -# IN_CACHE enables flags removal from CACHE -# CONFIGS list of configurations that need to clear flags. Clears all configs by default if not -# specified. -# LANGUAGES list of LANGUAGES that need clear flags. Clears all languages by default if not -# specified. -# REGEX enables the flag processing as a regular expression. +# Option Arguments: +# IN_CACHE +# Enables flags removal from CACHE +# REGEX +# Enables the flag processing as a regular expression. +# +# Multi-value Arguments: +# CONFIGS +# List of configurations that need to clear flags. Clears all configs by default if not +# specified. +# +# LANGUAGES +# List of LANGUAGES that need clear flags. Clears all languages by default if not +# specified. function(qt_internal_remove_compiler_flags flags) cmake_parse_arguments(PARSE_ARGV 1 arg "IN_CACHE;REGEX" @@ -585,8 +615,7 @@ function(qt_internal_remove_compiler_flags flags) if(arg_CONFIGS) set(configs "${arg_CONFIGS}") else() - message(FATAL_ERROR - "You must specify at least one configuration for which to remove the flags.") + qt_internal_get_configs_for_flag_manipulation(configs) endif() if(arg_REGEX) @@ -992,14 +1021,42 @@ function(qt_internal_set_up_config_optimizations_like_in_qmake) IN_CACHE) endif() + # Legacy Android toolchain file adds the `-g` flag to CMAKE__FLAGS, as a + # result, our release build ends up containing debug symbols. To avoid that, we + # remove the flag from CMAKE__FLAGS and add + # it to CMAKE__FLAGS_DEBUG. + # + # Note: + # The new `android.toolchain.cmake` file does not have this problem, but + # it has other issues, eg., https://github.com/android/ndk/issues/1693, so we + # cannot force it. While we do load the new toolchain, it automatically falls + # back to the legacy toolchain, ie., `android-legacy.toolchain.cmake` which + # has the problem described above. + # + # Todo: + # When the new toolchain is fixed, and it doesn't fall back to the legacy + # anymore by default, then we should be able to remove this workaround. + if(ANDROID AND ANDROID_COMPILER_FLAGS MATCHES "(^| )-g") + qt_internal_remove_compiler_flags("-g") + qt_internal_add_compiler_flags(FLAGS "-g" CONFIGS DEBUG RELWITHDEBINFO) + endif() + # Update all relevant flags in the calling scope - foreach(config ${configs}) - foreach(lang ${enabled_languages}) + foreach(lang ${enabled_languages}) + set(flag_var_name "CMAKE_${lang}_FLAGS") + set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) + + foreach(config ${configs}) set(flag_var_name "CMAKE_${lang}_FLAGS_${config}") set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) endforeach() + endforeach() - foreach(t ${target_link_types}) + foreach(t ${target_link_types}) + set(flag_var_name "CMAKE_${t}_LINKER_FLAGS") + set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) + + foreach(config ${configs}) set(flag_var_name "CMAKE_${t}_LINKER_FLAGS_${config}") set(${flag_var_name} "${${flag_var_name}}" PARENT_SCOPE) endforeach() diff --git a/cmake/QtHeadersClean.cmake b/cmake/QtHeadersClean.cmake index 497c3f29..d04a80d9 100644 --- a/cmake/QtHeadersClean.cmake +++ b/cmake/QtHeadersClean.cmake @@ -185,6 +185,9 @@ function(qt_internal_add_headersclean_target module_target module_headers) # and violate the standards. set(hcleanFLAGS -std:c++latest -Zc:__cplusplus -WX -W3) + # Because we now add `-DNOMINMAX` to `PlatformCommonInternal`. + set(hcleanUDEFS -UNOMINMAX) + # cl.exe needs a source path get_filename_component(source_path "${QT_MKSPECS_DIR}/features/data/dummy.cpp" REALPATH) @@ -195,6 +198,7 @@ function(qt_internal_add_headersclean_target module_target module_headers) "${hcleanFLAGS}" "${target_includes_joined_genex}" "${hcleanDEFS}" + "${hcleanUDEFS}" ) string(JOIN " " compiler_command_line_variables "-FI" @@ -227,7 +231,7 @@ function(qt_internal_add_headersclean_target module_target module_headers) file(GENERATE OUTPUT "${headers_check_parameters}" CONTENT "${headers_check_parameters_content}") - set(sync_headers_dep "sync_headers") + set(sync_headers_dep "${module_target}_sync_headers") foreach(header ${hclean_headers}) # We need realpath here to make sure path starts with drive letter diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake index ff906e94..b5831659 100644 --- a/cmake/QtInternalTargets.cmake +++ b/cmake/QtInternalTargets.cmake @@ -102,7 +102,7 @@ function(qt_internal_add_global_definition definition) set(optional_args) set(single_value_args VALUE) set(multi_value_args SCOPE) - cmake_parse_arguments(args + cmake_parse_arguments(arg "${optional_args}" "${single_value_args}" "${multi_value_args}" @@ -168,6 +168,8 @@ if(WIN32) # Needed for M_PI define. Same as mkspecs/features/qt_module.prf. # It's set for every module being built, but it's not propagated to user apps. target_compile_definitions(PlatformModuleInternal INTERFACE _USE_MATH_DEFINES) + # Not disabling min/max macros may result in unintended substitutions of std::min/max + target_compile_definitions(PlatformCommonInternal INTERFACE NOMINMAX) endif() if(FEATURE_largefile AND UNIX) target_compile_definitions(PlatformCommonInternal @@ -205,6 +207,14 @@ function(qt_internal_apply_bitcode_flags target) target_compile_options("${target}" INTERFACE ${bitcode_flags}) endfunction() +# Function guards linker options that are applicable for internal Qt targets only from propagating +# them to user projects. +function(qt_internal_platform_link_options target scope) + set(options ${ARGN}) + set(is_internal_target_genex "$>") + target_link_options(${target} ${scope} "$<${is_internal_target_genex}:${options}>") +endfunction() + # Apple deprecated the entire OpenGL API in favor of Metal, which # we are aware of, so silence the deprecation warnings in code. # This does not apply to user-code, which will need to silence @@ -283,7 +293,7 @@ if (MSVC) $<$>:-guard:cf -Gw> ) - target_link_options(PlatformCommonInternal INTERFACE + qt_internal_platform_link_options(PlatformCommonInternal INTERFACE -DYNAMICBASE -NXCOMPAT -LARGEADDRESSAWARE $<$>:-OPT:REF -OPT:ICF -GUARD:CF> ) @@ -299,7 +309,7 @@ endif() if(QT_FEATURE_intelcet) if(MSVC) - target_link_options(PlatformCommonInternal INTERFACE + qt_internal_platform_link_options(PlatformCommonInternal INTERFACE -CETCOMPAT ) else() @@ -328,30 +338,31 @@ endif() if(DEFINED QT_EXTRA_FRAMEWORKPATHS AND APPLE) list(TRANSFORM QT_EXTRA_FRAMEWORKPATHS PREPEND "-F" OUTPUT_VARIABLE __qt_fw_flags) target_compile_options(PlatformCommonInternal INTERFACE ${__qt_fw_flags}) - target_link_options(PlatformCommonInternal INTERFACE ${__qt_fw_flags}) + qt_internal_platform_link_options(PlatformCommonInternal INTERFACE ${__qt_fw_flags}) unset(__qt_fw_flags) endif() qt_internal_get_active_linker_flags(__qt_internal_active_linker_flags) if(__qt_internal_active_linker_flags) - target_link_options(PlatformCommonInternal INTERFACE "${__qt_internal_active_linker_flags}") + qt_internal_platform_link_options(PlatformCommonInternal INTERFACE + "${__qt_internal_active_linker_flags}") endif() unset(__qt_internal_active_linker_flags) if(QT_FEATURE_enable_gdb_index) - target_link_options(PlatformCommonInternal INTERFACE "-Wl,--gdb-index") + qt_internal_platform_link_options(PlatformCommonInternal INTERFACE "-Wl,--gdb-index") endif() if(QT_FEATURE_enable_new_dtags) - target_link_options(PlatformCommonInternal INTERFACE "-Wl,--enable-new-dtags") + qt_internal_platform_link_options(PlatformCommonInternal INTERFACE "-Wl,--enable-new-dtags") endif() function(qt_get_implicit_sse2_genex_condition out_var) set(is_shared_lib "$,SHARED_LIBRARY>") set(is_static_lib "$,STATIC_LIBRARY>") set(is_static_qt_build "$>") - set(is_staitc_lib_during_static_qt_build "$") - set(enable_sse2_condition "$") + set(is_static_lib_during_static_qt_build "$") + set(enable_sse2_condition "$") set(${out_var} "${enable_sse2_condition}" PARENT_SCOPE) endfunction() diff --git a/cmake/QtJavaHelpers.cmake b/cmake/QtJavaHelpers.cmake index edf4f54b..5aeffe1f 100644 --- a/cmake/QtJavaHelpers.cmake +++ b/cmake/QtJavaHelpers.cmake @@ -4,6 +4,10 @@ # This function can be used to compile java sources into a jar package. function(qt_internal_add_jar target) + set(options) + set(oneValueArgs OUTPUT_DIR) + set(multiValueArgs INCLUDE_JARS SOURCES) + cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) set(javac_target_version "${QT_ANDROID_JAVAC_TARGET}") if (NOT javac_target_version) @@ -18,4 +22,8 @@ function(qt_internal_add_jar target) set(CMAKE_JAVA_COMPILE_FLAGS -source "${javac_source_version}" -target "${javac_target_version}" -Xlint:unchecked -bootclasspath "${QT_ANDROID_JAR}") add_jar(${ARGV}) + foreach(f IN LISTS arg_SOURCES) + _qt_internal_expose_source_file_to_ide(${target} "${f}") + endforeach() + endfunction() diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake index 41e0680e..0b42991e 100644 --- a/cmake/QtModuleHelpers.cmake +++ b/cmake/QtModuleHelpers.cmake @@ -37,7 +37,6 @@ macro(qt_internal_get_internal_add_module_keywords option_args single_args multi QMAKE_MODULE_CONFIG EXTRA_CMAKE_FILES EXTRA_CMAKE_INCLUDES - NO_PCH_SOURCES EXTERNAL_HEADERS POLICIES ${__default_private_args} @@ -447,6 +446,8 @@ function(qt_internal_add_module target) # If EXTERNAL_HEADERS_DIR is set we install the specified directory and keep the structure # without taking into the account the CMake source tree and syncqt outputs. if(arg_EXTERNAL_HEADERS_DIR) + set_property(TARGET ${target} + PROPERTY _qt_external_headers_dir "${arg_EXTERNAL_HEADERS_DIR}") qt_install(DIRECTORY "${arg_EXTERNAL_HEADERS_DIR}/" DESTINATION "${module_install_interface_include_dir}" ) @@ -1186,10 +1187,13 @@ function(qt_internal_collect_module_headers out_var target) get_target_property(target_type ${target} TYPE) if(target_type STREQUAL "INTERFACE_LIBRARY") set(source_dir "${CMAKE_CURRENT_SOURCE_DIR}") + set(binary_dir "${CMAKE_CURRENT_BINARY_DIR}") else() get_target_property(source_dir ${target} SOURCE_DIR) + get_target_property(binary_dir ${target} BINARY_DIR) endif() get_filename_component(source_dir "${source_dir}" ABSOLUTE) + get_filename_component(binary_dir "${binary_dir}" ABSOLUTE) get_target_property(is_3rdparty_library ${target} _qt_module_is_3rdparty_header_library) @@ -1232,7 +1236,14 @@ function(qt_internal_collect_module_headers out_var target) "\nCondition:\n ${condition_string}") endif() - if(file_path MATCHES "3rdparty/.+" AND NOT is_3rdparty_library) + if(is_outside_module_source_dir) + set(base_dir "${binary_dir}") + else() + set(base_dir "${source_dir}") + endif() + + file(RELATIVE_PATH file_path_rel "${base_dir}" "${file_path}") + if(file_path_rel MATCHES "3rdparty/.+" AND NOT is_3rdparty_library) set(is_3rdparty_header TRUE) else() set(is_3rdparty_header FALSE) diff --git a/cmake/QtPkgConfigHelpers.cmake b/cmake/QtPkgConfigHelpers.cmake index 370ff607..dbe736c4 100644 --- a/cmake/QtPkgConfigHelpers.cmake +++ b/cmake/QtPkgConfigHelpers.cmake @@ -51,6 +51,17 @@ function(qt_internal_generate_pkg_config_file module) list(TRANSFORM loose_include_dirs REPLACE "${INSTALL_INCLUDEDIR}" "\${includedir}") list(TRANSFORM loose_include_dirs REPLACE "${INSTALL_MKSPECSDIR}" "\${mkspecsdir}") + # Remove genex wrapping around gc_sections flag because we can't evaluate genexes like + # $ in file(GENERATE). And given that .pc files don't support dynamic + # evaluation like the $ genex, distros will be expected to patch the .pc + # files according to which compiler they intend to be used with. + get_property(gc_sections_with_genex GLOBAL PROPERTY _qt_internal_gc_sections_with_genex) + get_property(gc_sections_without_genex GLOBAL PROPERTY _qt_internal_gc_sections_without_genex) + if(loose_link_options AND gc_sections_with_genex AND gc_sections_without_genex) + string(REPLACE "${gc_sections_with_genex}" "${gc_sections_without_genex}" + loose_link_options "${loose_link_options}") + endif() + qt_internal_set_pkg_config_cpp_flags(link_options "${loose_link_options}" "") qt_internal_set_pkg_config_cpp_flags(compile_defs "${loose_compile_defs}" -D) qt_internal_set_pkg_config_cpp_flags(include_dirs "${loose_include_dirs}" -I) diff --git a/cmake/QtPluginHelpers.cmake b/cmake/QtPluginHelpers.cmake index b4aaffb8..2db9d462 100644 --- a/cmake/QtPluginHelpers.cmake +++ b/cmake/QtPluginHelpers.cmake @@ -336,6 +336,8 @@ function(qt_internal_add_plugin target) qt_internal_extend_target("${target}" ${arg_NO_UNITY_BUILD} SOURCES ${arg_SOURCES} + NO_PCH_SOURCES + ${arg_NO_PCH_SOURCES} NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES} INCLUDE_DIRECTORIES diff --git a/cmake/QtPriHelpers.cmake b/cmake/QtPriHelpers.cmake index c619a50f..f1d45cdc 100644 --- a/cmake/QtPriHelpers.cmake +++ b/cmake/QtPriHelpers.cmake @@ -26,9 +26,14 @@ function(qt_generate_qmake_libraries_pri_content module_name output_root_dir out set(lib_incdir "") set(lib_libdir "") set(lib_libs "") + set(seen_targets "") while(lib_targets) list(POP_BACK lib_targets lib_target) if(TARGET ${lib_target}) + if(${lib_target} IN_LIST seen_targets) + continue() + endif() + list(APPEND seen_targets ${lib_target}) get_target_property(lib_target_type ${lib_target} TYPE) if(lib_target_type STREQUAL "INTERFACE_LIBRARY") get_target_property(iface_libs ${lib_target} INTERFACE_LINK_LIBRARIES) diff --git a/cmake/QtProcessConfigureArgs.cmake b/cmake/QtProcessConfigureArgs.cmake index 8fa4be2a..85f5b714 100644 --- a/cmake/QtProcessConfigureArgs.cmake +++ b/cmake/QtProcessConfigureArgs.cmake @@ -55,7 +55,10 @@ if("${MODULE_ROOT}" STREQUAL "") set(qtbase_or_top_level_build TRUE) else() # If MODULE_ROOT is passed without drive letter, we try to add it to the path. - get_filename_component(MODULE_ROOT "." REALPATH BASE_DIR "${MODULE_ROOT}") + # The check is necessary; otherwise, `get_filename_component` returns an empty string. + if(NOT MODULE_ROOT STREQUAL ".") + get_filename_component(MODULE_ROOT "." REALPATH BASE_DIR "${MODULE_ROOT}") + endif() set(qtbase_or_top_level_build FALSE) endif() set(configure_filename "configure.cmake") @@ -136,13 +139,6 @@ while(NOT "${configure_args}" STREQUAL "") list(POP_FRONT configure_args version) is_valid_qt_hex_version("${arg}" "${version}") push("-DQT_DISABLE_DEPRECATED_UP_TO=${version}") - elseif(arg STREQUAL "-unity-build") - push("-DQT_UNITY_BUILD=ON") - # QT_UNITY_BUILD_BATCH_SIZE will be set to 8, CMake's default. - elseif(arg STREQUAL "-unity-build-batch-size") - list(POP_FRONT configure_args unity_build_batch_size) - is_non_empty_valid_arg("${arg}" "${unity_build_batch_size}") - push("-DQT_UNITY_BUILD_BATCH_SIZE=${unity_build_batch_size}") elseif(arg STREQUAL "--") # Everything after this argument will be passed to CMake verbatim. list(APPEND cmake_args "${configure_args}") @@ -827,6 +823,8 @@ endfunction() drop_input(commercial) drop_input(confirm-license) translate_boolean_input(precompile_header BUILD_WITH_PCH) +translate_boolean_input(unity_build QT_UNITY_BUILD) +translate_string_input(unity_build_batch_size QT_UNITY_BUILD_BATCH_SIZE) translate_boolean_input(ccache QT_USE_CCACHE) translate_boolean_input(shared BUILD_SHARED_LIBS) translate_boolean_input(warnings_are_errors WARNINGS_ARE_ERRORS) diff --git a/cmake/QtPublicAppleHelpers.cmake b/cmake/QtPublicAppleHelpers.cmake index b60ef5e4..1d489f09 100644 --- a/cmake/QtPublicAppleHelpers.cmake +++ b/cmake/QtPublicAppleHelpers.cmake @@ -221,7 +221,7 @@ function(_qt_internal_find_ios_development_team_id out_var) endif() endfunction() -function(_qt_internal_get_ios_bundle_identifier_prefix out_var) +function(_qt_internal_get_apple_bundle_identifier_prefix out_var) get_property(prefix GLOBAL PROPERTY _qt_internal_ios_bundle_identifier_prefix) get_property(prefix_computed GLOBAL PROPERTY _qt_internal_ios_bundle_identifier_prefix_computed) @@ -269,8 +269,8 @@ function(_qt_internal_escape_rfc_1034_identifier value out_var) set("${out_var}" "${value}" PARENT_SCOPE) endfunction() -function(_qt_internal_get_default_ios_bundle_identifier out_var) - _qt_internal_get_ios_bundle_identifier_prefix(prefix) +function(_qt_internal_get_default_apple_bundle_identifier target out_var) + _qt_internal_get_apple_bundle_identifier_prefix(prefix) if(NOT prefix) set(prefix "com.yourcompany") @@ -281,14 +281,16 @@ function(_qt_internal_get_default_ios_bundle_identifier out_var) string(SHA1 hash "${team_id}") string(SUBSTRING "${hash}" 0 8 infix) string(APPEND prefix ".${infix}") - else() + endif() + + if(CMAKE_GENERATOR STREQUAL "Xcode") message(WARNING - "No organization bundle identifier prefix could be retrieved from Xcode " - "preferences. This can lead to code signing issues due to a non-unique bundle " - "identifier. Please set up an organization prefix by creating a new project within " - "Xcode, or consider providing a custom bundle identifier by specifying the " - "XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER property." - ) + "No organization bundle identifier prefix could be retrieved from Xcode preferences. \ + This can lead to code signing issues due to a non-unique bundle \ + identifier. Please set up an organization prefix by creating a new project within \ + Xcode, or consider providing a custom bundle identifier by specifying the \ + MACOSX_BUNDLE_GUI_IDENTIFIER or XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER property." + ) endif() endif() @@ -299,7 +301,12 @@ function(_qt_internal_get_default_ios_bundle_identifier out_var) # that the identifier is invalid. _qt_internal_escape_rfc_1034_identifier("${prefix}" prefix) - set(identifier "${prefix}.\${PRODUCT_NAME:rfc1034identifier}") + if(CMAKE_GENERATOR STREQUAL "Xcode") + set(identifier "${prefix}.$(PRODUCT_NAME:rfc1034identifier)") + else() + set(identifier "${prefix}.${target}") + endif() + set("${out_var}" "${identifier}" PARENT_SCOPE) endfunction() @@ -384,56 +391,72 @@ function(_qt_internal_set_xcode_development_team_id target) endif() endfunction() -function(_qt_internal_set_xcode_bundle_identifier target) +function(_qt_internal_set_apple_bundle_identifier target) # Skip all logic if requested. if(QT_NO_SET_XCODE_BUNDLE_IDENTIFIER) return() endif() - # There are two fields to consider: the CFBundleIdentifier key (CFBI) to be written to - # Info.plist - # and the PRODUCT_BUNDLE_IDENTIFIER (PBI) property to set in the Xcode project. - # The following logic enables the best out-of-the-box experience combined with maximum - # customization. - # 1) If values for both fields are not provided, assign ${PRODUCT_BUNDLE_IDENTIFIER} to CFBI - # (which is expanded by xcodebuild at build time and will use the value of PBI) and - # auto-compute a default PBI from Xcode's ${PRODUCT_NAME}. - # 2) If CFBI is set and PBI isn't, use given CFBI and keep PBI empty. - # 3) If PBI is set and CFBI isn't, assign ${PRODUCT_BUNDLE_IDENTIFIER} to CFBI and use - # the given PBI. - # 4) If both are set, use both given values. - # TLDR: - # cfbi pbi -> result_cfbi result_pbi - # unset unset computed computed - # set unset given_val unset - # unset set computed given_val - # set set given_val given_val + # There are two fields to consider: the CFBundleIdentifier key (ie., cmake_bundle_identifier) + # to be written to Info.plist and the PRODUCT_BUNDLE_IDENTIFIER (ie., xcode_bundle_identifier) + # property to set in the Xcode project. The `cmake_bundle_identifier` set by + # MACOSX_BUNDLE_GUI_IDENTIFIER applies to both Xcode, and other generators, while + # `xcode_bundle_identifier` set by XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER is + # Xcode specific. + # + # If Ninja is the generator, we set the value of `MACOSX_BUNDLE_GUI_IDENTIFIER` + # and don't touch the `XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER`. + # If Xcode is the generator, we set the value of `XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER`, + # and additionally, to silence a Xcode's warning, we set the `MACOSX_BUNDLE_GUI_IDENTIFIER` to + # `${PRODUCT_BUNDLE_IDENTIFIER}` so that Xcode could sort it out. - get_target_property(existing_cfbi "${target}" MACOSX_BUNDLE_GUI_IDENTIFIER) - if(NOT MACOSX_BUNDLE_GUI_IDENTIFIER AND NOT existing_cfbi) - set(is_cfbi_given FALSE) - else() - set(is_cfbi_given TRUE) + get_target_property(existing_cmake_bundle_identifier "${target}" + MACOSX_BUNDLE_GUI_IDENTIFIER) + get_target_property(existing_xcode_bundle_identifier "${target}" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER) + + set(is_cmake_bundle_identifier_given FALSE) + if(existing_cmake_bundle_identifier) + set(is_cmake_bundle_identifier_given TRUE) + elseif(MACOSX_BUNDLE_GUI_IDENTIFIER) + set(is_cmake_bundle_identifier_given TRUE) + set(existing_cmake_bundle_identifier ${MACOSX_BUNDLE_GUI_IDENTIFIER}) endif() - if(NOT is_cfbi_given) + set(is_xcode_bundle_identifier_given FALSE) + if(existing_xcode_bundle_identifier) + set(is_xcode_bundle_identifier_given TRUE) + elseif(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER) + set(is_xcode_bundle_identifier_given TRUE) + set(existing_xcode_bundle_identifier ${CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER}) + endif() + + if(is_cmake_bundle_identifier_given + AND is_xcode_bundle_identifier_given + AND NOT existing_cmake_bundle_identifier STREQUAL existing_xcode_bundle_identifier) + message(WARNING + "MACOSX_BUNDLE_GUI_IDENTIFIER and XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER " + "are set to different values. You only need to set one of them. ") + endif() + + if(NOT is_xcode_bundle_identifier_given + AND NOT is_cmake_bundle_identifier_given) + _qt_internal_get_default_apple_bundle_identifier("${target}" bundle_id) + elseif(is_cmake_bundle_identifier_given) + set(bundle_id ${existing_cmake_bundle_identifier}) + elseif(is_xcode_bundle_identifier_given) + set(bundle_id ${existing_xcode_bundle_identifier}) + endif() + + if(CMAKE_GENERATOR STREQUAL "Xcode") set_target_properties("${target}" PROPERTIES - MACOSX_BUNDLE_GUI_IDENTIFIER "\${PRODUCT_BUNDLE_IDENTIFIER}") - endif() - - get_target_property(existing_pbi "${target}" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER) - if(NOT CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER AND NOT existing_pbi) - set(is_pbi_given FALSE) + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${bundle_id}" + MACOSX_BUNDLE_GUI_IDENTIFIER "$(PRODUCT_BUNDLE_IDENTIFIER)") else() - set(is_pbi_given TRUE) - endif() - - if(NOT is_pbi_given AND NOT is_cfbi_given) - _qt_internal_get_default_ios_bundle_identifier(bundle_id) set_target_properties("${target}" PROPERTIES - XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${bundle_id}") + MACOSX_BUNDLE_GUI_IDENTIFIER "${bundle_id}") endif() endfunction() @@ -503,7 +526,7 @@ function(_qt_internal_set_xcode_bundle_name target) if(CMAKE_GENERATOR STREQUAL Xcode) set_target_properties("${target}" PROPERTIES - MACOSX_BUNDLE_BUNDLE_NAME "\${PRODUCT_NAME}") + MACOSX_BUNDLE_BUNDLE_NAME "$(PRODUCT_NAME)") else() set_target_properties("${target}" PROPERTIES @@ -603,12 +626,13 @@ function(_qt_internal_finalize_apple_app target) # This affects things like the version number or application name as reported by Qt API. if(CMAKE_GENERATOR STREQUAL "Xcode") _qt_internal_set_xcode_development_team_id("${target}") - _qt_internal_set_xcode_bundle_identifier("${target}") _qt_internal_set_xcode_code_sign_style("${target}") _qt_internal_set_xcode_bundle_display_name("${target}") _qt_internal_set_xcode_install_path("${target}") endif() + _qt_internal_set_xcode_bundle_name("${target}") + _qt_internal_set_apple_bundle_identifier("${target}") _qt_internal_set_placeholder_apple_bundle_version("${target}") endfunction() diff --git a/cmake/QtPublicTargetHelpers.cmake b/cmake/QtPublicTargetHelpers.cmake index 6f0d3bb2..df9e87db 100644 --- a/cmake/QtPublicTargetHelpers.cmake +++ b/cmake/QtPublicTargetHelpers.cmake @@ -307,7 +307,17 @@ function(_qt_internal_set_up_static_runtime_library target) set_property(TARGET ${target} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") elseif(MINGW) - target_link_options(${target} INTERFACE "LINKER:-Bstatic") + get_target_property(target_type ${target} TYPE) + if(target_type STREQUAL "EXECUTABLE") + set(link_option PRIVATE) + else() + set(link_option INTERFACE) + endif() + if(CLANG) + target_link_options(${target} ${link_option} "LINKER:-Bstatic") + else() + target_link_options(${target} ${link_option} "-static") + endif() endif() endif() endfunction() diff --git a/cmake/QtRpathHelpers.cmake b/cmake/QtRpathHelpers.cmake index 2150b95e..7228ffbb 100644 --- a/cmake/QtRpathHelpers.cmake +++ b/cmake/QtRpathHelpers.cmake @@ -6,7 +6,7 @@ function(qt_internal_get_relative_rpath_base_token out_var) if(APPLE) set(rpath_rel_base "@loader_path") - elseif(LINUX OR SOLARIS OR FREEBSD OR HURD) + elseif(LINUX OR SOLARIS OR FREEBSD OR HURD OR OPENBSD) set(rpath_rel_base "$ORIGIN") else() set(rpath_rel_base "NO_KNOWN_RPATH_REL_BASE") diff --git a/cmake/QtSeparateDebugInfo.cmake b/cmake/QtSeparateDebugInfo.cmake index ff225ad5..5b263585 100644 --- a/cmake/QtSeparateDebugInfo.cmake +++ b/cmake/QtSeparateDebugInfo.cmake @@ -201,7 +201,11 @@ endfunction() # Enable separate debug information for the given target function(qt_enable_separate_debug_info target installDestination) set(flags QT_EXECUTABLE) - set(options) + if(APPLE) + set(options DSYM_OUTPUT_DIR) + else() + set(options) + endif() set(multiopts ADDITIONAL_INSTALL_ARGS) cmake_parse_arguments(arg "${flags}" "${options}" "${multiopts}" ${ARGN}) @@ -248,12 +252,20 @@ function(qt_enable_separate_debug_info target installDestination) get_target_property(is_framework ${target} FRAMEWORK) if(is_framework) qt_internal_get_framework_info(fw ${target}) - set(debug_info_bundle_dir "$.${debug_info_suffix}") set(BUNDLE_ID ${fw_name}) else() - set(debug_info_bundle_dir "$.${debug_info_suffix}") set(BUNDLE_ID ${target}) endif() + + if (NOT "x${arg_DSYM_OUTPUT_DIR}" STREQUAL "x") + set(debug_info_bundle_dir "${arg_DSYM_OUTPUT_DIR}/${target}") + elseif(is_framework) + set(debug_info_bundle_dir "$") + else() + set(debug_info_bundle_dir "$") + endif() + set(debug_info_bundle_dir "${debug_info_bundle_dir}.${debug_info_suffix}") + set(debug_info_contents_dir "${debug_info_bundle_dir}/Contents") set(debug_info_target_dir "${debug_info_contents_dir}/Resources/DWARF") configure_file( diff --git a/cmake/QtSetup.cmake b/cmake/QtSetup.cmake index 90acbae5..c8209840 100644 --- a/cmake/QtSetup.cmake +++ b/cmake/QtSetup.cmake @@ -5,8 +5,8 @@ # Set the QT_IS_BUILDING_QT variable so we can verify whether we are building # Qt from source -set(QT_BUILDING_QT TRUE CACHE - TYPE STRING "When this is present and set to true, it signals that we are building Qt from source.") +set(QT_BUILDING_QT TRUE CACHE BOOL + "When this is present and set to true, it signals that we are building Qt from source.") # Pre-calculate the developer_build feature if it's set by the user via INPUT_developer_build if(NOT FEATURE_developer_build AND INPUT_developer_build @@ -352,6 +352,8 @@ if(QT_UNITY_BUILD) set(CMAKE_UNITY_BUILD_BATCH_SIZE "${QT_UNITY_BUILD_BATCH_SIZE}") endif() +option(QT_ALLOW_SYMLINK_IN_PATHS "Allows symlinks in paths." OFF) + # We need to clean up QT_FEATURE_*, but only once per configuration cycle get_property(qt_feature_clean GLOBAL PROPERTY _qt_feature_clean) if(NOT qt_feature_clean) diff --git a/cmake/QtSyncQtHelpers.cmake b/cmake/QtSyncQtHelpers.cmake index 2ee98722..f120a968 100644 --- a/cmake/QtSyncQtHelpers.cmake +++ b/cmake/QtSyncQtHelpers.cmake @@ -139,7 +139,6 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge set(syncqt_args "${common_syncqt_arguments}") list(APPEND syncqt_args - ${common_syncqt_arguments} -headers ${module_headers} -stagingDir "${syncqt_staging_dir}" -knownModules ${known_modules} @@ -150,6 +149,21 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge set(syncqt_args_rsp "${binary_dir_real}/${target}_syncqt_args") qt_configure_file(OUTPUT "${syncqt_args_rsp}" CONTENT "${syncqt_args_string}") + get_target_property(external_headers_dir ${target} _qt_external_headers_dir) + if(external_headers_dir) + if(NOT IS_ABSOLUTE "${external_headers_dir}") + get_filename_component(external_headers_dir "${external_headers_dir}" ABSOLUTE) + endif() + if(EXISTS "${external_headers_dir}") + set(external_headers_dir_copy_cmd + COMMAND + ${CMAKE_COMMAND} + -E copy_directory + "${external_headers_dir}" + "${module_build_interface_include_dir}" + ) + endif() + endif() add_custom_command( OUTPUT ${syncqt_outputs} @@ -157,6 +171,7 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt "@${syncqt_args_rsp}" ${build_time_syncqt_arguments} + ${external_headers_dir_copy_cmd} COMMAND ${CMAKE_COMMAND} -E touch "${syncqt_timestamp}" DEPENDS @@ -167,12 +182,22 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge "Running syncqt.cpp for module: ${module}" VERBATIM ) + + set(add_sync_headers_to_all "") + if(is_interface_lib) + set(add_sync_headers_to_all ALL) + endif() + add_custom_target(${target}_sync_headers + ${add_sync_headers_to_all} DEPENDS ${syncqt_outputs} ) add_dependencies(sync_headers ${target}_sync_headers) + if(is_3rd_party_library) + add_dependencies(thirdparty_sync_headers ${target}_sync_headers) + endif() # This target is required when building docs, to make all header files and their aliases # available for qdoc. # ${target}_sync_headers is added as dependency to make sure that @@ -185,6 +210,7 @@ function(qt_internal_target_sync_headers target module_headers module_headers_ge COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::syncqt "@${syncqt_all_args_rsp}" + ${external_headers_dir_copy_cmd} DEPENDS ${module_headers} ${syncqt_all_args_rsp} diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake index 50d8691d..6e7ff453 100644 --- a/cmake/QtTargetHelpers.cmake +++ b/cmake/QtTargetHelpers.cmake @@ -14,6 +14,8 @@ # module, these files will raise a warning at configure time if the condition is not met. # COMPILE_FLAGS # Custom compilation flags. +# EXTRA_LINKER_SCRIPT_CONTENT +# Extra content that should be appended to a target linker script. Applicable for ld only. # NO_PCH_SOURCES # Skip the specified source files by PRECOMPILE_HEADERS feature. function(qt_internal_extend_target target) @@ -36,6 +38,7 @@ function(qt_internal_extend_target target) ) set(single_args PRECOMPILED_HEADER + EXTRA_LINKER_SCRIPT_CONTENT ) set(multi_args ${__default_public_args} @@ -44,7 +47,6 @@ function(qt_internal_extend_target target) CONDITION CONDITION_INDEPENDENT_SOURCES COMPILE_FLAGS - NO_PCH_SOURCES ) cmake_parse_arguments(PARSE_ARGV 1 arg @@ -237,6 +239,10 @@ function(qt_internal_extend_target target) ${sources_property} "${arg_CONDITION_INDEPENDENT_SOURCES}") endif() + if(arg_EXTRA_LINKER_SCRIPT_CONTENT) + set_target_properties(${target} PROPERTIES + _qt_extra_linker_script_content "${arg_EXTRA_LINKER_SCRIPT_CONTENT}") + endif() endfunction() function(qt_is_imported_target target out_var) @@ -1001,6 +1007,15 @@ endfunction() # Needed to allow selectively applying certain flags via PlatformXInternal targets. function(qt_internal_mark_as_internal_library target) set_target_properties(${target} PROPERTIES _qt_is_internal_library TRUE) + qt_internal_mark_as_internal_target(${target}) +endfunction() + +# Marks a target with a property that it was built using the internal Qt API (qt_internal_*) as +# opposed to it being a user project library or executable(qt_add_*, etc). +# +# Needed to allow selectively applying certain flags via PlatformXInternal targets. +function(qt_internal_mark_as_internal_target target) + set_target_properties(${target} PROPERTIES _qt_is_internal_target TRUE) endfunction() function(qt_internal_link_internal_platform_for_object_library target) diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake index e6759c9e..4c6b7d56 100644 --- a/cmake/QtTestHelpers.cmake +++ b/cmake/QtTestHelpers.cmake @@ -214,6 +214,7 @@ function(qt_internal_get_test_arg_definitions optional_args single_value_args mu MANUAL NO_BATCH NO_INSTALL + BUNDLE_ANDROID_OPENSSL_LIBS PARENT_SCOPE ) set(${single_value_args} @@ -526,6 +527,21 @@ function(qt_internal_add_test name) endif() if (ANDROID) + if(arg_BUNDLE_ANDROID_OPENSSL_LIBS) + if(NOT OPENSSL_ROOT_DIR) + message(WARNING "The argument BUNDLE_ANDROID_OPENSSL_LIBS is set " + "but OPENSSL_ROOT_DIR parameter is not set.") + else() + if(EXISTS "${OPENSSL_ROOT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libcrypto_3.so") + set_property(TARGET ${name} APPEND PROPERTY QT_ANDROID_EXTRA_LIBS + "${OPENSSL_ROOT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libcrypto_3.so" + "${OPENSSL_ROOT_DIR}/${CMAKE_ANDROID_ARCH_ABI}/libssl_3.so") + else() + message(STATUS "Test should bundle OpenSSL libraries but they are not found." + " This is fine if OpenSSL was built statically.") + endif() + endif() + endif() qt_internal_android_test_arguments("${name}" test_executable extra_test_args) set(test_working_dir "${CMAKE_CURRENT_BINARY_DIR}") elseif(QNX) diff --git a/cmake/QtToolHelpers.cmake b/cmake/QtToolHelpers.cmake index 6902a1e2..db18a4db 100644 --- a/cmake/QtToolHelpers.cmake +++ b/cmake/QtToolHelpers.cmake @@ -15,6 +15,13 @@ # INSTALL_VERSIONED_LINK # Prefix build only. On installation, create a versioned hard-link of the installed file. # E.g. create a link of "bin/qmake6" to "bin/qmake". +# TRY_RUN +# On Windows, it creates a helper batch script that tests whether the tool can be executed +# successfully or not. If not, build halts and an error will be show, with tips on what +# might be cause, and how to fix it. TRY_RUN is disabled when cross-compiling. +# TRY_RUN_FLAGS +# Command line flags that are going to be passed to the tool for testing its correctness. +# If no flags were given, we default to `-v`. # # One-value Arguments: # EXTRA_CMAKE_FILES @@ -42,11 +49,13 @@ function(qt_internal_add_tool target_name) USER_FACING INSTALL_VERSIONED_LINK EXCEPTIONS - NO_UNITY_BUILD) + NO_UNITY_BUILD + TRY_RUN) set(one_value_keywords TOOLS_TARGET INSTALL_DIR CORE_LIBRARY + TRY_RUN_FLAGS ${__default_target_info_args}) set(multi_value_keywords EXTRA_CMAKE_FILES @@ -105,6 +114,7 @@ function(qt_internal_add_tool target_name) NO_INSTALL ${arg_NO_UNITY_BUILD} SOURCES ${arg_SOURCES} + NO_PCH_SOURCES ${arg_NO_PCH_SOURCES} NO_UNITY_BUILD_SOURCES ${arg_NO_UNITY_BUILD_SOURCES} INCLUDE_DIRECTORIES ${arg_INCLUDE_DIRECTORIES} @@ -224,10 +234,62 @@ function(qt_internal_add_tool target_name) qt_internal_apply_staging_prefix_build_rpath_workaround() endif() + if(arg_TRY_RUN AND WIN32 AND NOT CMAKE_CROSSCOMPILING) + if(NOT arg_TRY_RUN_FLAGS) + set(arg_TRY_RUN_FLAGS "-v") + endif() + _qt_internal_add_try_run_post_build("${target_name}" "${arg_TRY_RUN_FLAGS}") + endif() + qt_enable_separate_debug_info(${target_name} "${install_dir}" QT_EXECUTABLE) qt_internal_install_pdb_files(${target_name} "${install_dir}") endfunction() +function(_qt_internal_add_try_run_post_build target try_run_flags) + qt_internal_get_upper_case_main_cmake_configuration(main_cmake_configuration) + get_target_property(target_out_dir ${target} + RUNTIME_OUTPUT_DIRECTORY_${main_cmake_configuration}) + get_target_property(target_bin_dir ${target} + BINARY_DIR) + + set(try_run_scripts_path "${target_bin_dir}/${target}_try_run.bat") + # The only reason -h is passed is because some of the tools, e.g., moc + # wait for an input without any arguments. + + qt_configure_file(OUTPUT "${try_run_scripts_path}" + CONTENT "@echo off + +${target_out_dir}/${target}.exe ${try_run_flags} > nul 2>&1 + +if \"%errorlevel%\" == \"-1073741515\" ( +echo +echo '${target}' is built successfully, but some of the libraries +echo necessary for running it are missing. If you are building Qt with +echo 3rdparty libraries, make sure that you add their directory to the +echo PATH environment variable. +echo +exit /b %errorlevel% +) +echo. > ${target_bin_dir}/${target}_try_run_passed" + ) + + add_custom_command( + OUTPUT + ${target_bin_dir}/${target}_try_run_passed + DEPENDS + ${target} + COMMAND + ${CMAKE_COMMAND} -E env QT_COMMAND_LINE_PARSER_NO_GUI_MESSAGE_BOXES=1 + ${try_run_scripts_path} + COMMENT + "Testing ${target} by trying to run it." + VERBATIM + ) + + add_custom_target(${target}_try_run ALL + DEPENDS ${target_bin_dir}/${target}_try_run_passed) +endfunction() + function(qt_export_tools module_name) # Bail out when not building tools. if(NOT QT_WILL_BUILD_TOOLS) @@ -287,7 +349,7 @@ function(qt_export_tools module_name) string(REGEX REPLACE "_native$" "" tool_name ${tool_name}) endif() set(extra_cmake_statements "${extra_cmake_statements} -if (NOT QT_NO_CREATE_TARGETS) +if(NOT QT_NO_CREATE_TARGETS AND ${INSTALL_CMAKE_NAMESPACE}${target}_FOUND) __qt_internal_promote_target_to_global(${INSTALL_CMAKE_NAMESPACE}::${tool_name}) endif() ") diff --git a/cmake/QtToolchainHelpers.cmake b/cmake/QtToolchainHelpers.cmake index ae96c5e2..f6df13af 100644 --- a/cmake/QtToolchainHelpers.cmake +++ b/cmake/QtToolchainHelpers.cmake @@ -31,6 +31,14 @@ set(__qt_chainload_toolchain_file \"\${__qt_initially_configured_toolchain_file} list(APPEND init_platform "set(CMAKE_SYSTEM_PROCESSOR arm64 CACHE STRING \"\")") endif() + if(QT_QMAKE_TARGET_MKSPEC) + list(APPEND init_platform + "if(NOT QT_QMAKE_TARGET_MKSPEC)" + " set(QT_QMAKE_TARGET_MKSPEC ${QT_QMAKE_TARGET_MKSPEC} CACHE STRING \"\")" + "endif()" + ) + endif() + if("${QT_QMAKE_TARGET_MKSPEC}" STREQUAL "linux-g++-32" AND NOT QT_NO_AUTO_DETECT_LINUX_X86) set(__qt_toolchain_common_flags_init "-m32") @@ -121,14 +129,14 @@ set(__qt_chainload_toolchain_file \"\${__qt_initially_configured_toolchain_file} endif() if(__qt_embed_toolchain_compilers) list(APPEND init_platform " - set(__qt_initial_c_compiler \"${CMAKE_C_COMPILER}\") - set(__qt_initial_cxx_compiler \"${CMAKE_CXX_COMPILER}\") - if(NOT DEFINED CMAKE_C_COMPILER AND EXISTS \"\${__qt_initial_c_compiler}\") - set(CMAKE_C_COMPILER \"\${__qt_initial_c_compiler}\" CACHE STRING \"\") - endif() - if(NOT DEFINED CMAKE_CXX_COMPILER AND EXISTS \"\${__qt_initial_cxx_compiler}\") - set(CMAKE_CXX_COMPILER \"\${__qt_initial_cxx_compiler}\" CACHE STRING \"\") - endif()") +set(__qt_initial_c_compiler \"${CMAKE_C_COMPILER}\") +set(__qt_initial_cxx_compiler \"${CMAKE_CXX_COMPILER}\") +if(NOT DEFINED CMAKE_C_COMPILER AND EXISTS \"\${__qt_initial_c_compiler}\") + set(CMAKE_C_COMPILER \"\${__qt_initial_c_compiler}\" CACHE STRING \"\") +endif() +if(NOT DEFINED CMAKE_CXX_COMPILER AND EXISTS \"\${__qt_initial_cxx_compiler}\") + set(CMAKE_CXX_COMPILER \"\${__qt_initial_cxx_compiler}\" CACHE STRING \"\") +endif()") endif() unset(init_additional_used_variables) diff --git a/cmake/QtWriteArgsFile.cmake b/cmake/QtWriteArgsFile.cmake index aeb83bc9..77a9eb24 100644 --- a/cmake/QtWriteArgsFile.cmake +++ b/cmake/QtWriteArgsFile.cmake @@ -6,17 +6,74 @@ # This is used for writing the config.opt file. # # This script takes the following arguments: -# IN_FILE: The input file. The whole command line as one string. +# IN_FILE: The input file. The whole command line as one string, or one argument per line. +# REDO_FILE: A file containing extra commands to be joined with IN_FILE. # OUT_FILE: The output file. One argument per line. # SKIP_ARGS: Number of arguments to skip from the front of the arguments list. # IGNORE_ARGS: List of arguments to be ignored, i.e. that are not written. +# +# If the REDO_FILE is given, its parameters will be merged with IN_FILE parameters +# and be written into the OUT_FILE. cmake_minimum_required(VERSION 3.16) # Read arguments from IN_FILE and separate them. file(READ "${IN_FILE}" raw_args) +# To catch cases where the path ends with an `\`, e.g., `-prefix "C:\Path\"` +string(REPLACE "\\\"" "\"" raw_args "${raw_args}") +string(REPLACE ";" "[[;]]" raw_args "${raw_args}") + separate_arguments(args NATIVE_COMMAND "${raw_args}") +string(REPLACE "\;" ";" args "${args}") +string(REPLACE "[[;]]" "\;" args "${args}") + +if(DEFINED REDO_FILE) + file(READ "${REDO_FILE}" raw_redo_args) + separate_arguments(redo_args NATIVE_COMMAND "${raw_redo_args}") + + if(args) + list(FIND args "--" args_ddash_loc) + list(FIND redo_args "--" redo_ddash_loc) + if("${redo_ddash_loc}" STREQUAL "-1") + if("${args_ddash_loc}" STREQUAL "-1") + list(LENGTH args args_ddash_loc) + endif() + # Avoid adding an empty line for an empty -redo + if(NOT "${redo_args}" STREQUAL "") + list(INSERT args ${args_ddash_loc} "${redo_args}") + endif() + else() + # Handling redo's configure options + list(SUBLIST redo_args 0 ${redo_ddash_loc} redo_config_args) + if(redo_config_args) + if("${args_ddash_loc}" STREQUAL "-1") + list(APPEND args "${redo_config_args}") + else() + list(INSERT args ${args_ddash_loc} "${redo_config_args}") + endif() + endif() + + # Handling redo's CMake options + list(LENGTH redo_args redo_args_len) + math(EXPR redo_ddash_loc "${redo_ddash_loc} + 1") + # Catch an unlikely case of -redo being called with an empty --, ie., `-redo --` + if(NOT ${redo_ddash_loc} STREQUAL ${redo_args_len}) + list(SUBLIST redo_args ${redo_ddash_loc} -1 redo_cmake_args) + endif() + + if(DEFINED redo_cmake_args) + if("${args_ddash_loc}" STREQUAL "-1") + list(APPEND args "--") + endif() + list(APPEND args "${redo_cmake_args}") + endif() + endif() + else() + list(APPEND args "${redo_args}") + endif() +endif() + # Skip arguments if requested if(DEFINED SKIP_ARGS) foreach(i RANGE 1 ${SKIP_ARGS}) diff --git a/cmake/modulecppexports.h.in b/cmake/modulecppexports.h.in index a7a34908..538c40e5 100644 --- a/cmake/modulecppexports.h.in +++ b/cmake/modulecppexports.h.in @@ -17,22 +17,22 @@ #endif #if !defined(QT_BUILD_@module_define_infix@_LIB) && !defined(QT_STATIC) -/* outside library → inline decl + defi */ +/* outside library -> inline decl + defi */ /* static builds treat everything as part of the library, so they never inline */ # define QT_@module_define_infix@_INLINE_SINCE(major, minor) inline # define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) 1 #elif defined(QT_@module_define_infix@_BUILD_REMOVED_API) /* inside library, inside removed_api.cpp: - * keep deprecated API → non-inline decl; - * remove deprecated API → inline decl; + * keep deprecated API -> non-inline decl; + * remove deprecated API -> inline decl; * definition is always available */ # define QT_@module_define_infix@_INLINE_SINCE(major, minor) \ QT_IF_DEPRECATED_SINCE(major, minor, inline, /* not inline */) # define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) 1 #else /* inside library, outside removed_api.cpp: - * keep deprecated API → non-inline decl, no defi; - * remove deprecated API → inline decl, defi */ + * keep deprecated API -> non-inline decl, no defi; + * remove deprecated API -> inline decl, defi */ # define QT_@module_define_infix@_INLINE_SINCE(major, minor) \ QT_IF_DEPRECATED_SINCE(major, minor, inline, /* not inline */) # define QT_@module_define_infix@_INLINE_IMPL_SINCE(major, minor) \ diff --git a/coin/instructions/cmake_build_and_upload_test_artifacts_host.yaml b/coin/instructions/cmake_build_and_upload_test_artifacts_host.yaml index 3592ac42..bc16368f 100644 --- a/coin/instructions/cmake_build_and_upload_test_artifacts_host.yaml +++ b/coin/instructions/cmake_build_and_upload_test_artifacts_host.yaml @@ -13,6 +13,11 @@ instructions: variableValue: "{{.Env.COMMON_TEST_CMAKE_ARGS}}" - !include "{{qt/qtbase}}/cmake_build_and_upload_test_artifacts.yaml" disable_if: - condition: property - property: features - contains_value: DisableTests + condition: or + conditions: + - condition: property + property: features + contains_value: DisableTests + - condition: property + property: features + contains_value: DoNotBuildTests diff --git a/coin/instructions/cmake_build_and_upload_test_artifacts_target.yaml b/coin/instructions/cmake_build_and_upload_test_artifacts_target.yaml index be4db4f6..afc20b98 100644 --- a/coin/instructions/cmake_build_and_upload_test_artifacts_target.yaml +++ b/coin/instructions/cmake_build_and_upload_test_artifacts_target.yaml @@ -34,6 +34,11 @@ instructions: variableValue: "{{.Env.COMMON_TARGET_TEST_CMAKE_ARGS}}" - !include "{{qt/qtbase}}/cmake_build_and_upload_test_artifacts.yaml" disable_if: - condition: property - property: features - contains_value: DisableTests + condition: or + conditions: + - condition: property + property: features + contains_value: DisableTests + - condition: property + property: features + contains_value: DoNotBuildTests diff --git a/coin/instructions/cmake_cross_compilation_module_build_instructions.yaml b/coin/instructions/cmake_cross_compilation_module_build_instructions.yaml index 45410882..4146b11a 100644 --- a/coin/instructions/cmake_cross_compilation_module_build_instructions.yaml +++ b/coin/instructions/cmake_cross_compilation_module_build_instructions.yaml @@ -61,9 +61,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - type: EnvironmentVariable variableName: COIN_CMAKE_INSTALL_LIBEXEC_DIR variableValue: "{{.InstallDir}}{{.Env.CI_PATH_SEP}}host{{.Env.CI_PATH_SEP}}bin" @@ -73,9 +78,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - !include "{{qt/qtbase}}/call_host_install.yaml" - type: EnvironmentVariable variableName: DESTDIR @@ -123,9 +133,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - type: EnvironmentVariable variableName: COIN_CMAKE_INSTALL_LIBEXEC_DIR variableValue: "{{.InstallDir}}{{.Env.CI_PATH_SEP}}target{{.Env.CI_PATH_SEP}}bin" @@ -135,9 +150,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - !include "{{qt/qtbase}}/call_target_install.yaml" - type: EnvironmentVariable variableName: DESTDIR diff --git a/coin/instructions/cmake_cross_compilation_qtbase_build_instructions.yaml b/coin/instructions/cmake_cross_compilation_qtbase_build_instructions.yaml index 4a1ed613..909b1504 100644 --- a/coin/instructions/cmake_cross_compilation_qtbase_build_instructions.yaml +++ b/coin/instructions/cmake_cross_compilation_qtbase_build_instructions.yaml @@ -47,9 +47,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - type: EnvironmentVariable variableName: COIN_CMAKE_BUILD_LIBEXEC_DIR variableValue: "{{.BuildDir}}{{.Env.CI_PATH_SEP}}bin" @@ -59,9 +64,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - !include "{{qt/qtbase}}/call_host_install.yaml" - type: EnvironmentVariable variableName: DESTDIR @@ -124,9 +134,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - type: EnvironmentVariable variableName: COIN_CMAKE_BUILD_LIBEXEC_DIR variableValue: "{{.Env.COIN_CMAKE_BUILD_DIR}}{{.Env.CI_PATH_SEP}}bin" @@ -136,9 +151,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - !include "{{qt/qtbase}}/call_target_install.yaml" - type: EnvironmentVariable variableName: DESTDIR diff --git a/coin/instructions/cmake_qtbase_build_instructions.yaml b/coin/instructions/cmake_qtbase_build_instructions.yaml index 31766865..399ae731 100644 --- a/coin/instructions/cmake_qtbase_build_instructions.yaml +++ b/coin/instructions/cmake_qtbase_build_instructions.yaml @@ -41,9 +41,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - type: EnvironmentVariable variableName: COIN_CMAKE_BUILD_LIBEXEC_DIR variableValue: "{{.Env.COIN_CMAKE_BUILD_DIR}}{{.Env.CI_PATH_SEP}}bin" @@ -53,9 +58,14 @@ instructions: - condition: property property: host.os equals_value: Windows - - condition: property - property: target.osVersion - not_in_values: [WebAssembly, Android_ANY] + - condition: and + conditions: + - condition: property + property: target.os + not_equals_value: QNX + - condition: property + property: target.osVersion + not_in_values: [WebAssembly, Android_ANY] - !include "{{qt/qtbase}}/call_host_install.yaml" - type: EnvironmentVariable variableName: DESTDIR diff --git a/coin/instructions/prepare_building_env.yaml b/coin/instructions/prepare_building_env.yaml index f816ef56..53fc2ae6 100644 --- a/coin/instructions/prepare_building_env.yaml +++ b/coin/instructions/prepare_building_env.yaml @@ -305,6 +305,14 @@ instructions: condition: property property: target.osVersion in_values: [QEMU] + # This fixes an issue where binfmts is sometimes disabled on the test VMs + - type: ExecuteCommand + command: sudo update-binfmts --enable + userMessageOnFailure: "Failed to enable binfmts" + enable_if: + condition: property + property: target.osVersion + equals_value: QEMU # Windows on Arm, cross-compilation with MSVC - type: Group diff --git a/conanfile.py b/conanfile.py deleted file mode 100644 index 3f05ceda..00000000 --- a/conanfile.py +++ /dev/null @@ -1,300 +0,0 @@ -# Copyright (C) 2021 The Qt Company Ltd. -# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -from conans import ConanFile, tools -from conans.errors import ConanInvalidConfiguration -import os -import re -import shutil -from functools import lru_cache -from pathlib import Path -from typing import Dict, Union - - -class QtConanError(Exception): - pass - - -def add_cmake_prefix_path(conan_file: ConanFile, dep: str) -> None: - if dep not in conan_file.deps_cpp_info.deps: - raise QtConanError("Unable to find dependency: {0}".format(dep)) - dep_cpp_info = conan_file.deps_cpp_info[dep] - cmake_args_str = str(conan_file.options.get_safe("cmake_args_qtbase", default="")) - formatted_cmake_args_str = conan_file._shared.append_cmake_arg( - cmake_args_str, "CMAKE_PREFIX_PATH", dep_cpp_info.rootpath - ) - print("Adjusted cmake args for qtbase build: {0}".format(formatted_cmake_args_str)) - setattr(conan_file.options, "cmake_args_qtbase", formatted_cmake_args_str) - - -def _build_qtbase(conan_file: ConanFile): - # we call the Qt's configure(.bat) directly - script = Path("configure.bat") if tools.os_info.is_windows else Path("configure") - configure = Path(conan_file.build_folder).joinpath(script).resolve(strict=True) - - if conan_file.options.get_safe("icu", default=False): - # we need to tell Qt build system where to find the ICU - add_cmake_prefix_path(conan_file, dep="icu") - - # convert the Conan options to Qt configure(.bat) arguments - parser = conan_file._qt_option_parser - qt_configure_options = parser.convert_conan_options_to_qt_options(conan_file.options) - cmd = " ".join( - [str(configure), " ".join(qt_configure_options), "-prefix", conan_file.package_folder] - ) - cmake_args = parser.get_cmake_args_for_configure(conan_file.options) - if cmake_args: - cmd += " -- {0}".format(" ".join(cmake_args)) - conan_file.output.info("Calling: {0}".format(cmd)) - conan_file.run(cmd) - - cmd = " ".join(["cmake", "--build", ".", "--parallel"]) - conan_file.output.info("Calling: {0}".format(cmd)) - conan_file.run(cmd) - - -@lru_cache(maxsize=8) -def _parse_qt_version_by_key(key: str) -> str: - with open(Path(__file__).parent.resolve() / ".cmake.conf") as f: - m = re.search(fr'{key} .*"(.*)"', f.read()) - return m.group(1) if m else "" - - -def _get_qt_minor_version() -> str: - return ".".join(_parse_qt_version_by_key("QT_REPO_MODULE_VERSION").split(".")[:2]) - - -class QtBase(ConanFile): - name = "qtbase" - license = "LGPL-3.0, GPL-2.0+, Commercial Qt License Agreement" - author = "The Qt Company " - url = "https://code.qt.io/cgit/qt/qtbase.git" - description = "Qt6 core framework libraries and tools." - topics = ("qt", "qt6") - settings = "os", "compiler", "arch", "build_type" - _qt_option_parser = None - options = None - default_options = None - exports_sources = "*", "!conan*.*" - # use commit ID as the RREV (recipe revision) - revision_mode = "scm" - python_requires = "qt-conan-common/{0}@qt/everywhere".format(_get_qt_minor_version()) - short_paths = True - _shared = None - - def init(self): - self._shared = self.python_requires["qt-conan-common"].module - self._qt_option_parser = self._shared.QtOptionParser(Path(__file__).parent.resolve()) - self.options = self._qt_option_parser.get_qt_conan_options() - self.default_options = self._qt_option_parser.get_default_qt_conan_options() - - def set_version(self): - # Executed during "conan export" i.e. in source tree - _ver = _parse_qt_version_by_key("QT_REPO_MODULE_VERSION") - _prerelease = _parse_qt_version_by_key("QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT") - self.version = _ver + "-" + _prerelease if _prerelease else _ver - - def export(self): - self.copy("configure_options.json") - self.copy("configure_features.txt") - self.copy(".cmake.conf") - conf = self._shared.qt_sw_versions_config_folder() / self._shared.qt_sw_versions_config_name() - if not conf.exists(): - # If using "conan export" outside Qt CI provisioned machines - print("Warning: Couldn't find '{0}'. 3rd party dependencies skipped.".format(conf)) - else: - shutil.copy2(conf, self.export_folder) - - def requirements(self): - # list of tuples, (package_name, fallback version) - optional_requirements = [("icu", "56.1")] - for req_name, req_ver_fallback in optional_requirements: - if self.options.get_safe(req_name, default=False) == True: - # Note! If this conan package is being "conan export"ed outside Qt CI and the - # sw versions .ini file is not present then it will fall-back to default version - ver = self._shared.parse_qt_sw_pkg_dependency( - config_folder=Path(self.recipe_folder), - package_name=req_name, - target_os=str(self.settings.os), - ) - if not ver: - print( - "Warning: Using fallback version '{0}' for: {1}".format( - req_name, req_ver_fallback - ) - ) - ver = req_ver_fallback - requirement = "{0}/{1}@qt/everywhere".format(req_name, ver) - print("Setting 3rd party package requirement: {0}".format(requirement)) - self.requires(requirement) - - def _resolve_qt_host_path(self) -> Union[str, None]: - """ - Attempt to resolve QT_HOST_PATH. - - When cross-building the user needs to pass 'qt_host_path' which is transformed to - QT_HOST_PATH later on. Resolve the exact path if possible. - - Returns: - string: The resolved QT_HOST_PATH or None if unable to determine it. - """ - _host_p = self.options.get_safe("qt_host_path") - if _host_p: - return str(Path(os.path.expandvars(str(_host_p))).expanduser().resolve(strict=True)) - else: - print("Warning: 'qt_host_path' option was not given in cross-build context") - return None - - def configure(self): - if self.settings.compiler == "gcc" and tools.Version(self.settings.compiler.version) < "8": - raise ConanInvalidConfiguration("Qt6 does not support GCC before 8") - - def _set_default_if_not_set(option_name: str, option_value: bool) -> None: - # let it fail if option name does not exist, it means the recipe is not up to date - if self.options.get_safe(option_name) in [None, "None"]: - setattr(self.options, option_name, option_value) - - def _set_build_type(build_type: str) -> None: - if self.settings.build_type != build_type: - msg = ( - "The build_type '{0}' changed to '{1}'. Please check your Settings and " - "Options. The used Qt options enforce '{2}' as a build_type. ".format( - self.settings.build_type, build_type, build_type - ) - ) - raise QtConanError(msg) - self.settings.build_type = build_type - - def _check_mutually_exclusive_options(options: Dict[str, bool]) -> None: - if list(options.values()).count(True) > 1: - raise QtConanError( - "These Qt options are mutually exclusive: {0}" - ". Choose only one of them and try again.".format(list(options.keys())) - ) - - default_options = ["shared", "gui", "widgets", "accessibility", "system_proxies", "ico"] - - if self.settings.os == "Macos": - default_options.append("framework") - - for item in default_options: - _set_default_if_not_set(item, True) - - release = self.options.get_safe("release", default=False) - debug = self.options.get_safe("debug", default=False) - debug_and_release = self.options.get_safe("debug_and_release", default=False) - force_debug_info = self.options.get_safe("force_debug_info", default=False) - optimize_size = self.options.get_safe("optimize_size", default=False) - - # these options are mutually exclusive options so do a sanity check - _check_mutually_exclusive_options( - {"release": release, "debug": debug, "debug_and_release": debug_and_release} - ) - - # Prioritize Qt's configure options over Settings.build_type - if debug_and_release == True: - # Qt build system will build both debug and release binaries - if force_debug_info == True: - _set_build_type("RelWithDebInfo") - else: - _set_build_type("Release") - elif release == True: - _check_mutually_exclusive_options( - {"force_debug_info": force_debug_info, "optimize_size": optimize_size} - ) - if force_debug_info == True: - _set_build_type("RelWithDebInfo") - elif optimize_size == True: - _set_build_type("MinSizeRel") - else: - _set_build_type("Release") - elif debug == True: - _set_build_type("Debug") - else: - # As a fallback set the build type for Qt configure based on the 'build_type' - # defined in the conan build settings - build_type = self.settings.get_safe("build_type") - if build_type in [None, "None"]: - # set default that mirror the configure(.bat) default values - self.options.release = True - self.settings.build_type = "Release" - elif build_type == "Release": - self.options.release = True - elif build_type == "Debug": - self.options.debug = True - elif build_type == "RelWithDebInfo": - self.options.release = True - self.options.force_debug_info = True - elif build_type == "MinSizeRel": - self.options.release = True - self.options.optimize_size = True - else: - raise QtConanError("Unknown build_type: {0}".format(self.settings.build_type)) - - if self.settings.os == "Android": - if self.options.get_safe("android_sdk_version") == None: - cmake_args_qtbase = str(self.options.get_safe("cmake_args_qtbase")) - sdk_ver = self._shared.parse_android_sdk_version(cmake_args_qtbase) - if sdk_ver: - print("'android_sdk_version' not given. Deduced version: {0}".format(sdk_ver)) - self.options.android_sdk_version = sdk_ver - else: - # TODO, for now we have no clean means to query the Android SDK version from - # Qt build system so we just exclude the "android_sdk" from the package_id. - print("Can't deduce 'android_sdk_version'. Excluding it from 'package_id'") - delattr(self.info.options, "android_sdk_version") - if self.options.get_safe("android_ndk_version") == None: - ndk_ver = str(self.options.get_safe("android_ndk")) - ndk_ver = self._shared.parse_android_ndk_version(Path(ndk_ver, strict=True)) - print("'android_ndk_version' not given. Deduced version: {0}".format(ndk_ver)) - self.options.android_ndk_version = ndk_ver - - def build(self): - self._shared.build_env_wrap(self, _build_qtbase) - - def package(self): - self._shared.call_install(self) - - def package_info(self): - self._shared.package_info(self) - if tools.cross_building(conanfile=self): - qt_host_path = self._resolve_qt_host_path() - if qt_host_path: - self.env_info.QT_HOST_PATH.append(qt_host_path) - - def package_id(self): - # https://docs.conan.io/en/latest/creating_packages/define_abi_compatibility.html - - # The package_revision_mode() is too strict for Qt CI. This mode includes artifacts - # checksum in package_id which is problematic in Qt CI re-runs (re-run flaky - # build) which contain different build timestamps (cmake) which end up in library - # files -> different package_id. - self.info.requires.recipe_revision_mode() - - # Enable 'qt-conan-common' updates on client side with $conan install .. --update - self.info.python_requires.recipe_revision_mode() - - # Remove those configure(.bat) options which should not affect package_id. - # These point to local file system paths and in order to re-use pre-built - # binaries (by Qt CI) by others these should not affect the 'package_id' - # as those probably differ on each machine - rm_list = [ - "sdk", - "qpa", - "translationsdir", - "headersclean", - "qt_host_path", - "android_sdk", - "android_ndk", - ] - for item in rm_list: - if item in self.info.options: - delattr(self.info.options, item) - # filter also those cmake options that should not end up in the package_id - if hasattr(self.info.options, "cmake_args_qtbase"): - _filter = self._shared.filter_cmake_args_for_package_id - self.info.options.cmake_args_qtbase = _filter(self.info.options.cmake_args_qtbase) - - def deploy(self): - self.copy("*") # copy from current package - self.copy_deps("*") # copy from dependencies diff --git a/configure b/configure index a2b67a1d..e57707dc 100644 --- a/configure +++ b/configure @@ -8,14 +8,18 @@ #------------------------------------------------------------------------------- # the directory of this script is the "source tree" -relpath=`dirname $0` +relpath=`dirname "$0"` relpath=`(cd "$relpath"; /bin/pwd)` # the current directory is the "build tree" or "object tree" outpath=`/bin/pwd` +outpathPrefix=$outpath # do this early so we don't store it in config.status CFG_TOPLEVEL= -outpathPrefix= + +SAVED_IFS=$IFS +IFS=' +' checkTopLevelBuild() { @@ -23,7 +27,7 @@ checkTopLevelBuild() if [ x"$1" = x"-top-level" ]; then CFG_TOPLEVEL=yes relpathMangled=`dirname "$relpath"` - outpathPrefix=../ + outpathPrefix="$outpathPrefix/.." else if [ -f ../.qmake.super ]; then echo >&2 "ERROR: You cannot configure qtbase separately within a top-level build." @@ -35,41 +39,26 @@ checkTopLevelBuild() OPT_CMDLINE= # expanded version for the script determineOptFilePath() { +> "${outpathPrefix}/config.redo.in" set -f # suppress globbing in for loop -SAVED_IFS=$IFS -IFS=' -' for i in "$@"; do if [ x"$i" = x"-top-level" ]; then continue fi case $i in -redo|--redo) - optfile=${outpathPrefix}config.opt - if test -n "$CFG_TOPLEVEL" && ! test -f $optfile; then - optfile=config.opt - fi - if ! test -f $optfile; then + optfile=${outpathPrefix}/config.opt + if ! test -f "$optfile"; then echo >&2 "No config.opt present - cannot redo configuration." exit 1 fi - for a in `cat $optfile`; do - OPT_CMDLINE="$OPT_CMDLINE -$a" - done ;; *) - OPT_CMDLINE="$OPT_CMDLINE -$i" + # If redo-ing, write the rest of parameters into the config.redo.in file + echo \"$i\" >> "${outpathPrefix}/config.redo.in" ;; esac done -set -- -for i in $OPT_CMDLINE; do - set -- "$@" "$i" -done -set +f -IFS=$SAVED_IFS } #------------------------------------------------------------------------------- @@ -88,80 +77,10 @@ while [ "$#" -gt 0 ]; do CURRENT_OPT="$1" case "$1" in #Autoconf style options - --enable-*) - VAR=`echo $1 | sed 's,^--enable-\(.*\),\1,'` - VAL=yes - ;; - --disable-*) - VAR=`echo $1 | sed 's,^--disable-\(.*\),\1,'` - VAL=no - ;; - --*=*) - VAR=`echo $1 | sed 's,^--\(.*\)=.*,\1,'` - VAL=`echo $1 | sed 's,^--.*=\(.*\),\1,'` - ;; - --no-*) - VAR=`echo $1 | sed 's,^--no-\(.*\),\1,'` - VAL=no - ;; --*) VAR=`echo $1 | sed 's,^--\(.*\),\1,'` VAL=yes ;; - #Qt plugin options - -no-*-*|-plugin-*-*|-qt-*-*) - VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'` - VAL=`echo $1 | sed 's,^-\([^-]*\).*,\1,'` - ;; - #Qt style no options - -no-*) - VAR=`echo $1 | sed 's,^-no-\(.*\),\1,'` - VAL=no - ;; - #Qt style options that pass an argument - -prefix| \ - -docdir| \ - -headerdir| \ - -plugindir| \ - -qmldir| \ - -archdatadir| \ - -datadir| \ - -libdir| \ - -bindir| \ - -libexecdir| \ - -translationdir| \ - -sysconfdir| \ - -examplesdir| \ - -testsdir| \ - -hostdatadir| \ - -extprefix| \ - -sysroot| \ - -make| \ - -nomake| \ - -skip| \ - -platform| \ - -xplatform| \ - -device| \ - -device-option| \ - -sdk| \ - -android-sdk| \ - -android-ndk| \ - -android-ndk-platform| \ - -android-arch) - VAR=`echo $1 | sed 's,^-\(.*\),\1,'` - shift - VAL="$1" - ;; - #Qt style complex options in one command - -enable-*|-disable-*) - VAR=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'` - VAL=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'` - ;; - #Qt Builtin/System style options - -no-*|-system-*|-qt-*) - VAR=`echo $1 | sed 's,^-[^-]*-\(.*\),\1,'` - VAL=`echo $1 | sed 's,^-\([^-]*\)-.*,\1,'` - ;; #General options, including Qt style yes options -*) VAR=`echo $1 | sed 's,^-\(.*\),\1,'` @@ -176,24 +95,16 @@ while [ "$#" -gt 0 ]; do shift - UNKNOWN_OPT=no case "$VAR" in h|help) if [ "$VAL" = "yes" ]; then OPT_HELP="$VAL" - else - UNKNOWN_OPT=yes fi ;; *) ;; esac - if [ "$UNKNOWN_OPT" = "yes" ]; then - echo "${CURRENT_OPT}: invalid command-line switch" - ERROR=yes - fi done -[ "x$ERROR" = "xyes" ] && exit 1 } #------------------------------------------------------------------------------- @@ -222,18 +133,27 @@ parseCommandline "$@" handleHelp determineOptFilePath "$@" +optfilepath=${outpathPrefix}/config.opt +opttmpfilepath=${outpathPrefix}/config.opt.in + +redofilepath=${outpathPrefix}/config.redo +redotmpfilepath=${outpathPrefix}/config.redo.in + fresh_requested_arg= -optfilename=config.opt if [ -z "$optfile" ]; then # only write optfile if not currently redoing - optfilepath=${outpathPrefix}${optfilename} - > "$optfilepath" - for arg in "$@"; do - if [ "$arg" = "-top-level" ]; then - continue - fi - echo $arg >> "$optfilepath" - done + > "$opttmpfilepath" + > "$redotmpfilepath" + + for arg in "$@"; do echo \"$arg\" >> "$opttmpfilepath"; done + + cmake -DIN_FILE="${opttmpfilepath}" -DOUT_FILE="${optfilepath}" -DIGNORE_ARGS=-top-level -P "${relpath}/cmake/QtWriteArgsFile.cmake" else + # Rewriting config.opt into config.opt.in anyway. Allows for direct manipulation of config.opt + > "$opttmpfilepath" + for arg in `cat $optfile`; do echo \"$arg\" >> "$opttmpfilepath"; done + + cmake -DIN_FILE="${opttmpfilepath}" -DREDO_FILE="${redotmpfilepath}" -DOUT_FILE="${redofilepath}" -DIGNORE_ARGS=-top-level -P "${relpath}/cmake/QtWriteArgsFile.cmake" + optfilepath=${redofilepath} fresh_requested_arg=-DFRESH_REQUESTED=TRUE fi @@ -243,4 +163,6 @@ if [ -n "$CFG_TOPLEVEL" ]; then cd .. fi -cmake "-DOPTFILE=$optfilename" $top_level_arg $fresh_requested_arg -P "$relpath/cmake/QtProcessConfigureArgs.cmake" +cmake "-DOPTFILE=${optfilepath}" ${top_level_arg} ${fresh_requested_arg} -P "${relpath}/cmake/QtProcessConfigureArgs.cmake" + +IFS=$SAVED_IFS diff --git a/configure.bat b/configure.bat index e93e0af3..1da3740a 100644 --- a/configure.bat +++ b/configure.bat @@ -65,9 +65,8 @@ goto doneargs :redo if not exist "%TOPQTDIR%\config.opt" goto redoerr - set rargs= - for /f "usebackq delims=" %%i in ("%TOPQTDIR%\config.opt") do set rargs=!rargs! "%%i" - call :doargs %rargs% + echo %ARGS% > %TOPQTDIR%\config.redo.in + set redoing="" goto nextarg :redoerr echo No config.opt present - cannot redo configuration. >&2 @@ -78,15 +77,26 @@ goto doneargs cd "%TOPQTDIR%" rem Write config.opt if we're not currently -redo'ing +set OPT_FILE_PATH=%TOPQTDIR%\config.opt +set OPT_TMP_FILE_PATH=%TOPQTDIR%\config.opt.in +set REDO_FILE_PATH=%TOPQTDIR%\config.redo +set REDO_TMP_FILE_PATH=%TOPQTDIR%\config.redo.in set FRESH_REQUESTED_ARG= -if "!rargs!" == "" ( - echo.%*>config.opt.in - cmake -DIN_FILE=config.opt.in -DOUT_FILE=config.opt -DIGNORE_ARGS=-top-level -P "%QTSRC%\cmake\QtWriteArgsFile.cmake" -) else if NOT "!rargs!" == "" ( +if not defined redoing ( + echo.%*>"%OPT_TMP_FILE_PATH%" + + cmake -DIN_FILE="%OPT_TMP_FILE_PATH%" -DOUT_FILE="%OPT_FILE_PATH%" -DIGNORE_ARGS=-top-level -P "%QTSRC%\cmake\QtWriteArgsFile.cmake" +) else ( + echo. 2> "%OPT_TMP_FILE_PATH%" + for /F "usebackq tokens=*" %%A in ("%OPT_FILE_PATH%") do echo "%%A" >> "%OPT_TMP_FILE_PATH%" + + cmake -DIN_FILE="%OPT_TMP_FILE_PATH%" -DREDO_FILE="%REDO_TMP_FILE_PATH%" -DOUT_FILE="%REDO_FILE_PATH%" -DIGNORE_ARGS="-top-level;-redo;--redo" -P "%QTSRC%\cmake\QtWriteArgsFile.cmake" + + set OPT_FILE_PATH=%REDO_FILE_PATH% set FRESH_REQUESTED_ARG=-DFRESH_REQUESTED=TRUE ) rem Launch CMake-based configure set TOP_LEVEL_ARG= if %TOPLEVEL% == true set TOP_LEVEL_ARG=-DTOP_LEVEL=TRUE -cmake -DOPTFILE=config.opt %TOP_LEVEL_ARG% %FRESH_REQUESTED_ARG% -P "%QTSRC%\cmake\QtProcessConfigureArgs.cmake" +cmake -DOPTFILE="%OPT_FILE_PATH%" %TOP_LEVEL_ARG% %FRESH_REQUESTED_ARG% -P "%QTSRC%\cmake\QtProcessConfigureArgs.cmake" diff --git a/configure.cmake b/configure.cmake index 450cadfe..be1a4f3b 100644 --- a/configure.cmake +++ b/configure.cmake @@ -22,6 +22,7 @@ qt_find_package(WrapOpenSSLHeaders PROVIDED_TARGETS WrapOpenSSLHeaders::WrapOpen # openssl_headers # OPENSSL_VERSION_MAJOR is not defined for OpenSSL 1.1.1 qt_config_compile_test(opensslv11_headers + LABEL "opensslv11_headers" LIBRARIES WrapOpenSSLHeaders::WrapOpenSSLHeaders CODE @@ -46,6 +47,7 @@ qt_find_package(WrapOpenSSL PROVIDED_TARGETS WrapOpenSSL::WrapOpenSSL MODULE_NAM # openssl # OPENSSL_VERSION_MAJOR is not defined for OpenSSL 1.1.1 qt_config_compile_test(opensslv11 + LABEL "opensslv11" LIBRARIES WrapOpenSSL::WrapOpenSSL CODE @@ -70,6 +72,7 @@ SSL_free(SSL_new(0)); # opensslv30 # openssl_headers qt_config_compile_test(opensslv30_headers + LABEL "opensslv30_headers" LIBRARIES WrapOpenSSLHeaders::WrapOpenSSLHeaders CODE @@ -87,6 +90,7 @@ int main(void) } ") qt_config_compile_test(opensslv30 + LABEL "opensslv30" LIBRARIES WrapOpenSSL::WrapOpenSSL CODE @@ -331,11 +335,13 @@ int main(void) "# FIXME: qmake: ['TEMPLATE = lib', 'CONFIG += dll bsymbolic_functions', 'isEmpty(QMAKE_LFLAGS_BSYMBOLIC_FUNC): error("Nope")'] ) +if(NOT MSVC AND NOT APPLE) + qt_config_compile_test("separate_debug_info" + LABEL "separate debug information support" + PROJECT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/config.tests/separate_debug_info" + ) +endif() -qt_config_compile_test("separate_debug_info" - LABEL "separate debug information support" - PROJECT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/config.tests/separate_debug_info" -) # signaling_nan qt_config_compile_test(signaling_nan LABEL "Signaling NaN for doubles" @@ -535,7 +541,7 @@ qt_feature("developer-build" PRIVATE LABEL "Developer build" AUTODETECT OFF ) -qt_feature("no-prefix" PRIVATE +qt_feature("no-prefix" LABEL "No prefix build" AUTODETECT NOT QT_WILL_INSTALL CONDITION NOT QT_WILL_INSTALL @@ -567,7 +573,7 @@ qt_feature_config("force_debug_info" QMAKE_PRIVATE_CONFIG) qt_feature("separate_debug_info" PUBLIC LABEL "Split off debug information" AUTODETECT OFF - CONDITION ( QT_FEATURE_shared ) AND ( QT_FEATURE_debug OR QT_FEATURE_debug_and_release OR QT_FEATURE_force_debug_info ) AND ( APPLE OR TEST_separate_debug_info ) + CONDITION ( QT_FEATURE_shared ) AND ( QT_FEATURE_debug OR QT_FEATURE_debug_and_release OR QT_FEATURE_force_debug_info ) AND ( MSVC OR APPLE OR TEST_separate_debug_info ) ) qt_feature_config("separate_debug_info" QMAKE_PUBLIC_QT_CONFIG) qt_feature("appstore-compliant" PUBLIC @@ -1157,6 +1163,18 @@ qt_configure_add_summary_entry( ARGS "ccache" CONDITION UNIX ) +qt_configure_add_summary_entry( + TYPE "message" ARGS "Unity Build" MESSAGE "yes" CONDITION QT_UNITY_BUILD +) +qt_configure_add_summary_entry( + TYPE "message" ARGS "Unity Build" MESSAGE "no" CONDITION NOT QT_UNITY_BUILD +) +qt_configure_add_summary_entry( + TYPE "message" + ARGS "Unity Build Batch Size" + MESSAGE "${QT_UNITY_BUILD_BATCH_SIZE}" + CONDITION QT_UNITY_BUILD +) qt_configure_add_summary_entry( TYPE "firstAvailableFeature" ARGS "use_bfd_linker use_gold_linker use_lld_linker use_mold_linker" @@ -1326,3 +1344,11 @@ qt_extra_definition("QT_VERSION_PATCH" ${PROJECT_VERSION_PATCH} PUBLIC) qt_extra_definition("QT_COPYRIGHT" \"${QT_COPYRIGHT}\" PRIVATE) qt_extra_definition("QT_COPYRIGHT_YEAR" \"${QT_COPYRIGHT_YEAR}\" PRIVATE) + +qt_configure_add_report_entry( + TYPE WARNING + MESSAGE "QT_ALLOW_SYMLINK_IN_PATHS is enabled. This is not recommended, and it may lead to unexpected issues. +E.g., When building QtWebEngine, enabling this option may result in build issues in certain platforms. +See https://bugreports.qt.io/browse/QTBUG-59769." + CONDITION QT_ALLOW_SYMLINK_IN_PATHS +) diff --git a/doc/config/exampleurl-qtpositioning.qdocconf b/doc/config/exampleurl-qtpositioning.qdocconf new file mode 100644 index 00000000..f8fd478e --- /dev/null +++ b/doc/config/exampleurl-qtpositioning.qdocconf @@ -0,0 +1 @@ +url.examples = "https://code.qt.io/cgit/qt/qtpositioning.git/tree/examples/\1?h=$QT_VER" diff --git a/doc/global/config.qdocconf b/doc/global/config.qdocconf index 59f95cf8..cd4f51fd 100644 --- a/doc/global/config.qdocconf +++ b/doc/global/config.qdocconf @@ -29,6 +29,5 @@ url = https://doc.qt.io/qt defines += qt6 -# Uncomment the following two lines to generate documentation marked as \internal -# alias.internal = disable -# macro.internal.HTML = "[internal]" +# Require Qt modules to define qhp.projects +qhp = true diff --git a/doc/global/html-header-offline.qdocconf b/doc/global/html-header-offline.qdocconf index 4b87e3c7..ffce22ee 100644 --- a/doc/global/html-header-offline.qdocconf +++ b/doc/global/html-header-offline.qdocconf @@ -2,11 +2,13 @@ #specify the CSS file used by this template HTML.stylesheets = template/style/offline.css \ - template/style/offline-dark.css + template/style/offline-dark.css \ + template/style/tech_preview.svg #for including files into the qch file qhp.extraFiles += style/offline.css \ - style/offline-dark.css + style/offline-dark.css \ + style/tech_preview.svg HTML.headerstyles = \ " \n" diff --git a/doc/global/html-header-online.qdocconf b/doc/global/html-header-online.qdocconf index d674e76b..8d258c2a 100644 --- a/doc/global/html-header-online.qdocconf +++ b/doc/global/html-header-online.qdocconf @@ -11,8 +11,10 @@ HTML.stylesheets = template/style/online.css \ template/style/icomoon.woff \ template/style/cookiebar-x.png \ template/style/doc_search.png \ + template/style/tech_preview.svg \ template/style/theqtcompany.png + #for including files into the qch file. Relative to the outputdir of a QDoc build. qhp.extraFiles += style/online.css \ style/cookie-confirm.css \ @@ -25,6 +27,7 @@ qhp.extraFiles += style/online.css \ style/icomoon.woff \ style/cookiebar-x.png \ style/doc_search.png \ + style/tech_preview.svg \ style/theqtcompany.png HTML.headerstyles = \ diff --git a/doc/global/macros.qdocconf b/doc/global/macros.qdocconf index 6c64abee..5a7b826f 100644 --- a/doc/global/macros.qdocconf +++ b/doc/global/macros.qdocconf @@ -56,6 +56,19 @@ macro.endqdoc.HTML = "*/" macro.borderedimage = "\\div {class=\"border\"} \\image \1\n\\enddiv" macro.examplecategory = "\\meta category {\1}\n\\ingroup category \1" +macro.QDS = "Qt Design Studio" +macro.QDV = "Qt Design Viewer" +macro.QB = "Qt Bridge" +macro.QBPS = "Qt Bridge for Adobe Photoshop" +macro.QBXD = "Qt Bridge for Adobe XD" +macro.QBSK = "Qt Bridge for Sketch" +macro.QBF = "Qt Bridge for Figma" +macro.QMCU = "Qt for MCUs" +macro.QUL = "Qt Quick Ultralite" +macro.QtAA = "Qt for Android Automotive" +macro.QOI = "Qt Online Installer" +macro.QMT = "Qt Maintenance Tool" + macro.beginfloatleft.HTML = "
" macro.beginfloatright.HTML = "
" macro.endfloat.HTML = "
" @@ -111,3 +124,8 @@ macro.cmakepropertywebassemblyonly = "\\note This property is used only if targe macro.cmakepropertyiosonly = "\\note This property is used only if targeting iOS." macro.cmakevariableiosonly = "\\note This variable is used only if targeting iOS." + +#Appends the tech preview link to the brief sentence and adds to tech_preview +#group. +#Must be placed directly under a \brief command +macro.techpreview = "(Technical preview)\n\n\\meta status {Technical preview}\n\\ingroup tech_preview\n" diff --git a/doc/global/manifest-meta.qdocconf b/doc/global/manifest-meta.qdocconf index bc8e66f5..6c7ffd86 100644 --- a/doc/global/manifest-meta.qdocconf +++ b/doc/global/manifest-meta.qdocconf @@ -94,7 +94,6 @@ manifestmeta.android.names = "Qt3D/Qt 3D: Basic Shapes C++ Example" \ "QtQuickControls/Qt Quick Controls - Flat Style" \ "QtQuickControls/Qt Quick Controls - Gallery" \ "QtQuickControls/Qt Quick Controls - Imagine Style Example: Automotive" \ - "QtQuickControls/Qt Quick Controls - Imagine Style Example: Music Player" \ "QtQuickControls/Qt Quick Controls - Side Panel" \ "QtQuickControls/Qt Quick Controls - Swipe to Remove" \ "QtQuickControls/Qt Quick Controls - Text Editor" \ @@ -166,7 +165,6 @@ manifestmeta.ios.names = "QtCore/Contiguous Cache Example" \ "QtWidgets/Easing Curves Example" \ "QtWidgets/Move Blocks Example" \ "QtWidgets/States Example" \ - "QtWidgets/Class Wizard Example" \ "QtWidgets/Find Files Example" \ "QtWidgets/License Wizard Example" \ "QtWidgets/Standard Dialogs Example" \ diff --git a/doc/global/template/style/offline.css b/doc/global/template/style/offline.css index 9f0cc8cd..d3846597 100644 --- a/doc/global/template/style/offline.css +++ b/doc/global/template/style/offline.css @@ -574,6 +574,20 @@ ol.I > li { padding: 3px 15px 3px 0 } +span.status.technical-preview { + display: inline-block; + position: relative; + background: center/contain no-repeat url(tech_preview.svg); + width: 26px; + height: 23px; +} + +td.memItemRight span.status { + margin-top: -10px; + right: -10px; + top: 6px; +} + .qml { display: block; margin: 10px; diff --git a/doc/global/template/style/online.css b/doc/global/template/style/online.css index 33487355..4f51864d 100644 --- a/doc/global/template/style/online.css +++ b/doc/global/template/style/online.css @@ -505,6 +505,18 @@ h1,h2,h3,h4,h5,h6 { font-size:150%; margin-bottom: 1em } +span.status.technical-preview { + display:inline-block; + position:relative; + background:center/contain no-repeat url(tech_preview.svg); + width:26px; + height:23px +} +td.memItemRight span.status { + margin-top:-10px; + right:-10px; + top:6px +} article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section { display:block } diff --git a/doc/global/template/style/tech_preview.svg b/doc/global/template/style/tech_preview.svg new file mode 100644 index 00000000..54ce08dd --- /dev/null +++ b/doc/global/template/style/tech_preview.svg @@ -0,0 +1 @@ + diff --git a/doc/src/images/application-menus.png b/doc/src/images/application-menus.png deleted file mode 100644 index 44ac9ca75f38cdf7ad3ce9f6b94a382a3890196f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30529 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

e-}^+* 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 XtOY(bp8n(EZx46^SM24O5A!ekv= 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 diff --git a/doc/src/images/screenshot-example.png b/doc/src/images/screenshot-example.png index 86894867c379ff4767acc1e53e985801ab083b4a..6bbad985f31bb3739eaa356aa5cbd512efb74dc8 100644 GIT binary patch literal 227655 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 uVPP zsIb>&1Dk_V`@}8liG)3XINtNISk0}(;ZaV-`+)<3k!v9z)+~nPmJdy$V`v#k6ZWW3 z^0OGLd+3`9Gih)MJsuG}4x`-S?j*=2JDYUDXN3ChGyD=M7=og+56PyAwSb9WR&oGQDHCo5U_+APPbKD_x}AU zrZ`WNQFxUp;oIjfj9bYVVp1Q!{AyX6VM!#Rc36`D#v9j4*pR{D>)hY=HL%_oTcLqT zX8BoQ>BNv|sr`9N=;d7K9&TVOa*|Y{U6Pf0t0pQ>m`(7E)Yo52%7?5?%E49O>4n<} zP3b$2m#;CYbIDC-wij#ACY)s0(d+;>^#6S4pzia9Hp>jPVxloGX6aOp;d3vU!zbuxd7gPNh)#G z`*nIY0-+aV0p;d3n6v5a^E9}<6I^C)_G)ELRQQAS2d?_PxAFE{QCcR4PdRm;MLAJD zV6!nnrZ68?5Yv#}HOaJnQCZs583+jdffxFe(jfzge)ofKO{tUqJGZO#qcIX=Q+3m7 zn3AJVa9G~T?lH4}tlptjVZyWBn)lwo&t;#yPsydMmAGW&%u^Po%OwWTiI12qK&f@c zm*5)Xp^vIdtb+u>X468VhK;v~0~v**`_ z8_f(vwoHSiMoz{Jm{;)F9etd*aMP#mv$SF*ZAjf+z*rn~yO0nzu2KCW4TbO^!PF0R zM*S7f*`yPg=uw>_gHN_Zy3Iq$8G_E(DsI96{l>$l#Pewqk+F<)Dps^x!q-9hG?J_Q ze@qd?e&iU`>u$Wo|2L0J4lmws!XjJA!D}=Z?%ngA1Hv~y3A!z;m+v9FLss7vKE01K zO4wp4vL55mv38@!Qztr`!o%!-+1Pw}=jQVrds`A;_BRC^<3iY=WqPx#b8<<=d=6k}&1&!eSy zYAO?aT^DcK0M_G?A5yv@QG>eNAnA>$O4&`6xSQKcdaOq1ar892D)9WsX?hoa?d=c<8HBX|WrRM--MEPG=4Yj^wN!Do^9N~vfZlY+15_a?eu@oeo_ z(K;a0oI=`8GeCe?au5Ft_5TM3xqUkuj*&A%It@Td5yjjPQPdeuyPyoO>B1uAI?oY= zxKr6*<7)EPDk5y-&Ag8R&Ku`tL3}_2S)F}(Ih2%PWk(Uj>X^84O9s&rd9@L~eUQ;q zvjJ$HGP+)=-`*BK->N(Uitj^rQqNdj7RAV=4?Jv!)ZX+>*HORh<=ccRPY)~V5f{k= zmFIsjC94Ay3)Ka$Ceeg1rY$s)UkN^BYTQ+SWD#v&$&fiS!#&9NBJo)##E(D^`1viR zWNvdZk3P1LA61QvxLzQGG;JYeKp=Q^u>Z zwy5Mawq22}uFxBv99MHWo0I?Q;kX8-B%85-as-NO>N5QgY79I12Q?Ps z#7Zs_GkGsEvysaMtfTmcAHyZk0S_T!m^EgQNC3{C98@eek|Ym0G?%`R$K9d@OBcdp zz$VPK3zUTP-WbVdBs4sn$Tn*6KdA9jub@ReY{NsFs91hlS*WrZTi<+Ug9&ymOgTIT z%lHRY?M?zo`}KsAGWsT#MADdTB|Hf9NqL<(c(#C#vrb}*EeH7bL(ghoYX+EE_p|vULSGhoET5; zDS@+SPE2k(>2*1svy**wwaq8&eJd7e$NVca)~hMdTMMm4t7}kq@3~SW8_g<+XlwR? z^3&ju1)ivev4CucC-W1cdSM8)7)m3K1(yAFkpvmnRQqDPs*JZ_Yx?IiAQ=JStN@+% z-CMFyG_Be*LbuPYE@OE=4S)p8pY{kz5?IhnX%0PMtL#c5Q(12Re2-?YeOx>af56Xxvn_@hu~+cu5|+AL^y_;b>w9HX$(w0+0>mo(Wd0+@fWH$u%?T03o?hDv+P|1Bc_&=YJm`n#z`1}D##oTc z)5ugIgE%=(ehjDa2qr$(Dn`ky9jMFv0gA6{vCD0_>3WK*#s4RGVz{Z#04|89IItjj z&W=Gxm%?S?KkapZ2lMXg)MJ7IYk8_R#X^TDoCj)ZMt~_)i92xQ>4Apv*3sgd`mym1 zoxn>|-;3=@8P#qgVGt$nJ;I3OO4=R&vS(-7BV5ub(a>#Xdg18BGP}X2)MN2r_d(as zE}b4L6v@9vvYbUFj=l60x;EORR?D=?pBUcM_Ba&H7Num!UX$SbP03+9u(Sh6%Xgdh z{jMIB-BSQw`jt<0PsJ*CY&avVh<#WGKv$q%-Pd=D1U;Kh+&hY@#1!b?TicCCW&#hU1WF3U$r0%+evJ2D zWySHq;#c#yX~NxjN0G#Ve31PfnL#kdANRXmI~WwQStRNP#53Y?24X+P^Pa~OLEHdd zqhHtw3SDaC3e%|~v(wjC|Nrs9;LvOP`2V(7JzDCC0c4?6g6j{hc|Mn}R-x+k7|Cf* zRAxB(DqZuxjW*X!JiP==e{0?o*2At=l48OQN8jtq^KLP&Gn9LWiKlK`jEE#DG9oa( zHMvY$Avxw2TY<6K+z6i!uC<14VLga23`eCGF}O=#CFgw~2cr558NKB~$4};Go{aho zgG~0mL~An7erQ@to<35{C+l@2*HJH#NcB`r1H=y15ElyH@u1v(zSIqi_D@=q3r4F&deBs^q zXzIkFs(q0+*;ApEi^739eNe+5u?DiaS{s2g#gv>V_3On}d`-#sRJxD^X^&`EV&ZLKTnYBG+(7 z5rB`>?oD35o^e-!=F%j(B@N#wiH}z00DqV7R?51Qy1i40-J^KDBdVI<+KcvSxXmF$ zfJg~e|L!tbANUY&$%<7`VjYdH13lk0Eh@Uhef_vqDg3$UP9If0@kX>d*D_9+Ce}-n z=cU|+y;%PZutwdAH1}ns{m_?I@#ed9xn4YUTn_EOcYg!j7WbgOm2Ffo*Z$dJ?azSE z!u#VD4i{U|I@8vJfkQakaFW*A@P^y)ibjxZ9Zjf{WcMIkKxVI%@ER3PZiW9>>YEL| zI{SvY({L7URkgP>Wn9)Vu3MD3l?#aO@T9_3pz1s%b9<$ zoBut;D~gBIf<^#Pw7&MTw;x`~GCK#orNT#%1rHL0aDnfTDyPv_Fd@oXIb#*W`VI8` z9sth}(O_8dmF$lMVKH1|EWSU`0D8cUR0DP2e0oPfRVNQx!?LJq8ghjh1Hu-5fu31Iqo5P zdbJQ<4%6(>EYlk5Rvz&9(q$iG#l-ePT0{z=03%OomjD{+jlWg>QQI(PPuHqcsXhUm z%5|(NA}Ak2ScU(VW2)j+!7d)#RIoFR$fJIb!G0&-?0fJSR&z(j`dpchtdK&tFnmJ( z#f&J%ip((*WU;V7W8jfmVhhjsypEqc_SL zw0^hr&ZF1=o}?J^qpQ}Po;Z}>T@w`rqLZCRV1R%3s^pDn(zx{?Wcs$5BHwEKIxq_) z9mI&d6`&EY%D$CsHvnZ?FQQZ39@4|bT83+FkKLP!p=5)#qMbj{^l%L?1)J@L-T-r; z2ypB@T2cFMbR^`ll`56D>o)>$5cEx?vGYM_g~?)}X?NL**TcX?w{JJxCs;<#YW*2h zXXnkYzzaR`I2!{}As%`VF1xzc*GaVZ60?Z}|3pOmsfJzdL4$ro<)N(?Gl5j6CeziF z)!vG(YL2PX)Ozs(BgPFQsRhByJFoP=EYskyZE^UFz0P3sFC+iM?@p&cmM??__ZB)| zLb~`2yW39q$~`Zn4_LjO43l0zTfJDKYHy1ieEmEt%1u{;$4>uF;ypQl;x8n7bO}Mx zhm-G_)1Vtj8IAC`?Pm@Z3*mx+uO1qB=-}nDT(GjIljly{2{SQ_Y#L(j_wIz$FLDM8 z2`2Ee6dZ@S%Y{6d=SDtG1<3+6PV>A*Y2LjDJoz=h;k0ZeZOSqsd=Op2J&gIVd&pWD zqYL0?MyoGu($Gw=88^%t&Ay2M!lPkk`^W^SIWaQv+Va-b>@!!SmU9UAtMN$gt8)GS z)<)Wk?VY~3qzodi`WbK_N?OZ)*!n6;Ru*Z3BW{nBO;N^(E^<{A8hDuYQl|4{H{*I0 zI~1uFuzS>|2eP}7Fj%#Az}8NFD@T+iRQ81QET5%)Mv^#6-8JbcUJ$_jh=;VhO-MHc zKMEPH>#cww(`3Ym+yMqbW7ZSbs?*o7$R>UW>>ofQYY+&=wN;jh-7GZc$8KwBBo-vY zoATCz3gXbY#ebMvslUwaURFRA6^t7H@LA$!bpxXK;u<={t3}2~7{V6|WYW50a=6k&D`O|;S=M~+Vw8(C?Nd2aC>9#slPxK0UA{Jdi*87ZA>lRU0 z`hC$iL(g5P<0JUzg{;zf5t~Aso&c28;kw@Vsk@!hv=sQ zSCR*xT2$hVx0K?-v?)*Yz)&x25@dgss27!hna6xqD++Hw!Vl$=v&`dg>1mN^*!4VX zX#`=!dxL#>I=us;eCeKM$L)d#|5T3LvEX)UTd{|Vl!bm0rZBFSk4e5y-yMmRn6kau zLh7-a+Oqe)w*`#;6#9|xVz)isKXZcBfjgB3V!VA1FKee8nabRxD{pey>Y&CPCud_{ z4DEP*rDx=}HDQ%vY5b5>Iq(oRUqgD%+^)~s8!@d_(VsQFWCBslRt9SL-hf*iSE_zU zAaxNfyRH60CFUE;m6csiFk__f&*}Q@=X0?Bz%?JMUF656f>sYpU9`@J@2*$$xgDOG zh-0QZGP*j9<4XMjiSiT;7VU+WA6^g1>gtg8NajBo6!)0BT6DcQiWZ+Ht9HL|8|G^} zKi~`}&n4(0cdUK766d!XUGmyWrs?e_?eo7~i8sXO02drBI~8OgA7;g7eY$w7EZKT3 zid3eG5!r)B63c_5Wo;uFlXaKjYvrWPXmAQhCIQovgI&l!rTenIpTD{c=&uvHHVx&k zD+bWX?gb+`o#NJq`_CoGYs-isbbn#l+qbmjxe{o(@M1s-oCzIP_^;OSrI#Zk{Q?M* z0|QJuQZa5an2&@lxKz4w@!8Y0~WQDPI#^UE0)~ojBtHCcSeGK+eZouD)m7IFdRV?tU=t z3kg&ge`k7UU>Iz-Is_qa4loOCIWYO<`SZ>GT60$-Qgr8>j zy3L3OG9yo){fToupnB3i`j+bbCn`Z4QWr-U;UpUh7H5YtO8h{21|;Pn2Nt8RR--F==?^3eR0IR&fQ#Bj@3GOsnYvahfSIPi1_}1MFR!Zyn=Ow^qHXm zX`6a-ieYQh4JxEct0IDJ4!kZ!#4qT|&?nKbB=Mq)X}&fpd8sk( z>f&81bFuik+GBGkoI4;Ow!>CaYVVuGGR5{n?FJ=NIb-=DE5lTYjs1EpB9z8Zrq%hs z`uv__b5=|&`#%IM3}_>!`40h$X6gDb0b535QJ}`?*HBNw38@-F1tM_Se;H1DnhrgH z|Am0{b-cuMIt|1_(9~qOUt7iy>w6R8QD&MN?jZDfFTC&EUU*`F#^U`|QUT{3dLp~Ea( zH=edaQH(S#7v)FL2jzdOHo4tKSFvgFbk^xGPUhw_r!w^Nhg)m&c}LX7 zl@1Bww(f|ThK8TAXU8+RxS?hm|H9@BZqpr#hX##wij|wAgf2q5#BAn?Rkl(>rY~Mf zlUlrW;Qp({7cq4+$sd@fkyvn=5iXmo5#d6oq+~N7^BE9Y*8Na8z#=k{G4dV{~%f0`wt!04}ID^7y`X9D+kdp92 zVFcS#4eZD-G(y0gOTx!YP91N@B2-pTKxM7noG5mOk8xLWgDig`W^?~a&L<^B_0uQWlcqa6=|G9kf;V*8BA}b zHP7tv@|C~Yiu44YJl3=>` zqBm6C&bN1$JM?2F1f{``#$OQH_4I0a93+j1$2VgR-uUiM*gGQYhXns6^l+tmP+`X zx*U(?I*V*~LB+?^;4+v2l8F5Kmn=;G6JQO3>_&N4#n0a&YIahssQp~Ur8p?bNks3C z9;N_17ibH+bs})N1Up@=Im~K{74m+XJL&W7Eo9fDb)n@Uwg& zk}+86#NX_1mBlwW0B-hp@H%k)sepSnx1UEEwU%TKNnCB+is8_nx-Vt#j z7wmS>Hv3nD^puZ8>behTg@(r>iiuy#ZZ>T02L`66hA(TMBR}cKk(K;np6CQ+IR&_U z|2B-v6UeIjJY5<%by1th;@>qB>&Yl+sPm={l>GVx%N7QNH7$RR#`pMpBl00WpKxrx zPV=X&+PoCz8^;BcmCElxd_bpae;?#CkSKpCppxL-X@**~C$) zAgG|^nZzdI{9zJ%Xa&w()loeGF}!`VEGY`%GY2#beb~l|3;%Ot^fDt@J1A5>!dUwE z#Anl@^8j}#WsP;>$@acr{q|eVS9ji^|F%?UDF`SxSmX}u6@aA3U5>|R!^+?3h=3l9 zc_rtslA<`-B6?s$?7z83J^4Mds>5x2(6$Jglb1@GmO7s2*rVvp?bv|$%x|Nfhl7@; z-^@ur4f!T0F#XPjK|OA;Z+YF-#xnEBtp=m2>K%{DvVThMw_LPI4~?+s#@1R{Ln0X?i@*J@qkiQbp$8Rc75m$|f*` zyKV7YBJUFXoWIp_$qP-9#kis)`X~-JP^P3V#p!3sjEA_Gw%-=m?0$5OHy}kq;RM}`!H5iO1|*q(GpI|vf^lE=Hjw@kiRwI6&W(TQ)Z81+x$gGb zA|fYfj{A4;=Oe@a@TuL2kK@U4>AW zNoW9$N&gR?S~lwQFK%f75_4ve42!NAL_X`=Rs z*rA@^=ne7Mt8N?v0^k&td-7%O%2K%De0l0*b$sSzRmHG>wPNCJvcp7(zYUEL@K&#t zl+dp9<`);*XjKi>kg7O?gv-0*xt`V2{=KbYtZF)<3LglG5XrpsC;g!YLO)srP>sWR z6*0sn7E&>psTPAlr0X6R6(d7Zoz%8rzh#B>oWgxnx6Ol6&~u+=YQJ*yAg$&2UWb7# zNjuO!x2XH=M$1VkDYHyoSlyMwqhfrl?tb&~jNhpW+BC*QrsLz_EkCl5j293aNdhBX zJX-MiurexE(s3YE@qO~S%Zz8D$4mXjP%Q_T@_)}?sd?VVxm&7u=}dK=E{8)Xdb~n) z`?y0W7SXens5@-ArtarOzK9!PJgBnQ0~i1w=3yh%O2%@rk#JlX7C%HN2pgG*MM|%7 zzGB`~xo_;=6CR^m0XSD7gtqz1nc$%k!$L+;-SJ@8DAs^5yZg64c?sOX8@;uTo(D-q zYg|pqo+ZkM6XQ%Pnv8hUjEO6es#;h@(4n@6)786wBh%;m$lex7?=(2iy$C7Lmn7iMXmvg+RU`*99 z|9K9+deKuN>z_9WZJwIN9=V0YNp`>e6zBFZC?TI`a&AXBw%cPf?}|i!Pj-$dMoTOM z%c!Ri4si&Jfus1R~8|^i}V^FSVblg?WVQaq@4GG0sEhbx;vIv+` z@C}+4?{pRa&MVklI}bt38Q$64es@2)ju9%j`C}!dZ;Aw2pKC-_>;F)P`YBYQUd^V_ zE`q7Y8)ycvS^sPHvmic~30%Fk3V^-e%WFk}rbwrTCFUg+%)7A3--eO+32PBN`}4#1 z)^Of~c>eSDaXRPbapEt_LR9s(sZiP>6Tl>I#V5b|8)E>MqX&^u!0xOm_GBgtK z>}2am?m0SEn>&(t58cg3lx`gevr?|4+={U>E#q)NJRh==BSEgg`Hxd}06<5bCE?K# zyRO3=gRL=*(cau;FEo$U(o z=Pbn5U$8=TJ`-GGS|7D9XTg}Q*^~LAt94feHnIdNS-hb^Rw4|LlcaA?c zRXpAvB^YOjiOM_t_%is<(%1Pg_pX<(9sl#SX?5^A1kJo5%qxmFu+Wl6x z>@yEc>mP_!L4{maWseemPj4@BkkQ*Oejz`+tp6u%WGK0x*@Mm)05sN&Au#g(_uIv| z^{bd5fT2=jO7(Z;bj)mo04&3-lS+|3T%57w9xX~sn$W@xZ{Ja?Y<}SA{f@@Bj8%u( zo&A>f+~mw6%Emd&?~qc#5!lzIxE-n7-+arPzSie;#phU&yj2bgW5x4NE6IdAIiT-o z4-5O0{xLbe`#&AJ!@eA&*;|^TFLPefD`gZE=7j86uX^2#{XY4HBW1O^H}Q4ew|uim z5X$Qr&;Bj}Yv?zM^U%H(I}(vxOkCxg67JER!`);Et@r&3Nd6okqgPzi0``JHBc9wT!7>BGZv+Azxa;;d8p2YX;PpI;f# zyAs8%n{;j)XZu*qCim@9)8Vfzf0pm7AS3y#7yyj*{9Uc5d?%RU$m23zqv4yNS-Yp& zl48T`0+O2il2q)e54HX1nuW%$tG3^SJfm5K9x-Gy*{0a7lX&+oNJhvNDr?4+CF!$h z<$xx_5v+^qmDYnlnf)9!@fxC4W7w0ya^8ZfVkB%(e4E=DOIaOVardOl*eLCu+bi zsFOQ?bTq9?P;2Eqd~d9~7G)HY^dro)*jmWOgU)VI(#|HUM?{iENHW)+Wq?gepc>v}`%3UfA0iI7{^NT``lputzZtLRA}mzy zF4iY5)>6TB>Gjf;ew`&$f&7awBI8GK!FsfhM-#*4Ui9HMmJQFH&O->VD$k`ue}ER4 zRW*96-mYAIC6HGsZTKvoKky=>tGP{wQRijb<8K6iR&}Y|T;f3UwXfSzi4r7{A#uy# z2y}G!>DD}3JFxz4z1bEmF0|t<-;F_eV~W7l$puPo7X(1|QpYSWJf6vXFF(1P3gjw{ zEaXcR=CE2Mf}bI-w9UFmIqb6ihba#mBM1ytg5>Z+p$9RxcM0PR=@l&ymce^GvWNqP zjx_Lm;#!9U(mI!h+1yNh1&uLR;c;&@Cs#Hjf=hG{nFf+Vs?esOtcEXogg)*u$R}IN zw}^Zm3YrTqO}EfEx@}fID#I=3irY0VQ^J(MK(i38tbzm$Pj#SqrDhVy11ICEI5mI`+l#!Lsjc17_@ctAchdM?meQI9^(e1cKIMW(P#ROs0-f83 z3cryhe!9riQoS6iL4u^EuEHm6to@rEBhKYBzMqI=E`Mtnf9{+#q(cVOj1OO-MsN70 zv|vUfxX`j~r|7EBa~oyfJ?6u)csiqhxAc2Ut6O3@WucBqZb0xoNjB-bZ-IKdg`~ zeA4<3YLDnN2V$paWTgD^%rTf1enw0uk*}X*NMMbaeZoyp_U0aC7wzU|>BE_SYRU8q z6F+5oP8gMg=9F$&gjH{*y;1T_=?q(edp0j9?;#9`AbRN@UUZ$W+7#R)$_s+qPn`(dFoxC$zdE9_YXy;Da#yB3N2b%$&{aA^}re zS!8Oa`VK?MwC9)^u!O0&13i9b(WFlndiZ<}_t9WiFJk=QpxdmcOe-3K4PJik8Q z8ZPFA;U_X`<&%2^xQn<&UOI=rn6u6`KRpvQ`2G<`PR7lViSGG=%B`9=95~Zg2_}># zJ;q+e+05%x@Pt9g%yh%|)Z*mF06VEEtwF6ZCHQ82zK7Z?@#&qF<#Z|U6vEQogvSH7 zW<_>ir!s;zvVH9%Mfa^F`}ebm-Tt1(FFrJ1J(5v|37p3tk;ZhJIu$bj_f!33p|0CpFX`I-aT&uB&O4}QbYSw@2khED5bLj9d|y8C?;^ao>~{E zk4qi>66=`uQ&zKaK5AW%_IWcA8h*aBap*f84T5h}G+$C#dsBPxa8Pa*6!C)Zf?NqY zb}0C~HBMI6e+Ceh6=$m2`O4ah#y^~`a1`-;U6{4*c<#scDvZn2k3Hic-Hif1`F1$G z_~omsy~XgjJeiMYGK&rla9hbFz79x?7m{I7skbzC=Rn=GQ`c^Aox`25k@y zlF=1uZyk93K*;h^ycMG7`ANG3KT0G{@bD7nUfi{D0KbiKEYv<( zDCxrLipu!qW@J;#kkAu@66Df%=c(T1+ zBVx=@E+R~U{&E8!BZHkVF~gxuJbM|6-4OuOXs~BUhMN*U471;t)If)jL~@4H1sYw~ z@8RZp{d-|Q{o3MX=UF$2cn^GQ-bFVVKMO0r^P}h@vu8Uei*hD`i!Ir4J|&!`PtIEO z(Vnex`u?7PYJVk2Zk1QZt>~9co|{hR{bF8G0Wd|Ju+MLY=OHX(}jf{@lz*^y{ zO9YGBrTeb|-u>RZt(LbRL&-{q?UI;T*91s^4nD~N_p+W#9M|ZZpXq5-q!BWv#ww_^ z-M~5zJT5$-41E^Bc{hp3iTX58Qb)L(oHS@`O0LySyI%>ioaEOnC=?suT|A0p3qn6E zptQVkm$R||7f*-}H#Q~0at(Uqq0_wVvF3IRqbj|pQgAq2`-!A#05%205GhAP?tx4hU7K( z>02(QmaCzNBhjj2t{qmZn7vN|dgY zT}R{kwmlHHNJprxS-f|WfXXeor10{2?-&_2wPzN}xnjgxX7|{7%>SUL?S65ei`LKs zn0=YmWUtmPSf@4l10qQp%HfrISf4?^D~lqHiv{0RFhZsOi+q-d?JcEaY&*yx z0$)j;tDZa3>R-4NIAE_1ALW*sHjS-)g1Q}7Ahdtv1x5#z0rF}05|4E?Z3n}*T9nCg zlO1gfxM{*qxN7RzZC0QITGd_G`>iln=(}5AmQtGSq5?B5yg1QIVEZ7e(&FdPHA`L;u16y5~G>SVRYN&J4`j_@~B}`%K9Tt@1NqX z4`ufdt)Q5uFCSgAW84fZTCLv-4Zx5bg}6#7*V;uci-`;+Loyn=!uN++;sNH1H{s}R z7Qc33j??A0gWoqCV%-UdQY1}cx~*hfE%bPL?q%I9_@L%frHSHEUd>P68)6Btz~EHy zdCF))gS{R$SU2t*M*;Q`fDYNF^*u{cki7t6sr%eE0l}u#iB=a`-b*yE{&#C%QA^a8 z*4IKNb7p2Z+NwrA#W`@sKh4+dbzGNW5@sm0whO;4M`M%eoDLPtpr_MAnScCne?tl4 zc91ihs=4GDAiFFO)|$|+Z{OUXHB*&0`r>T67bh%FZLFN^kr=0Wl!U!@F&+m^=BS%V z=4#QAI0ew3T6~X*^&l?SnE7tX9CgXSHf4if&O|0^m&D}H1|0`pvNd(jU>X7-7p=*y9UG@{@z7+nG)E>_f z7L^TzZjK^btx;&qv9I&>M&ma2j=RrxM0Dio1FpYW0O`pALUW?S6km-dYUyN!x^yI8 zCehm)i^3fD(`HJ79WRX3{Vt;mojXU%{+84)a_2W-)DN>*rC<3_TTFQ*bc82%QcoYT z((S8}`U$H*CEW^UB!O@Ki>5}uBTM-xoJ1qr%IRpdx7icG&Suyh9g^t#?Pef?}%&2J0v5+pn5etrKK`i8Rfg|1`7bt}k1bOZwS4 z2v*d7RVZGBs1P1>RA#*O>qsACt@R5d9CoEMPq|4OkU76h=y=J-yuKoSTDqL&!BhhO z5kgsvzQ_A#67GZur|UW?UMq`Ni==AUJp~X`k7CUF+Kt4+kmYw>fO_O0BWQ6gjq4mK zi-cA@qUo~IkeysGSNw&x)N)JVnZc;l{#Bd*CWV03!FNrrtjy)2{-8!k<>9 z11tNRfa>Hykduya5zFPO?{@bOOC7j~A++tyW^cic;TGP}BPI*wBgfq7p#$>Hd6Rz9 z7`0!H_8HO^bR(p-lCOdw*JTdy-|+<2_L1x4Km}#eCFhYzmW-~-MO`%>(I>xJm$zq6 zcQ!W5o4m>!F;}%f)dK0${b30#C*9p=x+tzNC-jsTGFx+)@t8p{6G2&JsYQ5;(Vtm| z*Q;H4kYxf17QwXEyghlQ_Dj@m(dqu^j7?ybk!QZc+p7f9hIr%JVdlPg_;ME-s}(0N z+W#H`X3qXC-m=SaS8Oje${VwBxsBDn(a_{J$}`-pHjxurx|L)+r%cktm}GdNz#lJH3OSmw)SfW3{n|RBke-I-^0ysW40*1WcyoEFp|Y~@c9O^{r5sm!tP(T`w9^@{`U(=~i+lH6>$W55Aq657R$=UEZmB}B z?e%qkd3ohzet2ekmUwNt!YOdp2olKkC5oURi(4RQ-iBV2=CE7l_wr+*&e!&b@5%cO z3Hr@1P*Pq<#@F!-(#n1AZ)Tr~#VPrj%>OIBg=gS@}LdXOr*PVM!$j?v|#7g2?U)5*=FD%4sYdO8M$TcUWR z_xBfsos6p9>7RW71RRvm_YQb>#Xl7`KBLic=jFb&aNFYVVGW~R-%Xs*5`u|W zDV|4mk2sYb;;ORcr)v_Hd{ApDE%G3)$Yn=mF`jRlzZ|vy&J5?259zxV9RKIDCpWXu zV%($4Ly`gA;!u=X-k9p+Km-XeU|x{pKT~#pS^7vnk&pi~WtTmz;{#g;dx&OcH+$B{ zMFu)HH+wc{F_uC=g~rdX#q0*a+mF?pv`Ke*RdJ^^GFulnOYjMg#nVOMkgh};pls~} z&N9hv$gu?wi&nF^E$i}Oo|3_=Byjhh*}pFUhes_Z&wRrnKm}qK75!;`puOkVQ{yW& zr?aakWTO2Y3(eS5db@WlDK=Y5xpw!xL_03H_599`pI!d4~wM937M^Px+LhYQQl_MuY!y`Om*m6N;4C1@{I4VSF^O0`fY0d ze7@bzb3OlV!E)l+aN@BG%hE-WWlO8|r{i!M*{q!>8_Q{1CC~L_( zu2;zTc*WFaC28y`n|ajW-+Ngp-n6j~DNGDzy}HH6xc-NKjkscKya{vKZ2s66_s)2c zy-F#S1qulDckR0=920kDJ6RF=VPGEDK|t7hZ&WM2O5nkblNUaC_elnj`MOS zgy~+Fhg)h(J`;BJICqu4{JgX0Um`treU&4tVn}vu^OmqZ?m@5Ba!#?*MXW&UDA<$m zRn>t8dE5%=R{iG8v}e$*QkOf~YG)3mmD}GkW{+NZWNvWp?nrmJj-DIYO&4rDX)8m1 zfhQGCC&mm8JJOU^)%yjUM|Vy4!HtUYu6kmDxp&Ec5Lq5vLh@KU5JV>yTK%}6*KUT< zy8K7YrR~uH(s40X`Mxicqde!F@>dpDs{onTAJ7{7$9e18jm)*&n%WM+x4#l@HZ=UW zpZVG~A>`Sye}!$FpZL#LTH}DF2oTdpoWqE{I0Mh?*BLY~G^r3c}Y?oEB<~SjHwPrG}SnB-O#|y#Q3TsZJWH}dBQt7@oS76on6(yf7E92l9nR_cAR#_ zF*UpnS;zgmhjC=AFOz2DozK^DfR0q!y{)~iS9Ac&*3=&KS=<688wMG~s&23B-W>|{ zbB*qw-dj6vFAV&LjwO?2Bc{d3E#C$iDBE=M_wWw#Y)SPhRIIZncw<-JaqP2)k)23J z;13eeuBBrXy61a%VO-3IwX`U0xy)%gIOZvij_rg`>Q20ak_*eaB>OJjJ-rL3?be0B zp6*r5X3aM*Ism_Aln|8sv*Erkf^xd*ztVarY0QZ3TNKUtmCZae_c^=1w5-P}!yk+F zpp|7T_p)KU;FxY#2e`Y@>iAoMI!g1(E|D~ik5T5~nU$rLxxPPt3sqT3d*=-X9O8-M zuH+|=rysUbj9%HV*_ZmO38ZT%gKx;Vq=OrSZ zpS*p=Emu4rl(Gf?^ccgthdvOMb$c?)R;xUq?y_;bWA6~&Yrr-blTR=f2MyNECkg0U{CQ>4$q5{$_EnS0&#E8KNrC}na(x4y>QbQU9 z2BU|B)JBfJ=li4I<9FQ0{($Y+cD=4=oR9P5j=z_>iq~>7!t%t#ddA6hU;Lzib%h6i+!i+_w;&K^D`W?&e6XiblHUeFnNO0#27~7JoD~v) z`;e81Mm#B{7y4gH@1yeJW>w~(1&d>0s55?mj7u@Nos9avx-PvqQ3bkK1%%?eV}ofS zHglr)TkW!0@MsAX;Z~DUV@U%49lCq(U#lgnrm64^EG(>n>s{CA0!t{}205r!EK5zGnSkU~+hH?`DzLkfvr^WS2vn!g5dcf7qx@zlb0251wQYmiZD#d(03HZ2?5}cxSnF?Tqhb>pwdEvi4&H+ykEGxORk;+ox3v06%=*U_-ynb)xWe#M|tDOSWg1goR&*b~c|+ z7-2Rlt(O-f6i>+-vLp*ot)QUGbt@IOC_SyL%#B^U|0eUwN04lck@Gm6rEaRJfQZOi!mpiZx@kr7p{_}cZiWce3D>E1q`gH zj>;q@ZslD-FI(9#7~MO;hp@=m_2R3}=ph|(=VB*vDXb7VJ}_@8x;usUup?P4EPIkN zBY}u6?>Vvu6U{QtqlMf4{$FKCml0e#mCdKo+DD+LsI??k9UGUu9kdKUIj4{sGSf5c zICgZ0IeL(eFp~UCW{NM;89}Sw6{?-fE{Wv)G5zSc`Y@803C-WJDf$q{IpP{Hx&Mw! z(Pw*+jBDX*ct8b|y0Y37w5oUhJkP?vt5nkwXDaKLG~FEzh6HT~9OIMV*q#&v>;P;g zD0tE?(<{uENvX@>G;*u9MBrIPJx3}%GGXD_h^CO>@6P^x`Cmdq5mn}7#^!?DGn$y4 zF1jNvu9oEbVUXf`I-cwLeOUlc9fHmXTeg_*8x2nvv%n-6C1bVo^N~a23^mVIA6+ri$hfM@{0+^0IjYhNa)HLDCMfm!Xt)9 zBmMqOJfF_3_inIYFSGMDDodmNcj?9m^W3`*vT3{;oeU3g4^4I}3b$U{)A&Gf11!@B zln@|jAxbG)4_YpVZ{uqAowxR+fhD&x$*9KlCa54uyrLNNQ05nr^yK@#BDSOAB=#`KW(ZTCZi(m#JSimz2&Is<(rV&)h^EX9QJ=D*+PqdgtCWsD^SfNQE6V zN~g6iQuMHm7iJDUX+@r!$LN{W@ZT%T6@05!@BpDHyM2vJ4t$NvDo&V|r>;R3or73G z+jjO+KgcACF#^7)_(SOkJ3PS2F6MJNN}s6kK5ycjjZ61``Mb(xZB*8zd%Damu(ql( zIO|dB-$%5c!6gjIJhi}@&!26jiNaAU-L#swF>8NUf0__p9pzpF*|YB$Z5CaME{f4j^y_Q*4;duaw_ zh(86(Ghqy__(|rMT{+S1&*&}N6&3C=Yrt%xP_E0(M}Ehv8K@d&h?3i^>-j6s263RJ zpxY%CL~qxP++nd)`}O*K9|tZ1M<9kjn^rz7^y?faMc*w{2lyFN-$?x@hWv*cLCmQv ztwRsY9MaRmY7~zwd6me7#vS5|)+eI&46qtUA6qBjW!`W_<*Pjgb|$og*6HR*iwFJJ zGoif_j8y(R!&_1#CG53dVPnzq4Y>U&!rpO`xl8-s|NBf0`RSg)Dl@SQqG%u}tV+-8 zS)Gr@RKzRe9oPn~HE7(d*|>=uH&()cJ`N97iwYzK-YPY0N&vCOz$1V+SjZZq+z*C2gF1Vf8DB#&O&*SypPzPIu09#WmV40 z|5fDVk?#SZf>qP&fwnt@h!st(#nc+>kZ1B&}0b#SzW>RE3%W}`l zSv$p5L*Au4YoRLIyGw{^!OhjjoERn_kuB{C+*kYufS(Sx%+TlVXKbqql?FPk@1Nqr zK{s+bZ$|`F_u^8Wbe05k*WRqtO@=pcVv+q+aI3w*zR%zIl+i(_+PC>8gL75J(IaLgSpSY`up^Axdz_Sh|NxYq! zugWGa0D!Y|8Yq%jD}~`)Zr0)<)H6M!L#6DZ;zeyM(s{+S?JSh15|eDwRVxDBo>|b% zCz&jyh!GJ+q6B?W8;nN-Erj4-bP+nnJw|K@V!!IzsdCaVM_LinKq>}tOec6aQPJ6% z-mPTqyduI`?0+4BTgg425+_95r_~CKDqvN0_AB&*>FOd1j1_JU_%xsg`(zj6qNVD& zR3W2HZUfr?$iy2a)DY)57PG8uqe`IYE-08xaF2qqc8jatR0}A9TYpMxTIl~W!?^zT z=!ZV7B-xkKx?HBBaQW)CNL-wR>D!Q(AIsgSDXS!ZO*=aT?`^-6_6U+1VFtPmzycai z^J)U^QLY0XZ8wzZSo|)lEtbopIUg_XKl|k3*pU}AjaB!`as3dB8+{-qbX}XxXEvlT zZRwr}c{-%n?}sYfb0lhrie!J!3#`@q+6L6mRNYJT<@u3NKjh1`S~b+f9&1VWX06aY zLebN@`~7l-M4YWYol@66ZIH}JoZg#G5$6I58ECZ4v+Kn@5gmUUWp;y`#|w)sbgJj~ zU>7SIdrzs39yt#kJbSfnLugGtgUhamhCx@e0Cen99X))xifXChVy>9bC)3dh3^w^ro2K&^Ps)Z&CIp>ioNN! zi3pdNX0VFs1r|L9j(U$U&cnbb)wv<1YF`*a5oQfjo3lz2o2Lu88(qzcYc+u>(T4q5 zhG5wZKf5EA%4gDVF9aT2biHfY`K)X;56^r?V=R$q7^OTi-#{z6tVi+aV0>R~vwqgm zO3!PNlOp_=r=^9)I@d-alaA~;eR1t>v0J5B_NlBC_&$TgG-7Oe1yIv7-r!evxAPPrej$b=QE- zE@fy_QkwNBY}aTPh$opDWau3s5xcCrKzb#Bhcm&NkB-n9n#$XJC3s;@!{qk2G$zog zIlgto;1vy41^Q{G#h!Dp;!MQp9*pKsYb%NxN9v6sr%Uc!0x!uj^Bi5172)wnOkc*t z|6zDPh$6X~F;RQ>(Qt}m!R$+2BE%>e=0|n~?e+-s=(o_8TW1Ig;E9|tkrawcT$#65 z(4k@wF#Ln?zLNNWZ8LYRufuF#4n$R7J#2l^C>LpXu}LK1E)hO@7CyBXibGpd(c`mEe>4 z#*JU0I~!EfS;42`W{6{V2Wc6i017M_o&M=bv@p z{K_f!?d-hGZ-v?^+A+pbX#RZ`j#ygo_WdjsDH^06u`ciDXHjchg)29MGXx*cnY4Ub1L99!pFVC<`l@ff!3OT{z ze_1^|v7mzNthAED!^?4oo0?&BeDPve zZYf*wk*S}&Z+I;zOp%Q-#)xVb9NGQ-FRW(a4v?yAxfYoJo$AY01NxL@r}JGc|?M zu_sR!whO}>A=(d~`+7X{Y_v548YYXG^NuZs6=X`5sefgM9qR>*z4q-{9%6W=iqFc? zMIE~C#yCEW5`v7^YEVxV8}zyxq}#oKtYqm82*}v1*rTFN33wHq3ke?5VlG4ThOldz zQlEI9uF0M*tcuq7W&Q0o3`2r3ma@ORJFa#kn^vv&&GdyNn6uPnaUDv1DgZMElXCM~e4DDgvWDvRG+6$#}^)xl7l z3=RhfLCGc-&Uc7xJ3}hMUpE#gc&Bq+L(5rESbM{&&iv%j%5^#$v7@b;p z*$U2eCJ*&$MQ$PFcIK#wd+$f1A_d*X+^N+Yxd;iLDQ)XR)h- zT;f-Z&mtztNj0>kP2s`y)#ekAdZNs9*4c=;PtM54ub)&#vhcXLT0h@`%}lN?8YjBiBRK;t=r_-aJiW(LlEz z{^i`2hWxD{akaI={vB)Icn`^wGR({t zwl>ujD#`h)nXNBaJvB4)bROnAh-_T@=pUO!70`26w*%z9Bo!ut-{<9CJ#Lb#;@Otg z^bB^Z-=UHkI@q1q95*@oyN;h~B0pty;Fw6ezy7Uv!b`TYn^b;5p~EoI!t?i0?Z`vu zO)Z24pSpUQAG4ie1QOzh2(o241&Ecd!5AULUe8EQrw~08d`>Z7mK7qFYtIEe`2f%z zQ$e7uLQhLpTw*1uA5^F$g2PDe!B}SP?lcH}Ugs*7m(GXWE>`8%&WF*=9y^6Al zO%8vn_i2Q-Bo)!}D4;CIPzdmhBqE@@K~5YprN`>JrN z*_6iW5!EJyTV*dfNA75*8D@JXzJ?=%POIu9riDOU^(7e&QW1`?b-%RL{o?!iGO|6u zjQe-;OPLyp2!D@N#Ywn2b=tY^y_>B)a=Is6`j93la`XyCvRjHFFy^*{7`BkS+b!5)#K!7HnpRD9$& zw1aul(gJMo(Mnr94?T_+hkTYvcS%`l@T}jx4Ca|8r$4j+i5CdEgt1tfvD}oK^Y;~M z*G=t1zX5aWp~wLF%MW0!x}6Cu_+21|vrTV6YWa=ZLNuqBK6L#J(sO}xAxVOW28@%c zFA_K`$?0zwWCU}3t#dNxro-pMNt#?*G2t;u&NhfgH+mFfxwqTz>+#ZU7Q?$Dcx&b> zf`HJO`>$w#M)(S{B*pk!DRUaZ?9hc*91Fa>n^=4+8Iyv?ki;`l^S_e!ovR$K?9SlO zFZti7hGoBos%&sN$`oqJr@$&z0C3X_7G`Rsg@43_1 z(jX8Hvh#UtlfbKWt_)P8vEgVB=dtg9MsL2g&sH&z^c9zck%;Sc4cjVm##ZvGte&Tu z!;y+aLLfWXog2E6TUjtym>dIL^$!20VuUM#g@^z-b;EEO`CyoOyNAih1S&ZarE*2sFmx23e z4AnJiO)-5LMFr?RU%5N}Z`|HQjsxzAcNc_tO9Qu_q*ocyPG)@BeN-U#fx#Z~CTr@x z+3Myl1o|Zldicov-QK%Q`S>hvk0PL2vK6=`8HPDsUfHl^Q4ryVsDut;{>v-e#9K_*zM}bN-XF9I$ZM;9}QU)HpyJ zCYkQNBezO#p#D<{=+CW!f%m-3=CAgC!n3W}5=^_>71d>~IJp_@m7`v_xs=i-JeFF| zot&A;@icU2RZfI+8}WMHI?%btH3j535uc(_bvgP)wSm$(`R#)dg*xhz8V?8qX3hTB ztXxM>>|e;GT={lCfA-_Xl*0QwHG*xPT)!?{C>R|@5pEwG ziF8>2E_87zL6@vJnF5cRr_?mSI1mUwZx16bdPgFK){v)&Edk$SO30}_zLIWcx^(fn<{ zf4*T0SRmF%TW#64JkXesJiNT3L@Ni`fyY87yb}7 zJiTHN08$x?8j@|Ne=Fy|%aXa`L;F>GvOkw7dF=X`pw~cWpqY?*IS36MrA}5L?P=lQ zk>wn{t=|A{#fhoz2O$YW?F!TXJst5}*U`Ffxk3_Va%Au(*EN`QwqEyHo-@Hdtq-Ic z4uz0%a2t~x!jQDMDWI4J$_#YcTaRZ-`nvd?`J^4tq&?H3L3wMI6?jIEGR)aEL(>s> zdya6PMG4IF@;svLsXTcv@7OKEJs0^NoJfw7R?D8{xBae?0ohO5cmZ^k6JQS;e451l zRyc_6nsX<5`~F3ybJF;$Sn7~cq(U49Jh5PN3wVQ?``a0kpa@r<%Hx*?Y&wZ1BlNOY z6_P)~(>Z!y+~zI59PqRI^yO26+z>Ol`Luu2^x;4=hBW##ukL}sM3O>T^s}FTauB#E z6(hPH#x{M~T1$Uf)96{(bmWz+)Nk8a{pM>$AHlfex-S7ItMsdjm&H04V!ONNvFbJU z)5RfJqU&HPHiv*4(+6~7R-*#*mkwuEJNDBybzui7Q(4c8qi95MYzmydsHCCxPKABh zx@q|29gkjV)oZ?eB~Wvth~;#$x$VFk}tY%-{15Wlm5!?@e|5* zw7#|HzakLCm0q}}TY(74V8)*PyQ9_q=)_iKhSzL1T^`J{tU@ZIssublmoFnp1M5w7 zCaQFw(#A8Y*`@{gev)1q5R8w%HJ}1Lf{2djT{8cm1U;FJ(3@KH!oV&`9E#eV*0Sq3 zUzTfUX&_2~_W!7PC0iL;Zr;A6nw^*Q>V|!rCWM)uv!X?(mjs}pqhOJGk0ZMhtSnIj zilAgw-sWqNOEh3VG$XbDSUU@Jk%OLS(M|=U!&gL^6mRgvn3Cd%TK~l2hQgtLmuIne z=bDs3(u_HL#}ps>kbhE#YN+ZlNw_J(lsyRz}|!=bZLZ zqxrCd)E5p#|PwL%2Q{LVob=bF{_B)-&7d{OzHihXgasq{LQ(`%kn}w-bb_+yc^ilSf*NxsiJJi^;1l)A`PkNw zG^k>fduJEKiNQ%>w-}X~XkgRYMrCRh)u_~1l%VVJ+NPCEr$X~uJs(0ydPQRR<#q~# z6`#A;qZ_Xw;6+tM;+zBzz;3a(tPK#Sy`I4=?}3+lgCZi(Z}gx`Xj~u-P$|r1tn&ef z*Bq08m>ty5@xPSZzp`Yz>))R0xAG^(7Iw_Y6 z4EbI<4+t!&32-aJfb9W-*Q=;R-s9A4;7_h;@#2J$cb@0;3*8YX#o!q%2gLZonk9Yn zeQ7;$jNiLl=~Oqytmv7Xw(fnjE6s3l(D_EI&eRnZ{|GHQXkWNBJv6;4;^ljUWyTH! zR30?E^_cHP@u}7`RZ;u^YVirDJQk|&3jru<#@mj{PnsHtZO$D(;JftMkZu0>q5VwZ zSWL|{3)w~GfDR~ev30+d8T2BU$_5V<_1US5-ej|-%8OcpyIZuSG<5EN%CqTlvUzD4 z_Q`)y$tm|o67&$hF){nQWa=n*Wn*u^tSU$z;mIn-?kj>x|ASwX@S@M;yI0pmIo3UP zsXe#e2-4jdv3`w#(E=R8Xw1FUXXQGmB(cUG9fA>sd!)`e^GUJZ zhl+kyV1o*D7mZdrjBNBd{U2kD%V3kJl)ij6cCn>CvfW5E5pdfhQRh2a|3doxrHbxI zn!xpzxH3Z~A57lI%L$e-dW(oCO$70l2A+HIup_O4QJ|yB9UBT6x9!wJtl>l9uvZeD z%p}Db(c(UF8OBCE=I}p`tKd3*TA9_pYV}6(E!7FB$=*^BTa{yE72UZHl1I?4dXTORz5~*BCiZt&AUshvYLTSjTD&hCM^~;{FiJM#W@1zP| z3vl)I1NZP1=4;3Kqa3y8OE%uf^>)`LNl@HjM0|fN*M)s|jHy|A`k*&mudlNwP4pTo zfjbt&JWzv#$YcArVBb!E83*}Ha(==j zGe(xJ6S*Uh*-mxv6gk|-ho5stv$Ixr2Ac;D^45^|%J%BlUW;#hYgMKf?BQ_xHxM%j zY2wX-oi96nFV*-DH@^4(;>KcDU8!eON_F&#@UjRYn_y0G1tW9A+z9N}jQ}D>j1nRr zrA@F5>V^=1-r8NSEc`R6QXapBQBRue2BmD+GJh2;rvQRtvgI|3BWi3s1_(?Pj2X=8!US z5pJR0k9}DG`?=?CTwmeR=5kh0d-cV7T3>Cd-g3g$ddelik={AYeL2FajEW2U*?B!L zi9CWc+tnj@a`OZS!tT34oKwt$Ay4a59ggH%gexqKS^J_Ne)JIk?9!#um#Q@4dmWZr z))8>@-s1q<5FXAXyjVbPS|L%Di>wLBwVrXWFi81bU*k}`fnC#~(hAskB2^MKkeMk+ zwDs9L8ud9ZZK8YVTiATKGl1Q(7r}Dk97^co2a`;mYiRDfzQKN(Qi$a6G12*0a;{t` zRZ*;;J+%Rmf7$-+m&GAcI+^y_YKf|)df_#kjl%gHH1K3i!7=a9H|OK2Qh`6EVOi_T z=UtpHe_dmb9Xo)cf4w*dw9w~@z3I4p-{h+vtuJo1?HD@^ffm@F7ehQ`6Si3^?!K}@ zD!P2t{ab>U{ehA(@v_4LErsT($Min8ZdaQ$##>T^>ut3vidk!&C#0g^lXRC%P^i7J z*CTuy6UhVZ`-q70_&iQ!-FF^@lpLuF8jD2m67ehI11z)c=>*$g&kwK1AKx?di@xya zY6y_TBx@>KYdVqPuQ5GDkg!&jDU0wFbe&{+H?K9m0w4?}#pRMy!uHjGP~!g~$;T=u zZC@=Va7j2)vG8!ch_uFf>-yhK?Q%C>T|UD?-70ll7-x5fJa)p5{@pWo93sS_l8+^i zzi2CMtYN@ayf;O!H>+JBNNsG3%M}FJaw$9S8qZ2aV9^w02!$36Xwg2K@u!t&%4h0s zexDPTc80O13ZsI^7pFL_>Mjw7` zxzl%d?dOU&g9^_MB0J>*m)d%&RY-jvcKO_RQ@v~G_f>M;aIxf2qB-UEdP31jX$Y7H z6f)PQ(yJ68ts9&YVqeTQe4qk5$(iXdL6Vt#+%K-VCLd!hZZ$r2q?!Go&E@Y3SLWkA z*y*zXnk_$%jEqNKBq-TU2Ax*L-se$jNAK%3bojeKO!_aA4EW0=H_wsC@k@W0n6$Lr9w_PwOYYU$!X1u9nHx*`FU2L;zw3}0VUq_(27xJm)EvecwMUWq4= zzhQz@SaU~31w}K>HW*fPC0p?=PyMFCv4FSda!K@Ye*%<=RLpC;vxcG+Lq*;Zm>`5y z;DQ9aJOo8>7~{s5(VfZLcKp>FG?b7lJ|ezKvaIipVEUD6Tm?)hut$nk=ce+?%j5>q zRdn_Bd+3kI`x=y)A9;@WZk>As?ui^teaVoTNI871wRz(`g*lvEV5ch7s~~aINF5Wt z>%W>b3ocbp2p^8Gy5P~)DjtiEjK`s}0*DsI8d5l=E1vj?#*(o7NyR5s zu(KEt*1()(l)12q6O*b@n7_})X<7Kv)m+9XJeDl?W4nCD9qwlR!qTL6v*KWs=pE~E zG<0gRfM<;LbmDNDw56KH3hzDl>FR1mntD!EN{%+MJyh4%q90%tfUEd#i+=9y+~SZ8 zeCo6Vye%4A-mGlX`=~VeYcZH0rHeI-A3KVC$ zoRUVVDt?7@h;22#1MV}Uh}>Oqa=|7hq?}w+Vk^nHS|AL^cw9iVpoF;NVuYdF9XI5> zBK5e&OHh~92#xDFu1wvDfZ;{y2?C& zP-VD2m@fx1+l~~J<7m^{j0$xVO$Y~od8NnaH2^pIUX|-BL}?Rw>#v-3*YTRF{cpaL zVKDdmO?~kfs)Vu zq&G2631;AW-!X~w^~8#*Et#=rP70O6ue{flpfnS2zsF6xKU3@za-<5<8B05hC1^E{ z9uLfdXGyCo|A&RI)uQ6XWcPljc!j;yQfuPRVF<&VrW+R|r9X#s*Dp6*1B+g#aC;sc z7+duI9(51_j`W5ft4(-bZy)Fqp7V>T-b)-2g;NQfnDJ)GO34Ek7#o69uO+9<8XYp% zCpH|&>^-VTN;z6TTfexJ>Z@o)@g1|SD6%SF_P=VYj@%>!^B%K0w|o{M7bg7w(#p^O z(#i`|DEEG{GmwK8Kh?;9A8L{Sqq`P#E^-gYzzVCI~=UQ%H8Ly>$DSWy5 z8kjoE{NfFYoEWfMjJhtzdey6?Zf@~tv92MnlRYxI7=Fs8d6GY*PkD{>BLiLoQX9+X& za=e^W__zfpLFtzsr;;Vzn!}`pPU@OdC3rLxy@`U1*%!jfhy2ncLnll4g(?IYb?#ou zvQ$<2xrm-%aZxqZ&1#^zPMw8oZZ&>E*^bD<=qrhxuFfh>l?wZzIhytJWpWEJWDFkp zssk*w8FpT_%i|6hwPe4Ifvfoep_OqfTbZP^0cF7T!1wUUrs3t4J@eD_=O$F#B3-{5 zu0&rpTI+Q>Dy>_n``c%flb@DX81)KM9}6_qG0^ z0$ar``I`?6&R@_@lvccTV(XUqP;M&a0Jlo+t7Orn-xYl;?W`pqHLqIibGt^Ys#`Za z=RuPJ#LfPEcVhpD6r3mwBO2{oq_~*m`ozhOnaWm2{OjT6xYG*gg5X|Coj{*)!xmce z5)MEqoaq!+eA<{ntx#XrK6Kb$_3PIfJR>0#c_$(WeI;vg+FML2pW52W(%~|N?V4iGqY`r0yI>#=3(Yc6sOvQ-s8PUC&2x1*PVi z>C>)(y=w2%rq#d(oiI=>pG|cGlf-B7Dhl0yr=yyBwNLoV6oNNT7>s^$~LWUg98J?XPHy=ttV$1QZdK}I-msS!3#|9$l z{GlvNA|%+2u7irpXe=WWUn@mY+3U9OwQz`b@=@PZ+(rmSFGkX$-h9viWBKiF@P6If z;egz(#-md;Ix|BtM32|hVE=YHe>{^6_(@u-H845|I@Cv$kWOtKAd$_XD6!f%VmLK0 z&iWs;o^|~JZ=d@8w&lL)r4re!Ad!jKWnKAj??R~oU#Qf|w#O?q-3!{^*{NF_!Z+Az zjG{-i4VWDZ_V#DT&jadAe>=UGw?(=>nHCCEYjep?E9~Y``(;_oQZ9UoXg(@(uRD6! zx62HaeJ<4@J{JhzN#0!VWi_(i)WyBSD9&eSF8zEx$xFAD_rp$*SL`;|H0v3UjAO@P z@y#D=Pnf^h2NWGpVNuQg6{lYKtPz(~`oJ0OyIvO_^gcdbTz$|S?8N8Uzp^{#ddqv# zUp`v*oj6TH{;e-Dzs*I3TS=R>kDKcCcYM&5-ffvIiJp6W$-k^TrEWpl9J|#=6g#x8 zHX6$H{_K898&F@DA6^Jj= z@kw$vSr1!bN!Z)8HiEJ^m{e$rBr>4dTVyuEl%X3Vm zF(Cx&j>oOKXeL2sv2mmn8KcYhUlJMx|0R5pmyzEa1uc%bpKnww%8wQnQwQ|Yrxz#GM zm~jVL5L!381=FP5|6rIC%x_S(C%x4i*wA>^tXC6Lwzp>(HUAi-zW)7o)D5GQrM`e; z3!&mADz>ZvWPrjJ)#PtELzy+}u9^~EO|e|>?=dFvpR%=`}WRe+3-+pHpKM_a7ER#o&!6}~Bc31-(jqfED!^mu(8)hzZU z&9mm~uEU3-RzZu|dAHfZ=3_sF+M=?Zg=hpKm;L4Ot8g9by77Ao#Baw9PNnw#IHsg^ zj&gs>$ET|g5HQ#tl3FS4cykN5cAQfbTud^QXwAgErLpZ+-|7EJb^UfPnZW2@x!*zY zy(9Xm+TlDgF6`4TTV2%K>D#A(`a410Q|A_;N>uGr^`)KYmP;bUH2d*Rx@P*F<{KzO zQp3s)Re#m(QZT1+quzQ=BO<80G8oDvBaL>|;e&FL-FtPJ>lIz1W!RubN`W-(a^}tI zhMRZ(i{D)$(xX1~{(+hYL}Ge5GsF%};K;sA-=)QUFtM8!<^f{|)5^cy>-VMs6NJa~ z>rD&2|A*I_ zsa}cA)aRcU!0-W(x`^GQq;HR{BT1oYVszf9S%b)772o4pT<;!Kg9U$oAl$D9UTsN* zrw=ey@|JcK<%}9PLcaM{P9HB+%>F)2-;(E_ZFi)CYnlva{L+8aQxQ5OyWJHL&?_!V z93tCDUr9{)vKM`HYYr zW1w}(*?J7Jy1qH+JuLf-kC`Ko){fwI$CGM{Y({*kFU7OF&-2CKjqUN(-R8s7EttP& zhowwdyubafa}90~v{$Nh1azMG_O^e_(qYQNcd-rFhN+L8|nPDed0qN0dG<2(s zu3_aSAkn^1>-8BZ`OrhM|CDEg;+f}*H;(=zkkF<*ALTESaP-{ zW@}y0T|~GT=U)8bw52(_v6<5bkRiMI;ZsA=R_56#Gm@m`KgA57);cehQ9G$ZbhBR! z<_O}o9#sBtK~s%@IdcW`ih&~blz;qt_fl_v88<-c!BHtf!Z&SB)D&9fM8JDQ3i= zQ9>Yo=`PahzuDJxIl>fA$Raq6Om(P{yk#JlgZ`1t#WI+=0*x3_c<-ioEoc7wt_DU9 z)5IRD!31r_R(>5Dv&d_t@LrZQYj%IDUn#HU>gMd{5p&!~JsU(Tvr_{Utt6X}BtuFy zWTa+&OGM1MKPt4iCG#h|_v{m>a;{64M;{+WaS6x~dARz`&-lyV+09mI3(^2kvs0Af zSZU^-^ejVDs>AuNq@F{uLtOk}-t^~9XvI-^49F zZV2slH;%aPjOrX*sS_lbXKv=aX*xS_)0(oJ64Buaq_q-FKOJ3m0m%k)5 z1KGZ@6Ip8%p{b0$&@2S%CJa`et=T&J&b_M=pg7@{sDw)iQw=v6 zZ@Di{rFDu_3@M|R!gB^l%Zrvm3yEOSJZU=OqpRV7i@_&DArzcTk~r%wGB7VG=+|&( z4g_>=(L3{WJ>YAmgGeQH`_#=$>ahNEub4Gcn&4W|{S~Cd?LYo#nNCV)@8#F2mBF9o z%Kr9Piu7yJ@g6fnc3jPIYc;&}`i_AUvHU`@PAz#YKj&CDdDB;CrwsIW61KFh8Bi>B=S3g&d4Y$utsj={DXD}%%XtfxxXL)=z6pJ5i z--)X=kXXkTMoHd$Bio`e$@0YXqa5_}fIn*X_|@^zz|L|(PcV4rH${E!i>K-8%U|_< zKF|#3m9ngs3*jt&43&NQK68#IEiXU;foDC^osTp&1+fEto~xd|lh!grqmOX>>^<%E z((hDmaZe;#Q%YHUuz<8=r?wG`iK8)kQsIJK?qUYaW?8KX;{*5zjQ zl2OkJV}S}~!3(~2kBbrsqsgAKN+B0V#k4A3%B#&HL;-H8pO9MVSX+`&oG6Y-hGg>Q z4j@E@Aoi@OE5aL~P@m&#gWqHOwj=OOmq}WU9l7HzOqD2GnX+A7L~l>Y3h8G5#=5 z@D9i+41kcbzD5Dqe6Wn^*H8C;g+QbLn()a&)kz2IcVV7Xekae-*AR}PzQL~=l2PZU zU9Q`-sidR~d2jvR6~(kQM@2Tf(q4=>9lOnC<3h_9G!jhBZh~uz{aG6)z-EkYfA(5* z@2~pq*Z7N8D;$zFKL`hh((J9Gf??~;H=!i5M`$*krJ zH4C0KY*126u+=}IV=*~w3XBC0`ies)gP*IMIv?M|sZ8fA3GW^LqHYXYdUqrzWi;u4 zafW8D#Kiuj$$S~;5z29U%ek@9^0H1WQ0H#YN6iN7=PgZn-3BDf{;7RVCa(qmyEa}G zTjhHbmO4MRQKxYDX9Z9!@3@*?5B$b>ML#|LuXHnbPBlqRhrL{mMqoaiCdAP~d z@=vn$CkdnTCXX@v)@!v-zOnpjb`yBU=4i_K5OnP04%HJ3z~$ZDvSC{LwIWd2Uz+XG ze0DOlUkHI<&6=R2QkBmw6vh|$Qf*U}g^Dc2U!|UnM7NhV>-KAU*83u=cB(eI%QjbC zrU#r2`w9@>coxtDQ`#E3BMn_!Q1!OEkAGdJxboI7IOm0jp6|*Y=Md<~diXlPy6wjm z>&alQ?^;)jtl>#r(HuQjO-u$UV`1l2x#jMAaqrXSjXbea z8t|&hpc+!hfPbmIJzGrdKN$MqY#SQdIquaCi9nu;LCebz-c`B`+h1bm_=7`-B00lI z1UvA&IK_YLwc8@GU$&e1F!oM2(DTAIa>*F$i*NII+UUUhRxV6(p1XVx9>))Kpm{1^ z6Xz+!JbF{-?N7PEh6G#12*|QH4g_zvzsMwa=t0jEEo6N;D1CMD9@GY7dny5hmh~}v zvi|GT94?*BZtQF%q<;d`pr*7T!$fYKuSk26>+!14tmDHyQ&q{ndWDgxk{Op&>(C9; zIR1+hm_2@Ltgfd_O7*+Jv@>ov-r%$T48pXLz#AzR4T?fooKhXPpH7Vp?}M~vIv zX*1zU4K?M_O_>MniD1+LWmk{^^e27N$h(<^pd$sP4)#Er_*N|Igsv-C!4El_+7tOT z`nL;~ctKY%D}A=(Hy=;eW1mvLaOH(-`|5f}*A#^IRr}UNAhpdwhbbc)%k}|URo;AD zxoH`18Z2w7x`9RnL`!1U89@w&r;bkP~VX+ z*7K|Q|K0^3TPD)5Vm>#dRjyIVSLPI*@zZj*c=Sxgf( z6VXvovzaVSkFEkx-x5I2ovSQ@$rvR%5U_2Ob%#$UU^54HH5S^5zrauK)XwFMOq#)_Jz8d4eZwJPU2qCpcF|YNYNt3&{h0; zxO#WfEs?h#zB13>E6_WO{M0@_)xeIzMw8y}y%OqjiqW3>EXS=GNk$d|vx;^PReWDx z5&UUjD7fSsN~v7yBvY@8MNLz?l%u_m!N05Y4&^JWrZ7{%|)Oc}G|7vSz7ms>% z=4@F>T4gA<)Jj%iVA8C$n{@fIh<)E++l4}v>t#&yFxBDW+I^G2$(p06`#y(q} z=$&tsYj0qeM6Q@c1YcUsd>TY%Mx6()8@Q^%{E;f=>$++7)*F?gz7O&i6mmY6p631m z1+Du7u&S7!Su-GA!xDAvfPo{LYo7kUx6j!^$%^D^dvqBjC@U-mtH?Uxx3;{CbQZa| z#OD>a<^=iZX)tn|(!K`%MfJ0(489Z-IB8Sy)6OM!S`=<9k>RVMG@*FB6`FnPwj@vf z$}+Pqes$vHo`Nd~bm)c2grakjh*$6EH%(M$mf+HWXvf6}+-TOPf{ps;|CV*FTanm`8~a^7a;MtaiBruthVMM~jPMlyx5jqdrk?f2bxpk|F@wjC+jYvW+bWj$mIt_xtgJ3B{!Ah6rfpTb%U%_g z6T8~+{v28Tu~N56PauN}DR$uJsnFovk9T1`k*{C;{!cRWy>s{4j)wVcDLnVt88wnnhA%1ElzY5 z@^D`}`{~3}me5iGw@>a$3*lXWEMVojh|Xm1l-!P;(-$I*lB@J4R@nnp=I$&tFkoK^ zUdqB-kE6+A&0xTn*S)7?@u1d<17mu*G0BYM^$n4`Y=C2j{W`2HZ30EwJV)C!G?0tk zq+Hnx;c>Y97go1{h`{{3wm_JdyU0UAYQKsapX-eP0? zdO6+<11{>9vt8>PLt~rd%6)bV$NB&?6>i9mW7l2aW1Zp(z_W(ASBh_h+?y~eQ1(=r zj7t|IWX62H9dQih3y|sVqeZzS?H_r=ZjB0AOvPASOsYmF+0hv%=C996rB&QrHEj7M1L9G?wx|W^XyiB=<+du9?!%n zEo{{$uBBw44pt*)#+6r3ET!N4PQ6jwUmrfLc2snHq?W!%>d$mE&Dr`Sz|othZh9}; z3(yX7OG4WY)9ggU?r46X#`!;c>gLHZ zZ@ny`sodD+(Ccv@NDZ?WcB0uP2017lhfp~Dl>4u4O3{C(8c)p8Xflfd3j3~kJ)>zJ z7neE?zC^lgKQ;jh28P3TLs3*&y9M<1xN4Kb^7ig;dk<-zhOemWvw_2#;yG;c1mi4obZ$l{t^GsKZfn;B z2TLXHV8Hn1mkELLm#mp64hL0%oS)vQK3S&G#W%i;kfP%g0BGPL;r@1CWgc5S&4us+ zQc1bxcJ}(2xm=?HImO$0i)^RRojrpORZbv%$2K$(hlaHJn}hsJOB8eF@%NWT{hxfs zfuKgiA4}9fCG6}@yMC^0R>LV>-z`}`Wp7)udwSWCOev@CPr;@}0`I*%oEbqO(77K@ z9PYK@)Mb10rnwPZj7Qu*Cs{IEqXBvn>ZVjbR53@rC{-2UzgL|R;TrO`9O$8wz8V|& zc!(Hz7~^#KT#wJb5;4O$F^3g0n?c!It{4LsD(jvN2GmHx$33HOaQN>C>52_BO->+S zzdbsSrhlIq4cRpyT6wp6QZ+3PucZMXend4+gcBOaeQ%^5hmYG|H70T4dIP?SDWxl{vf-?e*at)ZDNl zouGHLc@b1in;AyIZ#D>@BNP<>dCh|^{rDaRDg2Fs3Hae+w3i8{a>0v)cF~1RKQD zq*ox&Yw7Bitl=+Rk@RJXS8NlM=k?AQC0IBO2W_h4n(tpcjRu1}K}z6e>DmbT{j)+ysG9*HpCW`Qm~ z8>TTlglc_G>sZR_jvo=iMRE2VF84#va`M!(6K02OG~XW??;JU9%N;yCe05J*5VJs! z3tLMYXJl{~^jOd4uRKXUVPA2EWIOeh{wsLS*=JmFjC`ZURm&#fTAuuG}Z^M~d|Kb!Vge}}2+iHi)J}IH!KPps(uCjde zeNSO5?F0FDVzNt4q{o;s@Fw*OuIUbO@rL)c6k4VD~pu;=Fj!7-qKH1E_axYTU=$ z4WOLAXDM+|rqrhSIawGk;d^i^??$fnnNMSQ&Yhh3gu!h@w z83|WQ=~%3_&xUW9m`AU~DTR|&HPfFpfLdz4cH|adt_UQ%l&K%p6mrn!9@1@t!ywTw zxiJn~SYk%It;@CU6y6;8MyXlAS|mq>|9rzMV;fYAdUTn1;}F5>OTQq$+E7nnyDi;w zwwjnwu_+itjrT^VzlwVuMANBy4F;^+tlg_wL4KFBUY6>iXxQ&er-{$R>llREt+u7Y z@mE+Rp4wL zAjgVzN5tdK<9h%#TDIW9e!1@xjln2E{h+dYf3X?UISz`j`&5XgO26CJkb@7ff@q)f zEV#*`K{*~8f=Ke-rfJ&6OWrZ-kR+Q}_}R}V1fHPM=ao5Obb(nePK>fnfQ&aHE_o&- zT1C^4@NF^2Sbeg`)uiI$Aujp(*-sN8i?AFe1n2x}GA$3Cg`;Sz24)L;{f%rZ2&3m2=;&DH+2#IAx&jLehOE=4WO}4OjT;KN$v{ zA@!%*W_W|!_r!$KB=_rF(Q*nou(xmWkJ-PWig<3n3yywVHvX&rg#-j0uom_0SE2Gm z!@W*j15q#>TWJndNoy6_2}<+?tq%MKwHoCS)ziD@Q!=X3CD(hxvU{SNHxD>@|Rc{i}%QYiq>hkpUZsHu(Z#f?m-CvfbE+Wi3I zhfYFIv6cbSeZry|J5`-ZC>Nf;9NTQG_2X@Lrl%Iy4*xathT@Vs0hMztUs7B&DEZVO zpPOX`Pw~RKToo)z{0E#dfyB;^@|A2i(Wx z?iW`fF9+qtkV&CgX#CmY!$kS0qB1`M?N=IOmY+k(IqyjfEUj8*pKFUN3{@)JC^`{)0xKwzFw%9yX zsk(lD)_#!sve^43#nUnwckSQ}ZNun`^@Szf?oqIYCuxIXwP-&bI$YfNSXyl;W>O z*@fY2R3cH-Lt?Y}Iu9mA2obgBGQa4y;I`2EN?OTyap(@Es~oCL zWuZ;z@l5fD`DIAJoIpQXq(O+TJR9~_w{}|8w?!VPhK`4D z2f3AO2DDz1S|a=gZt+-O) z$;H-|qM;&h4`~7l;)pmFqCzGe>#NH@k6!EwewMeECX^S9b|0AP)j<+F_FBuX&tt)r zc@cH+>CQ-wy@m{im!psHz5C2ONI)cp*^PI<`mmy=h(X%@X`t!caH>}t?bW-vh^pk_ z-=rkCJ;e&aK@OOXEY1LXwQf^#xBOny`s92JrEuFQ5~E^l&vJCK-^h05Y@(kg{HmF; zNA2Ct%3Pq|R$iI<8)F92a|?B=g9WZ~ti+UKYBfm7uvok@R(gy3qxNVrD-@bI4mSmC zm_YRg1?psgx91-hwf_2*VlZ+qWk(3TmVi?O*Y8~?p9uFw31N7=95_OjSgxHH|9qEV zKV~z&ovGI;?P-0w<@Lju5$2S^6kJ8og^QTIUd7W5nvb+6jIt-Vp3;V<)GAYr14a`| zLSC;v03XgzXSEW-q#&;Z4#iYiaex-3H;q~|yZy##(ftjIt!xjHo+B5jJ;Z zVUE8ucE`JRk~a;j+*uD`1W$aWc@$uIZMy{e%~6klkR=``+#GHBHEkhrx9%%AfFIuE zvD#0s43hcLsyr`nDw>G|s>~7B3m{!zVcMhD9V0~i;WlC6#y;QWTEiMU)+sK=%&FNA zf9u*K5nuFy3(L*4MWtM*5NeLL&=znPxp;|4f{q2a_Hk*3GOw zUt-OasF^!q^3&-QY~QhWsjwiwu&tTVrm|c<7p1$cKH1-z9c8&u=;)UhHA}108k&h>pY?KK?rsv=vmB!wY9Q!{++nUJ*n~xee;|$bXVO_s_UbBJ%P?~OXdUw zoS$Q;ZmLlg{`)VTARyf9y3&m~5R39TG{4sk)~X8JF{%bH%mUXhd-#f8(Hmkc34CLfoZ1gfK{D#ipTNKd6tjc9OSbr8P4=4uji6pA@?E=kg@$-Y* zcjhi}oP7*(c^50Hs4FucHC!Y|yn*h$-er7ropWEg7Y5>RB+j2QnfGX<2*c8lN&U1g z_&p5oc`_LW*ec3qFaC+tP}4Neu~beWAzXD9@c4h~xK zT=X9Q^-<^|@#ulfv7MWVYv&CUwUYz;t%3CF492hVD~_}<_V!xaRuP?n82|5xIEu-69 ziqJ~f?;w*~yGOkYYY>+R=Y(3Iw_r1My(~&aOxo73dd_g8|(IcqLe6r@7QZ+Fj}|FnG@P-J-ftDX151 z{MP=QPWOEoMdRyFJnIp0+%`}Pv9d(lZr1p8b~W+$NjcMNpAS|C!VK2fWxIUt1`W82!jcmJ(X+}w+;D9Z)&jF2h+fQo)J2UF? zyG#8&?4Cp!%+$&4>aOih@RvV@#4mX|xA>)WlY-`=-X&j|a2|dOrl{u0N!5+KR4nGO z+ze+`>>5=ZdOlnQCd{Py5;QoH#q8d^qcGa%lfRAdA1aPjPP;sOF~^YbeGFU?h1ATp z<_6x_!TVTeNLsGjqua)?3Q^bD3e!ebYrLvv)UExR=N2eo#*lfx7?Qm7OZ(w07{Ft^ zc%$vjJ+B|x7S?C2-Oq{BHn&#nZ)y&^-3$PKh`Rf-JBE3E8a=L9kAKGRe5*6ST$B+2jDDMpFz2dloR7lO^`L2OWVIAkleIh&82%-s852VMHRp6Kh(ra6(g)iV!EXXFE z4Ui?=dtG3PkKEztB!4TgT>;DH&!N~15Kdass)29A=zZ22s`CZ>TuX8w4qIm(FEAHg ze4P1NJ1^?+a*0dMixzTAXE2kzbAJe?51h(Jj!2&yG|dR6aAEZKZbE`o5+NH>%YF)c z+`KaDYDeO0WH{&-!wsVrjC7Z`Hg@}6HOTAR4@T$dtE6!fGvP2S4FA?&PQ62XdV58D z1XrKZ|4i?la8LqT&QeTEW>``&?f&KNn#W{Mj=Z=}s<-vbrP}9en)k*@m7wYKuHgV% z|JLmE-^rifj}?k#jC5@Tt-f|xt7W3mi}-E1*=HG{d`Ms7n=s^OK}<9D$Axrv8IELU zbI@krOYowt0e1%1@n<=Pjqt>XDy?qTJ?Un#_H8X6BUeA--b_HYU#b?Z2ct+1gjJ`%0Vy-?Oo)L7|)at~W^hCoN2Ud|@r!&XmlBPDU53vovGL+N@SQw!!= zKJQ7-56Cpirl_afcW)lPA32D>rk3s9@w#B{9-;N&XQ5MnHgS+Gm?2k(ILfHM(ozc7 zG3v~Ca^J<9@)1F;;$&*9AB*1B-W z7qH(-1P!L)ILsmDh2N-?{ygU2QgUgxMKd#`sp+gHi`!`End-{6N``XehZ4Eg z$rE%7U=X6zf&=+)YN+`kHbOby%}!sGl@#88d;bpi5B}pP0+fj1uj(RoTGb2LeXL#9 z-UKDboyuB+czp-jIcXF5ahtAgR|C2=d5|&V}$U`BzofHn!vPy?nd^A z(#MlL0Wq30gO{B^@UuP9p>m83Yj1p5EGR=2ZlfxIxkPVB1ws>-a}?fV8$Bmd9{gPH z574aJ^+kNaKi=R~!~=ZbgYGy-JUlesxAe_311muP+sv>c#%eRb&5)Jp_N! z1n+~+i>NovP{6nL)Hcb}i}oa)trzojPbe=*dLw{aqeZulrRr>y*dR9QSK0cu zBg)*J!UZ@1{-T)4>7EO<3M-N1DjNPoB2|fJVZa#ENSn9UwnuK3=(sL_W%5;sF#$2Z zq76~uM3oj=XT6^FjF!otT;cT(F0KXB(2?9v>46tW;l_8Q(^_69!Q-Yqk0z5?R7WeT zl1+0}UfUQQ!S7d&sX?tsKzEyfrS0DBfn;bWl*#~FQ&LHp9njYtR_+%%OZfCPA6=6m z*0?APgM7jwV%WN5j>N@0a|>8VeqOB5kmKj58`hW??tnNqI7D%o;T^wVojBmCVYIt$ zuH9|kC7<2)ZV%P~X`365?=i}mQCxUfLO{K7fL+QzvpjzkRU&9|(0qs?p6u+Lp@4N~ zxkUXwFH}O!w*Sg;xYOA7NF^MF3;PU}lP7F&A!#k*;FrtKq^i`~w)^i@A1g{vdzNn8 ze-zzfYE{cQF?T&SG<1^#l+lrt_IA)Rt0POLvnm1Wb936bzjALaqZ^E{hd}(I7kH^1GEY4nG9(&S$|Jd=8mijRm^6^w7tgb(Ej2X2{Ond4V2)&C+; z@9142Y?>o?=Xw(HH;J@E>ghprZWoYnq!KGiT~4cHofvfBZu2(#c|Ef?*&ij$K>SmA zx|p*!itTH)fZ{oQ-REN`t{9%?-}oG1bxPvb)v!P*uv=V%=1(WcEL!7 z(+&gnxSd`T4a~-nwZ$Mru-s3;e5>#i=bue<=3FrSM5j*lE3A30pODh_NC*!4A;L*d z`qmhvE-%U0p1jxse1NgUw@%R3rQkO91;8wF>FcY_d^_cqK+6HC zEh$7kwA*A~Zh!v;vQIN9PIXCNzP9wh^xxq`-D7gd?&bqW+Cs+x_nMvii_@%(hbe_~w}X)}Xx8l0v6tbpZ!S7YD;Dzc zmh1#S#e#V9;{wS_|5F1a+LEMg{hE$v<;`#EVuF>*gzvekY+9{q%0=R(x* zD6Bhuk_JIh5@Ue)Dqqf=)%atZ5ewLN?FxQw9s?*z@gb|u zT-|!Gv~2pt^BNxwrCWqtHN0&6DfQLaKD9)8=2~I2^w`#q$NfVVlFeaJ$KDS7fN)rW zrhXy>gI5_tkHFt?-DB`pPsujw_-pU?YO+s_G8#L1Rr)o^*Ne7#TM%PApUW)StD05q z_DAd;t1={`9gOPclNcL677iTopL^n%h~Y9z+07>;c&xG@yzN|42d|FMw7#zO`18K0 z5aq;xBE=k>8xMR(>BU64hjNknf*E8KEqUJR+)b{VnbIHY#QdFMGo(@A`saH;X3I~`&fX0#Kktvo?^xjB z?x(i@U>zEw(X-Y^B$u%N_-K|eXSo~^O1)_-T(}?8lV7R-R76qVr2*7xrewz{hI7|O zM2bNBH;!ZcJ#;NCTKTX6SX`(iv47i_sTmex_AuEHb$SY^VUF^B&bQ^l&Zg8<%}l%Vvgp z=8WK5Y29ynHojiDkE_sI2e?8-^z8y%*zAQQkR?7C2I}{6S7B}B>)<4}kQ`zkajV)A z{VW>!J}~y$^3#5)OU{m$AKt;YyqlD6sk@Vy9pEyQ+C9NjjuoqI-2+yufuCMqJ>O&x z_Dz2cRsT*%n~5vf+kGS3I#lg~aq-*EF#2e$KzuwPEbT!ZwV%4%>>pUrKfb77Jx^)s zgN-az7xv?4s-XeVnOWzt%B3=}`0uF zYZ4GGdse$67R^0v(mjYEd}ebz`L)FNOWb72DQhP-T#P---a?3>W>lTxR&h&MBTei} z+@|!J75(#s5w`WO>#%Eoh-HbmnWh-e(v$?DC~1J(k9=48NPIA2t}BM;iq}pVq>M}& zWy9hsMfexu3|iT+fjgV|{cGveSrVZKLEG+}qx|@y{2G+`<_5e;V+v9Fu#C&0*b;S0 za7}oKT`W{pXXlr#ZIsU|9p8i&w}q7+WiB{vbzyQ`=Q#YJr1W>hm$t4xJQZ~m5E6*@ z0`5y`Yyc!n#OuB0s(E3yy_T%ItI6#2F&78$e7Fjgc)=ku3{VXYcPS`&Iypq(pD|f4 zdOW1%`gz1Is$t_kB4|r%H!aQQ+^=YS?+ejQl`MgXH>Sj+h5HI{@>#JF6 z{LVHiT=9ZUw+y%4_PC^A|JhV8ZGC{PATcjLxSPftLUCY*sS~-eUO7w~s4gHcy_JVP z`(t{iS2y#R+TxDOqE4%zQ%vKK$n&OZGPQ1$dAN;)*HHEF~0eM^{(3+c=+<{NZM zkolFbo?;^iXZ!)2mX&R-zBf$D?QpMlNo%N89dpTjBY)@1NZLc?rAr&`P8UahJ9t`U zwkV-}*^oOK0p^_-Z)QeRMD`Dvrg12}s%nxaBH)tXodo}QebgWcS#_Jeuv z*I_0fg}UtsHB{dg+K}$~T`GGDxhv!1Cy!g=G4_)2zXgEf?c&<^!d)>tL(=lF=`clZ z%c}L!?P=DvB+92%R;xf)%UL2X+hl!_Z4}`)7~Per5W97YKOx6eMQQ9pP$SMq#)UZV zr~TY)0&HK|+bnvP>Yrv^*fp-_;xk8%D;UG@We;T5b@m}FjYn{)uDeTq_m!F?Jml-z zEdOH8GPWPq%7@_zace~=x!#(VvX1>Qq-)iIAth%maNvez`S0^+@VzBX33)5--4o68 zY3ebics9j|eBl1;40U`H;aVr|Zl2P-NcXoMm|=h@uvKrgunergwO46Hw&4AT`+EK3 z9w(b-s==X;0#P3X-Bstp4lH;5hA*Coo1Ym=&+ta(|aYh`DZ`qeX=9ch_6Kbdz&K)ti+a{0NR-(`l6x)}CU z_q-b5n(%mLY34?d4B}XjZkF zY5qqvQz{>uua@5~zt)mv{3+@g_cU8OmD7=3r%<(gq@x`elsN7vUnk;9i+^4>>s@_y z*CqJ4_Sq9KMBMHjAzXm!!Su+HAS;VZ6l?2t1o88ghB|&(?;U}GoStTrRZ|V+mFE0i z^`5SKVP$96OjPV22N~X#q;HjK`uUgCWw;LUsuf-w&Tz&i5f@~pc~!PA3X}7@_fyU! z{tZ2fw>|_74)V3|vsPN|&-njF$2DISVg;|4;7_@m(69lv z^~KjlM7>BnFRt&gJcguTRTR`4y{CS8Qj<5F3yACKKc4D;9ja3pMg+G0;4q`b+RU1P zHD$P$?KpDk(SY{sM9+bYV-|X}GE&X%s4JoCOe@@Nb@Mf8yTtt*uFmd)w0J~N2}+?* zfjwJY9#fEHln&MyV|)$EuD#PCUPb)Lneo}6cP5b-sk*gv@v*G(ow;g<>#4QmcW}#( z6L_Eob8sC2FoUbajX`!*D9@ZGtWW=2pz!ua258IReQaa$-kT|i{P={4(e;Cwoa3*p zwsOMxnk`0jW^QVylmppMNfUsAj-e|4?UMc}T0Lx;@@SPPnqaR19Vh01Xr3-Jjk{;N0E!4kv z=zeLLzUoX2FD52xgErbT8h~oCID#*}UV_VA8gb&$;bECb@h(BkR_O6SCm=TWFt}#VN|vBz1kR^r=uw z-hgLK&($P8S-)A0$&ai<$6**T6N!>O5#sxP#ty=cC4B zF}c{Q{r5oLZ=<;$3uPujUgnL6F?+nHglzGl0GVn)ITt1x8s?I-7GAHqxA*W>@#p7d z^S|El(NshBXjDq|#%?(jYXkv`UNl9NG<}FSQ!-gPTDRkJJ|2vL5xpq1$9Kj0*aOPs zqE_B|PL9HuV+3wsol?`&Vu}Qvs}pk~ds-%R>y#co$Ih|p%0Dna! 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 V1DT`k|A4Q<-vk}1`Pb=R{ttt|s?h)d literal 24606 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

B?bqT0^p8^?+U7erWIPkR-KF^Ct* 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 #include #include +#include +#include +#include +#include int main(int argc, char *argv[]) { @@ -19,6 +23,8 @@ int main(int argc, char *argv[]) BindableSubscription subscription(&user); SubscriptionWindow w; + // clazy:excludeall=lambda-in-connect + // when subscription is out of scope so is window // Initialize subscription data QRadioButton *monthly = w.findChild("btnMonthly"); @@ -49,9 +55,8 @@ int main(int argc, char *argv[]) }); QSpinBox *ageSpinBox = w.findChild("ageSpinBox"); - QObject::connect(ageSpinBox, &QSpinBox::valueChanged, [&](int value) { - user.setAge(value); - }); + QBindable ageBindable(ageSpinBox, "value"); + user.bindableAge().setBinding([ageBindable](){ return ageBindable.value();}); QLabel *priceDisplay = w.findChild("priceDisplay"); diff --git a/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc b/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc index 8d2a9a47..37e81485 100644 --- a/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc +++ b/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc @@ -4,6 +4,7 @@ /*! \title Qt Android Notifier \example platform/androidnotifier + \examplecategory {Mobile} \brief Demonstrates calling Java code from Qt in an Android application. \image androidnotifier.png diff --git a/examples/corelib/serialization/CMakeLists.txt b/examples/corelib/serialization/CMakeLists.txt index 7dd5d476..8f6d57eb 100644 --- a/examples/corelib/serialization/CMakeLists.txt +++ b/examples/corelib/serialization/CMakeLists.txt @@ -1,11 +1,10 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -qt_internal_add_example(cbordump) -qt_internal_add_example(convert) -qt_internal_add_example(savegame) -if(TARGET Qt6::Network AND TARGET Qt6::Widgets) - qt_internal_add_example(rsslisting) +if(NOT ANDROID) + qt_internal_add_example(cbordump) + qt_internal_add_example(convert) + qt_internal_add_example(savegame) endif() if(TARGET Qt6::Widgets) qt_internal_add_example(streambookmarks) diff --git a/examples/corelib/serialization/cbordump/CMakeLists.txt b/examples/corelib/serialization/cbordump/CMakeLists.txt index 813b02b9..77e4a601 100644 --- a/examples/corelib/serialization/cbordump/CMakeLists.txt +++ b/examples/corelib/serialization/cbordump/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(cbordump LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/corelib/serialization/cbordump/doc/images/cbordump.png b/examples/corelib/serialization/cbordump/doc/images/cbordump.png index 72232c1a95670a9df6bfaca62e8c2e00b64d4e8f..d951ff9b8f2d7023e447c846d1de79d871841fb0 100644 GIT binary patch literal 19325 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 G4*Y))<5I-{ literal 48004 zcmZ_0bx>Pj+wEPU#UW^D(F83H#kD|iC~hS{f#U8Cg(AVNcw0(vcemmWr7iC6?*46_ z^F8mpGiS~pFhdB*&c5Zk)>^-tQ04d1*ch)do;-PiEh__4ee&cP{K=E2252vVN76px ze*u25w~&xfwlFq+@`NGQCAL|<;~hzNdW~FojkB_HCq#lMgg7jK&yu`>@J)4qM$&3( zm3UmRd>EltTUW*+Rl_CsCFLe#9V1!*6v20edRZ+KdcYk-Y;jQ6B>H3a#PNb`ab$C_ z>?ZEBp@2}*d)dMu?l+fFASqDxtJoA9mQR(hPRT^04@0kGK+T>9I|47m3x=K;Alwsm zW+6Z5hpqV&7loG%H50=-={p_XqtdhxH7p;cEynd21bB$lqFqWV<^OAwL#^cGMdTuk zgY`{{PY`K=8crrD+a$#flf95gLK=oVBLV?3n!MDnI&KCPTe{*wLJ=**mW!(l84B}! z`5M~=s$()*7TbBDvkw~R22Zo`3vx`o zp=+KWH|lxkj9S-ZVb%ZCz8W(^M3*xuP4#o4!Qao(m{h7yg7^LXUDyi8{l1Aly|VE{ z3N9X^C1>4@Mv4{>nXRS>J(vMQfNn3Nk{Z)?AKnVt{NF8BjcCVxNxJ^v{(O90$Bcp>7fP~4uxXayx_&Mio$Z|<;PF^d4VNk# z&CczNW^LiK|GaKwQUgf+1%ZCoU@L<$tJ&Xl+=3~RG@I)dfp90au@uYoE;C^Jwx8N1S(>FYes#bR{e+(Vx z{pzQwFygOD+P>5{I~7P=#Z?|WKM`(OpkFwDyLSNJF0+H^o6S5li1@bbSk3tAowH5x z$Lt(&HkT;+VcwDVRX?~i`{@-cjpa62icYL-H2CS2vSr_EWM93{(WUgE44QA{+0k3| z$(>oKzjZ1{j=T*m7QoXB!iT3ob+$US2G=Oioh(?fScfPFOfHQZ2=_i+f0n-*NVN4i zrC}St)(&IS$rzvLIdby&zSYx2sK0UITN%m&w)D{mqdXNaF5NrYX?&O}89ANNPU;z1 zuN|qs?ec7Cy$ibDE7?0zLyyd9na{qQjbo9g&#AcMRimsR)~iP=fm7?|2dXo7pr*)W zX=G0tJkA!y5V&L_eWK|NFnqn-Z6a%JCsRCnpBSfNGW>qGxg1G{@6R>bE#xSs5f7#D zvK1B;MQCVf)MJzKOo}wskQ;MsOiVR~KMZg_c>b->t`oZDz0YIpyk69<5jrweD;lZt zqu5bAlOETy@zg&&YY}X_{&ZJZxiYbKeP}n)IYBSny6xqIv*8!7M|mH4<+Hk=s+XSs zpaXoi8{LUL-o7(de4B!vGYwyls)wbWiV9Azq1OAeRBkIq(fi94jS=CCS@4l$;c~R8 zKXJZey=3Dtv0gPEd@C3yK9m{U)E36?w0=5k*LpW>H;R-@J3c;6Ji?{rh;_Xk&{b5H z?9w=Wj{BhexWLQ>VBF&Bl%3pN!F&rv`pwsw7xP{RM+8bj4yxWqo?3d&{7K(0!$g#7 zi#$aueMBu1v+;G7PC6?tQB^4XI^1@fFXkWESgYbFm`Rst+GrnFr}befgtcilgwpqN z(I1t_3MUZ@gataBVXkgG28q^#I73pPm!#_i~7NO@~^9$GjcJ<#9J9G5_KKaF6M zXZmJjl7^$~l(vmgJBXvLqmlns5v|3jd=c|QH@nZ7L74i2;DbcM0JfsY%|F^c2Y7)s6Pf6vltgH-f|uL%6qU@LB9=vcy}Nh- zu5sJby1i3M0(Z0B(WGlA(8K1j0YBuy*HVejE4)u^cv@N!KbJ$Qh3*%Uth6R^tqX^0 zLhUqYmuOSD){YJ)z5MR}MC#YgwnUJ-*)8Eb-1Ct7L6#q^MwxJ(`>Id$=13_mj@;Z2dy|$NEPzthJALJs|lfQkrzw()KgE&amxf5+x-7CYf{nnSv>&Y^UePjg#u&9c*ulQe7# zD=;p)H+E)mFtw(92Dh;__It_u=OW2nqY5LAUyB>wULNf?F5H#u%+^;n;{-`0n{64K z+*VKMJ5hQc`Zu2bktc|?X46;AejYf0$5r3ly6v-`tPdYOxAQ$Abz4s{Yw$Ur>KWJ2 z)HJm|2xn`tkEc^~^x7>C+4-IEg_PehOShWw{>r90VP~Q=-3xgBEPcASk?6dz=c#?M zZf%L{ZfVPPzwp^VwS7Ckn>4G1mgX6+gXX=;(}PN-bP?N)?{4=8L%ATNxpjFLvCVIq z(x&77)=LjZ(k|5s%3$YnIc{HpKScu!b&e@a9N#A^cq=!4c-0^t_-w8ggqOv)x9H(r zCx78O;lwq0j_cvJ!lK$>T#OH_PNa!K%RCRaw&21^+ZFo5k(;^K`#)#yh01kwyc>H& zNOydX52R=J*H~<(28om!u+vN2Cic$Wem6vJ;e*L%tmoRl|FxyBH90wsR3WvsUtSnK z)8Lq}oWrOU@m;dh9~~^#Z=P2CE--etLiu2y``tBFx85<^>+Wn~PMXqZ^*!Gb3IQLGsW8F?Ok>yvjc3cyRNei(gd&4 z{qE~$Y#aAxk&@xo3p_T{b)pYfBXp*lxC0L-=?`_8Q3Czs4xMFkOyc8BP~nNIa;Su|1~%GixvMEOOf9|B?xR41p+4Sg5NI9da{CtNl3GK}_A$KkqT4;Zxt<^})s%9ENSx z>ab=o7-iRiJJ}5h)4n<{vF?&DaXkBcc|S8{zuND@G&jg*5E@?0GP`cOV(6b~ z&3LmzP3BYHmyd$o6a7$WN25sdxzsdV68B=3BgiGlA`_TEf^1`~mM)m9J``i8Lq zNA%X7Ab76Pt#-oiZpT2;88YAWgqpMKMnZeE8%J>W;~fcyQDC!M;C6Wr#m#hC9 z1Cj7J$T7&&X=B)h{)anKc!WESK9J$}fg!V|e)&-pYy6^|8P50HT%N85XLRfob=@4p z&Wc3?uTDRBzvVi!x~Y)6&hk6|15Iy>l)W@~O!wE<5Eyn{Y5uQFy89+%gm;hjtxG~7 zMvD}z2Bd~~)``y#M|{hS7MbqEeHOUHffR&AY5PqYhSb;C%rw}wTy?{6MwvuUdqrS< zO=V)tZuYz*t`|<8oZar{8u4z7`L^ zxB}MXB-9cic)wPu-Qr#E<4cxg!&bkFU+aEk6n^M)y_LJaSG!P?2Yh%%2y8BZ&cR>G zVeAWR3fAlhO+wSESSx3yR7Tm*Z!vQ3Cc|+rp*ywDrzPcV z^%qyQ$V0x?_a>@j+s>{*o4@aP?MQddul`K%++j%OM`;1qn;Mf!mbt#->BjsAPX>;x zx+=%)M)x!|V5YulpiSi=U0%r5uo~}b)k<>==9$Yaj(lirz@S_nQdk8+UW<6wH7*5{ z&K~tp+Ko~Kk04gr)kBgY72J07LIgOlRFKB6bC?H+0YMu0+Cv%Eb3W&0Kp-X36AF=z z>JbQhCE@Be>kuMYND?KXp8eWY0?lVbaDk)k`Kqk&&2A+zw^3ab0{>ZvFUVxMtsJD{ zOA=>OQnwuT+UACg?OMjKcG3v*Ch6iKMD(^Tn6U4K1mB$F0LwUQ$Jc|_hnBTaygjI2 zKF?(B=lVQ0vvySpJJV_WL(@4tOftFPj2Y6J6GKI}wdN#*RB_5DXrr&93 z9_gqk3iyV)ALNN96(#NGLpYMg8(-KRLpRFyQ2$4hbu3OC@$7-3yEU9is|4=5m7U}o zwm`@-S5?R9u1rjgd%UQD|&@a~j^yl#c#E^w2hy<5~mK zC;^%wy??~*S^|B<;)v9uXiOT``@Y}`;3_d|yAoLlN;BKrS^`LOC*|trF=-4UHAf`jveQ8RBYN2FXq;{Pbq zP$t5{SsON2LkZ~V2;hBzT6Co)4BUy?uT`-mEb`aoomm_6w3hK6M)N&%!C-NY0KLg~ z?-=b;3nC9%tt*Rpo8Rlp4Ylm7JXBk^RFgYPB*>KneKs9RYb0L|pc}iOyPXeu1|?M5 z8mHGy+I1ncZSfxaXv2*EhkQbGL}L@SZdE+ms&E&%pV`C$kqc2g;SO;Ul6H}=K|da~ ziL*_Q#MN>pd%N!VR_F|m)z`iMPt(b+2!t{}EPKSbaQf>6ZQ$WT=%2_U83Y<6Y=};A z*(LO1S&p_rXlm7lR?i^TbOoMh693o4E{Y6;Vrw6ZI|=zH?zW$iqR-?>;9qyrf^|n} zJU1+*sw>|AP@=0ddZjO&WX9C6I|QkcsY&3&2c8WpKa#jhgTgahWx;Fx39oO)Oj)~} zLr+!ys;R}4YZnbBX=6UB=YOaXaT&7kGc+xR8p~aL>!c*KfodN9#IBvMB6 zt`>r^cjkBvwCY9K;5*)BJB4cr`;>mA{Qv4qBc1G;n)>gq=Bh(Y(!J}3i*@u)?tE`t zvTZhIZZE&M>@PgXq)*BThJ%axw!U1pDop@|e_&oZMC8t9s(Vk1xpXkOLTc(R5S^fa zC6k#PdUiL8?R zB9THdoXtj~Any@pQqDE|KGe?a?wrP6t}E}viVjpNnJ+BuxH{V#P4x0aIGH>Z9R zjW#Pieh+glwry60MI%GJ(OolaP7l}KUv%;8b}E%to*f({lnBj_w?355->r3=9kuXZ zST?l|Jg9A@a);OBE-#1QXARt>i}*Ao#28at^)r>$J>0ZDRLZf^E!m70rAVTuG)7s- zvAcIxr{$~IFLnQn&6n2qIn%gU4rinD4xFUeu+1^?IB34Ge$N{vHnaPs7W6kgOHhTw zH!Cpx-07(br{}48nmmrxvmD;Gh&TlO-?HC!Skw>4Nv+8f1mdyx_ghMS6>O*{V@vx( z>a5->hr;c1X?K%9*4&{-KQ5W)J$G2Fc7Ud{Wv-7Zf{!&P)mmQHI;0f8rw2x`K!@^b z?=R~}3K*15O92^3WU0JkpXuzyCs2TQwO%wI)aR!AP79y@mN0eryiy0~$UmQVp0?f` zS#56TtL2IiwT^pNTWBz*7b~3O>csEG7%_*RZP8WM$b7hcX1a`3*|DD1HLC-*UdxHN zo1Smq7#J5c)w$gsIJ3QLaI8Jvk-HeC)T)0TZN85qm=jcJuDRBY`_P}D)j3;Lr#!>S z8V5|EX>y0z_5BXXomtjKt-6E#4|sM?Ru_ZD2K6phg|qrM+)lY?)BQg6NK?KorP2~t zO20B5){c#)Pmk<0ktNdFjg}!6#&bpQSAO5J<;S~fAI4n-jF~QuF&7%R z3k#NwivAQ|*Yr0F-RZimzhId=NY{G>CeqkXE9FVHznQ;CtIwt^c0r{aYri{M)7bZF zOlVwtfFG&8>V|S)5$POdBMW)He8Z`u=>AB3(2W;!pccHUyYF@2kEG;Ua@_ye3ai1R&^ z4o<kjPU~`$!D;5`gD=TOe(;*i+Y`H;6{F&y9amfVot`K`t-2K@ z3qz#cR$O(7&j!ovQ)%n{`;$^^+Yz7C`g6S+XHo0cddX&i&RQ$dgMr}w0!7o{;bL8_ zwGTF0`#5}6K{F3AL%Z=e^R`4K5);I>;fWj*rVm52=YpDb)rCweNSlP2vW#o#aKwjl zqab1F)kV`GNy;Pp{x`YFBoK@*?%Ol9rJ-zee}sY3J=;g0ZXHX$9twa``4O4~dZgLlKOgHbOMB-Q1@8QaKE2X5f9jzata0}8NLdIK=tG7Vk==)-Z8XA*jY3*9l$4kw8a9G4NHlL+ht4uu|e za63ZQKeW9JC)WQ-1EBa6l{tihm6zI_0${#815$w$|hUYqwlz;eYW^`QKfuq zK^qR+B?c2IJ#2_RSX7@}xH=dVGlUzEq!3fD*DN?>o>QyBeh~QM!CpaMid9|D$n|iU zuev?uS6jI84O$Z`|Bn9sSR2l#@gdE;(KL;}*7dCWz1?_weWI?$MAE=RbKCip=M1Od z%Z}t3-(2R=_mWPguNj?~67B3s$Gc`Vk2Z!@Z0-eHqEvXH##q!Pw*~#x5v7&5G&M(d zCoWCJIwRgY?}cnIYlmD-N_0*lDHnK;*2*iiZ=w2knbJ?(N5$^(z+MO3-Cf@{277|v zLBhmWU&M;t6F)#fAUXs-R18*#pnyaG_pD|Tw|p^|^eGG#xz~=#R@KBzX{iW|+aSpJ zlsAw8cMmGSm%qidY+@YS`I58+r4zqB@|N*>*eN|;Ds4B!yu8&3{`a{uKQrA4OZPqC5y;awIhEpGAzf^dew`=8IaKAE5qq z_i+PuVx=h@9(y(`*}vjkD0~L8IrI-vVJb*_3da`+_1KxNm`%W2^Ex?4@_jClMIkam zWx{176<+l{+nss~S=4u5dO=_dc-WuU+EuW`VD5{*{7pT?D0^8}8UxEZTCu$%Y2_2^ z((GEMq9n5mN9ISw_x#7jittmCiDz8Q`(B4uDXb$yG$9lBa&q8c%ycXdxQu463%@)l_( za2#MSXf^T?G`1f=rrH+2MV>_-5R~?f7?GZzXe2?B2RJ*P@Cv?GB^2ipbEF_H8oHl) zzZXCBRivdkxlpIvd_cF>c8<}Pcj2w?M00&D;W z^3+9xaEd{Np;&3* z)4$4~Z}ETQRN{9Ul}jC?qXW*ZHNg`AO4f&6YkxmM#LGttCU*D+hdJm&qeVB@|6^x4CsS;OLzQ3MmbuDeZ_Z&VT zzwlGKwdL5WQQ&z${TV0_BwHw&Vp!sT*X*;o*j(~Y>f(fN*^R9)=G^E*3Q_stDFRYB z7-QjIr{aHm^^m(w(zJiAz*LcA@1fPiI@uVhB}FMB6{@>5e$jR+rM{rbefdY8O=q95 zUP~Q^lbiq=xJE4%VK2B}m-&6eFc1UMgR-cg+v%%d(aeT1)bz7 zBEFS7taMLt9&_})#T5H`%+IkaI}cR8f8bSn#boxj4g04OfaQTHJhf_{jm1s`mFG!d z#43DcgW#Bf;Q01Zx-UL$JY=9f@hRdh_7X8@D{M);A_8OOfJ*888)^8MJlx$}XvMXFkoxGp zR+XV2uhjFKGWCK;R3mVx>C`@#_om5Xf?7?fZuMuofS(U8VO>cMKDA14p*j4 zlJqQ#q{%#L-Jp7~fIJ@SxrXXc78q9hZdnITWv@D)Lw&A%5-V{~yLiCe6b>Z|9Tz=P z%EjnlzIiWrwUaTi5Jz0oga}OpV7*BkJATq9 zZc{zHupE+x`LYF$VD=rXPcu!96|{oLp${tJQO`BFI00ej$H+4@!r;Tt=6FWIn|STd z{o6$lJhv5xnH@eNo=)wGXdvNdf#kf9bnoNPDe0J6NiVFoMy7JG{#sd-FcJIRa^s%V z2hA!U$GTo_uf6IC=76ylA1?x}(=;B06i3xaBuIq`s(YH?x`{c;gfzW(zx4AsS{Ho| zgW~Z9QXc?oUoP+ywTp)AxYpP?)mCD5MG%@(ZJdYgl{B|5VkKJCw-%^(LMf3fC><2D zF9^^VZNF{Yn(u^s`1*Q@{bR)}P3wGGG_ z1*sNsch^Py#(@qV$(dm;!NcIC(-^D|cAFg_tqYgbgAP-;c3JW?WibrJbUy zlsa~*HZ+tr9zBGeS*}q%ngbS(aco+KLnRvGt76i9hs7L$-98v6)= z#g#Olf0(GY(i&ichz3=-pN9u5#2EB+ef?w{Y}OuLgsMb){Be`sr+&X-XZCEuAYI1$ zoD4Af>1GkH?Qc79MQ6`8M>~L+OF7r``ICjh(M;(XYD?Q~ry4$789HfYHGubuFX$FL zX!?79zRKf3(8hztHN4Y!&@zKfAv75`!OxqIae7mJo78%n{k_oLXVmw!2{1fk6SWfu zkUQH$AxvOPy$^koFWyS$yv>jc&stJb5*}lf8fADIivrbEw~mcyI%v5`y=hO=2{R~vY=V!eNH-! ztlRG7Xs1q9x=4V3AI&H)escbA7+MbLIAQivKPv^vr_n{AxQ=?rA{lz-H#ApdDjHKT zI-ce2oY`Qq;WG?O)Ieg{os;#U%9Au6zE-{i&^?;dua^NEeYPOL-ptBk95C5RG*i^O zwjV=>B_L2#EqCr9>$VLfHUMXW~Pr?=$M}Xxd=NYZ6L(t#{Jb%OWr$z zY-~Jc$5T*`zB_Hp$D=iM;$^KM`*m+9<$%^4C(ZCx=g<=<z4?)aV zP;P)Wgl3Fx4%gG{Qe!gjHp_uo^+}RZw{Y|NL#(Z3`k_ZbzRzt#nPoZi*v_S%=eXKU zRzLv*D}2=y=vDu+zQ1%*362_3POcl4v_9XRqH`S1K9a}cOWwb$jdVM(7?h~l^Q^$sQ&td0W=}}}TG~0Bfp|0==%8{^eV#mvkU{H+ zTm1rAc8yOb0J*sO9iC7j$U~eRi+6{~e)FB50Td%->JS+O-QwIzYunh%VA1)OD24nGe ztw$^jA{XIpHYA%L+V9Axt%_oO6<=ydGQ|z#@P!ry8rmd^Ki`MfdG*~A zHf-nkqCWrUWB|{b>z|rV1N=Z~f)RO+;P$$FJd7`nvPXstDDmPggeBgw7|83yW7w{pBR_cVq){ z`JT5H%d^&ZCa!GNjELMMAH43OM9{*(lEjpLx8yK3v%4J+36jsxkiG z(Rt~Lq$gv4E3Gl{a;X1>uJZ8^#iP{%vH$oS;OV0i7|x?=5~B&DAgyHsL6Kj*z3Vt7 z8&q>X5Y1e2F-gj734)2f)#p!U7GPGY?N_A?en6-`Q;|?779-Luc(z{sNT7t~zQ80- z-eT1#1h9^h8RKZ-K~)rqSqWU>e^~0}bPz_#)i58B;S$YX3Rq0EfT6rtXIPkKCm}Bb z-|$;91j4B184Bq*-sLZs{n;toPm{R-j<6o3^ojMz3J(m|E@78%UrRFh;n>dz&{d1Q zA>rmv+?JEyasF%jegohv=3rJ z(XDC#v~*eRNTBb_*~UXcB&tHq)opTJk&dyiuv9}?pa#I=wEXQ1%z~CoMG3yuj@#P} zQMWIsxHX0#$o3aN-0KWO)D8nbmcARKs)wr+i1YBGVm()7I0iT|xi z-S7c`b8OvA4J=6y7hM`zR+f-#&qTo(25i0NoWbB6yMkl1J;}X%5j8|^k{!M z*m(P2{yuW~nQPy`%icc{44_|IzHm>6;hN->NsY zMF}0t__zTGXDssCp2*0OQbu86MOEo2{_LN~)}hJ8*NT;GMPCekadl%ufmiSSp)ihj zSWD}^|5T)PxIb32sWB&N4_l+dazHu=vcNw8qGYq-3}k8rp{z&^1(P6#4#^)Gj{jS$ zi-)^-qmrn0T48pmLoJGWP6-Wz*|hj1aj&9Jzk9PmjZ<5s(MHt~3VZR^jOosQZ&qnr z&d+>H}@ieR5zuzKDRc4X4E=Fr^f?J3^Qibf>k$HpBtx<5vh`|MY6P z5KP+?2!e7OX1npEHGcSD$c;f+!hrSnvVN)QC==v@-r=~adxf4Y91doyX)1oBmNV&* zf__|G0hx0p+W=hF{`?2RAM9%*JEg5ZPP}@=7CHh?wtmL(Da?b#5%}4QB9DfeWKvK^ zc*c%*n^PU980!FlSJ^x>*gt%fo&y$;BuPZW$E)Kt(=K+udvAhkZC-cHB5gxWP`dAR zzQ*YPlGF%XM^H*_%>PJg9iBiu#=zNc{7%*w6z9g%l;=xLQk^kisrSU=AaxjL6M_h3 z=MhF5_#aVi7`B~ZK=#~UX82XS)?dow{yI!}m3gd&bR2GQStqi6Luno$KWhG~sxi=z zPVb=jAy}`B#$Tm^bkS7OVUBe_|IoU{y0LmtXblr0<;p*Gvs`Ah0_txsij+W()$x}k z?g$i!*Z~af&fD2x<6l+Z0S9J-Q6QmQyC<|Lsnn_m=b%GR;+~p0AUWR{ z7CKRwX!g3uidXpyKDg;}KvZ#f2myAQD%qEN>fuA2%!jJz1@KO2P5DR=Sl_(oq~rQC zRmX799bO886B3wb25iY}x4m!G#ZNzDw!HwuKZ1js&!?HTf|L>BpX=WkWdY{d{;%h_ zMdcL!?H=d=omdt63To(X0#Tks9St@hrpu`tk!an7(KH+tuf&w0;LTaPE8df{506}2=Bw^GcOw%uIj}WAOSo$lYT`k{M z5Pai!9GN!L)PE%B!J~9AQWb+~`aeOTmY2<9|CPZ#idZ(k{l@X~UjsLa#{h7a$*{O&^9MyeIDOQ(_uTN>>a{% z&CI?Jgjnl_g*f3L$Me!~Ca zVyU2a>Eq~2V}93~`BwtYc?rD)CeV%5j1Y@3o9qwb`QGE0v;Q>*x)Y2caPJs34f(syx&}W_i{WSemcvbhYz!uo_DzC$M4zggaAaXxB=5&vNH_xm4*(vpsRv)xB(vcJ!3P1{S;8R z1;3CTF_TZqzMW~S*k@#M;y+hl{RZKSR4a)_#f!yZtTrdb3&xEPCL(41hN@q-QcEPh z%txVfTbw_e`Ew;oaNiz?Omp{oev@eg!(ioJRM6l&q-rdUtDUANV4tVNP($<{FHB~w zBcbxrQvI>6ig$NKk`cp*HB{@&2@Knn7*HU=vb5lLP!%{$=m!oldxk88wlb}hj_8;P z8fT5+P2M6j%-;Yn78|Lz>vq_NI#cfW$_PIj6_5G;{C22ACf}!Rc_5#;GbeBZ@dkeg z&j5|3h{%1YzLRsD`j7izs#7qETjF1-Djy)J@laEzEb-1gmpx;UKVj(qCz8JyAc-%? zuMVq!M2>3#g0fMDGeI_a@%?G2H&ZZa3Q6)T85HyD40Y#i&DW*MZ$ivSI2Im$+EgG9eW|?ygk3T)@s>_D`nOxymk#ol_TEs z=Yp1C-A(K(2Gin!4nG#tgDwGIK!wCHdAdi``xDJUMwiq^$K%lhwAd&>y2-}0S0iqb-R#UsaggDtRwFjBL5cdVoa2i0abXOfXG;lWPkU{mhM}9Y> z(Y~LELYGj+R~=(N`TZ6{opMN4MRjlnIDkn)QJPg_mv&G66E^S5r4XKc!T1kO-Z0#r zHU7Wn?#a*b#CkbEaKgl<>+QmGUyvGF9TAhJ_CB>FWfT20%~HAtQGG@R+p6HQQ!OBi zKFk}TT}650OqR2Y)uJSUkb$!69SJ+V2HgKg0-M(ReSg|UN{7@KUHunCtWiAjKCkI z>wMiFkq0IQ!Tj1ciJiCpbU}5smCHnDAaI1Lp^GCB>ov|dd+Gi|Z{=nCb}4eYGci)r zk(?x3*ywif!`YJQdO5dZneQ=iu=<-5=@WgJy+U%Det@4-3>eR^TFivU5_g@Jg22;9 z$hQKAuc)qv1$LOfbBQB@#Th9}zF7dP|F$=t5~#DGF7+#B?%8U&?*&X?-~EeG|5Iew z`-opWR#+Gu?=8$TS?2YB?B?LJ!?pHPuGeeOuotlCCx+65p+b^SC0L6&Zsk980=i_2 zQoDFGLZ8LS+0T!%oqHPCGBezR1v#GC0>>pnnXVN{SH+gWJ!L`?5m?lJ9*ZmACPDp4 zPe(UY0QZdz!P<&2U}m5z13QEGqPB2T{E@YknU_0}IQ zz6F#>F<3c>6PDI%Bi;*oW6bb)3ZrE7B`@xO>gZeeaLc!g|5Zo#34uB~b9uB<>;nV= zz8weHMv*OLl=aaFep@5+FZY#E866zP-F0j&m+iLZB$}UuuZ)X7RCC6zMTcl(Qd?kU zR4~t=F9B=51TiUo_`F5Lou)Eya?#S_f7j4McA6BnRSU@LP-r~YqcDwp+&r|hlZQ~o zmUw6nI@YN5;r6$)LB17>p8|L4jFrG|GWR}taBNKv=CsyV$$kxxLBR`Azq#VMB6I&? ztE-}YIRkU5M0Bg-^_D?n-+b(iY^5zNPiFXc8~TlU)oYCSn(zZ~01YNVgG*WRVW=bN zAfYD9r!KBdxffvmzvVSNyEpOt{;BMd0HHI@n`}7hCXHVoSJsnC!%F%TuoaN}fnisT z(>&go^Hd^e3h){9GYbY!9#by=CmwGf@sQTrHMY5*Vqc0PL9B~}1XN_@!YxP;>TJSntRnN z8Q=a=-!mqrYI*~@Pk_6W2p{Z<*{l1g?{{~`9f(zmXDZ^6ipiRN3!LmJaJU63^)$^S zf?=BG&5XfUiQf7QgVjAyc_Xk>+3ZUfOd{)HKnX9?JG6-Br;)YIQ4l>f!oTvD9@`wv z+*`6C6%sKEZ>85nqe+Z^fOSzB?LIo799T4SY9_so_rZgeTZN?cPv4zVH-(1jISp~2 z|5|@KD(rsvQ68}o6?uZk(X;RY7!& zseIuvc;4)9^0YrL{j)mK`63cRytDRSs)0cMy7 zzkvR{=Wma6N<@3pcdRanPc9*(mW@zhT*hpRJT&!M(*kna;#gd*5~>e~?L~wl>}iHr zr~ounMg=YQsX@#8PrLM@SD})5FR@6JSr$TF^YE!3f|p2<3UDki%LnzLQ#^#az5g0A z^vQAn0s%e76Hhyhhm!_BAcB>Bl^TVV#_5RcszQ^gjY4wOoCR51s`~7SO7YTR!*%B2 z(_$#$Cjm~(mYaQ!jF@=Zh(*A18%IXMz*o9X`mu$QU6d*cc0c845;o~ZHOGbTPXB5O z_i|h&8RPp%#;B zwde{B2)cxZtq#%qqyc9L%VkidzQU>cC?zI2B374-DNuSeYD5l=ay{x7xIOIH)Be_oMUJmXD<_3Qz(g46%+w_O3)7Fmzn>?- zONvZ!7l|ln1tq`vGX_{)f#$oQJ(>$#!?9c?%2%O4EEV-H1Xl~vO(r*wBaY}s=?K!& zbJ5slTg~Ywm23bE1*SM`QaW7&rv8e}&jXHWad`SP6*nHUO|t*-6vkF{B@1Q2Z2Hz} z>&jes#UB-d(?2)x%s7zIr3}9aW_m;C0dS^Hz6XXa(9oN$pQ@T3U&IlrRF6B@R;n{U zeCgy%-jv z%fj|=3EXOL{$sSh8>lGmk=Q(O5GgYyaI^>;FYb~;Di7qi`XugcuP^VMbNpV1MRKy6_m;T~M#}u4tpA7xjoX`w@)pCrTP8t+Iga*9WQnd4;B!z%AKqOo z)RKt@t`(NHSayL=?-F%w%S{LaKf1MZ#@%GD=OKXqCJ?O6U3~l!P+omGWF>vFj&-VQ z4j$B6>FGDyyI zqz+g_xEo$R3QkiT3KxPriBFNyOH#MgVaAs`0w-st6uZ~!9I5%q?{w|nSjE=|cUGI6Z zZ$nh7{>~Gy4*UzWYdQ`v*=m4O(e&SkLwDzYFZ`DUXmMX)i;~DHR!rj|E`~C8acqh% z7uhYejQbtXcY7jj{{QyowoHVoH%BSm_J*31yTc!Z^rr$=@genyGWzIqRuq!Yj)p(g zMW+5^Af&%CLdkU(nnF@3HyN^yLlJ;=pgm;cw|jT(*g&UX=wb2)%tpdph4v){;658Zn!nb%h{t&E2&OkJ z4pRIm6NDDf8g8cJTtEuJkmSQk-W598(b>qohP;LmVnRARs? zKGHL4d&LU(Mee_RD%^L~;u8y2Vu;hthUD0nbR6m6p2o+7MZ<@}wzE2sDc8f({tG5h z&4kYswZy*;QBEy-QI1GV^TPggFW^$9eTBYRlU{3ppk%Rz_QwQ>);<|wtfqcOj|Kq+ zQT&P278-F>eT^F~LK^XUH$%inRA+7kAj)awfqyp9Jiz!z#Hif*bmvNM;E&HkMGt;d zO*U&dP_oN^reu*C)ZGH4j~}g>g*-ox6LoRP8sp!IoA zx)Y-lN_%&m@uc^lX!{0&^+1pJC_yc@%`n0#K!|1VIiflcjLF|G14z?49UOeF-YGdg zsG2WB&ie#CXqr$F&y_+&;38m1V3GB8c%>7cN0fWU(2+8D-7)6-%Tf9F9oe}pA{~}g ztkNUtNke+7?zjDixc}gr232~pIxwM+@`#ihq}QIuGOO#8*2Pi2wE%7?>8Hq7c6_a2 zqYUe8>m);~)2hByux8$yh3<2(X%AxK2r!RX(J0-5tZ3a1o^ie7t#*^X%^c597)p>A z2mXWSP6lf?l!moVs4kGMJ=T{n2x25m@)YpmM6(6{n%?g85vY4mb%ub4mV_UOiz4D^ ztHQXPqM5lIE~^Atre3=-kJsd0(?h<4xSM&HpFUagc1j-d7iqE$+iYE?N@~)0#)5V1 z4*hmTA;JdEm9mWKXDsNvp;p+b@P!1;&qKpo@&gb`(#Ej~d=(PxZdS=#bYa?S*!L?jvR6F(#)m{W+#q zXv=jur~u7}H--%ABMUr)OxbJQ58~>f-$#nO+O$~55AgB@elW1<%Dgfx7wAtfoaLpr z-DpL>Ia*3$Saq8A9ZKg8#<&R3MiLMaF*{Lk>c+8&XY{odJXH?MPy~R8EFQJu8HL!% z&eJ}ZKb#M!NsvS^AQd1XY)Rz5f6cu7fTAHMANR%0BRq#fQPCd5KHfrimcoG}w|+NK zjRIR&$h%$=`Br${b{4RXAAIS?Q^JXQGZVc)AB7uq@+|SyEpaiAmrHtq#~qOBj$mr% z>GE_Qhk`Gb`nprgFX#}j*FzOUdcWb$6BdlE zQ1zvTPzY887sfeMw3N)p)oto%$tO!itGzBs+Ent51q=ci{t74hqmJ-XVHAX0*BJab ztG=;grmH^3L9TUcV$P4Jf{J=$F?{q6NGgc+%AnW>Qk?;=mJDi6=^a7qP%ex)KIYqsG-%A7HNg*mhj93@&cFIh0B_b3I3_O&J;+isT(+=WP zx^33ccq7ztKE#M3=A87JFP*p1baz-BTM7TecaK@!=5|RkwnHC(C0%4p)RGU}FzOw& z092#IKVmmW|Fc6Gb1Dm2uZMU6U| z?>!A1>0COkWc!NUM2Me5glBj4CYu(pm!5A1KkZSZ`DD!29$QHcxo#N_tE`VAfs0=N zZcuC+ISJ2t;a2DuXWn3vg{GbY$n!d0EGwz>6$tBu|8MG85Kza%ntf(DBDY5#7vofr zW{Ypb4eA{QRbwL7M~gmW=7gUdZu; zl{<@)EfU)L&EbOzihSx1crzD7T!uBEL086k3USO5eJou69|jrTgBB6ri~r6qL)>uz z{9i&WNy4Q6%^?5Eb1QCWcBfU1+i>C_Vs%PZkRf6p7X#?VlX{Br*lp28(nTe#5KDj0 zU=9hBG(Cj|=rd`{fOet3Id)oDB(Att&xRz<7aa&4UsCJ78)w{_l#_$0B$w?BbC=(< zySzgNl|nuaNf{EJ3kXnIL02-J{^{5qZBB7iLDCW?dprSZkPg&b$AFJk0a|hv!J;`z z?>%u%J#IcsY!x!#Apg|H=gs7o-Scluzf!e1+xzcx=30!PI2Ji(v7jY<1JDO`=L})w zi?)Duk$_1+BWFYYt%4vKvHNvu6nAI4+&W&eoy$!4LjJ@LXE!Zojr> zK93@}Jd%Vi%=S$|!u_L(0{zRh72Oup5xUn#h4qmMV#acMaN+=W6FEIQcnn#?BZIz( z)89GMsU7@l>wAPLD?upMYxW~=bS4y`v(cA{t#=f|yBK0u!cku@PB(qlWrlV_eEez! z>sk?*r2fO`#D2hwwc%m&oiM4t`rtd3R9*0t_)4R6SY`IAUGjrWk2#*?-Ad>)yMt5c zi%m*`muDkPqEa5FI)RSgI{6OD8n5(_^G++FdUYkoc>ZDhb2`~R}d zJtvO;KejoJ8zgvmDoi!hX#>6Z;uXbSbey9o<{8Ih@Zdsr_He@mngAT9s-`ai;A4{4 zQ_lpZw8a=>t_y9o6>^>LBusr~8`D%~C%D%dO^IPbc)FQp(ut!M)={P&sC?Ec#<4nI zMuQnv6M}&YrSE=B=tSxm=X~S$Lp>5Z)4W0HUjs_GdU$U#Q~iX@fu1xs2K>j4pySR0 z!lyv<#BtZ5@*V#B8pX4`?E3Lbdb_DgC+@p?i0UqXk+?HKq!KL7H$eGE<+ECr`q>=* zh|%NKLT5bVtaUB4l(Y=Uujl%V{=+#(o-K12Wcp=vJtpW)LJqlK?v8DB-hg)Z$s=ji z6GOZmb9K2M@8=dHMz&UW?o^RT{(=oEsP{Q`u*`z)0_hxA75*-jLpc;oidE$Y3D!5v z+UX|aXC^lAqat6Lb}9*HPPMdHEt;C~ccK3@!K=6QQCA7EINjo=1wx{Tn} zQTPtFGHSmTWS7*!D&x2f6RW%Nu^KyXA%|vEPD5QCvHy&ZR+(axhD=Y@2K_E~(JB5K zXj1;Ap2D!sAL=+Vj=oMrkD(BCy3#FQYc%-ZEVQxI(*MaqqjQC=n+B^nhltf>9gVy1 zKYF|PFAXj3b<0wdKvkBQYi{ZI6<%vdfAtIVxEcW%6c{jUb-tEjGe(Y5k%FSzSt31I z29Ji`39zCFJV_Xz;pNpx2Aw`zskU!^#w$(&NO^5vfRrbZ^+AB#qrFFj@O>N@N2mKH z!Rzt5$Ok`o8i+iuVCdn&gXOfJWfsFEq1?|BF}n=)IY+>Vn~#1VY|}jQp-5q>SkgoK z9G}}zpcvXnDw3#CIZX-oD{*;fuh?@)5FG@RWw}8_YKdGC2sdiQttcx;*prS8tSAW* z$-0#4ZpC!07B%jcesLa_4w{vc6|7+Wz>BOAarRR>yhWui zO-f@2X)prFL6O(LOq_41^^#NICEJi|z*o@hsS0rOe1b zN~_1z?oV-&D%-1&eDO&s!oGH0p-+j?F61eDDk~#3MlRXH@2ys*zd9#idK1E0e-Mb! z9MMCA90pNS6m57}kPI~^d?Nb4$mu&WGype0CbCS2-GQ)&xcb#KP-7nlJU-)zo5v~> z&0o4S&Z#mD)i?n)IDh>h=&5}UQ~ z0Ni-NL;l=oVW|}+GA4<0LM!?n8vdai#i_X<*skhJ-$=3F{GbK3MLt41!Chn*2jBmT zpo_2&U?~v||C@*I{2%yvV1hd>)*B=-eNn=QoVE1qax`e#Pp9Gn``9o7vs;qa#R6r4 zuKy5t1E&9PDq1W(4zeuk_$L>%;ly&&YG#_n6~nv3?*9`x|BvK)+3w-*vI5XdJwhtk za;KD}#FpA4Xct~7kTEuI`0AERo2nwa$Evibs3A|$nxs9by9lZ#9jWN^^!*HPx#q<$ zEzl3_Sjy}GuURMM=G5k)hdeRRgA6{cc3r8z3*qKA(>djr)}c$Wo=VCqxs-*}VZj$Z ztIC`DTP>u5e7mt1asN!GD*V;d77bS{9*rD24aWJOgD{T~DeqJme%Ne_KZsM+pA&E?*~n_92WJ}WF4 z9tNQHqQG$Lpk3%{)?{2|W$?qL1YV)YjTmwfvC}BW-nce`%U8`_Z++s~EI0_++gx1S zNrGr7Uu>remkg+18^1`NyZ~9|WR1FC(vn@Wq_BAXN8_;sOGDNO>)Z5=e-YG;PI( za!6}>&KoD`PTtN>mKv9To9FHyPy$j$0F*Us+1=FP(X2lQ5}7Y=p&dU+z{-$Ca9{^m}8uiO5t`3-1^-* zDvwW%74iYuB73#u6^FoD_xdR?i%u^VINEx#pnVbZJOF^0j7Ga6UQO8sJl@xsYyn|- zDPgU;6mh85T$6S~E<#mxI~oix%811HvPiJ4RDu!A4lN;M)mSufR_C< zV>Dg9IicwrU%v_iBq2{R1vkxYQdL<8EtS4FGMTa=F!h)bcLYbCSEydY3RHI)vKFC&|nWyKFbeyio7s_~Rc(?82gxgKNK5KW2u5GJ< z?G4^jwumEKurV)!KBk_tadkJGDMigpgMBiTx@q7e0&)4_%~A4Oq!Ept*sIelBp6Dw{Pd*Q7q>|I=~v1zFW&ju^W@g? z<`3iuQ@CX?GQ=jlcy_)+C-0LIhJ33<;R6P?gpB`)MZLPs)3cJe>P)Q-B~C$tOzq_Oi;a(!f|pkRcf52c)FrAc)+d9I zYPNJI^Gv=oB?3dM`TAGtrp?lO_QjO3s6(}&drg(-GZGTlta5dPV&0y%Wv)J(;2BU&;yJunU#wzyU^BY#CCs|FiTQTQpJjHgzcANww=y*9I=nR%w{*nkGENxmJN z0E4Ydy|Rj>vB%(7<#&Z<)2<5MiSF$XZ#8!@I;NoE!vo3%O9puAGo`FjWKq4pgKU8S z5=l#sE)39@dW;jAtVFY*$WP(ft)x$Gv;8>E`3?BAyBHxKdfZb30lGJoL<#%3Wr)Jc zxKhe$!36gP(WMk=s6~^GD<@R`m(FxHnT0^m5bHBCiNG2+jy2Dfa5w_6@0oyfyb;w_ zdf#vzt3ecVx!uTPSr4#Kg6hp@jMj*&z>ACc%fh)_=d6ne9OjiVtpTG%_@&Zg=6GrQWu z-U1=@O87|#ECu}$e&$Y#K{J(h;=6symX}m7ZBsrNaUqh!UT#n`^(J^tL2gU}9O4lh z&;ha|_b@MoQDC6sQ-vTY#>8z0jqDm!y~IBcfmDbRfY0ZGa!1<5E)ONdURBD`_%n~N zhukdGx?mfY=1s%3ZEU$TAMsM1!KDHP!?Ca)OPCN2gsoL_T&8skpn@MUb)02*Ui0ifxSZ&mWy!3#yz!q6JGl0Izp7 zQ8f2(qL=8i*_-qvjUZSov!x>B4IW_NZpu(G+=pwv20SYxeS)J)&~PUI+DyM(LTn#i ziV%>+A?y3(E6m}iio!^MT+olt$c6ztnjUJ|Way-fCEnnrPr8blN)detkq& zSZ1U+6a=5TeMm2Tc=(4W1^|Qh&P)Xb1hX*XqCycAo3W%98$=vgc&}qyQ?G8Ik-&!Z zn>~uUHd9p>Y`%@kLBs3bS3|@MR8tpzrtP>3ptCC{}Ud;UaVefXHEh{emQfVq6 zhqJi1Ppw#gX+5nTMj>?0!9=LCaPI_6e#C?EHI`z@gI6-huVP3xwUDc~o>nM9A5&xH z%`V^%WK*&A^VGzM+^s6LJ+ZyDnybtcocDhKcvW(FoDbQzwbipgARZS5uPT1(d%&&M z?;l6c?AZs&3dlj-N5SMw7p}%QBd@S862x7Z$*I<;rvA=*r$(tFiG(F4`Kfw}!C$E5 zTT$f1boMzqB33;w>?&JHC_RrF(`2n*y>i2JVraajiSY&6S>2HoS| z9!WS=|KWec%F?kq`^XxxzpJ)dPjJkddzAL_2v4Pi3w-n~_6h-b+9XRd;dhs0>N5a7{9~Or$yy012t8*9Y+o+z4vq$! z5G7V1>xb1SJ=y#2Y}^p0B86#*Yjrs?G4B8ZG0pHJ-!k&ArKj{C-uan#_JDX5WXa%q zweU(bpebnKZ1-w&s>0KQ%8h%?cqmR?VvvsMiP0$M>eozaWRBW#o>Bs1K-cRHCEoEp zi!km9q5$IM-WydX37oBbBFNOiNV4BdQS;mv!FaoYq6k(UnCA!O;uAI~@xu=hBsDCN-;cJ>W01XuYfma1!`KPvT4%0J7I){_ug9=%jnHH^@m(%p&my{i4W= z<80sLztF7PnTr{@zi>_?+Yn>S<3mWuUWPL*CEPKe$m7I7LQ-cIdk+>` zNZh7BaP6Vjt01n&%L%J)!VXI6*Mzi;#O1EP&#Orrn!pEv9u9J*PS>+9<^Q(S@|Qm) zAl=~F*p=bkw!@2$0AyE#jbgu74-nR_za);=T?QcmB^5NuNpN$IakwT{$4e`Vd5I!J zJ1kEG#5TNkK;$b@+<+HuowoyQ>4RdrBY(0uAWX4+!D!(xre$$yOEDw;2O#^k0m#!l z%q&v}5flEvP@bP^38Hj`C6=D?WACZR9#`^|JS15<0pNU1Glk>3wkSphjCP-_6Pcst z=fqCY9u`bo<-xeVGB*{r6Y%;c-#}d#1CN#tCXc#5@tc8S`~H8l04vQ1)27L0EckFpcw0CNdYep{NAAc@v>MpM^39Oy3%kDxEgmc$WpQ<(%j?qF+jA z_Q=q-Wcs>=p*_*zN{*mWeZ7`{S3fzSeHouANBRTAVYoIas7Q$dc!7o)$=Yn)LKo-+J;2L7v#KaHu*KmqNhbO)#!L^mXf*f82*zxSD5yDSqhg3h$w{VSPjTJ!=W`%}aj;m(3x3ox zaX!W1^yu^jhlRWi$$GjC5?I~-$)Hcds}1iL6b{7;(o)tTFdLZo%IxY>q&Qqxa~m0Q zZSClCI=U$~jd-x#$#}#WeAMimKyKNi;R(p`Ka8D6u?2Dg<;Of2*qBS#(Aq0n1lfhP zd$E)5__V2#W5tOLl{jKDw@tD;nF%i_L_-%G9tpB=1-M7g`=DXn`1$QvOi>q zl6;PGPCrPovk?Bv_hGTKp8qEUnYO3u@t$vy0APOdFYCjn} zDFIN+(T*2!U!0%*%%tUa%r5}8Z=2$;_zoh z2kKu*;-cqkak2C2YyS8$&CS74r;n-29NO<6?GPRs)(C6#{r!$OfgC;=Wp*_Mh%VTD zy9ngDHLM|Oz#sM|wAk^o$!~HHNUlMrh`t0@gYe_sP~1JV$JnEoB~qT7>-Jca=|ot} z)?M{5_X{=F{Hle^)FVn0y-mDBl^n{Yy5N4^%J@E!etPg zw<6N|jqoL3w{KPiVxo2Ci9wtUG_dv=dl+uE#m8s7#^zpInYHTG1A6`T@Hy`mtH=!c zEO2Cy8vh68nN{^|SW$cQ7kZ(6WMRBu=&}UTGCuM1PsG5~EaAbjIci&)y%af$0z^7B zx1Q_gLgkjCuajW#KG-QXT1AerH zc}AB0*2H+oAH_5-Fxy9)98f&0hrJW>p<({T@a%0Jx{X`52cz`KK7lJSZ@h4Kz{RWpXRZeQqOU9CY#eEqd!^aqm*RKrn zU%c9_hG2PevFR_fsNedF$#>+EuY}?YHBa_RP@UwKnYxlK0mw@a?omhMSmJJ?2Cwcs z$&HTMS-qH zx)8Oc)JMGg;Pp@jZ^5@Ewt+}NR1fC%{jZY(u;|Upgg=4fp&{W5)WlK;BDZ`8m584P zuEX0m$O)k!5{J{8LGx|Y@-+Yj9pFQphz1AZ$*cXnKBZCT%*o=U{$*4C{J`s>UiYpe zWI(8PQ942xnTt$C{q~w>%H(3ZDNMsPNOim@YSTydl!9UQO^H-3-88jD~p zzr~XEr0~&%#{Ex~o*Z*{0rJVl<$-HpzBdr3^Dbc%@&DkP=te>lVET_l&r2wGA|9?0 zhuCcYDe@DD^cdN86XuVXx5LSP^Fu=LIQ5LKgCUg44d@bXn9>1*5|98a*sRt?IT z9r&*LAR?bSFf$6kC!kc9c@*r=9(;jYL;j0KfpAjX=2SyxiqoxEyeFN5(InwxZT5kN z!|l|+4zXmZ)tB7tk*duYYL6^{fZX2HmV<;qoD)a!U-b2po`{uP_!`=5JWfWA+oYd@ z;wVrYHB^uI+0f86m$aFpe9cMNipyY85RMFgB#b=cX`2GO77CvWBR{hs{$G6_+>m@6 zT_yPE5PZ8I!5p8U9*CG>e@G|dHLint>G5g(_~@*_#k=vw+_r6&9fDETjZ9pIZ!&(I z3<(kjT)+>dI*~BAd|U#E zd){v@sp-@WgP;VLal*A+^36RR_cd$?zNOUWOpW`UzFM2iCO6^l;-2xN0ki=HInYUa zc$1F#)b%M_XGS00GX+rWQe>A%!YOr$!d@JmZnu;>#9l)U6*R|SHs}{`u4Q5jY_6A>@+Y63*Y*fhr0E}!oFC! zS(!5tzRx)}WsW=AhKxHc+0VDPeFQ~#rr98niRRe|UVmSJRMIZ|v)CEg^F#ubBr^2D ztk7?}jEDp6zx}b^>HHBpQ8_kh@fJzKa)=AG3hPgeivU?;t@z-YgXJ*nFeFmw*EPr_ zT0nqa$La7+nf|LsX`ftvfR9FO2V^YJeb?oG2Mn?VB2l(`d|xYKlFtO@Tl^>&f$Y87 zTTf0g22IY3;TNexmMVc|KAvi1-I_tn$5LoMBIddJ8_*O8irt$A`ZTbl@f7qlvbZ(j z9~=nFGs@$KA-Jrge>HS(NXDS1T=|@DA=Z|Hz^)hLTB}vM{q1_>Lz;Q3oBxXFRt$jQ zl}!8APQqrU0BS*+y69m%;|D zd%;Q$4*6tpxe3~c&&<+&8<_!@#SL6W$R#hzgpo}2(S@{VQD7&Gg-g6LY^(~KFxbq< zIZCI_!G{{;)9vGWvo=AdbAJH%pw-`6HXbtpA>dgKTO{vH>#YYB&2qMnd*VUPlNUod zsD-PCT}D*qj%qHK+a8$Z`7fY^>^i2)M{x5yw1ySEHd>$WD5UgqeQHyQfN8+#!d7(M zy?eIq3si2o&cb)-aak624af8W4MX59M?l|i$2lEVt z_b1Zdn<&*uNJRSIO*haKLXwzQm?h)4mXtSvzB362fbNRIIezHf@ozX%MwbTxzeYhYB(hp1Ty^`Tm<`vzNW#|z0%!y zbO%z&Q(xiZny|I#bbJBr8wNp>dFXVE(WapNe+2HcSqO?QzMKe34yAeE)U!nf0Fh1` z%OU~I!MPCe(Ga};Puu!6$sG-CV{@Gq3PD;S;s2>}Z*?T)w6A@ZN=LTE3|&=AgSSG! zHaKG}9%RUKnp4ZHm0ga}K|KKse6ZsZRY}r3*u@dpp3vmG0I5<#aV4Q2EK1|c=LSC9 z`YyAj>0y5y^N=$_?3w1$mH47)&pfg3$4+$>=BAID#Z% z7tPE8wF#2M@HFXWSXf(b@t0?|SWDOgA~gGsnj7B^*G`$Tho*cLSg|y>8=k1b{K#1u z2;3&YiPdWU7h%wJXYu^ceN!_3&hrDkmEqR??!ufey1K>!JMUP1^qnVD8+<=9w!I%v zul(^dLE_={w;L%^&!wG z)a1*HsXVRIc_Ee0^e;=_5N*3{WA{T#N}G-x1NBaC*K|P+BV*iKe}td??7X;(kU3_u z+x2?+!fkT5#-LAs@r3p}_LRn3ZC2WAI_-qw%bgl80=ESdM*}7;^2|Lz@VO69=gc(}Tv@o(c zY-{)Z(&i5D-PZg-yCN@mPrM++5}w9FcSSw1lq>#95yM0)_=R|L&cHq9UPn<+WpZkX z@3ibm@7efkDWAYHN6$mPHkF`bewTVA5|^2lU=iNVRV}aRi9esB>ed&=mSBg=^FIdo z2CPJqJ_r6WIOHR5i+`h)bY(qv-!_RLyk$Stef*(oqj^ey_${G{GHulK*Y*_EX2R$$ zA?FDt+h-znZ-l~HPY9STJ0rqrPHC>`Reh|q_3ge=wfB~Y{89!JM$#a8s!7_ldZ@JA zQ~v}l`xi8qwb#P;#xoP;{+{icvhY4C*W_qYkWv#E6%uyoQCQ1$W=J+JIpJL3u`OSP zHz@(tb;c-PuiQKsyX+4g|6Hd5Kc!_p};ypiAGA?#}@I?9d&gS}s)9v!_A@A}wQ zbkaY&!3v}w5JF`o0zt_w6;I4;EgsEleN9*NQmPfeT&BarLGZ>k+E<{Hw*aXUdoj+O zMkk8EGWO}Z#JzRA1HtPR5oj6SWWLKjRT(Kg&?FG1QCkl6^%=gq!Is9lu6OF9;4HtK zEXlCv$jUD}H6Sg=z8>^KW4H_=9Cx#Ibh!KND)vX6!EM7;4$8ZvhZ?$uiQ9ViCngi- zZT5f4+?>F5=^si$NQiDR<%hMlZxwy#wtqNe$!j2-UB(OJakmbA#VgN~+>Ad^XBcH~dypBy0(VfeCl2Brv1lMupqWlN_pd~eBUbiJF zHu$)|0ZkuR=u$#IQi3A+YfqXzpaU;!YN#akE= zeGJ_&m)i_=;Vjf26 z{~SBcf+A1954;Jw9U2IKBDdtKSj&q3emPpj;mWgGeK!6sIwjk12O2F)bgp?wf?aO% z+14$A?wd{^r_eB?lk`(xwP#Hg5r_Ukvm-G~BDP+<$kx|yUAw?j5;YvGd!bQb)<60D za)pR;@<*9H)z=s^|i%okX*ec=TpJQrawQ_n-aTX#v_6`)LVgd4>NY<*L z=V{`o_e_mR9e1Bo6IJWqog00l1Q6g)4ZAOg#TUYj{M<*%Y{Fm=5+O-YHttTBh0jLZ zIy}moEen63dNSt1-Hz(ZE!3ao(c%|FaX(_3*%9QqRdoXcgHo}u5>*v$>HA`hc#s)& z5g0mao)v^Tof=1qcX}q`CG~T&ue%98=?(cp1W?HD>I}Y3PKA_s3YfS_u=ed6&)o_U zqCDPEE?T9X)i*m~;LFb`m7#^>b&Q{KHC(6^x4Jy>+c0=ZNuIt%cBb8$qK{S=VN+%e zCS<+5zNw{~<@}l?r_!)W=Vhv2nl z!(Knkt@DA5Pvht1O4@}r@DGfaqQ1%SVkkfPsc90fm!4$g5{PRu z`78p?IKpR+{9&yRvhD=&M+>!7t;^+v?>oW7`1$HBx4P%jFKR0o!3PZcNZJ2)jAy~* zqUf?gfu@|@k#7)6%7}qo@2AeI>#F%Y7A!Ps%E0Za!}{q<#a?OC%{l2k4g1sCsp^X2 z2LffeLM2$ks>)`i_Zp8#M}M0Vvs>CpS?Zd`+JsXCA}1`7y8_oeGJjQ!@o1l~Dt-SV z6e1MfMw7O0XcEV5D>-)gwv`pZED?*U$AZY#NTue;;EBwbp4CSO{gk4dt7Jr=?!6H6 z;HWd!*cI%F*UN&H2t5#C5jJ;0?gf3c{0idgJa(Q9rC-IqXahh>^DKk7n!kGy$w%{< z$>-Oi{?bGr0fMsti4!>P2rfKnuBODW$@6Etu2wVm4C--JUT_$M(|E8ewzJ2C5&2%M zjW$HCCrj1)Z=K*}_T2F&E>h$@I#kX&H{`QJV;DJLnlFh^I zTApUndMk8w|6s3U@vWC6&0shsT)KPB4CKSB?38=%@Jh(#Ghz4;u7qwGx8F?YmGHQ` z=$Ek|)GZA=y#2Y$M?X@-U+d)2qr#cf5R$I)Ln!Y;5*icDj+@9A){Xbb9Veu3xukRz zN98*dK1P0@M5=s9Az*f)j^ct5y)&|ZNW-kcq(TqFbxw`?nVF7z#6QfL5_K6e>bZVr z`&&Dr2i=a&Ni@0htWGYv-HEiHa^_v{;$Zd97t|;V*Jnyf$3uoZJ+VgupM5v=UbNVH zeX~MjTEL7Mn87cm@cxD)$S!{*Q;>*$|!*a$10~by>A9u07pL_Fp1_kg{DgIQhkxEs0doxNcsT zee+mlW0WH)>1}7(X`1oeiOni^OC)OWVKFg%NwHj3j!9$PB0vW7iU}edi&ZB}+OVeF zh@~v{KVJj#MeWIg0bcn7h>34rc;kORCMM@yTz=q&z%|qjSu;)YCig*i0v;8z< ziJhAegY&7*_1c?2hd=sTZlJ+5La&)Ni^fkd=b?DQ z>3D_CBJ%w)JO47mzK6?@v0S-4|13Miu_)+^l}(W{>(%vG7X+%7x>Wcllr|iZH<2)y zmzk~2Y625@S%|YnE9r7hJ(p()^IWf^q*=L0h-plRJV&PC_cH`?gm|~f09srZVU3ob z@O(IywN4VP<%o7sy!SbRGhY$dle97C{eADUXN8Xfxr;E)GEmO-yGtUUa^BgUxMqdN(B=8*dPq24 zk6Wdf;{5sj$2F^N^c z`B-%9TYCBF^7pymDjeh-@g02Pn%leh_pz>YRS!}t3%cg>BZSkz%aBURX48F&XxiaMOlTN{f(CzlkJ_Bx#<}Jum z{C38Ss0F5tSLj2i!d-y}Z}VpBY+6Lv^{%_r)$NBG%~Vc1o}cXNFn%$NWB}Dckic^qJ8h@Z?x`H+C`%x^+K*?<;miPpLY*UFL zDgK*}C0#2M&@d1D0#}ReBgmKsOX0o_Jy-z)ka1&*!@0v1!qLClS<5i%FE)xGA($rG zRLF0;pRvO2#_RD4>Wg`|Xt!MV+~EO&&hJ;i0k5liv5x* zAxuojEDj+yXjVrv@}yrLEH5%?O1!4$qU-v!GCTaJVy5#?uZ&^2 zYsGD6Z{74=$cARY=TBqY$b*mw1f97k>^9as`&@N6OlPZK<$-agJ_iY-Kkq(T%tJlD zlK}JK7X?pI)N1uC0XpsCFCtAua z`-Q}{b_wXqDZ7Wl=2{bv;5UT?!laYW^Y7N_Y>p>4SZx;*63V}%nAOi^5tQ3Ep-dQ6zeisNpO-lNSrJ&cIIj`KpS*Eq1;TQ@~#rT zQTg^qD^u@^6RA_Eoy9MNrSv@5>@%4POkz!gt?R!*goRF0^7_8e`yggL%axOdi>C`= znfmn4))}Vt!cIPw6sJD0y1NTf8?_@NFLp}|mz}Vles@uN4d}$LG^o?QgSL>qb%O48 zAPUO}B0^~NiTVT9qlH_Lf=D1k#90-BkzO%us!a}qJG|51+q5khvBV#XiS^ZEKc!LB z7NT2xH2ke#oir^@9_TqHxZb_^34$Jz2Sh&7BJ>dE+Gvf+pDI!k-H`7zq-u)6U@5Pe zFuE3g2duR@HFeRw;(R+Y2nf0>_~^(uL}o;ahXz(dz!;?djLea=I0~6>~7l@8_c;A`a0K>Z(Cj zpAPZI=F0D4v=io6myZ=)ce0}?bnoIrkhedAtF-C{=LwHD`F8PRRv9Jv$ITEd#6%oH z{r3FRf-e;{(aBSQbP1)~eMN{k&0S=eZVFk>XDS|1Q;b08W94V2=h6x)CO zJl0qOX*}O;A`!Q-dRPPPxj0HzlfQ`DXD!3)99EJHr#cm!0SNPxLBZ?V>`Gf*mnS>H zQlbjF@+NFB&+}|iwZ@(8v{w@8acH@lRqW*8>dLwp!14(E`k}=;dN$~m>gUhl($~)@ zyvV^Y8r?+}{rL$WlZjN~A>)7HTLU@iDloAOaNO`~*`>s8Shyfw2TwUV)l`_C?9W_< z#&(onqohU~eSSt%_RYFawFFCgaF?aRn_a=D;I#5?{2nfR;7iWAm;L4^xg>|oWxCZ3 z^MvfN8y2s!oUKT=*x;ho$Ns|&NE&Q zC^nG<=EZOtO`Eh-RD<0k0o{Es4A-A4D+4)>{{$mk14QfHo7i>v2tD7o{~M(1 zCP%&Q{d5(S>lS(77G)@;jad!pn?!J%nALIm-OtzvW7yh%5qabG-Kq3d)lf>{IQ)Z5 zy9s)-%!Bu+!oiD!IUmDYq<=1dCJoVv*?n0$v31w})Ve*TSn_+f-Qd7WP^^D`x;v1x zVFvKjAtrFTf8rZpl`a%(4Drf#FhNp4_>GzR-upyoa;G6y_oRfPa`~s$H_hV{QZ?Uk zReF_d<;Rs%p4FN>UOw4H^GVqgUv85jC1sHy5Tp|oG^St|8rBXCGv^l$UE znfnaghl%$KO4{2zzIe$QIt+Zvs~4t8PG0-@s2*>=s*=x++rooR$U?i}h>jMLIcnK& zQOG7BnJqznyiroj8IA`Xt0L{MhRLaX*;nVI9()k-2Y&){KO2gvm|B}ehw%c~v&-cW z{F!o-hY>m^5=1>;>S`+XkJx^9{=MLj;UerF7)0ranl4z5V{_~yPteeu6&+OliQrsnXgqT)!k=b8uY0l znn=8a#}5-qB}Fy#1L%Y*k_hAie30*LdGBD+(y$L$n-rY&x>*Cq)M3Hm*`4;qiB>Nb zq%5=rC=i9ri4pG+ukbJ=0q&d=7W-n5WJ*O_r?Msf%w^72&JR59j-*>ZU;&b za4Mq_#Cum{?%eC)36X{-4KpW&LrW)WX@vHj{HJ)+yZTH8j04O5S6go#73CXtjVhv~ z0@6qhB`ql-J#;8BbO|UeA)&y4BHf(=N(c-kEl78YbSg@SbmuTL-#z}`_dDyHb@+<~ z%)_&ux#x;~?Y%GD<@Q*)Zsm}B9xOqjG^xRlDYU+BIb2l;RC2-*-?Nm$ts19y8|key2g&+qaZKVN^tHc*~1`m~!jB!+s6`gu%4 zNdorY9l;`dyEEkjRWk)}`g4m-7&SnZf_rK04DxI0>4st9m$KAThZ`PNcawH6&iiC@ z7CV)!HI4efaHY9}Eu1^Tidh6goQJRbC_Kf}>K0BA4U1Bq4uk@t5FUe8cS(+zg+^@K z3uma4AHWqd)m5o8j8fLK>|^FuqsvmfZ^l-R97IpZfB~0X=A=@AI^uGa3`9c7xE9i-qN60-|r%MOeRGpwo+y}YV4~FK&&|E1F{LRFZ}p% zPJ2HaLu*}ss!TTbk!bj0*UPBsJaI6{6vt(BZ#Yi2FM#9EB>1grZqz#&NWsWPzHdH@Fprk$|;Pwd`_Z=0||oO`>l3!eN@CpU|L0iR?0GyooO zQa;rh`PZr6ulS&qZE&1y4EW^R~5A(?sQ{;*4xXa~dZ6$+rcj=kMLJUz7vM&#Iz(P#(@G zrMV@4!ILpWQ2e!==TWCI9Gd!(OR3hknxt(<0#5Np3sG z0^6=BFN=14qDV_2NgIg&wXpgzh?i(a%Ns#V@b$)9F=ps%RHyIBr*(BnfudtlvXuPD zTjvE4_9a(r=?$`XyVkcs4ANp#5yZJJeZy>;1yUJFls z(UtR3e9SYl*Rhw}YD(Eg5~_Bk3eZe_X5T-&A|q}FqKH7k@F-L~yCu%?(8r&y3%PEc z1YC(Jih%F%S~H+!R4?X%QEcN?(D_WLPP>- za8FIo-JrFw`|*?aFg2jw;Rr*AG5Qu`=YL78ZEa-yNET_;+jrRqp~8QNg4!}ls*{Ts z96vLXl@FrL=TU#y*YPs)8Wr-+y*DP7T7wr~t;7s8&m7QO-n&PbAhc3e>HTKXctfsx z#C>qB0Gk4o1;v;u)D{$){a)x^Y>Lb)gv;!|&-<7V`Y}qdu?N!fmVZ?Hj#gTL9c>P~ z4r{k&Bx%(Ek)MX0(@Fz7AJ^SKb@<7(ANw;@OJTR1bI(|{&l+SHnC7glO83T{G;$?2 z3#E%5wuBY4zysoeAgcRut|~;xz8Q22F6s?VHmO^)x(TW@Eye^h@{(iTHGfM$_iS*h zepZ1VE9W#qR@8QUjwS9;T;m5VxJyf;hDG8 z1@(D}Td`BK_HxYxddx$LuL;)lI&oR$eNL~AQ1M!}lR3)Jm*;@r#Xo+BP^9CnCt@#q z{2F+>>tpxxjO)p3AEZzUp;Ikvd)|By{kZtJjzue_?WL@Ug#?4~<%_x#!yx-WP;N|t zMNp407I2m$kLJb^ztqe@2R)*!hB^7q(N7B1gt4fBUT_2$L@(G~E0rYnfDOH|i+q)F zA9~CG#`^2k1?did`!6`C_Iq2P*3n2Mjua^K%XoU-5ms4igt$TZ{PQc)mU)+kABi8b z-&mZm-#*E-$I>U0{#AXq zA1=mw8eMX3tN6By!+4*QcA3uTS+=Jx10lSo2Cf=Ub%+}yAUG>SQo4`x+MtKM*7r`y z#^ZC5i|ga-f53ZXW~JBRH(aN~fPEh{VnFB+i}7fF%4#+=7^WfeYs%14D@weSLs)`q zkJ{zePX_$spyTYGB4f5I^d1Inz+_*b82NoEPpXV5J??S@dJO7K?Nm0W=`uC8zW^Tm z$sMyZ^hO4M%Atu=LPuEaj%sxH1R$$qbf56vn^k|a6dvcvLMAibhsWEHMk+sqJ0QMv zQsGk=38mtSR3jCWd1_G!5F7Xl`laRha3&o4XdoijxqGk1>Zyq^cWgAF zu-TR|TR0Y1t>o^x^eZhb=b>&WX|WJJiwXD&NV~s_8(MZ;FnuECu%svgHK+!G3=?E& zRqFv5P_8yR*fM`Vz1l}uGjrD&;3@QMX{}N?SSLq*uX#2L7L+C$Qdcj#vJtQx5~miZ zW+wdTWC^2BytHEN*i)wBK*R?Urv#*~?J7(6J1AEUWC|tOePV!*Gfzn&} zbfXW(9=3Wy9F3uvZ$7QUg+B@(Dvdx}jO1vdj*i%S4k++uA5s(0Q0uB}^_~RG2ED;z zzIcCHk5SgUMBC)9tryQNa?8qbst{E3a{5#8Z$DvSMgx4(8f+1#R1hnRKBu6(cT1K0 z2b~8OoEFv$g4i?`fK0mcqdV}AoK*z#C3IAj`)@loywO_0`pyRH17eQ=?m9&-)0i>k zXFLdr{f@cvLJx$D!DsZH1iL=CIs=vMJ`?6g$$QfB@o#V znANZUW2t`&%Y@x<(5wZG5_G(~co^~S&1``mnBW%8oGO;pH+^~8H{^mgaG0JhQXi`H zU*kDi(Vrf5{18Q=XZ4DCZkG(meVTB2LIBrJxb8JSko#x^Z@dxz`Z(vNH(R^R^@PL4 z7Qpu3K+nZJkf!!xwhTnC2Qn%#fSY{SnzA%}5!m9M-?~RE+E^BstdqRwQ#q_aSyzZbpnW z9h#wt@l7t}F}8&gA;oX$(8Fhvd(B7V!4V?QRHa$8{o7jiLj>54R2{f_(*X%+{>r;Q z)f?s*o=h-j3#!j`j-^k{(UIP48U<^B{h%dd4brK7Wb~@Nx|RDI@wMVlTNXHtG6&t{ z4VUqLRIi>!Kp`vr6xJM$YiP){DxGe2e#UDx`T`8tkQYwG1VS6D6*e-wQ~TXDg_oz; zoCKBw&WmI)0$l_b_W>}Uk$laNGV8Mh*W1(?OrR~qp8%;lO?_WUP~9j~>2>oVoc;W? zMtWuN?mSeo01?j#-_m0%i+-`%AK@MuOk0FM&z@$M*l%QY@EI&%;Z%SFoam%ZN-on9 z?7ZCUz+=+19hA1cJNR|*i1kN5M^MN+yHNgNQ~|I~@f);Y!Hy=QBCC*YFL>Ln$b(;q zB_y_h_UyY>PnzWz*kG)1To(c$4(tyB8cwJIJ{B951A66WccpO@UMrj#1+YC(3s26I0$nHW#8vE00C&ESGugA?q+ zL{j%#A+gn?%}lrR*1v8yY}f3(x`11%ZZ6bFGy?H?DXj~-rl%!AmS4Q1C zW^O}4?`|@c0z?PkVo9c)v0ByY0*uV)&mU|mmi#Jv)g`NWlbp8y&h=(7CmMt}Y)m!G z3%IOu1oEeZahp&=_jRQJjFCvShs7n}^#1!D8*nk!+P4TsxIAf{f^+Lhxhs1dKT1kF zqU~y^tqj}OPjU+Ni==Vrux|sa#k6VSlPhx668Kh4(HoH3IHHo6Fz0;^&aJQZee$J- zU9P(D(f_aqD-zFV-)=ZS(ME|Nk+lsc(S*$FP_piclalMh#MPKA%B$VDjTPZB>=X`c+TFTRP zR*Gj1aOtOB_Qv8wJ9QU9Z_F+{K2#rIAqcjLoWY4A9749J9sDKndXAhEfQvLq0--uW zPg{ardXLyJhFr~WCFY@S?syh{wis$Z1PF;xx}IAAFrGs&cb&tgByUw?tD%X=|9AT_ z4(-D97i4hWCJUGQz(fk^CY(FqP5BkmOPm%PnL7=@+O!-&+insk(u5)`LQ#1BWjcy< zj*3gM)R&9-nv*l^(FM~iD6}`$en`EFRtCg-cu+G{7Y!B*zG;hgc2Ccuh1HXnrF23ipzxo zu(ZpY^SxWA&db&3i0vw^N9ucpo&`?LV%K*X*K-b_w=QvL75qt0eWA&C_c}w4Rr^?^ zUgo}|;PV~z`J>-XLa(OMkAtG3^CTAA7M6BQ`xNfmp64Pur^6QQq(~ zvvmr~S=qSPsTvHzYWsle8tdw8S`)_~J54~AMu9PQC@%rw?c&^9_Yuuy6Y1`rdhuZ59 z@zEC}VpjV+wJtHp_C+K;ZG+6L(F5F6-Q>tx|G28nJ|pozQU7KeDW??pKY>Iju^iVg zQYiahtMpb4>2^XMU3cMDUV(a19de(K<5ONPByD)Tcnk=+jDf)fpBXw%IraFrKl$J}%k$j$bDWLwUa zNR?X(X8V&g?NpEj`N_ar_5TvORfwG96AEIk#6)^3PZL#Ey%{3`K~nr-2q-cKStQ4f zV_NQzo5IO{^TVHKKc1lTY<#@1@NG$FgOUa}C!;#Z!>CxM%#az|$p|T(yJ_9k6>E&F zVlui`yr~eaAA)6NaE0iGAw=M*DP~mc2A7t7K+0wbKgwFt3@nwjk^ivF^FaF7a4T3R zUrVozlHqB6GM840FMTgtcEeORB~s#%KrA^n0##Y%fksLDeD(P^A)FV0ZC$V@q%)52 z2SZ@(F&wAil%->WOsz=ZmFNI*@D!vRAJ2)# zj?XmtcP4I;XL~ZkQ^G0q26C@fIV0qZaSAmlGie+?YnEY`fsdPKh^K61i67Mu?kaKD z@{CfmuMo#-9;hqy3caF=a0^ct{7m7F?FSIpiSfXy&;y3iey~O>AqVf)rxuw-NMd+X zEla-M=q({Wq11?srAviQeOzCT_{x7z1&<;1w8Rh++g$tj+zmUt1_52i2rQwr;OenZ zNAYjJ=$Tal zKn*Id50CPqxM40|S~RFn__-U~Tc!>lIIo2i`LUR)L|1387}@%ge#he`)Y%ujukJ*? zu_yMO6%3f7j)*$_%3ra8$MuQEMaJw#ep+a0?u5U<*@f8c8O(d-+tgLU2}o=cXb^Z} z7?@Hk=4mpWQZsE1&q$H`5RA~H%$GgyAQ?{-D{L&bi+q^nML=ot-HqkM(=t3vff(0P zDenv@3@a||D$LsH67oq3P&G?1L-Ul=j~HK2zKtK1CZ;@(*SabF+Z8qKT3By}%H&}T z1mH*E&fp1g%#a`{^ioiaqBkF`Xu#S)mIi=mURXy#HniuzE*0^B774U(Nk8>?4^t}r zpS6C-uhl%b1Qx$#yWpd@2?pnyAvnB({&Tcpv`*ku5C`$mRaA=Fe`yjQAX)1Yby%4w z8GcDx6S)75Nt67hD_aul^{;iCy#4p^k8yr~Wzyl_qD^Ja!?fec#6u4N@c@a)deOus ztw*K4-q&NZLu7fb0AUQ*!luwaC4eh%_9x#K_oVS~iY}sz(_>Pjt`tISmF#5Je`n!t zu!hJCb=0NZ8!OpLkM_rR{v!z_2tW!Ex~tJC1R6wJ_n(hH zf8!8fxXKT!KopFCJgWP{QEF8gwvFZgr4*9Kt`vvHgVc3~09oV-i%SfUF&bvAom$7x^{RU=iYUHs? z9JEV+Q&#bCTK@H^LLQ(`WpAsOB&FbbwEu`j81fV%^-ma~-P#lp z$mVtZRgJ*$=s2*k_GHI3(699|*?k+gZ7kC53n&l`o4KJ;)0%YVgyYmC|4C%1jT1pO zZ3a!+gwcr&Fa5F7E||n4E`9T`Zlmg7BkNggQ{|VxTRx1s4Pw8V6_yM(uaKNdD(phU z!l3u*9q(_O#7HII8>lCru5W3Gr|irh>dNNH%WQ{7|0OY}g0SjxP#VtM-c*ddhs~s! zc3E(xu}5w5(Bb29*#!P3fiaE(7r-4V2~6PUp|PF)M;C}tW_cN&AQNqwHTfIJ$K$Vl z`9Ck9tV1?C17dT8?b-^96Oba5yhLBR1$bKb26bZ#6SlDqs?I&FsY(}?pNN3+z0JY{ z1mbzrKR%rSA=E{wBObyv@KnAiLRdfrizMZ2}gKkTe{D0 zwx&cqNH4DbG~}lxNz+e6`fw+WUzH`6is5@4{yTdW>D#Pyzd&(tEO#;+6t(!>PR6_C zadAULqDc9Ko!PTo^HGLPovu$?h+MNN1IB#%qBFCs`j?~Yu4Sm*gcb3evzl)aui$sJ zcP|)eZDf|*139VEd!s_G&c+#Vj zTe9NIp1uM`7>3xEJ#&&z-y9EUXc!sN2?fdLE57b#ipbFR-)4w9PN*FOZns9#mw)pk z_TK{(jw>cfUN8UgJOdpIr5!I1udV;EVBfH7(V*7<3TXtjmu)5UiI+EkisoUVKQM|2 znv|8k{UdfQYEWj5;^$s7@BXYogv}wu(`Q!8A_kB#O15Q7* zGzWDreJ|Ri(1_&Y$@}u>W2nqt+_{9HIe-OB*cNCq3Kk16x=5`Z8+YmM8Y%?;Nz~vk zkvU9=D^UB^y;)cMcA%{r#8gvYF~P638tahPdUZHN-pEy1^#7}*fr{}1ubkR!g3NPc zC5}W}k5RdPey}$J+Ns~0Q48!nHuN(L_xihxRR|o883j(fP_Xs$#`AY4n@=Zl4*9E=$7|ljD za9MBOaW?Ph2VlGRQS7HNwu{ks0WJCH}zV_HPsN$Z6&@YjWyXI0q z!S;nr|E%yd4M-AlH8J)tvmHc;TT-i+-HaMuH6iC6UV-9R=8s^(84@9HJK^+|Qw> z(_LlZ9`@$2U*WS^QuCX-GbI5szP$_6?%P~Vz>sxf_B}~;lz5cTi^VU3WFLgIwl0qU zKLVRUx$bckU#0Qo{wNvT#yt>P{m3SVC&+gO8Oc*o91D0j=Z5rviYO%(ciu$ayVeC8 zb)P=^DE#$`B(HE1yCXz(gN0mF*IL(5#uBGwS&hxt+8U}|z@o%3_!mbtE<-#)VvOY5 zZ;k<9iYK|wI0Yni?jkDR=!@rA3*mkygEPv)#VD$=%PhMbQEF+DVfkQOUk{28U%1;zw?#dV}`?=-qy>28nowqGCb|uVRG#tll0eM=whCQAm4ACs5ARl+%2m-j0iBEsvce$)VMeT>m8l zDe!cFy#AK*FwI>&kW4;!_~d1F0cx|Gps_kTywGJQ&hz46(Uvc@D#ey>L6^C?H$HA% z;+qm7Hqy~Qb;!j|rw$rl*SI+3R-}Yy3zqRgf6!TH&F{IC0z#d^2wAjG;L5$F^T19j z2q_IQKDSV$Cg>sMtVBMCq$7g@h8qBc+5}XlLH98g3-ZafyhW9lmu@kKqV+lI&Qkru z3kqN=dHW_6_=lu4OpZc{^*tpo<4ao2=UN+8kdKsE%uus>mh}%cKFlPlC*>qf=ew{d zSG@a@;q`9vPBTE8xl$%pqY56ojJqN3km=^V;zAHl<6nNjB-H19%+pAe9QMs^AMcVL z4La97V}q*|?7idLnP(eLBTP0akl&hWtIf5`-)O{A2HUM>@8WJIa&PyTOCDv)-{fgA zTKwavsg8EIkxi1z`wS&wg6P+OGbL~1wN>80p(90V!?WR`;i-m` zOy>7z)Yredf8Q_O&r-^YS;J>rfUi3#5g9^|`3`#Qsyxb3Ay#kwTo0a)zRSCwl3B0g z`~hDBT^sXy&y;;88)3cO=%LM_07aY2TIV$a{Nc$tNl72 zn=67N5K?%iN|qqTA~g2pFd%PjoL>$|W~|qNmkNhgclSo{5ih-ZpO3Yjf_EM~$jvs& zxKO=abxa$NChpG(k+D#+T)Om){x8VL;;%l0#LasR>+&DF!AVS2ZCDTWNwtIG>Q~(o z5DLN=`8)tEjj~FI%6!2Sn>c$<7Bj79@h-w}(@7rGFj-{7PsG;{ZHWRu{X0UbwlCX_ zC^j4r&y%QXv*AW0`wc>5rRYTK;i({5%*CkQ%?uaXoXsSjmH{KSsFl|dVN3zyu)7d@ zZaP}i>I8gEJRo2xdNg0CC!@-K)ThoAI+B$XNb3>e*_g)7uhj8nw3HDxwUPSYJS>T)P8 zVfX~5&2H^e`U8hg@mv*)x^M7FT`0%(mFb~^>A~vk&;4-ZzRi-ZuECB6`qZ27Gsrs> zzLN?EXbfHo&oZd8j+i%ykeM#`qCG9=Xhc5Oy2X*Q>D<>~tW#nntH5f+q&fR(0|hzi zA*udfj^CEC8s&(NW)!C)7i$@x|JO|iqGke7NWO-}!>LBh(qijYO4!=tivU;*DavH( zcZ--)c%o)Xj_HMu15pAd0J-?^>Z>=Xj!1^bW1bRnt#NAg7lkVi6-4?A-r;-NnXJq` zqv&ix^!SprBT+~sW7Cqmn$7gJrEKi8&QGWTBFP!)8XS#x&bEYFfAZK#?_ctc#)KD5 zdWzAV+%xvElqQEBUc%@Fqh*b-cb6%6)^;lO(lT*02bqL?nM4UqVu${?lc%LHb?jr; zIR$OX#5Yu{&%F8~R%zK5Ffw1~gYwe;EzKtssoMU5!> zv#1vr=1rpw3FWQYw^tx$sPRbljq%e{0G({bzq=#(H}2;_tWWbgXjzb$bXH5Xf^loF z?~U}MXq^^naLtK#hZv6u%wKy;nH`Oj@TsNyeZnf$Xe4l?>%pMoFz0a(v6c^Ql0Z(< zW{l!a34bI?R-WiwS4gptilmk3grR@1#S7${o=jTb+YpM!yaXWSt3Iivi*J}M7gxW9 z`j^ztvKn)zUOpThMO-bMng&$PAEFWU2PwfLH%Cbn$P=PYVMHS`O`VDPqnWA$rExsp?vaTp#_J6gPi@93IAi=WTE6bM) zsKBYpa|I6l7KmvUqCDR$tJHfO2DAC@wzi~|5`n5UYf+sMn^Nek*HV=A3Ti-Xnv2eP z%CvA38uzk(p;CotGS(p_?ObI!^Nh;)jLH1bPwk zR${QWI}0goM@wrx_CkguvZW2qZB3h0bB=y3jcdydb#a$X=${{UPI`p%rRVcoeEd*n zy7XlQNMq{dpfY|;@WPSy9D&IGa>8ovLNcx^E5cLQ z;*#Y~HfEoziL{0%7;PVDZAOiMM)qwDwESFL$IRUCcBqP2wr*ym(BOJ!FX^2m-eTCz zOhh+_VZ4W!?3S*P52*I+2UyTM!U6XSV?T>5OZ= zKM;tY1*KfoQ;#PE?fu%8U_-CPTx2!<+R*v%jrmf9&!s~ZGVb)Cz5)JrqdIT`lYnr1 z>>iWfvN4-qdv=MDs5nKeVSG?6PkE|TB+%Azt~9q{uyXowqq^D#r7SVZHVyQFLDyb= zv0tw}b~rzo@z zIHR=Dx2&$tsq|mlU4Ku zZX)7$(rEwvRI^d{f zUTU0TWEJixR+H@km#R3~Z>N`dklu#sd8GMLVJo^Nwr$qovXGRfK}&hXeoqC58hM`N z$aI1^FJ@~(80=DqKCOhIa=hvy>?18sG+66T=8hLVBVTmf?=5n{&szTEQH!omy@loHt>EX1;X~HBjJ{1>!GU4n+@IcgB zf6Tw=9fke)GcPrkdZii&9|b<|om*9G*bLUATzOy5bjlia@Fwl+iFv;P>^9XL;o-k=Z2KWJP1O+PW4Jt33tte#qg}#rmiiR+ee`w9OpoK;?l`@# z|Nc(S>QqoQxfG55!(#CewJRE%VZk!Y4kZ{n;FhQb7*7 zx02ve-OG|f{}4Td!FEE6Q2ho)qdgyN3wbuUF}tA3&70X2{mE?kFKF?~9`g)44Sn*8 zcvXjDl$t{ze&Y`o7nC|X`L;CDRdBn1cZ^eOwunekSi`f`ttTC0+?kk{ajB&CYo73w z4Rw#pEj);kMEA&`@9)66ytQ`Be=a;)-LnWh^R1)=8Cz@b3}X1qFRkAotx7xZIB<4+ zx@R|VcEwPd@ee=hY@u!AhS;~Q39qXt_|?+|m7PGrzL{fUV&CR~N|m~4qv6Bj0Pw#s zJ&vyTCUhHr&BV$6Mb~VTi|xX$g_{4iokXcPR64HzaKa$yh7&*L7Anr1`7-#75g1mY zZmHo_&{<`<$4dWKUTlBZIy5uSH}AUov1TMKNa#QtOnh6hdvh;D`M&~0jv>E*4sR!a z1}R-N63!{1iR(zyaGo$N@IR{BvIo&eeo3vb#v%-Q#caekV2ZV8k=7@hb}uPco#;va ze%`4Gz*^+-2i(CP6+s|5$)`wUO2~HVw#7>#-hD8 z^{@y3{Q_U)>HDFBXwl_5Bi!etx|C3EQX{mHW7<)nw@$7%^_hcD0!bROUHtRwg!-K; zQi0Pj+gTD=7M?mb_kc^2H*Gfg?zG)cXG<`SK7N+w8tp>l_!t21zN3u!}kHMzfcJY)lA4sHwmF?Oj$cvlO>g6FyCv83Dq%`4KNl!y$6{de)g z_QZmsqKI=`0&Kqo=FcxQL(r~S4m92AV@?AfMl=>J>Y8Wj;K?gK##*!Q z=2{mArAmx}lsm#>j3Iab%ai{e!@pbppF6iI{Dr~$NNdtPmlI`q4ScC7X+tX%tb+az DFDA;E diff --git a/examples/corelib/serialization/cbordump/doc/src/cbordump.qdoc b/examples/corelib/serialization/cbordump/doc/src/cbordump.qdoc index f928b987..a4dc0111 100644 --- a/examples/corelib/serialization/cbordump/doc/src/cbordump.qdoc +++ b/examples/corelib/serialization/cbordump/doc/src/cbordump.qdoc @@ -3,7 +3,8 @@ /*! \example serialization/cbordump - \examplecategory {Input/Output} + \examplecategory {Data Processing & I/O} + \meta tag {network} \title Parsing and displaying CBOR data \brief A demonstration of how to parse files in CBOR format. diff --git a/examples/corelib/serialization/cbordump/main.cpp b/examples/corelib/serialization/cbordump/main.cpp index 106c408c..56d4070e 100644 --- a/examples/corelib/serialization/cbordump/main.cpp +++ b/examples/corelib/serialization/cbordump/main.cpp @@ -14,6 +14,8 @@ #include #include +using namespace Qt::StringLiterals; + /* * To regenerate: * curl -O https://www.iana.org/assignments/cbor-tags/cbor-tags.xml @@ -33,7 +35,7 @@ struct CborTagDescription { QCborTag tag; - const char *description; // with space and parentheses + const char *description; // with space and parentheses }; // CBOR Tags @@ -216,22 +218,18 @@ static const CborTagDescription tagDescriptions[] = { enum { // See RFC 7049 section 2. - SmallValueBitLength = 5, - SmallValueMask = (1 << SmallValueBitLength) - 1, /* 0x1f */ - Value8Bit = 24, - Value16Bit = 25, - Value32Bit = 26, - Value64Bit = 27 + SmallValueBitLength = 5, + SmallValueMask = (1 << SmallValueBitLength) - 1, /* 0x1f */ + Value8Bit = 24, + Value16Bit = 25, + Value32Bit = 26, + Value64Bit = 27 }; //! [0] struct CborDumper { - enum DumpOption { - ShowCompact = 0x01, - ShowWidthIndicators = 0x02, - ShowAnnotated = 0x04 - }; + enum DumpOption { ShowCompact = 0x01, ShowWidthIndicators = 0x02, ShowAnnotated = 0x04 }; Q_DECLARE_FLAGS(DumpOptions, DumpOption) CborDumper(QFile *f, DumpOptions opts_); @@ -268,8 +266,7 @@ static int cborNumberSize(quint64 value) return normalSize; } -CborDumper::CborDumper(QFile *f, DumpOptions opts_) - : opts(opts_) +CborDumper::CborDumper(QFile *f, DumpOptions opts_) : opts(opts_) { // try to mmap the file, this is faster char *ptr = reinterpret_cast(f->map(0, f->size(), QFile::MapPrivateOption)); @@ -316,7 +313,8 @@ QCborError CborDumper::dump() return err; } -template static inline bool canConvertTo(double v) +template +static inline bool canConvertTo(double v) { using TypeInfo = std::numeric_limits; // The [conv.fpint] (7.10 Floating-integral conversions) section of the @@ -337,31 +335,32 @@ template static inline bool canConvertTo(double v) return v == floor(v); } -static QString fpToString(double v, const char *suffix) +static QString fpToString(double v, QLatin1StringView suffix = ""_L1) { if (qIsInf(v)) - return v < 0 ? QStringLiteral("-inf") : QStringLiteral("inf"); + return v < 0 ? "-inf"_L1 : "inf"_L1; if (qIsNaN(v)) - return QStringLiteral("nan"); + return "nan"_L1; if (canConvertTo(v)) - return QString::number(qint64(v)) + ".0" + suffix; + return QString::number(qint64(v)) + ".0"_L1 + suffix; if (canConvertTo(v)) - return QString::number(quint64(v)) + ".0" + suffix; + return QString::number(quint64(v)) + ".0"_L1 + suffix; QString s = QString::number(v, 'g', QLocale::FloatingPointShortest); - if (!s.contains('.') && !s.contains('e')) - s += '.'; - s += suffix; + if (!s.contains(u'.') && !s.contains(u'e')) + s += u'.'; + if (suffix.size()) + s += suffix; return s; }; void CborDumper::dumpOne(int nestingLevel) { - QString indent(1, QLatin1Char(' ')); + QString indent(1, u' '); QString indented = indent; if (!opts.testFlag(ShowCompact)) { - indent = QLatin1Char('\n') + QString(4 * nestingLevel, QLatin1Char(' ')); - indented = QLatin1Char('\n') + QString(4 + 4 * nestingLevel, QLatin1Char(' ')); + indent = u'\n' + QString(4 * nestingLevel, u' '); + indented = u'\n' + QString(4 + 4 * nestingLevel, u' '); } switch (reader.type()) { @@ -401,7 +400,7 @@ void CborDumper::dumpOne(int nestingLevel) printStringWidthIndicator(r.data.size()); r = reader.readByteArray(); - comma = QLatin1Char(',') + indented; + comma = u',' + indented; } } else { auto r = reader.readString(); @@ -410,7 +409,7 @@ void CborDumper::dumpOne(int nestingLevel) printStringWidthIndicator(r.data.toUtf8().size()); r = reader.readString(); - comma = QLatin1Char(',') + indented; + comma = u',' + indented; } } @@ -466,7 +465,7 @@ void CborDumper::dumpOne(int nestingLevel) if (reader.next()) { printWidthIndicator(quint64(tag)); printf("("); - dumpOne(nestingLevel); // same level! + dumpOne(nestingLevel); // same level! printf(")"); } @@ -498,15 +497,15 @@ void CborDumper::dumpOne(int nestingLevel) break; case QCborStreamReader::Float16: - printf("%s", qPrintable(fpToString(reader.toFloat16(), "f16"))); + printf("%s", qPrintable(fpToString(reader.toFloat16(), "f16"_L1))); reader.next(); break; case QCborStreamReader::Float: - printf("%s", qPrintable(fpToString(reader.toFloat(), "f"))); + printf("%s", qPrintable(fpToString(reader.toFloat(), "f"_L1))); reader.next(); break; case QCborStreamReader::Double: - printf("%s", qPrintable(fpToString(reader.toDouble(), ""))); + printf("%s", qPrintable(fpToString(reader.toDouble()))); reader.next(); break; case QCborStreamReader::Invalid: @@ -559,7 +558,7 @@ void CborDumper::dumpOneDetailed(int nestingLevel) }; auto printFp = [=](const char *descr, double d) { - QString s = fpToString(d, ""); + QString s = fpToString(d); if (s.size() <= 6) return print(descr, "%s", qPrintable(s)); return print(descr, "%a", d); @@ -574,7 +573,7 @@ void CborDumper::dumpOneDetailed(int nestingLevel) qsizetype size = reader.currentStringChunkSize(); if (size < 0) - return; // error + return; // error if (size >= ChunkSizeLimit) { fprintf(stderr, "String length too big, %lli\n", qint64(size)); exit(EXIT_FAILURE); @@ -619,7 +618,7 @@ void CborDumper::dumpOneDetailed(int nestingLevel) printf(" %s%s", indent.constData(), section.toHex(' ').constData()); // print the decode - QByteArray spaces(width > 0 ? width - section.size() * 3 + 1: 0, ' '); + QByteArray spaces(width > 0 ? width - section.size() * 3 + 1 : 0, ' '); printf("%s # \"", spaces.constData()); auto ptr = reinterpret_cast(section.constData()); for (int j = 0; j < section.size(); ++j) @@ -631,7 +630,7 @@ void CborDumper::dumpOneDetailed(int nestingLevel) // get the next chunk size = reader.currentStringChunkSize(); if (size < 0) - return; // error + return; // error if (size >= ChunkSizeLimit) { fprintf(stderr, "String length too big, %lli\n", qint64(size)); exit(EXIT_FAILURE); @@ -770,7 +769,9 @@ void CborDumper::printByteArray(const QByteArray &ba) break; case quint8(QCborKnownTags::ExpectedBase64url): - printf("b64'%s'", ba.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals).constData()); + printf("b64'%s'", + ba.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals) + .constData()); break; } } @@ -811,23 +812,20 @@ int main(int argc, char *argv[]) setlocale(LC_ALL, "C"); QCommandLineParser parser; - parser.setApplicationDescription(QStringLiteral("CBOR Dumper tool")); + parser.setApplicationDescription("CBOR Dumper tool"_L1); parser.addHelpOption(); - QCommandLineOption compact({QStringLiteral("c"), QStringLiteral("compact")}, - QStringLiteral("Use compact form (no line breaks)")); + QCommandLineOption compact({"c"_L1, "compact"_L1}, "Use compact form (no line breaks)"_L1); parser.addOption(compact); - QCommandLineOption showIndicators({QStringLiteral("i"), QStringLiteral("indicators")}, - QStringLiteral("Show indicators for width of lengths and integrals")); + QCommandLineOption showIndicators({ "i"_L1, "indicators"_L1 }, + "Show indicators for width of lengths and integrals"_L1); parser.addOption(showIndicators); - QCommandLineOption verbose({QStringLiteral("a"), QStringLiteral("annotated")}, - QStringLiteral("Show bytes and annotated decoding")); + QCommandLineOption verbose({"a"_L1, "annotated"_L1}, "Show bytes and annotated decoding"_L1); parser.addOption(verbose); - parser.addPositionalArgument(QStringLiteral("[source]"), - QStringLiteral("CBOR file to read from")); + parser.addPositionalArgument("[source]"_L1, "CBOR file to read from"_L1); parser.process(app); diff --git a/examples/corelib/serialization/convert/CMakeLists.txt b/examples/corelib/serialization/convert/CMakeLists.txt index 5a10a78a..b5b960c0 100644 --- a/examples/corelib/serialization/convert/CMakeLists.txt +++ b/examples/corelib/serialization/convert/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(convert LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() @@ -18,6 +22,7 @@ qt_add_executable(convert cborconverter.cpp cborconverter.h converter.h datastreamconverter.cpp datastreamconverter.h + debugtextdumper.cpp debugtextdumper.h jsonconverter.cpp jsonconverter.h main.cpp nullconverter.cpp nullconverter.h diff --git a/examples/corelib/serialization/convert/cborconverter.cpp b/examples/corelib/serialization/convert/cborconverter.cpp index 85ca8c12..f6a4ee35 100644 --- a/examples/corelib/serialization/convert/cborconverter.cpp +++ b/examples/corelib/serialization/convert/cborconverter.cpp @@ -3,19 +3,21 @@ #include "cborconverter.h" +#include +#include #include #include -#include -#include #include #include -#include #include +#include #include #include #include +using namespace Qt::StringLiterals; + static CborConverter cborConverter; static CborDiagnosticDumper cborDiagnosticDumper; @@ -118,33 +120,33 @@ static QCborValue convertFromVariant(const QVariant &v, TrimFloatingPoint fpTrim } //! [1] -QString CborDiagnosticDumper::name() +QString CborDiagnosticDumper::name() const { - return QStringLiteral("cbor-dump"); + return "cbor-dump"_L1; } -Converter::Direction CborDiagnosticDumper::directions() +Converter::Directions CborDiagnosticDumper::directions() const { - return Out; + return Direction::Out; } -Converter::Options CborDiagnosticDumper::outputOptions() +Converter::Options CborDiagnosticDumper::outputOptions() const { return SupportsArbitraryMapKeys; } -const char *CborDiagnosticDumper::optionsHelp() +const char *CborDiagnosticDumper::optionsHelp() const { return diagnosticHelp; } -bool CborDiagnosticDumper::probeFile(QIODevice *f) +bool CborDiagnosticDumper::probeFile(QIODevice *f) const { Q_UNUSED(f); return false; } -QVariant CborDiagnosticDumper::loadFile(QIODevice *f, Converter *&outputConverter) +QVariant CborDiagnosticDumper::loadFile(QIODevice *f, const Converter *&outputConverter) const { Q_UNREACHABLE(); Q_UNUSED(f); @@ -152,7 +154,8 @@ QVariant CborDiagnosticDumper::loadFile(QIODevice *f, Converter *&outputConverte return QVariant(); } -void CborDiagnosticDumper::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) +void CborDiagnosticDumper::saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const { QCborValue::DiagnosticNotationOptions opts = QCborValue::LineWrapped; for (const QString &s : options) { @@ -181,8 +184,7 @@ void CborDiagnosticDumper::saveFile(QIODevice *f, const QVariant &contents, cons } QTextStream out(f); - out << convertFromVariant(contents, Double).toDiagnosticNotation(opts) - << Qt::endl; + out << convertFromVariant(contents, Double).toDiagnosticNotation(opts) << Qt::endl; } CborConverter::CborConverter() @@ -190,37 +192,37 @@ CborConverter::CborConverter() qRegisterMetaType(); } -QString CborConverter::name() +QString CborConverter::name() const { return "cbor"; } -Converter::Direction CborConverter::directions() +Converter::Directions CborConverter::directions() const { - return InOut; + return Direction::InOut; } -Converter::Options CborConverter::outputOptions() +Converter::Options CborConverter::outputOptions() const { return SupportsArbitraryMapKeys; } -const char *CborConverter::optionsHelp() +const char *CborConverter::optionsHelp() const { return cborOptionHelp; } -bool CborConverter::probeFile(QIODevice *f) +bool CborConverter::probeFile(QIODevice *f) const { if (QFile *file = qobject_cast(f)) { - if (file->fileName().endsWith(QLatin1String(".cbor"))) + if (file->fileName().endsWith(".cbor"_L1)) return true; } return f->isReadable() && f->peek(3) == QByteArray("\xd9\xd9\xf7", 3); } //! [2] -QVariant CborConverter::loadFile(QIODevice *f, Converter *&outputConverter) +QVariant CborConverter::loadFile(QIODevice *f, const Converter *&outputConverter) const { const char *ptr = nullptr; if (auto file = qobject_cast(f)) @@ -256,7 +258,7 @@ QVariant CborConverter::loadFile(QIODevice *f, Converter *&outputConverter) } //! [2] //! [3] -void CborConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) +void CborConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) const { //! [3] bool useSignature = true; @@ -318,8 +320,9 @@ void CborConverter::saveFile(QIODevice *f, const QVariant &contents, const QStri exit(EXIT_FAILURE); } //! [4] - QCborValue v = convertFromVariant(contents, - useFloat16 == Always ? Float16 : useFloat == Always ? Float : Double); + QCborValue v = + convertFromVariant(contents, + useFloat16 == Always ? Float16 : useFloat == Always ? Float : Double); QCborStreamWriter writer(f); if (useSignature) writer.append(QCborKnownTags::Signature); diff --git a/examples/corelib/serialization/convert/cborconverter.h b/examples/corelib/serialization/convert/cborconverter.h index d19c9eb3..ff031856 100644 --- a/examples/corelib/serialization/convert/cborconverter.h +++ b/examples/corelib/serialization/convert/cborconverter.h @@ -10,13 +10,14 @@ class CborDiagnosticDumper : public Converter { // Converter interface public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; }; class CborConverter : public Converter @@ -26,13 +27,14 @@ public: // Converter interface public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; }; #endif // CBORCONVERTER_H diff --git a/examples/corelib/serialization/convert/convert.pro b/examples/corelib/serialization/convert/convert.pro index 4c6b0b55..5f4d8c20 100644 --- a/examples/corelib/serialization/convert/convert.pro +++ b/examples/corelib/serialization/convert/convert.pro @@ -12,17 +12,19 @@ INSTALLS += target SOURCES += main.cpp \ cborconverter.cpp \ - jsonconverter.cpp \ datastreamconverter.cpp \ + debugtextdumper.cpp \ + jsonconverter.cpp \ + nullconverter.cpp \ textconverter.cpp \ - xmlconverter.cpp \ - nullconverter.cpp + xmlconverter.cpp HEADERS += \ converter.h \ cborconverter.h \ - jsonconverter.h \ datastreamconverter.h \ + debugtextdumper.h \ + jsonconverter.h \ + nullconverter.h \ textconverter.h \ - xmlconverter.h \ - nullconverter.h + xmlconverter.h diff --git a/examples/corelib/serialization/convert/converter.h b/examples/corelib/serialization/convert/converter.h index 4da4d472..300f8379 100644 --- a/examples/corelib/serialization/convert/converter.h +++ b/examples/corelib/serialization/convert/converter.h @@ -5,10 +5,10 @@ #define CONVERTER_H #include +#include #include #include #include -#include class VariantOrderedMap : public QList> { @@ -32,26 +32,25 @@ protected: public: static Converter *null; - enum Direction { - In = 1, Out = 2, InOut = 3 - }; + enum class Direction { In = 1, Out = 2, InOut = In | Out }; + Q_DECLARE_FLAGS(Directions, Direction) - enum Option { - SupportsArbitraryMapKeys = 0x01 - }; + enum Option { SupportsArbitraryMapKeys = 0x01 }; Q_DECLARE_FLAGS(Options, Option) virtual ~Converter() = 0; - virtual QString name() = 0; - virtual Direction directions() = 0; - virtual Options outputOptions() = 0; - virtual const char *optionsHelp() = 0; - virtual bool probeFile(QIODevice *f) = 0; - virtual QVariant loadFile(QIODevice *f, Converter *&outputConverter) = 0; - virtual void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) = 0; + virtual QString name() const = 0; + virtual Directions directions() const = 0; + virtual Options outputOptions() const = 0; + virtual const char *optionsHelp() const = 0; + virtual bool probeFile(QIODevice *f) const = 0; + virtual QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const = 0; + virtual void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const = 0; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(Converter::Directions) Q_DECLARE_OPERATORS_FOR_FLAGS(Converter::Options) #endif // CONVERTER_H diff --git a/examples/corelib/serialization/convert/datastreamconverter.cpp b/examples/corelib/serialization/convert/datastreamconverter.cpp index 451688e3..0cce9dd2 100644 --- a/examples/corelib/serialization/convert/datastreamconverter.cpp +++ b/examples/corelib/serialization/convert/datastreamconverter.cpp @@ -2,20 +2,21 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "datastreamconverter.h" +#include "debugtextdumper.h" #include -#include -#include + +using namespace Qt::StringLiterals; static const char dataStreamOptionHelp[] = "byteorder=host|big|little Byte order to use.\n" - "version= QDataStream version (default: Qt 5.0).\n" + "version= QDataStream version (default: Qt 6.0).\n" ; static const char signature[] = "qds"; -static DataStreamDumper dataStreamDumper; -static DataStreamConverter DataStreamConverter; +static DataStreamConverter dataStreamConverter; +static DebugTextDumper debugTextDumper; QDataStream &operator<<(QDataStream &ds, const VariantOrderedMap &map) { @@ -42,123 +43,43 @@ QDataStream &operator>>(QDataStream &ds, VariantOrderedMap &map) return ds; } - -static QString dumpVariant(const QVariant &v, const QString &indent = QLatin1String("\n")) -{ - QString result; - QString indented = indent + QLatin1String(" "); - - int type = v.userType(); - if (type == qMetaTypeId() || type == QMetaType::QVariantMap) { - const auto map = (type == QMetaType::QVariantMap) ? - VariantOrderedMap(v.toMap()) : qvariant_cast(v); - - result = QLatin1String("Map {"); - for (const auto &pair : map) { - result += indented + dumpVariant(pair.first, indented); - result.chop(1); // remove comma - result += QLatin1String(" => ") + dumpVariant(pair.second, indented); - - } - result.chop(1); // remove comma - result += indent + QLatin1String("},"); - } else if (type == QMetaType::QVariantList) { - const QVariantList list = v.toList(); - - result = QLatin1String("List ["); - for (const auto &item : list) - result += indented + dumpVariant(item, indented); - result.chop(1); // remove comma - result += indent + QLatin1String("],"); - } else { - QDebug debug(&result); - debug.nospace() << v << ','; - } - return result; -} - -QString DataStreamDumper::name() -{ - return QStringLiteral("datastream-dump"); -} - -Converter::Direction DataStreamDumper::directions() -{ - return Out; -} - -Converter::Options DataStreamDumper::outputOptions() -{ - return SupportsArbitraryMapKeys; -} - -const char *DataStreamDumper::optionsHelp() -{ - return nullptr; -} - -bool DataStreamDumper::probeFile(QIODevice *f) -{ - Q_UNUSED(f); - return false; -} - -QVariant DataStreamDumper::loadFile(QIODevice *f, Converter *&outputConverter) -{ - Q_UNREACHABLE(); - Q_UNUSED(f); - Q_UNUSED(outputConverter); - return QVariant(); -} - -void DataStreamDumper::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) -{ - Q_UNUSED(options); - QString s = dumpVariant(contents); - s[s.size() - 1] = QLatin1Char('\n'); // replace the comma with newline - - QTextStream out(f); - out << s; -} - DataStreamConverter::DataStreamConverter() { qRegisterMetaType(); } -QString DataStreamConverter::name() +QString DataStreamConverter::name() const { - return QStringLiteral("datastream"); + return "datastream"_L1; } -Converter::Direction DataStreamConverter::directions() +Converter::Directions DataStreamConverter::directions() const { - return InOut; + return Direction::InOut; } -Converter::Options DataStreamConverter::outputOptions() +Converter::Options DataStreamConverter::outputOptions() const { return SupportsArbitraryMapKeys; } -const char *DataStreamConverter::optionsHelp() +const char *DataStreamConverter::optionsHelp() const { return dataStreamOptionHelp; } -bool DataStreamConverter::probeFile(QIODevice *f) +bool DataStreamConverter::probeFile(QIODevice *f) const { return f->isReadable() && f->peek(sizeof(signature) - 1) == signature; } -QVariant DataStreamConverter::loadFile(QIODevice *f, Converter *&outputConverter) +QVariant DataStreamConverter::loadFile(QIODevice *f, const Converter *&outputConverter) const { if (!outputConverter) - outputConverter = &dataStreamDumper; + outputConverter = &debugTextDumper; char c; - if (f->read(sizeof(signature) -1) != signature || - !f->getChar(&c) || (c != 'l' && c != 'B')) { + if (f->read(sizeof(signature) - 1) != signature || !f->getChar(&c) || (c != 'l' && c != 'B')) { fprintf(stderr, "Could not load QDataStream file: invalid signature.\n"); exit(EXIT_FAILURE); } @@ -175,9 +96,10 @@ QVariant DataStreamConverter::loadFile(QIODevice *f, Converter *&outputConverter return result; } -void DataStreamConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) +void DataStreamConverter::saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const { - QDataStream::Version version = QDataStream::Qt_5_0; + QDataStream::Version version = QDataStream::Qt_6_0; auto order = QDataStream::ByteOrder(QSysInfo::ByteOrder); for (const QString &option : options) { const QStringList pair = option.split('='); @@ -213,7 +135,7 @@ void DataStreamConverter::saveFile(QIODevice *f, const QVariant &contents, const exit(EXIT_FAILURE); } - char c = order == QDataStream::LittleEndian ? 'l' : 'B'; + char c = order == QDataStream::LittleEndian ? 'l' : 'B'; f->write(signature); f->write(&c, 1); diff --git a/examples/corelib/serialization/convert/datastreamconverter.h b/examples/corelib/serialization/convert/datastreamconverter.h index 95c8861e..201f3c47 100644 --- a/examples/corelib/serialization/convert/datastreamconverter.h +++ b/examples/corelib/serialization/convert/datastreamconverter.h @@ -6,19 +6,6 @@ #include "converter.h" -class DataStreamDumper : public Converter -{ - // Converter interface -public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; -}; - class DataStreamConverter : public Converter { public: @@ -26,13 +13,14 @@ public: // Converter interface public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; }; #endif // DATASTREAMCONVERTER_H diff --git a/examples/corelib/serialization/convert/debugtextdumper.cpp b/examples/corelib/serialization/convert/debugtextdumper.cpp new file mode 100644 index 00000000..dfe3e562 --- /dev/null +++ b/examples/corelib/serialization/convert/debugtextdumper.cpp @@ -0,0 +1,89 @@ +// Copyright (C) 2018 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "debugtextdumper.h" + +#include +#include + +using namespace Qt::StringLiterals; + +// Static instance is declared in datastreamconverter.cpp, since it uses it. + +static QString dumpVariant(const QVariant &v, const QString &indent = "\n"_L1) +{ + QString result; + QString indented = indent + " "_L1; + + int type = v.userType(); + if (type == qMetaTypeId() || type == QMetaType::QVariantMap) { + const auto map = (type == QMetaType::QVariantMap) ? VariantOrderedMap(v.toMap()) + : qvariant_cast(v); + + result = "Map {"_L1; + for (const auto &pair : map) { + result += indented + dumpVariant(pair.first, indented); + result.chop(1); // remove comma + result += " => "_L1 + dumpVariant(pair.second, indented); + } + result.chop(1); // remove comma + result += indent + "},"_L1; + } else if (type == QMetaType::QVariantList) { + const QVariantList list = v.toList(); + + result = "List ["_L1; + for (const auto &item : list) + result += indented + dumpVariant(item, indented); + result.chop(1); // remove comma + result += indent + "],"_L1; + } else { + QDebug debug(&result); + debug.nospace() << v << ','; + } + return result; +} + +QString DebugTextDumper::name() const +{ + return "debugtext-dump"_L1; +} + +Converter::Directions DebugTextDumper::directions() const +{ + return Direction::Out; +} + +Converter::Options DebugTextDumper::outputOptions() const +{ + return SupportsArbitraryMapKeys; +} + +const char *DebugTextDumper::optionsHelp() const +{ + return nullptr; +} + +bool DebugTextDumper::probeFile(QIODevice *f) const +{ + Q_UNUSED(f); + return false; +} + +QVariant DebugTextDumper::loadFile(QIODevice *f, const Converter *&outputConverter) const +{ + Q_UNREACHABLE(); + Q_UNUSED(f); + Q_UNUSED(outputConverter); + return QVariant(); +} + +void DebugTextDumper::saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const +{ + Q_UNUSED(options); + QString s = dumpVariant(contents); + s[s.size() - 1] = u'\n'; // replace the comma with newline + + QTextStream out(f); + out << s; +} diff --git a/examples/corelib/serialization/convert/debugtextdumper.h b/examples/corelib/serialization/convert/debugtextdumper.h new file mode 100644 index 00000000..636e6ccb --- /dev/null +++ b/examples/corelib/serialization/convert/debugtextdumper.h @@ -0,0 +1,23 @@ +// Copyright (C) 2018 Intel Corporation. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef DEBUGTEXTDUMPER_H +#define DEBUGTEXTDUMPER_H + +#include "converter.h" + +class DebugTextDumper : public Converter +{ + // Converter interface +public: + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; +}; + +#endif // DEBUGTEXTDUMPER_H diff --git a/examples/corelib/serialization/convert/doc/src/convert.qdoc b/examples/corelib/serialization/convert/doc/src/convert.qdoc index 156ee5ba..0557aa18 100644 --- a/examples/corelib/serialization/convert/doc/src/convert.qdoc +++ b/examples/corelib/serialization/convert/doc/src/convert.qdoc @@ -3,7 +3,8 @@ /*! \example serialization/convert - \examplecategory {Input/Output} + \examplecategory {Data Processing & I/O} + \meta tag {network} \title Convert Example \brief The Convert example demonstrates how to convert between different @@ -59,7 +60,7 @@ \section1 The DataStreamConverter Class The DataStreamConverter class is used to serialize to and from the - QDataStream format. There is also the DataStreamDumper class for outputting + QDataStream format. There is also the DebugTextDumper class for outputting the data lossless in a non-standardized human readable format. \section1 The JsonConverter Class diff --git a/examples/corelib/serialization/convert/jsonconverter.cpp b/examples/corelib/serialization/convert/jsonconverter.cpp index f52c9db5..b6a6a1dd 100644 --- a/examples/corelib/serialization/convert/jsonconverter.cpp +++ b/examples/corelib/serialization/convert/jsonconverter.cpp @@ -9,10 +9,11 @@ #include #include +using namespace Qt::StringLiterals; + static JsonConverter jsonConverter; -static const char jsonOptionHelp[] = - "compact=no|yes Use compact JSON form.\n"; +static const char jsonOptionHelp[] = "compact=no|yes Use compact JSON form.\n"; static QJsonDocument convertFromVariant(const QVariant &v) { @@ -24,34 +25,30 @@ static QJsonDocument convertFromVariant(const QVariant &v) return doc; } -JsonConverter::JsonConverter() +QString JsonConverter::name() const { + return "json"_L1; } -QString JsonConverter::name() +Converter::Directions JsonConverter::directions() const { - return "json"; + return Direction::InOut; } -Converter::Direction JsonConverter::directions() -{ - return InOut; -} - -Converter::Options JsonConverter::outputOptions() +Converter::Options JsonConverter::outputOptions() const { return {}; } -const char *JsonConverter::optionsHelp() +const char *JsonConverter::optionsHelp() const { return jsonOptionHelp; } -bool JsonConverter::probeFile(QIODevice *f) +bool JsonConverter::probeFile(QIODevice *f) const { if (QFile *file = qobject_cast(f)) { - if (file->fileName().endsWith(QLatin1String(".json"))) + if (file->fileName().endsWith(".json"_L1)) return true; } @@ -62,7 +59,7 @@ bool JsonConverter::probeFile(QIODevice *f) return false; } -QVariant JsonConverter::loadFile(QIODevice *f, Converter *&outputConverter) +QVariant JsonConverter::loadFile(QIODevice *f, const Converter *&outputConverter) const { if (!outputConverter) outputConverter = this; @@ -87,13 +84,14 @@ QVariant JsonConverter::loadFile(QIODevice *f, Converter *&outputConverter) return doc.toVariant(); } -void JsonConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) +void JsonConverter::saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const { QJsonDocument::JsonFormat format = QJsonDocument::Indented; for (const QString &s : options) { - if (s == QLatin1String("compact=no")) { + if (s == "compact=no"_L1) { format = QJsonDocument::Indented; - } else if (s == QLatin1String("compact=yes")) { + } else if (s == "compact=yes"_L1) { format = QJsonDocument::Compact; } else { fprintf(stderr, "Unknown option '%s' to JSON output. Valid options are:\n%s", diff --git a/examples/corelib/serialization/convert/jsonconverter.h b/examples/corelib/serialization/convert/jsonconverter.h index 40430a6b..acff1433 100644 --- a/examples/corelib/serialization/convert/jsonconverter.h +++ b/examples/corelib/serialization/convert/jsonconverter.h @@ -8,18 +8,16 @@ class JsonConverter : public Converter { -public: - JsonConverter(); - // Converter interface public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; }; #endif // JSONCONVERTER_H diff --git a/examples/corelib/serialization/convert/main.cpp b/examples/corelib/serialization/convert/main.cpp index 00c626e1..9a272090 100644 --- a/examples/corelib/serialization/convert/main.cpp +++ b/examples/corelib/serialization/convert/main.cpp @@ -11,12 +11,14 @@ #include -static QList *availableConverters; +using namespace Qt::StringLiterals; + +static QList *availableConverters; Converter::Converter() { if (!availableConverters) - availableConverters = new QList; + availableConverters = new QList; availableConverters->append(this); } @@ -31,64 +33,68 @@ int main(int argc, char *argv[]) QStringList inputFormats; QStringList outputFormats; - for (Converter *conv : std::as_const(*availableConverters)) { + for (const Converter *conv : std::as_const(*availableConverters)) { auto direction = conv->directions(); QString name = conv->name(); - if (direction & Converter::In) + if (direction.testFlag(Converter::Direction::In)) inputFormats << name; - if (direction & Converter::Out) + if (direction.testFlag(Converter::Direction::Out)) outputFormats << name; } inputFormats.sort(); outputFormats.sort(); - inputFormats.prepend("auto"); - outputFormats.prepend("auto"); + inputFormats.prepend("auto"_L1); + outputFormats.prepend("auto"_L1); QCommandLineParser parser; - parser.setApplicationDescription(QStringLiteral("Qt file format conversion tool")); + parser.setApplicationDescription("Qt file format conversion tool"_L1); parser.addHelpOption(); - QCommandLineOption inputFormatOption(QStringList{"I", "input-format"}); - inputFormatOption.setDescription(QLatin1String("Select the input format for the input file. Available formats: ") + - inputFormats.join(", ")); - inputFormatOption.setValueName("format"); + QCommandLineOption inputFormatOption(QStringList{ "I"_L1, "input-format"_L1 }); + inputFormatOption.setDescription( + "Select the input format for the input file. Available formats: "_L1 + + inputFormats.join(", "_L1)); + inputFormatOption.setValueName("format"_L1); inputFormatOption.setDefaultValue(inputFormats.constFirst()); parser.addOption(inputFormatOption); - QCommandLineOption outputFormatOption(QStringList{"O", "output-format"}); - outputFormatOption.setDescription(QLatin1String("Select the output format for the output file. Available formats: ") + - outputFormats.join(", ")); - outputFormatOption.setValueName("format"); + QCommandLineOption outputFormatOption(QStringList{ "O"_L1, "output-format"_L1 }); + outputFormatOption.setDescription( + "Select the output format for the output file. Available formats: "_L1 + + outputFormats.join(", "_L1)); + outputFormatOption.setValueName("format"_L1); outputFormatOption.setDefaultValue(outputFormats.constFirst()); parser.addOption(outputFormatOption); - QCommandLineOption optionOption(QStringList{"o", "option"}); - optionOption.setDescription(QStringLiteral("Format-specific options. Use --format-options to find out what options are available.")); - optionOption.setValueName("options..."); + QCommandLineOption optionOption(QStringList{ "o"_L1, "option"_L1 }); + optionOption.setDescription( + "Format-specific options. Use --format-options to find out what options are available."_L1); + optionOption.setValueName("options..."_L1); optionOption.setDefaultValues({}); parser.addOption(optionOption); - QCommandLineOption formatOptionsOption("format-options"); - formatOptionsOption.setDescription(QStringLiteral("Prints the list of valid options for --option for the converter format .")); - formatOptionsOption.setValueName("format"); + QCommandLineOption formatOptionsOption("format-options"_L1); + formatOptionsOption.setDescription( + "Prints the list of valid options for --option for the converter format ."_L1); + formatOptionsOption.setValueName("format"_L1); parser.addOption(formatOptionsOption); - parser.addPositionalArgument(QStringLiteral("[source]"), - QStringLiteral("File to read from (stdin if none)")); - parser.addPositionalArgument(QStringLiteral("[destination]"), - QStringLiteral("File to write to (stdout if none)")); + parser.addPositionalArgument("[source]"_L1, "File to read from (stdin if none)"_L1); + parser.addPositionalArgument("[destination]"_L1, "File to write to (stdout if none)"_L1); parser.process(app); if (parser.isSet(formatOptionsOption)) { QString format = parser.value(formatOptionsOption); - for (Converter *conv : std::as_const(*availableConverters)) { + for (const Converter *conv : std::as_const(*availableConverters)) { if (conv->name() == format) { const char *help = conv->optionsHelp(); - if (help) - printf("The following options are available for format '%s':\n\n%s", qPrintable(format), help); - else + if (help) { + printf("The following options are available for format '%s':\n\n%s", + qPrintable(format), help); + } else { printf("Format '%s' supports no options.\n", qPrintable(format)); + } return EXIT_SUCCESS; } } @@ -97,10 +103,10 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - Converter *inconv = nullptr; + const Converter *inconv = nullptr; QString format = parser.value(inputFormatOption); - if (format != "auto") { - for (Converter *conv : std::as_const(*availableConverters)) { + if (format != "auto"_L1) { + for (const Converter *conv : std::as_const(*availableConverters)) { if (conv->name() == format) { inconv = conv; break; @@ -113,10 +119,10 @@ int main(int argc, char *argv[]) } } - Converter *outconv = nullptr; + const Converter *outconv = nullptr; format = parser.value(outputFormatOption); - if (format != "auto") { - for (Converter *conv : std::as_const(*availableConverters)) { + if (format != "auto"_L1) { + for (const Converter *conv : std::as_const(*availableConverters)) { if (conv->name() == format) { outconv = conv; break; @@ -155,8 +161,9 @@ int main(int argc, char *argv[]) if (!inconv) { // probe the input to find a file format - for (Converter *conv : std::as_const(*availableConverters)) { - if (conv->directions() & Converter::In && conv->probeFile(&input)) { + for (const Converter *conv : std::as_const(*availableConverters)) { + if (conv->directions().testFlag(Converter::Direction::In) + && conv->probeFile(&input)) { inconv = conv; break; } @@ -170,8 +177,9 @@ int main(int argc, char *argv[]) if (!outconv) { // probe the output to find a file format - for (Converter *conv : std::as_const(*availableConverters)) { - if (conv->directions() & Converter::Out && conv->probeFile(&output)) { + for (const Converter *conv : std::as_const(*availableConverters)) { + if (conv->directions().testFlag(Converter::Direction::Out) + && conv->probeFile(&output)) { outconv = conv; break; } diff --git a/examples/corelib/serialization/convert/nullconverter.cpp b/examples/corelib/serialization/convert/nullconverter.cpp index a3f0bcd9..aababe67 100644 --- a/examples/corelib/serialization/convert/nullconverter.cpp +++ b/examples/corelib/serialization/convert/nullconverter.cpp @@ -3,36 +3,38 @@ #include "nullconverter.h" +using namespace Qt::StringLiterals; + static NullConverter nullConverter; -Converter* Converter::null = &nullConverter; +Converter *Converter::null = &nullConverter; -QString NullConverter::name() +QString NullConverter::name() const { - return QLatin1String("null"); + return "null"_L1; } -Converter::Direction NullConverter::directions() +Converter::Directions NullConverter::directions() const { - return Out; + return Direction::Out; } -Converter::Options NullConverter::outputOptions() +Converter::Options NullConverter::outputOptions() const { return SupportsArbitraryMapKeys; } -const char *NullConverter::optionsHelp() +const char *NullConverter::optionsHelp() const { return nullptr; } -bool NullConverter::probeFile(QIODevice *f) +bool NullConverter::probeFile(QIODevice *f) const { Q_UNUSED(f); return false; } -QVariant NullConverter::loadFile(QIODevice *f, Converter *&outputConverter) +QVariant NullConverter::loadFile(QIODevice *f, const Converter *&outputConverter) const { Q_UNUSED(f); Q_UNUSED(outputConverter); @@ -40,10 +42,12 @@ QVariant NullConverter::loadFile(QIODevice *f, Converter *&outputConverter) return QVariant(); } -void NullConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) +void NullConverter::saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const { if (!options.isEmpty()) { - fprintf(stderr, "Unknown option '%s' to null output. This format has no options.\n", qPrintable(options.first())); + fprintf(stderr, "Unknown option '%s' to null output. This format has no options.\n", + qPrintable(options.first())); exit(EXIT_FAILURE); } diff --git a/examples/corelib/serialization/convert/nullconverter.h b/examples/corelib/serialization/convert/nullconverter.h index b2c69593..fb215c31 100644 --- a/examples/corelib/serialization/convert/nullconverter.h +++ b/examples/corelib/serialization/convert/nullconverter.h @@ -10,13 +10,14 @@ class NullConverter : public Converter { // Converter interface public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; }; #endif // NULLCONVERTER_H diff --git a/examples/corelib/serialization/convert/textconverter.cpp b/examples/corelib/serialization/convert/textconverter.cpp index b02ce12f..2df2423b 100644 --- a/examples/corelib/serialization/convert/textconverter.cpp +++ b/examples/corelib/serialization/convert/textconverter.cpp @@ -6,6 +6,8 @@ #include #include +using namespace Qt::StringLiterals; + static void dumpVariant(QTextStream &out, const QVariant &v) { switch (v.userType()) { @@ -42,67 +44,62 @@ static void dumpVariant(QTextStream &out, const QVariant &v) } } -QString TextConverter::name() +QString TextConverter::name() const { - return QStringLiteral("text"); + return "text"_L1; } -Converter::Direction TextConverter::directions() +Converter::Directions TextConverter::directions() const { - return InOut; + return Direction::InOut; } -Converter::Options TextConverter::outputOptions() +Converter::Options TextConverter::outputOptions() const { return {}; } -const char *TextConverter::optionsHelp() +const char *TextConverter::optionsHelp() const { return nullptr; } -bool TextConverter::probeFile(QIODevice *f) +bool TextConverter::probeFile(QIODevice *f) const { if (QFile *file = qobject_cast(f)) - return file->fileName().endsWith(QLatin1String(".txt")); + return file->fileName().endsWith(".txt"_L1); return false; } -QVariant TextConverter::loadFile(QIODevice *f, Converter *&outputConverter) +QVariant TextConverter::loadFile(QIODevice *f, const Converter *&outputConverter) const { if (!outputConverter) outputConverter = this; QVariantList list; QTextStream in(f); - QString line ; + QString line; while (!in.atEnd()) { in.readLineInto(&line); - bool ok; - qint64 v = line.toLongLong(&ok); - if (ok) { + + if (qint64 v = line.toLongLong(&ok); ok) list.append(v); - continue; - } - - double d = line.toDouble(&ok); - if (ok) { + else if (double d = line.toDouble(&ok); ok) list.append(d); - continue; - } - - list.append(line); + else + list.append(line); } return list; } -void TextConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) +void TextConverter::saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const { if (!options.isEmpty()) { - fprintf(stderr, "Unknown option '%s' to text output. This format has no options.\n", qPrintable(options.first())); + fprintf(stderr, "Unknown option '%s' to text output. This format has no options.\n", + qPrintable(options.first())); exit(EXIT_FAILURE); } diff --git a/examples/corelib/serialization/convert/textconverter.h b/examples/corelib/serialization/convert/textconverter.h index 6379ffc8..46e5500d 100644 --- a/examples/corelib/serialization/convert/textconverter.h +++ b/examples/corelib/serialization/convert/textconverter.h @@ -8,16 +8,16 @@ class TextConverter : public Converter { - // Converter interface public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; + QString name() const override; + Directions directions() const override; + Options outputOptions() const override; + const char *optionsHelp() const override; + bool probeFile(QIODevice *f) const override; + QVariant loadFile(QIODevice *f, const Converter *&outputConverter) const override; + void saveFile(QIODevice *f, const QVariant &contents, + const QStringList &options) const override; }; #endif // TEXTCONVERTER_H diff --git a/examples/corelib/serialization/convert/xmlconverter.cpp b/examples/corelib/serialization/convert/xmlconverter.cpp index 080528f6..b625595f 100644 --- a/examples/corelib/serialization/convert/xmlconverter.cpp +++ b/examples/corelib/serialization/convert/xmlconverter.cpp @@ -13,8 +13,9 @@ #include #include -static const char xmlOptionHelp[] = - "compact=no|yes Use compact XML form.\n"; +using namespace Qt::StringLiterals; + +static const char xmlOptionHelp[] = "compact=no|yes Use compact XML form.\n"; static XmlConverter xmlConverter; @@ -23,7 +24,7 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options static QVariantList listFromXml(QXmlStreamReader &xml, Converter::Options options) { QVariantList list; - while (!xml.atEnd() && !(xml.isEndElement() && xml.name() == QLatin1String("list"))) { + while (!xml.atEnd() && !(xml.isEndElement() && xml.name() == "list"_L1)) { xml.readNext(); switch (xml.tokenType()) { case QXmlStreamReader::StartElement: @@ -47,8 +48,7 @@ static QVariantList listFromXml(QXmlStreamReader &xml, Converter::Options option break; } - fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", - xml.lineNumber(), xml.columnNumber(), + fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(xml.tokenString()), qPrintable(xml.name().toString())); exit(EXIT_FAILURE); } @@ -57,10 +57,11 @@ static QVariantList listFromXml(QXmlStreamReader &xml, Converter::Options option return list; } -static VariantOrderedMap::value_type mapEntryFromXml(QXmlStreamReader &xml, Converter::Options options) +static VariantOrderedMap::value_type mapEntryFromXml(QXmlStreamReader &xml, + Converter::Options options) { QVariant key, value; - while (!xml.atEnd() && !(xml.isEndElement() && xml.name() == QLatin1String("entry"))) { + while (!xml.atEnd() && !(xml.isEndElement() && xml.name() == "entry"_L1)) { xml.readNext(); switch (xml.tokenType()) { case QXmlStreamReader::StartElement: @@ -89,8 +90,7 @@ static VariantOrderedMap::value_type mapEntryFromXml(QXmlStreamReader &xml, Conv break; } - fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", - xml.lineNumber(), xml.columnNumber(), + fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(xml.tokenString()), qPrintable(xml.name().toString())); exit(EXIT_FAILURE); } @@ -103,11 +103,11 @@ static QVariant mapFromXml(QXmlStreamReader &xml, Converter::Options options) QVariantMap map1; VariantOrderedMap map2; - while (!xml.atEnd() && !(xml.isEndElement() && xml.name() == QLatin1String("map"))) { + while (!xml.atEnd() && !(xml.isEndElement() && xml.name() == "map"_L1)) { xml.readNext(); switch (xml.tokenType()) { case QXmlStreamReader::StartElement: - if (xml.name() == QLatin1String("entry")) { + if (xml.name() == "entry"_L1) { auto pair = mapEntryFromXml(xml, options); if (options & Converter::SupportsArbitraryMapKeys) map2.append(pair); @@ -134,8 +134,7 @@ static QVariant mapFromXml(QXmlStreamReader &xml, Converter::Options options) break; } - fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", - xml.lineNumber(), xml.columnNumber(), + fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(xml.tokenString()), qPrintable(xml.name().toString())); exit(EXIT_FAILURE); } @@ -149,18 +148,18 @@ static QVariant mapFromXml(QXmlStreamReader &xml, Converter::Options options) static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options) { QStringView name = xml.name(); - if (name == QLatin1String("list")) + if (name == "list"_L1) return listFromXml(xml, options); - if (name == QLatin1String("map")) + if (name == "map"_L1) return mapFromXml(xml, options); - if (name != QLatin1String("value")) { + if (name != "value"_L1) { fprintf(stderr, "%lld:%lld: Invalid XML key '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(name.toString())); exit(EXIT_FAILURE); } QXmlStreamAttributes attrs = xml.attributes(); - QStringView type = attrs.value(QLatin1String("type")); + QStringView type = attrs.value("type"_L1); forever { xml.readNext(); @@ -169,8 +168,7 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options if (xml.isCDATA() || xml.isCharacters() || xml.isEndElement()) break; - fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", - xml.lineNumber(), xml.columnNumber(), + fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(xml.tokenString()), qPrintable(name.toString())); exit(EXIT_FAILURE); } @@ -180,45 +178,45 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options text = text.trimmed(); QVariant result; - bool ok; if (type.isEmpty()) { // ok - } else if (type == QLatin1String("number")) { + } else if (type == "number"_L1) { // try integer first + bool ok; qint64 v = text.toLongLong(&ok); if (ok) { result = v; } else { // let's see floating point double d = text.toDouble(&ok); - result = d; if (!ok) { fprintf(stderr, "%lld:%lld: Invalid XML: could not interpret '%s' as a number.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(text.toString())); exit(EXIT_FAILURE); } + result = d; } - } else if (type == QLatin1String("bytes")) { + } else if (type == "bytes"_L1) { QByteArray data = text.toLatin1(); QStringView encoding = attrs.value("encoding"); - if (encoding == QLatin1String("base64url")) { + if (encoding == "base64url"_L1) { result = QByteArray::fromBase64(data, QByteArray::Base64UrlEncoding); - } else if (encoding == QLatin1String("hex")) { + } else if (encoding == "hex"_L1) { result = QByteArray::fromHex(data); - } else if (encoding.isEmpty() || encoding == QLatin1String("base64")) { + } else if (encoding.isEmpty() || encoding == "base64"_L1) { result = QByteArray::fromBase64(data); } else { fprintf(stderr, "%lld:%lld: Invalid XML: unknown encoding '%s' for bytes.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(encoding.toString())); exit(EXIT_FAILURE); } - } else if (type == QLatin1String("string")) { + } else if (type == "string"_L1) { result = text.toString(); - } else if (type == QLatin1String("null")) { + } else if (type == "null"_L1) { result = QVariant::fromValue(nullptr); - } else if (type == QLatin1String("CBOR simple type")) { + } else if (type == "CBOR simple type"_L1) { result = QVariant::fromValue(QCborSimpleType(text.toShort())); - } else if (type == QLatin1String("bits")) { + } else if (type == "bits"_L1) { QBitArray ba; ba.resize(text.size()); qsizetype n = 0; @@ -238,13 +236,13 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options result = ba; } else { int id = QMetaType::UnknownType; - if (type == QLatin1String("datetime")) + if (type == "datetime"_L1) id = QMetaType::QDateTime; - else if (type == QLatin1String("url")) + else if (type == "url"_L1) id = QMetaType::QUrl; - else if (type == QLatin1String("uuid")) + else if (type == "uuid"_L1) id = QMetaType::QUuid; - else if (type == QLatin1String("regex")) + else if (type == "regex"_L1) id = QMetaType::QRegularExpression; else id = QMetaType::fromName(type.toLatin1()).id(); @@ -267,8 +265,7 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options } while (xml.isComment() || xml.isWhitespace()); if (!xml.isEndElement()) { - fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", - xml.lineNumber(), xml.columnNumber(), + fprintf(stderr, "%lld:%lld: Invalid XML %s '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(xml.tokenString()), qPrintable(name.toString())); exit(EXIT_FAILURE); } @@ -287,9 +284,9 @@ static void variantToXml(QXmlStreamWriter &xml, const QVariant &v) variantToXml(xml, v); xml.writeEndElement(); } else if (type == QMetaType::QVariantMap || type == qMetaTypeId()) { - const VariantOrderedMap map = (type == QMetaType::QVariantMap) ? - VariantOrderedMap(v.toMap()) : - qvariant_cast(v); + const VariantOrderedMap map = (type == QMetaType::QVariantMap) + ? VariantOrderedMap(v.toMap()) + : qvariant_cast(v); xml.writeStartElement("map"); for (const auto &pair : map) { @@ -301,7 +298,7 @@ static void variantToXml(QXmlStreamWriter &xml, const QVariant &v) xml.writeEndElement(); } else { xml.writeStartElement("value"); - QString typeString = QStringLiteral("type"); + QString typeString = "type"_L1; switch (type) { case QMetaType::Short: case QMetaType::UShort: @@ -399,37 +396,37 @@ static void variantToXml(QXmlStreamWriter &xml, const QVariant &v) } } -QString XmlConverter::name() +QString XmlConverter::name() const { - return QStringLiteral("xml"); + return "xml"_L1; } -Converter::Direction XmlConverter::directions() +Converter::Directions XmlConverter::directions() const { - return InOut; + return Direction::InOut; } -Converter::Options XmlConverter::outputOptions() +Converter::Options XmlConverter::outputOptions() const { return SupportsArbitraryMapKeys; } -const char *XmlConverter::optionsHelp() +const char *XmlConverter::optionsHelp() const { return xmlOptionHelp; } -bool XmlConverter::probeFile(QIODevice *f) +bool XmlConverter::probeFile(QIODevice *f) const { if (QFile *file = qobject_cast(f)) { - if (file->fileName().endsWith(QLatin1String(".xml"))) + if (file->fileName().endsWith(".xml"_L1)) return true; } return f->isReadable() && f->peek(5) == " - -#include "rsslisting.h" - -/*! - Create an application and a main widget. Open the main widget for - user input, and exit with an appropriate return value when it is - closed. -*/ - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - RSSListing *rsslisting = new RSSListing; - rsslisting->show(); - return app.exec(); -} diff --git a/examples/corelib/serialization/rsslisting/rsslisting.cpp b/examples/corelib/serialization/rsslisting/rsslisting.cpp deleted file mode 100644 index 9269be40..00000000 --- a/examples/corelib/serialization/rsslisting/rsslisting.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -/* -rsslisting.cpp - -Provides a widget for displaying news items from RDF news sources. -RDF is an XML-based format for storing items of information (see -http://www.w3.org/RDF/ for details). - -The widget itself provides a simple user interface for specifying -the URL of a news source, and controlling the downloading of news. - -The widget downloads and parses the XML asynchronously, feeding the -data to an XML reader in pieces. This allows the user to interrupt -its operation, and also allows very large data sources to be read. -*/ - - -#include -#include -#include - -#include "rsslisting.h" - - -/* - Constructs an RSSListing widget with a simple user interface, and sets - up the XML reader to use a custom handler class. - - The user interface consists of a line edit, a push button, and a - list view widget. The line edit is used for entering the URLs of news - sources; the push button starts the process of reading the - news. -*/ - -RSSListing::RSSListing(QWidget *parent) - : QWidget(parent), currentReply(0) -{ - - lineEdit = new QLineEdit(this); - lineEdit->setText("http://blog.qt.io/feed/"); - - fetchButton = new QPushButton(tr("Fetch"), this); - - treeWidget = new QTreeWidget(this); - connect(treeWidget, &QTreeWidget::itemActivated, - this, &RSSListing::itemActivated); - QStringList headerLabels; - headerLabels << tr("Title") << tr("Link"); - treeWidget->setHeaderLabels(headerLabels); - treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents); - - connect(&manager, &QNetworkAccessManager::finished, - this, &RSSListing::finished); - - connect(lineEdit, &QLineEdit::returnPressed, this, &RSSListing::fetch); - connect(fetchButton, &QPushButton::clicked, this, &RSSListing::fetch); - - QVBoxLayout *layout = new QVBoxLayout(this); - - QHBoxLayout *hboxLayout = new QHBoxLayout; - - hboxLayout->addWidget(lineEdit); - hboxLayout->addWidget(fetchButton); - - layout->addLayout(hboxLayout); - layout->addWidget(treeWidget); - - setWindowTitle(tr("RSS listing example")); - resize(640,480); -} - -/* - Starts the network request and connects the needed signals -*/ -void RSSListing::get(const QUrl &url) -{ - QNetworkRequest request(url); - if (currentReply) { - currentReply->disconnect(this); - currentReply->deleteLater(); - } - currentReply = manager.get(request); - connect(currentReply, &QNetworkReply::readyRead, this, &RSSListing::readyRead); - connect(currentReply, &QNetworkReply::metaDataChanged, this, &RSSListing::metaDataChanged); - connect(currentReply, &QNetworkReply::errorOccurred, this, &RSSListing::error); -} - -/* - Starts fetching data from a news source specified in the line - edit widget. - - The line edit is made read only to prevent the user from modifying its - contents during the fetch; this is only for cosmetic purposes. - The fetch button is disabled, the list view is cleared, and we - define the last list view item to be 0, meaning that there are no - existing items in the list. - - A URL is created with the raw contents of the line edit and - a get is initiated. -*/ - -void RSSListing::fetch() -{ - lineEdit->setReadOnly(true); - fetchButton->setEnabled(false); - treeWidget->clear(); - - xml.clear(); - - QUrl url(lineEdit->text()); - get(url); -} - -void RSSListing::metaDataChanged() -{ - QUrl redirectionTarget = currentReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); - if (redirectionTarget.isValid()) { - get(redirectionTarget); - } -} - -/* - Reads data received from the RDF source. - - We read all the available data, and pass it to the XML - stream reader. Then we call the XML parsing function. -*/ - -void RSSListing::readyRead() -{ - int statusCode = currentReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - if (statusCode >= 200 && statusCode < 300) { - QByteArray data = currentReply->readAll(); - xml.addData(data); - parseXml(); - } -} - -/* - Finishes processing an HTTP request. - - The default behavior is to keep the text edit read only. - - If an error has occurred, the user interface is made available - to the user for further input, allowing a new fetch to be - started. - - If the HTTP get request has finished, we make the - user interface available to the user for further input. -*/ - -void RSSListing::finished(QNetworkReply *reply) -{ - Q_UNUSED(reply); - lineEdit->setReadOnly(false); - fetchButton->setEnabled(true); -} - - -/* - Parses the XML data and creates treeWidget items accordingly. -*/ -void RSSListing::parseXml() -{ - while (!xml.atEnd()) { - xml.readNext(); - if (xml.isStartElement()) { - if (xml.name() == u"item") - linkString = xml.attributes().value("rss:about").toString(); - currentTag = xml.name().toString(); - } else if (xml.isEndElement()) { - if (xml.name() == u"item") { - - QTreeWidgetItem *item = new QTreeWidgetItem; - item->setText(0, titleString); - item->setText(1, linkString); - treeWidget->addTopLevelItem(item); - - titleString.clear(); - linkString.clear(); - } - - } else if (xml.isCharacters() && !xml.isWhitespace()) { - if (currentTag == "title") - titleString += xml.text(); - else if (currentTag == "link") - linkString += xml.text(); - } - } - if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) { - qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString(); - } -} - -/* - Open the link in the browser -*/ -void RSSListing::itemActivated(QTreeWidgetItem * item) -{ - QDesktopServices::openUrl(QUrl(item->text(1))); -} - -void RSSListing::error(QNetworkReply::NetworkError) -{ - qWarning("error retrieving RSS feed"); - currentReply->disconnect(this); - currentReply->deleteLater(); - currentReply = 0; -} diff --git a/examples/corelib/serialization/savegame/CMakeLists.txt b/examples/corelib/serialization/savegame/CMakeLists.txt index 8871a9d6..ab3d9a70 100644 --- a/examples/corelib/serialization/savegame/CMakeLists.txt +++ b/examples/corelib/serialization/savegame/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(savegame LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/corelib/serialization/savegame/character.cpp b/examples/corelib/serialization/savegame/character.cpp index 7be737f3..863fcb91 100644 --- a/examples/corelib/serialization/savegame/character.cpp +++ b/examples/corelib/serialization/savegame/character.cpp @@ -6,15 +6,10 @@ #include #include -Character::Character() - = default; +Character::Character() = default; -Character::Character(const QString &name, - int level, - Character::ClassType classType) : - mName(name), - mLevel(level), - mClassType(classType) +Character::Character(const QString &name, int level, Character::ClassType classType) + : mName(name), mLevel(level), mClassType(classType) { } @@ -48,35 +43,41 @@ void Character::setClassType(Character::ClassType classType) mClassType = classType; } -//! [0] -void Character::read(const QJsonObject &json) +//! [fromJson] +Character Character::fromJson(const QJsonObject &json) { - if (json.contains("name") && json["name"].isString()) - mName = json["name"].toString(); + Character result; - if (json.contains("level") && json["level"].isDouble()) - mLevel = json["level"].toInt(); + if (const QJsonValue v = json["name"]; v.isString()) + result.mName = v.toString(); - if (json.contains("classType") && json["classType"].isDouble()) - mClassType = ClassType(json["classType"].toInt()); + if (const QJsonValue v = json["level"]; v.isDouble()) + result.mLevel = v.toInt(); + + if (const QJsonValue v = json["classType"]; v.isDouble()) + result.mClassType = ClassType(v.toInt()); + + return result; } -//! [0] +//! [fromJson] -//! [1] -void Character::write(QJsonObject &json) const +//! [toJson] +QJsonObject Character::toJson() const { + QJsonObject json; json["name"] = mName; json["level"] = mLevel; json["classType"] = mClassType; + return json; } -//! [1] +//! [toJson] -void Character::print(int indentation) const +void Character::print(QTextStream &s, int indentation) const { const QString indent(indentation * 2, ' '); - QTextStream(stdout) << indent << "Name:\t" << mName << "\n"; - QTextStream(stdout) << indent << "Level:\t" << mLevel << "\n"; + const QString className = QMetaEnum::fromType().valueToKey(mClassType); - QString className = QMetaEnum::fromType().valueToKey(mClassType); - QTextStream(stdout) << indent << "Class:\t" << className << "\n"; + s << indent << "Name:\t" << mName << "\n" + << indent << "Level:\t" << mLevel << "\n" + << indent << "Class:\t" << className << "\n"; } diff --git a/examples/corelib/serialization/savegame/character.h b/examples/corelib/serialization/savegame/character.h index 4dc25139..05047503 100644 --- a/examples/corelib/serialization/savegame/character.h +++ b/examples/corelib/serialization/savegame/character.h @@ -8,15 +8,15 @@ #include #include +QT_FORWARD_DECLARE_CLASS(QTextStream) + //! [0] class Character { Q_GADGET public: - enum ClassType { - Warrior, Mage, Archer - }; + enum ClassType { Warrior, Mage, Archer }; Q_ENUM(ClassType) Character(); @@ -31,10 +31,11 @@ public: ClassType classType() const; void setClassType(ClassType classType); - void read(const QJsonObject &json); - void write(QJsonObject &json) const; + static Character fromJson(const QJsonObject &json); + QJsonObject toJson() const; + + void print(QTextStream &s, int indentation = 0) const; - void print(int indentation = 0) const; private: QString mName; int mLevel = 0; diff --git a/examples/corelib/serialization/savegame/doc/src/savegame.qdoc b/examples/corelib/serialization/savegame/doc/src/savegame.qdoc index 9b754577..36f02f98 100644 --- a/examples/corelib/serialization/savegame/doc/src/savegame.qdoc +++ b/examples/corelib/serialization/savegame/doc/src/savegame.qdoc @@ -3,7 +3,7 @@ /*! \example serialization/savegame - \examplecategory {Input/Output} + \examplecategory {Data Processing & I/O} \title JSON Save Game Example \brief The JSON Save Game example demonstrates how to save and load a @@ -11,11 +11,12 @@ Many games provide save functionality, so that the player's progress through the game can be saved and loaded at a later time. The process of saving a - game generally involves serializing each game object's member variables - to a file. Many formats can be used for this purpose, one of which is JSON. - With QJsonDocument, you also have the ability to serialize a document in a - \l {RFC 7049} {CBOR} format, which is great if you - don't want the save file to be readable, or if you need to keep the file size down. + game generally involves serializing each game object's member variables to a + file. Many formats can be used for this purpose, one of which is JSON. With + QJsonDocument, you also have the ability to serialize a document in a \l + {RFC 7049} {CBOR} format, which is great if you don't want the save file to + be easy to read (but see \l {Parsing and displaying CBOR data} for how it \e + can be read), or if you need to keep the file size down. In this example, we'll demonstrate how to save and load a simple game to and from JSON and binary formats. @@ -25,45 +26,83 @@ The Character class represents a non-player character (NPC) in our game, and stores the player's name, level, and class type. - It provides read() and write() functions to serialise its member variables. + It provides static fromJson() and non-static toJson() functions to + serialise itself. + + \note This pattern (fromJson()/toJson()) works because QJsonObjects can be + constructed independent of an owning QJsonDocument, and because the data + types being (de)serialized here are value types, so can be copied. When + serializing to another format — for example XML or QDataStream, which require passing + a document-like object — or when the object identity is important (QObject + subclasses, for example), other patterns may be more suitable. See the + \l{xml/dombookmarks} and \l{xml/streambookmarks} examples for XML, and the + implementation of \l QListWidgetItem::read() and \l QListWidgetItem::write() + for idiomatic QDataStream serialization. The \c{print()} functions in this example + are good examples of QTextStream serialization, even though they, of course, lack + the deserialization side. \snippet serialization/savegame/character.h 0 - Of particular interest to us are the read and write function + Of particular interest to us are the fromJson() and toJson() function implementations: - \snippet serialization/savegame/character.cpp 0 + \snippet serialization/savegame/character.cpp fromJson - In the read() function, we assign Character's members values from the - QJsonObject argument. You can use either \l QJsonObject::operator[]() or - QJsonObject::value() to access values within the JSON object; both are - const functions and return QJsonValue::Undefined if the key is invalid. We - check if the keys are valid before attempting to read them with - QJsonObject::contains(). + In the fromJson() function, we construct a local \c result Character object + and assign \c{result}'s members values from the QJsonObject argument. You + can use either \l QJsonObject::operator[]() or QJsonObject::value() to + access values within the JSON object; both are const functions and return + QJsonValue::Undefined if the key is invalid. In particular, the \c{is...} + functions (for example \l QJsonValue::isString(), \l + QJsonValue::isDouble()) return \c false for QJsonValue::Undefined, so we + can check for existence as well as the correct type in a single lookup. - \snippet serialization/savegame/character.cpp 1 + If a value does not exist in the JSON object, or has the wrong type, we + don't write to the corresponding \c result member, either, thereby + preserving any values the default constructor may have set. This means + default values are centrally defined in one location (the default + constructor) and need not be repeated in serialisation code + (\l{https://en.wikipedia.org/wiki/Don%27t_repeat_yourself}{DRY}). - In the write() function, we do the reverse of the read() function; assign - values from the Character object to the JSON object. As with accessing - values, there are two ways to set values on a QJsonObject: - \l QJsonObject::operator[]() and QJsonObject::insert(). Both will override - any existing value at the given key. + Observe the use of + \l{https://en.cppreference.com/w/cpp/language/if#If_statements_with_initializer} + {C++17 if-with-initializer} to separate scoping and checking of the variable \c v. + This means we can keep the variable name short, because its scope is limited. - Next up is the Level class: + Compare that to the naïve approach using \c QJsonObject::contains(): + + \badcode + if (json.contains("name") && json["name"].isString()) + result.mName = json["name"].toString(); + \endcode + + which, beside being less readable, requires a total of three lookups (no, + the compiler will \e not optimize these into one), so is three times + slower and repeats \c{"name"} three times (violating the DRY principle). + + \snippet serialization/savegame/character.cpp toJson + + In the toJson() function, we do the reverse of the fromJson() function; + assign values from the Character object to a new JSON object we then + return. As with accessing values, there are two ways to set values on a + QJsonObject: \l QJsonObject::operator[]() and \l QJsonObject::insert(). + Both will override any existing value at the given key. + + \section1 The Level Class \snippet serialization/savegame/level.h 0 - We want to have several levels in our game, each with several NPCs, so we - keep a QList of Character objects. We also provide the familiar read() and - write() functions. + We want the levels in our game to each each have several NPCs, so we keep a QList + of Character objects. We also provide the familiar fromJson() and toJson() + functions. - \snippet serialization/savegame/level.cpp 0 + \snippet serialization/savegame/level.cpp fromJson - Containers can be written and read to and from JSON using QJsonArray. In our + Containers can be written to and read from JSON using QJsonArray. In our case, we construct a QJsonArray from the value associated with the key \c "npcs". Then, for each QJsonValue element in the array, we call - toObject() to get the Character's JSON object. The Character object can then - read their JSON and be appended to our NPC array. + toObject() to get the Character's JSON object. Character::fromJson() can + then turn that QJSonObject into a Character object to append to our NPC array. \note \l{Container Classes}{Associate containers} can be written by storing the key in each value object (if it's not already). With this approach, the @@ -71,11 +110,13 @@ element is used as the key to construct the container when reading it back in. - \snippet serialization/savegame/level.cpp 1 + \snippet serialization/savegame/level.cpp toJson - Again, the write() function is similar to the read() function, except + Again, the toJson() function is similar to the fromJson() function, except reversed. + \section1 The Game Class + Having established the Character and Level classes, we can move on to the Game class: @@ -87,26 +128,43 @@ Next, we provide accessors for the player and levels. We then expose three functions: newGame(), saveGame() and loadGame(). - The read() and write() functions are used by saveGame() and loadGame(). + The read() and toJson() functions are used by saveGame() and loadGame(). - \snippet serialization/savegame/game.cpp 0 + \div{class="admonition note"}\b{Note:} + Despite \c Game being a value class, we assume that the author wants a game to have + identity, much like your main window would have. We therefore don't use a + static fromJson() function, which would create a new object, but a read() + function we can call on existing objects. There's a 1:1 correspondence + between read() and fromJson(), in that one can be implemented in terms of + the other: + + \code + void read(const QJsonObject &json) { *this = fromJson(json); } + static Game fromObject(const QJsonObject &json) { Game g; g.read(json); return g; } + \endcode + + We just use what's more convenient for callers of the functions. + \enddiv + + \snippet serialization/savegame/game.cpp newGame To setup a new game, we create the player and populate the levels and their NPCs. - \snippet serialization/savegame/game.cpp 1 + \snippet serialization/savegame/game.cpp read - The first thing we do in the read() function is tell the player to read - itself. We then clear the level array so that calling loadGame() on the - same Game object twice doesn't result in old levels hanging around. + The read() function starts by replacing the player with the + one read from JSON. We then clear() the level array so that calling + loadGame() on the same Game object twice doesn't result in old levels + hanging around. We then populate the level array by reading each Level from a QJsonArray. - \snippet serialization/savegame/game.cpp 2 + \snippet serialization/savegame/game.cpp toJson - We write the game to JSON similarly to how we write Level. + Writing the game to JSON is similar to writing a level. - \snippet serialization/savegame/game.cpp 3 + \snippet serialization/savegame/game.cpp loadGame When loading a saved game in loadGame(), the first thing we do is open the save file based on which format it was saved to; \c "save.json" for JSON, @@ -120,14 +178,16 @@ After constructing the QJsonDocument, we instruct the Game object to read itself and then return \c true to indicate success. - \snippet serialization/savegame/game.cpp 4 + \snippet serialization/savegame/game.cpp saveGame Not surprisingly, saveGame() looks very much like loadGame(). We determine the file extension based on the format, print a warning and return \c false if the opening of the file fails. We then write the Game object to a - QJsonDocument, and call either QJsonDocument::toJson() or to - QJsonDocument::toBinaryData() to save the game, depending on which format - was specified. + QJsonObject. To save the game in the format that was specified, we + convert the JSON object into either a QJsonDocument for a subsequent + QJsonDocument::toJson() call, or a QCborValue for QCborValue::toCbor(). + + \section1 Tying It All Together We are now ready to enter main(): diff --git a/examples/corelib/serialization/savegame/game.cpp b/examples/corelib/serialization/savegame/game.cpp index 21dedf94..f99ecb8b 100644 --- a/examples/corelib/serialization/savegame/game.cpp +++ b/examples/corelib/serialization/savegame/game.cpp @@ -11,6 +11,8 @@ #include #include +using namespace Qt::StringLiterals; + Character Game::player() const { return mPlayer; @@ -21,52 +23,45 @@ QList Game::levels() const return mLevels; } -//! [0] +//! [newGame] void Game::newGame() { mPlayer = Character(); - mPlayer.setName(QStringLiteral("Hero")); + mPlayer.setName("Hero"_L1); mPlayer.setClassType(Character::Archer); mPlayer.setLevel(QRandomGenerator::global()->bounded(15, 21)); mLevels.clear(); mLevels.reserve(2); - Level village(QStringLiteral("Village")); + Level village("Village"_L1); QList villageNpcs; villageNpcs.reserve(2); - villageNpcs.append(Character(QStringLiteral("Barry the Blacksmith"), - QRandomGenerator::global()->bounded(8, 11), - Character::Warrior)); - villageNpcs.append(Character(QStringLiteral("Terry the Trader"), - QRandomGenerator::global()->bounded(6, 8), - Character::Warrior)); + villageNpcs.append(Character("Barry the Blacksmith"_L1, + QRandomGenerator::global()->bounded(8, 11), Character::Warrior)); + villageNpcs.append(Character("Terry the Trader"_L1, + QRandomGenerator::global()->bounded(6, 8), Character::Warrior)); village.setNpcs(villageNpcs); mLevels.append(village); - Level dungeon(QStringLiteral("Dungeon")); + Level dungeon("Dungeon"_L1); QList dungeonNpcs; dungeonNpcs.reserve(3); - dungeonNpcs.append(Character(QStringLiteral("Eric the Evil"), - QRandomGenerator::global()->bounded(18, 26), - Character::Mage)); - dungeonNpcs.append(Character(QStringLiteral("Eric's Left Minion"), - QRandomGenerator::global()->bounded(5, 7), - Character::Warrior)); - dungeonNpcs.append(Character(QStringLiteral("Eric's Right Minion"), - QRandomGenerator::global()->bounded(4, 9), - Character::Warrior)); + dungeonNpcs.append(Character("Eric the Evil"_L1, + QRandomGenerator::global()->bounded(18, 26), Character::Mage)); + dungeonNpcs.append(Character("Eric's Left Minion"_L1, + QRandomGenerator::global()->bounded(5, 7), Character::Warrior)); + dungeonNpcs.append(Character("Eric's Right Minion"_L1, + QRandomGenerator::global()->bounded(4, 9), Character::Warrior)); dungeon.setNpcs(dungeonNpcs); mLevels.append(dungeon); } -//! [0] +//! [newGame] -//! [3] +//! [loadGame] bool Game::loadGame(Game::SaveFormat saveFormat) { - QFile loadFile(saveFormat == Json - ? QStringLiteral("save.json") - : QStringLiteral("save.dat")); + QFile loadFile(saveFormat == Json ? "save.json"_L1 : "save.dat"_L1); if (!loadFile.open(QIODevice::ReadOnly)) { qWarning("Couldn't open save file."); @@ -76,85 +71,72 @@ bool Game::loadGame(Game::SaveFormat saveFormat) QByteArray saveData = loadFile.readAll(); QJsonDocument loadDoc(saveFormat == Json - ? QJsonDocument::fromJson(saveData) - : QJsonDocument(QCborValue::fromCbor(saveData).toMap().toJsonObject())); + ? QJsonDocument::fromJson(saveData) + : QJsonDocument(QCborValue::fromCbor(saveData).toMap().toJsonObject())); read(loadDoc.object()); - QTextStream(stdout) << "Loaded save for " - << loadDoc["player"]["name"].toString() - << " using " - << (saveFormat != Json ? "CBOR" : "JSON") << "...\n"; + QTextStream(stdout) << "Loaded save for " << loadDoc["player"]["name"].toString() + << " using " << (saveFormat != Json ? "CBOR" : "JSON") << "...\n"; return true; } -//! [3] +//! [loadGame] -//! [4] +//! [saveGame] bool Game::saveGame(Game::SaveFormat saveFormat) const { - QFile saveFile(saveFormat == Json - ? QStringLiteral("save.json") - : QStringLiteral("save.dat")); + QFile saveFile(saveFormat == Json ? "save.json"_L1 : "save.dat"_L1); if (!saveFile.open(QIODevice::WriteOnly)) { qWarning("Couldn't open save file."); return false; } - QJsonObject gameObject; - write(gameObject); - saveFile.write(saveFormat == Json - ? QJsonDocument(gameObject).toJson() - : QCborValue::fromJsonValue(gameObject).toCbor()); + QJsonObject gameObject = toJson(); + saveFile.write(saveFormat == Json ? QJsonDocument(gameObject).toJson() + : QCborValue::fromJsonValue(gameObject).toCbor()); return true; } -//! [4] +//! [saveGame] -//! [1] +//! [read] void Game::read(const QJsonObject &json) { - if (json.contains("player") && json["player"].isObject()) - mPlayer.read(json["player"].toObject()); + if (const QJsonValue v = json["player"]; v.isObject()) + mPlayer = Character::fromJson(v.toObject()); - if (json.contains("levels") && json["levels"].isArray()) { - QJsonArray levelArray = json["levels"].toArray(); + if (const QJsonValue v = json["levels"]; v.isArray()) { + const QJsonArray levels = v.toArray(); mLevels.clear(); - mLevels.reserve(levelArray.size()); - for (const QJsonValue &v : levelArray) { - QJsonObject levelObject = v.toObject(); - Level level; - level.read(levelObject); - mLevels.append(level); - } + mLevels.reserve(levels.size()); + for (const QJsonValue &level : levels) + mLevels.append(Level::fromJson(level.toObject())); } } -//! [1] +//! [read] -//! [2] -void Game::write(QJsonObject &json) const +//! [toJson] +QJsonObject Game::toJson() const { - QJsonObject playerObject; - mPlayer.write(playerObject); - json["player"] = playerObject; + QJsonObject json; + json["player"] = mPlayer.toJson(); - QJsonArray levelArray; - for (const Level &level : mLevels) { - QJsonObject levelObject; - level.write(levelObject); - levelArray.append(levelObject); - } - json["levels"] = levelArray; + QJsonArray levels; + for (const Level &level : mLevels) + levels.append(level.toJson()); + json["levels"] = levels; + return json; } -//! [2] +//! [toJson] -void Game::print(int indentation) const +void Game::print(QTextStream &s, int indentation) const { const QString indent(indentation * 2, ' '); - QTextStream(stdout) << indent << "Player\n"; - mPlayer.print(indentation + 1); + s << indent << "Player\n"; + mPlayer.print(s, indentation + 1); - QTextStream(stdout) << indent << "Levels\n"; + s << indent << "Levels\n"; for (const Level &level : mLevels) - level.print(indentation + 1); + level.print(s, indentation + 1); } diff --git a/examples/corelib/serialization/savegame/game.h b/examples/corelib/serialization/savegame/game.h index 0e91343d..5ba59529 100644 --- a/examples/corelib/serialization/savegame/game.h +++ b/examples/corelib/serialization/savegame/game.h @@ -10,13 +10,13 @@ #include #include +QT_FORWARD_DECLARE_CLASS(QTextStream) + //! [0] class Game { public: - enum SaveFormat { - Json, Binary - }; + enum SaveFormat { Json, Binary }; Character player() const; QList levels() const; @@ -26,9 +26,10 @@ public: bool saveGame(SaveFormat saveFormat) const; void read(const QJsonObject &json); - void write(QJsonObject &json) const; + QJsonObject toJson() const; + + void print(QTextStream &s, int indentation = 0) const; - void print(int indentation = 0) const; private: Character mPlayer; QList mLevels; diff --git a/examples/corelib/serialization/savegame/level.cpp b/examples/corelib/serialization/savegame/level.cpp index c2f88c34..f30d35e5 100644 --- a/examples/corelib/serialization/savegame/level.cpp +++ b/examples/corelib/serialization/savegame/level.cpp @@ -6,9 +6,7 @@ #include #include -Level::Level(const QString &name) : mName(name) -{ -} +Level::Level(const QString &name) : mName(name) { } QString Level::name() const { @@ -25,46 +23,43 @@ void Level::setNpcs(const QList &npcs) mNpcs = npcs; } -//! [0] -void Level::read(const QJsonObject &json) +//! [fromJson] +Level Level::fromJson(const QJsonObject &json) { - if (json.contains("name") && json["name"].isString()) - mName = json["name"].toString(); + Level result; - if (json.contains("npcs") && json["npcs"].isArray()) { - QJsonArray npcArray = json["npcs"].toArray(); - mNpcs.clear(); - mNpcs.reserve(npcArray.size()); - for (const QJsonValue &v : npcArray) { - QJsonObject npcObject = v.toObject(); - Character npc; - npc.read(npcObject); - mNpcs.append(npc); - } + if (const QJsonValue v = json["name"]; v.isString()) + result.mName = v.toString(); + + if (const QJsonValue v = json["npcs"]; v.isArray()) { + const QJsonArray npcs = v.toArray(); + result.mNpcs.reserve(npcs.size()); + for (const QJsonValue &npc : npcs) + result.mNpcs.append(Character::fromJson(npc.toObject())); } -} -//! [0] -//! [1] -void Level::write(QJsonObject &json) const + return result; +} +//! [fromJson] + +//! [toJson] +QJsonObject Level::toJson() const { + QJsonObject json; json["name"] = mName; QJsonArray npcArray; - for (const Character &npc : mNpcs) { - QJsonObject npcObject; - npc.write(npcObject); - npcArray.append(npcObject); - } + for (const Character &npc : mNpcs) + npcArray.append(npc.toJson()); json["npcs"] = npcArray; + return json; } -//! [1] +//! [toJson] -void Level::print(int indentation) const +void Level::print(QTextStream &s, int indentation) const { const QString indent(indentation * 2, ' '); - QTextStream(stdout) << indent << "Name:\t" << mName << "\n"; - QTextStream(stdout) << indent << "NPCs:\n"; + s << indent << "Name:\t" << mName << "\n" << indent << "NPCs:\n"; for (const Character &character : mNpcs) - character.print(2); + character.print(s, indentation + 1); } diff --git a/examples/corelib/serialization/savegame/level.h b/examples/corelib/serialization/savegame/level.h index e09e2c9f..e487e55a 100644 --- a/examples/corelib/serialization/savegame/level.h +++ b/examples/corelib/serialization/savegame/level.h @@ -9,6 +9,8 @@ #include #include +QT_FORWARD_DECLARE_CLASS(QTextStream) + //! [0] class Level { @@ -21,10 +23,11 @@ public: QList npcs() const; void setNpcs(const QList &npcs); - void read(const QJsonObject &json); - void write(QJsonObject &json) const; + static Level fromJson(const QJsonObject &json); + QJsonObject toJson() const; + + void print(QTextStream &s, int indentation = 0) const; - void print(int indentation = 0) const; private: QString mName; QList mNpcs; diff --git a/examples/corelib/serialization/savegame/main.cpp b/examples/corelib/serialization/savegame/main.cpp index f97b0d59..3fc0f3af 100644 --- a/examples/corelib/serialization/savegame/main.cpp +++ b/examples/corelib/serialization/savegame/main.cpp @@ -17,9 +17,9 @@ int main(int argc, char *argv[]) const QStringList args = QCoreApplication::arguments(); const bool newGame - = args.size() <= 1 || QString::compare(args[1], "load"_L1, Qt::CaseInsensitive) == 0; + = args.size() <= 1 || QString::compare(args[1], "load"_L1, Qt::CaseInsensitive) != 0; const bool json - = args.size() <= 2 || QString::compare(args[2], "binary"_L1, Qt::CaseInsensitive) == 0; + = args.size() <= 2 || QString::compare(args[2], "binary"_L1, Qt::CaseInsensitive) != 0; Game game; if (newGame) @@ -29,8 +29,9 @@ int main(int argc, char *argv[]) // Game is played; changes are made... //! [0] //! [1] - QTextStream(stdout) << "Game ended in the following state:\n"; - game.print(); + QTextStream s(stdout); + s << "Game ended in the following state:\n"; + game.print(s); if (!game.saveGame(json ? Game::Json : Game::Binary)) return 1; diff --git a/examples/corelib/serialization/serialization.pro b/examples/corelib/serialization/serialization.pro index 9f0ced02..e20fcb57 100644 --- a/examples/corelib/serialization/serialization.pro +++ b/examples/corelib/serialization/serialization.pro @@ -6,6 +6,4 @@ SUBDIRS = \ qtHaveModule(widgets) { SUBDIRS += streambookmarks - qtHaveModule(network): SUBDIRS += \ - rsslisting } diff --git a/examples/corelib/serialization/streambookmarks/doc/images/filemenu.png b/examples/corelib/serialization/streambookmarks/doc/images/filemenu.png new file mode 100644 index 0000000000000000000000000000000000000000..1a92895ccf7a469eb66a1088fd7ed6706d645512 GIT binary patch literal 3728 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 literal 0 HcmV?d00001 diff --git a/examples/corelib/serialization/streambookmarks/doc/images/helpmenu.png b/examples/corelib/serialization/streambookmarks/doc/images/helpmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..baa98bee96385d47b7fd96f57062895f36ae4381 GIT binary patch literal 2099 zcmb8wcTf|^8US!cnt~MR9i+(t0V%?%gdBq zI7jhRN1Of?|x4e1t{(rxjE#J(3vpci1-#+w)UzC&4k`WUV zlk;$Qy$r@x(5erMgWlhC#>U1bCMKo{&&|xtEG#T6EiEAsh_$u#NtoBke3FfgjV(|>vMu;x zXJ=<`Z+{AS{KWxyLUwd?JPj0)&zw1P7AU4Tl~ABiC=4j2!pf+>l~G+>T+W?4cOKn) z9@FcJ>2m|Jo7~F#E>`rpySsZ-_Im+O2fV$#eSCZ_U%q?=crobf>+4rN=4~(Rwq~zq}J9qA+rlzK)rQN-IH$6Q)18ADgXk}(*X5IsEtgNi8?Ck8E zoSgdvc5ZI&1AsV@mzS5HpI=y5SO#>@pwVay&@)pGkiJ&{r0(8O7VCkb#YSLw>D|cE`%%tE;47yI_{wQ+Zf{i!CaLY=>f(Fn8+Tk3a3x9S%Labb zKxM3yMYgxZs|J~tz5J_)=l5|9a?*#gLWmfqn;dzi8qH9*H18OFWj1oue+fVzwx*cvRThOP33%uBSJd_M8P z>>&Jr`e<0By@Q5m-1Q7n%*vs6-llbpGfoV=T-nL1sOWuWme3^`;J;d_TDaGf&w6g* z*VjKZXwF}i>1Xq75slnOimOHrRgiT_68Sj6rbJ9iM;U# zZ5~f^JVjK5DilFcHJpmwosz$(I4x%zt0fC1+_+eFT_O@1d9)Uv8vO+Y$uA?9Uict^ zbPO?ZMSHfHT$&P$7w0XPSY|OP=uj4%qJ-0pqx5i})W4l=;Wux)OuvN=I=d&{WP+us zM7N(2DLu)4VQX&h=yf-E@=CJwrzfCvi=cE?M=;E>rKN4@Y;M8%Ia8QwF>|-D7^nBm z$_U|aedBce{hL`Ag?ZT2Z{?bkso6>k87V(siOiCB!(qb3?db$)u}K2E>6u%bQ+qc8 zi@nIrpm$?f*Rg~gr3I@HOnXV<#|07sX)-I!-=XkI!vbB%saN{%m%plciDH9XM3b&m zTRk=DD`&}v>0Pv#$Z)gA2~JSC8uT9=XlYt-LC3n`Ff=76^Y?S<)|fbrF-DRHx-)6m z`P85Zj2=`Aw){Q5aCCX=ecH2qRry8V$Yz zn^sWpdh^Vb?HiwSbxZ#vZt^`!~!NH6}Nu4S$>ac>8bO zxI_um%m#T=9^n)zUmn@sX;(XJz%6-@OMdo5CAxd|_)|m7x_*mdt zSfo|o1Hy`QYApP5)rT_0Wgg0|&vd3jT~wclgTzs`6d8s=J{0IDv_?R=_jR}o|3TCd zR!$rx>9&F=x)Tz4$qHE!btH65WT70;29x~ngPY2(Q(L8I)LE4D+WK2V7e+UFL#O*0 zWt3>mI`tFCX1cZ4X6~uj08>mv{e*5uMPs|2!$E9}iLMVzmVs4=@Vo;{0xu*6kvL~b z8@Xk9qco68FHjj+_56yeAaO*dcgdNzTMv>9F*oYNoFdZdw$MR8|CwL$oV6|ddI_69 zJo~GAAnJA!%ys@vO3hLQ!*Th{AGZ=tRlf9^d~b9}Jv8C-47JoNbW8ewr#>hh|EVAU eXV+LM)Gv@N*Hx-LI}d(;F^>yy*T!?<+5ZMJd|0Ib literal 0 HcmV?d00001 diff --git a/examples/corelib/serialization/streambookmarks/doc/images/screenshot.png b/examples/corelib/serialization/streambookmarks/doc/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..422873b6d09ca06bf9a83e65a89d13b3a32d0ef3 GIT binary patch literal 66567 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%0DQQGf+nqp%FlQf|5ulXzl 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�`k(|m1FkX_!eJYn^%%s*uH32pwAO( zGUL;^kAYwrX~dkLddDZQK&(R0m((J>HVi5^GhW}?+|#D8{Lwy{vuBY#7I*UY&&X^F zP;_C1e~uv?OVvJ+WTmot@yVn3HpYw?`6|QpE=b)uR~-#V^x=BX4)d$Yt0WqHZhe@Z z0K^VBBgbr4P;0PiOTIb3)K)@BB9Ry{DfuDJmFlGZd@&&QnCe&1hZ~<2xJ>f<;I9<2Y5BUFs^21PvTHD~91d3WK~gyi>=Qf0QJP8G&Y9!u z`kErSka{atK~OlzZI_KM>(X25ZA+3YQgdeM+^rKth$p@um8+C2td;hmMKch4gCfUw zgEJ&qDmMifQe=#)uF&A|w`tCKeA-t!peOW0|EyBGU@Q+Ewonyi*SoCk`5-P^urs*eN0;hRg({>(8eI-%IezEOK%R8Fm%HLAS2x(ULND+kkPW5XQLv2yM51JmI?lVYL z-AP<4Kt$z|827raK2T`;Z264T=) z3RY2-HNX9o_qeBX-C5Sk5^p2b!-?x?X=rLl33V}ACE66sR}ERMRbBP$QWNoH!lb%h z+t#au4ECvI-;XqbUZ|0f=kDx2RZt)vGzU%d!3`3Gw@8L|Q&<#cy{%L(Lp(EARW-@;^UrCXEd;f0O-(@G z#BRFvw#1t}Q|`==&WXm0s$cCGon=FY?z|p&D4pcy0`d6h=540;>jpa`4sa)Znp0r@ zDz}9Gtdyfn%Cu33<3$&e|BH@uYHee#mz zf;-Fq;tU#?uK&yrY31qa#uIt2=<$ZDW%U*Brj+^5J-M!1y5tjH*}w`;dht#)xL^Zb zh}@0&*h?!dG_RZWAx0~?;o7cC0Ug`xcoi?eC5wIzaASkotfpt1a6<_7ryl`Ev@{E6EYP15_BeTob=4x;3rv)zV$cU}kOPR2Ru5 z*WkfTn4q?F5>u-^|6_+Z3zJ?ehQhbw03aFZ>A!yePI%Le=MCMLd+(iZEPx;ZB^2LR0a^ht}SciSKd}?)FPji&g1u z%?KIk*c;$0H&4s^*z0R=cu|^l=Rsv5xglaT&`4u~^P6>@_4o!)p^5e%yKo6i?wag% zNliy`uZXlrI*`t=sxOe*L3?fO2`77rdZ2GlaI&y-{AMnmMEcw&z)6@f&ZFo{EVvi^ zcmB0D-{hF)gC!351AJ6JyP)sE=+a{4+Aj9U!C=7nJD-5B#MxypzMVGbxMf?pwRyIM z^5G%l2(z-pa5s_A#he8WgW*Ul>q0)IH?bw>#KK&i%GUtwIkA@xDhQpZt*yn39E|b^ z>cQB0A*>f#KSYSR^;W)u=pN&HK!tTGPq-IWG?4HgkSGZ((1^5!%dM#Ar%pMCGX zh|mT*kWn=;${U#hEM#3I%qHDCP+ z0sN`!$iRpC9(=LLPVek`DEr0jZe>(gR|k)Yy1z(MzX#?dLD=gw>PEURfh;P5h(j7z|0{QiN7lkTU**8M!PqzdoT665p{*G^Avc8OFk zxq671l{{KPD^?^zolAksF69V>Qf|s@+tnrsg%t@gZ!U()hsw^ae)jlwGa{D8;NSl$ zb*jp@Py6wA4APwP^?URFGzZMCw=RgA5L&jPGE=o(ur1~x?0EGPCOx2x%D(S_Cc<|m z7ThfEm0>n~&U6oKc*Xv=E2qdnE5dj|2zV+#(kVlts`HM!0b^{@M~)r^-J~lxZv;%i(}b0Y&jU`ul5{`01b7? zRyjgld_~9-$6evxwufIHGa$wB0tr%szPBz7X37Q+*S`f7Pk(qzT`3||VTPpMU99^6 zz)pSiCG`*2*aK@v;&}JV+0P3feTM``p2_kU26a87YZt)^Py9Gzy)!$+WoNh1`Ji^G z6M9=)I66G+UX?*V{6oHfDqol4`HFQtTP;ceYteysx0a0PjPi%v03DUQGQvb9N}{4U z6_iK1>Tju&j>E;9dsOaV9}Bks(1p`26K3Kc@uwQEeT(HTI&%2sMy!jY3TuD`Q77_I`7uk z)n#mTD|<+kj9>X?@IvPhIoJa%EHcJBY1*GA2esjqCTu&$A#p0!OumDh54%6OgvZMo z4$s2JUvz)v&m%{U07kQV_;9M8dvYuUVD}qt9@IR3tludR+p7ffDugR=u+yj7b>r|j zd@s@@0&bp@O+i#poVvz=U#HfLV%gg2VYchoF>Pl-zR*IXG=wgNLe(!=RbLtfpsktO1&5gde`OKju@` zG)l&0{bCe$wbaD>xI%i6N;c*Z-AFV*;iro}dS(+kI7C}y$Mmw;?UX-H?A{?wO|gFK zA0H={!gUT~{o|ZD`@*03VKXtby_F2UANpvX8X;C46aS^^YQnE>(u`^sMsD>Tx$WJ# z``8<%N+cjv)T-SfR=8ki=z90Lp6ZZl`(+z6=;hhpLkj;iMaYB3Gw#am6B|$94s$zM zgn~6Jwvn%)9M1`_^{-7g63jgoYhhEqEsT^XDw{`bPMh0zJ*8? z{yJ=t|4Z_e8YA&KbY^aLw(qmQ%;ZwKObYN5OEOQCeVwxu9nfSX zkkeh}?wqs1LLTcQpo>`*p8+acwq5XyZwQVzY=g*9_+EvC9l5pDk29c(-3Tev&C~YV zvrhQmU?8MW=IYZNS0wkGUoB04{`q^V_h;(Y-9Y8f!lu;uFFF#NkpA**4d;$Nu^ij` zc7Nqj$G-3VO25E9gomGEviAIRcL;d-R{O6gxjOA%U!_Hp$LfL2U*whgwow)0ctD;l zs?lu^LPM#BX%*S{_^>d*CX)g=7d!J)(fgz`EB`url|gjOy&%1_v$A<*s5EML#d@2q zLI?COW5FX@co7q^VbQ1coDZho?2MOXemMfmi=3PVIr8WoQZ3qwqZ;>IZ7VMYxI0;LZIBU(8DDjHBxz~daT5QnMc z65pI#m6qcEBMg_D5+p8usapShYSrg04 z)S>kEYyO-lLwBb4VyJb8JGO$}1fGxSyj93rD4G=89^3!CjZ3}ZbbcZxFGt#@ixkL4 zvqtd6LqM8s<2I$H+n1*?W&gkmb@f6Dhu;d!f$i zyN@e>UnI!HyouE3Wn{lPP&3FJa?BD5?{B@iny?x`*0&TfkU>vv<`R{eWTBO2(a|J>6!ZC<{}l+A^drp=oh8PWG}kqs(1fBgxI3&{RI z`f;^TpaN5iDO!caPq(XCBR}ZF&%^PL!HIu7sZy)S!~kgXA&fZOccobvuR z>qSLHukN~l_*&d}F!pWk0)u^h=&lvos4w5YzeFR3E(k#`aT7t;?%lT{V`me@w6=+4 z>d~G<53JbkmuDl%8SbBMQqQE35d4&+gMy z1`tnL)*LwaIf8ucI>>HR)1Rl$+yZ-rVIGz=V*T7G1@ZA%WP2ELc$Wqlp*PZvOoX15 zCmiZ2opQ_{hUqj!tsHqlceMmvs>~zsF3x-R5@>J7p(j*6HB}C&{e7*~(?@cJgFKem>u0f5dW`T_;hn)nYY35p0K*wQ&Ep=%Gr1dlsejst%n>?(+sC+IeZFs>OFnuCf$ff^%DsL0xitk8E zJn+Kv?M>cIjQJP=0Pj6wX^-2m3lV2uu+^gfpkXh@#b;2c#Pe=TrrkFn zrb_8P`kD1jsu>FH*L2E!{;bjHOY6?%f;+DhTO4l^ehedR9i7JfVeAu@%YrBOnVZ?U zquC){rmWN*Lobg!uvneiyN)r)bC>HYCm21f8X=35sF46z79AB86%!)^G{S0Kb$`4d z-=gFyL!lskaW79;=%Ux6WjB1mLpOqI4%T{4cHJ$|K~ev;ktdF}EFAID%aB9xdmQLr zn|&O_+EGZXuIN2Ihf;#zveq|%_GuY<#Zm&l! zqk?qPZfJhGl4E`kJL;?$&L?9UnhGTYv4CB+!^sWICR|ZO6fKzJ^k*J`7VT zDYBcXmSoQZ%w+Y}IRkJH5gHReegsKwZ9GaE-Qo;)04GBSd$`5!C z3suhYASfz3!Oj=U7z@0NmlmL@|JWF_!FRl3eCY)5aH`Y$uM$z~vgtYo@8IBDMLaHL zkUakU@&>6%hO#h+Y_ZZ;OPtzyhEvx$GG*@5M?CLSdS4?V-`1^Gsce~G(rHT`i2Hdq z7(II*(F?8Gt>+E=AqRLbbXdNqy2>@lQ5PGSr)}~DGIi_Mz?*OdLm^ig&9w=Ikg;oa&0KC`t`mdL* zcP7@EDn*6Q>vW?W9h%KxWR*)Ruuofy#jk~H4JKm7sZO`?tl>RFB@$n;B8He?rnaEt z5zpt4uo}c0&q-b{(6@cSuRpxDxH8IS_f`&db#>6-5_@`r2ABY1v%7WBjjtnB?`>E) zXrWLdOcWU*ta3eB=yC;{dAIJVnA))4A)t1Lmr-6ez)1bmD;7jv1ev~XipL#;Ekyrf zdahCH8i^;%vy8605T;h9&l4pb7wF@uoxGe^**Ga#?it4q-XLatEn@t9uq${&%mgdI z_a?=cD@-qMH}#x^U+#_`#chp0`-1U1WWq(V$u%_lC_Pr7e?mVR(IOY_x{J-t$wY+d z+VgTpLee3cVzZL-*DlTjBy({$7#oPj{J0G8lI3$gAwN@15)@?-+ ziyls)k3|a&+;-yp6QtD`oZ!=dW5CWvx-uPQt)^eo?|pEc@AIfN;-Rd124TOf9rV1& zytrJjW*;LH6EAkCW*!2Ju^6CS8HvGq43Q}qSS*(WalG9%zg$LL)$G_Y$X5Pi@utn~ z4LiwpdMgr}2C1m)?%n=)zUwElk@Zk_qjuw-OHFH+nNpo@ce*b!Zh$N@ten^X_Bwhj zXkq%TNc($YBQX|M^aNibK)CX@f6sV>RPL)(z4ipx1tzDk$O**C3!jgUxR`_83=Kde z3b$uA`L^MjG{kPWw-Mwbzw01~&Jr@V4f(i_oRdu)U6z@$?`SNt*r~Ml)Lx51J9&GJ z+ZrRF9a3`{l1O{Nm2xS>#$DOfo^fY}BNLg}=ebtR;lBI+gK;oY|ajF%S|d9s@TU|&tg zC~A@%n!e7nNe|anW=Ia9-)as=FhO{=_V+0M14l#-(?@yd?NbHm>h;Hi{CDA=U%NcY zzE4fYdb?YpN+p{AMtQerpq}Rnil>6WYn)cXJ)qc?LHv6QlZW zJK7_u{l-vhS8Ea`pNt~$t1X%z>Nlhy{F1Jp_L~4-6>%{Gv21*yOVUo8(Yt=_3j5go z`8_Jz+wqlqmE{m9ZX#KB*ZnZsFTh{{Yph&D#orsl?&~g5<43I^O=9jfTmKlk&{InU zIR&kssHNOCbIFte#PHK0`kXvV;YgXc<@C$=W#m`F*5s7!jN?ok;v!VGQ`z- z1`v0VUCCo*7Qy?FvT7-BR0jd0dLlIN`c%K%J$PQfYA&1IuLHUp{nv|-XRDaQ$X;)s zO9m~j71ffVX)`M~auPnrC16}0t@Q8!xKR7ihycGeF6t&!rg-VK^W!uTt5>fPP#bP# zIlIkfY)I;By{&&LVaFFdvp7u|FwC9J-n2MMrLM4-hn|`y(&^#P$$J*J)ymJG5*QH| z%2s?%eO6=>as3q6ksiMZTFl)MxnOwVowey1#f8l;iQ=8EI+$DS{_?5{ANJT%U7>0) zqB;?(%jP|*>Ci`b_+hRsGQPZaIiahd*~y=3rKUf5YQAJh{?y&?#5|xUZbcH5Uf~SVjS3EGO#Y6;3#rojYon-COn+>{ue_s6Dst$rpgsPt^*Mjp zLMY5;X=-a(Sxa7@lwKJ|S^4$qo@l5lF^08;=%4tiDIpVv3t#jOoaSBOFMwFZX zA|5PzUZe;YT`F=c7@Zv*p@gIU{LSwq1WIKOy48FC%Lp=`Yy^H(%4gqv6W}z!NId;fje3r96fye^lfx7d}IGuaWk}CF^I~0 zGz3{dSH1!i+F$l?y8(1TT)qlPgCO`CFERN*K1Ju0 z{cc#ScVIvf2Fs0Ux@e8P;K2NrPRViDzf%6>pathe2c-N(l}=kOAKi1rS?enB)12fx zcMjtg0B>_?;+;(HFCE=4KgcLPQJ2kvOKLAfZy%ipuaF#vsZeq7?=#M`15P)ea{fVF z%p0@*fDF#Jb@tp~#(D#XzjSsdaT_kDp%IV-ZkA|-ONfM3N;-rFkXT&G8volNU9cUa ziHQ6BkEw#luG6X5Nz*opJ)icCG3r!`uFr&j()OR)#w;lPAl`;W(@^N;8}Zqzhr8Em z9NVakA+4K;bQ*Xj`cdZfmU`~N8syhNK)vs1gL1byu;1vsRIj6Fnc$wD=<6$Sf64dC zm(bQZMS(q%!S&`9KTAYKxcanaEt{g-tF&?sYVaSeTlo!-;HQFI)i%Xie4$5ZfnBBH zpDSaS#Di7iq7OmaI1>Z8ksdwm@@+~RGd+_O*To`W`?_2inX7osh&*0YUS7|8 zv>Jm9{E=B%2)s>K}Run!mZ(dFjo9qsCw)`yX3m63v2?(wY6*FUM9%H>aw6208{=-Qyoh5YeORRv3ay0VV$m1}c+xo3!8EibtBhJ@V4^6BvOywCL zzPmJm|AorWJmUnyPcM(vPWufR1y5e^a*FfMB`1t(qBUK{6ZiT(L5gabo=`tNr!?TK zd@EA8$@?g>g7#*jtr76d;<;$!!Z>&MlFoNh$d4~hhU_w!C_8POU?XYDyNroOD?ZvF z1SO~6lr8-EvnAbf@g_TFUOqV!ku$_`W$#>Q2D&14w*p){8K$vc0b*UB)jCC@!Xl|aI#2+%(gs68?7vs0^a?j zpFhWLxNwG%ae=)9p{j*>)cW5_R+RRp9O!WWz_rj>A)GXtE?&p9Kyc_;)TQ%|tA&ME z4g@@wJ&GCMZGM#y`@R6>h8s5;i)Z$ zer-GvtP z?Kh3*R4yVr^6~PNtXNI*yLYRJ8Flw4WuLV*>Gpp4l9Iz}R1FTH<159qY?iheP^?#R zaz4Gw_9D6QR9V29*q*IeV6Vi6+W`RR?6f^bl;O4f?sMsgs0XA} zxGBsPY)yQgkEi{-nDyg410qr>K!;2%A=*^u&gpE}UINV**PM#+8sL|yfp-O8b!|7+X8~K*Ntwk^l7j({sAf^P%tp>#c6fsO11VQLO z`yMi%`3Yd%+r${7-F;C;{$b-TYpwRvwdh=LU)oF4srw;U6&dxchwGkdW|y^T?mh*v zm!hK@fOpTy&mok1x7~KJ8?p~!VU}WJvQSj0{l$Vk)$ot)jtQ=?1zS@MlklJGM>Zl9 z=s8uSp{7cX#uLk!?fkT2#VXIciD?r-h0G;&YekrNzh3N0MTj!imWd--FY3J$o?CF8g?VOa)I z%t_}TGTMX{CXZuT-UJG9SLVsh8@ z7b1SKwWTf9*HWAdl=G}|_29BvGe!b0?8xy#GBz1Zd&*885*MKbIj=+X0raX;uk z8lw|>@{O3qw{xvBqI_TRFV<>$pw{hTD~OezgRLIn{TJ>rh}#?)Uv+G~%F0RFA47Hh z-)Fz@4(H;&loZ1Y*s4XjrhRIk6e);l+Xd+-r zM)=X2k)XC1G)MsXlDXK}*+KV8#FB}2HH1e{NN9>m`R=l1O+7&z5bu~#z=;9e$7!9J zn!2|0&LrsG&zbQkA^)%i$(e5^LjM<83#eHB-I)Cc_aP|MS{=N(Ax-^g;pg-a3&POL z4oA+%^u%_%377>Iw|o?=Cp1Zdr`sw2X`@M5bKq`11yl3Sv3jhkx(rZMb79OJg%_<} z#dP#uKpt_nmsD%3ju)jme?N_1HCZKdQQ>q!ek=sREaCL4b|8uoA{V%*u-cIwD=;H$ zuJ*hLeo2!3oQ+qr2Tq6n&!2(G9{8RQr_|H#%3r_R0)YY?n`(s&R}mLM!s9apS_uIeL4Z>c<@ zwRo}J0P{if(Uj+-yARbI_$ER=GhtMUP*uBQcr$K4KcJy#Q>TA>efxf}GFA%kJ8x7S zY-iG;fb__yfa!XNghQ2*Ki{fV;fjy63cjH$x z=kGwyynx8unc)}rP9pZa3z6XK0?SU0fujP!bD)+-!DYpx2MNRy`bL#SWkuP*59HK6 zb+HIINPJ@telD_oL3Jdol`Z$J)}_>Sd1q13b!#hV!sUP`gA@yh&{gu2Ag&Nd)7k_P z=du%L&;o?Lhpe+iBf!kSE9f{*gQyE~oOMT(0=^BKHg=VJUL?`4PBLwI1oUl8t90*k z7PpAXYM3`!W^rkGi4>6tFtCejtQspC5U*x345rer=qnaMRIo3a?fP5Wu^Ps+Yvi== zYG+_iR}&*(OuCOLa**;tuUma#C;xJexqLV9?fCaOugaszM0PtutL@F!>`vmXEXpS| z+|8ty5;(7JDNX=;fW#V;d%W}*i4Ln02q01xa!bLV9Uub5{fz z2{(`i@*vDQx%1gLmQCPQ3uyLTuo#A+0r`~>Du_vcP&`iw8z^_3TnK@O3(xZjPTkgi z+|HzS^@W$|n(6QHwdu{lv|qOnrAKBrNJ6akm3aRQ0u0bQLRd^GUGBIye(Sd+B$D|VdCf7V3%0$iS0|0P|Bs9$?ROdYUZTznLe2HV45Yo}iAh>E~i zW}-v5LHB=^8KdC5u0rA)oO`GYQ`BAUn$s3L5fF&4)dBGY5sfUPgs=B$4h1Y@>bb?> z3O-^1z~X`W4_zms`4@vN{zO5{m;cxD;L}r!rOQQYF6l6-O4rKD>c<=3<5CY7|HHKx z$?WXxQ0`BmbxQT+e^~wRTZF3-AFhE#_ka2?gQ!r)27cvW%y1Ympl?Cq=S#H$XL`N* z(BRkGm)E1WrC=Ma@Mh(=dZV|UdmF6IpcHynykS^9>~7C@63 z2`Sppw1#QFSEFk45MB0#3bPnKKk=wUBsU%dO*j<($QzA$1hHSjRWFky%c&YLiaoKy zywGlTijRB$=f)+2EQ(m&ig%*Bz?5%9E`0iEIa!u3^!^F#uuvh`k?3mjbTNkA*qT4{ z+pr4vHuPD)a_QK)*FX#*Jp%$5QR6KTb%FvDRS5c(ujYUlWI&PxgkW}P;_SPBEK5pY zTudg`$3vmT>2t&eR(D--BAeSpEYg7RxQ4)gM|>;?ZJ>-&*?3_dy|khHkyDnU2ft2F zUqu^>vDe_G;lNNqhSX#V8Jjg^P6^+$mbJS@m7h}VL31u52E*&`1dI~IXRXt=%g|aP z^zrZ6%?iKv@D{|+pPN)7!kf=d5&;;{47qKaz=uGv#BDGP*KCsed0eOy@9$#jah&l# zvhUh`4OZUH^^}O5;oWqwuKXar0F@XOo4y~uFl$xW!Buqmd8C&P>v{mCrFLnLV`5%5q0ugFq!WZ49#9PB-p}#&52hac++(aG)ff&o> zJ62$aa(?N}N);lfoBO8n#CEI)t320~wEIY-F2x|*Yug0+AH2kGn5>WqZ()tUpy5xCf>`0IF6eT59 zhqX(_!{FyesCD&fcC0fy^H}&df<7P^s=~6YFU*6yI#ywNK-{tHZa6?g#e{ zOq|z94IRLW_6u=O&jC|=Mp+}i3C`e)MC#D_lo~dBhrk`W--h>oyxq4nz{eE_$^nINYB}6wq0l%G0D3qb&m6WrI#4vyYgW zs{&$$`uqC)z787B8ol$%rYLbOQMo*-<~jDq_nf@AuvMF94S#xE@>yDe{Z#dI8KH^2 zAKEpIMzN=J`xvDEhEFGVe=9Mavp~y6)^|p78#$m=#;xnex-0Zh3h5CC?y~$ z-DS|7Dm6ixIp2G@){e8!KL1bem;KvosY@8l@jUmHH(afW3H>Y@NdNzrle1ys5Zu1= zBly?CU`eNBiFYRmI^t*DrNE zXE_&ba~A6NdGEnKB|(_@E#NPKxONI(!Rcin;^^8Qo&Q;ng)&=ff)4OH#ch6rOknII zz8>A0u&^-o9&L~D#8(#eS3{$>!BcWsRV32%v3mi_AV|1PvR3VW{{90VHLGpmwmtGI zmYZ$;GI`IgrG^oJo#J|tO7S(1KMl>fp`gq)*#b-}r;5daX=v|VpY+_#@dbcAnKCHG z@1KwrP(3m4Y}+16EN8ID?NQLCR^XoZ7a{L}rFO|*i3g$bGB4@8Ou#iRV5V-+a_y10 zGdqrQOuRJUP0JPlv&KmZXh;0#dfu6S#FgyL%s z(D<}JB~$qVtBkAKfesFW4PsBDuDKtqw(iI z@}C9ApsvB7I7^a`1=oj?g2H`wt0?@LhR1%#GOzxc_?}=U{+aTL8;2nV`4dH0nOI~J zeB*lzD^#BL!4EF}orK>zADq92NA82vs_6ei|4P`6!w9BWjN3JApFArcy_+(Uyc^$Nh?ZkDC&73}p}Fb^wGB(&zVgX}Xh zo0tPM@LH?vGmb?VC!dcLt(N>x^WmNKf0_@yPtoNV9aMGdAqzo-KhzRV@-x;r+y)#8 z>(joZH<%tkaoK*8FdoH8AJ=5edg{L#lVvn_w`J~r;eO}I^<4j1FX%$2j^`Ah>ErLD zP5>Bs zL=6GQ&(q1%_`j3cr{xAW!%)e4<9Xw->eGq-EPK=V$z`S$*aws*3Hcg_O4Pg?w^^Ii`0lBCb=tW*L}``T;%Q- zV*hwIxG$$Ej@I4&G^GSD@3*NQQ3q^FapvmZj3PGKsd1dhG8$cgq8>>FaEQ@KL$)%E) z$%EMXA=Lf*_x29qCvjJy< zCLg(P-i`OOM+VC|+u&?ireG1e8kkP){t~X89dcIXuP{dWL6d|Q`%Il}%NC8@*Y~60d%{PU%pyehdz1bC;Vu1Uff?af1y_d*gb(c zkv8$d(|r0iCV3rDf_*|NF2edGGqVqo*FR~E+&SlaYfOFyX2n}N)?c8__!=O$56!Qw zU&1t3h!R2QrEYDYmqIC+vIp<;4l*E`->I8VNh94@Qmzk{HzB(^P|3!uhhQ}+iV9FndK9w63YX2O^d zWf1Q~m)uzSS1I@Wf6Nma82J4T!lwhUtG@&=w{B2Sr)o59Vx#>Rtf5mxKw4-E6^r9kqI2%n=MxLd+AeC zm_5N!2A%23Y02k8O1(<4du=j^LpcvMd;hZ!Pef6oqg4Dapn=orGaE8A~|yZhhzv?iD6Ka0K0t3*_v z&OK%lA4Gk)3e)`(UDN&aRfU-T_8#JH zf+PMlnLtKcUcJ<9=SSzFa}^>5{=BAB*G3LMygFL2&5Qc&wTr)aAojJ7OL>+^bh$&sj&a zaa*SpH=ArM59j5mq>fm}_y~h$ve|D8aX~6dgJztGSI*u9N8>nmT!t=5}U4j+Md#)CCmF7!SFEuk!qG0|E$MghDf@JvcTRpJl zbKd=98szOti%_=5e+&o4o4rFFX@BNu%2Yail@7cH{IjY_Ax!R z0Of~{t6>$t0n5vc=}~-=`dH^?kaFHJH*n`wT@Q5^`c*4h|W5iFvBI4LW;WoC=+%#`dAT18n;zOJ4(O*f<>v+nW#C`OwWoj-xwx(AIc5YHIkK4-(WVqXCo>WnXYu9Oe@yl zS455OOa^)GyXO)aa_85t*;FggFbl#FCrBuM>=gPW;dHLe^W-nya4?~nl1}HQ@v#s? z3C2objcdg9D}sZ_9F|V@N!%2W^9xYvwptAS_z?bUoJ!VYIVS;f?aK|~xS^QS*6(g4 z>-psjeuo9Jw+fp-An>BU!JGAaQF7U%-Z?R=_2zcG8>B@E0yBHQUS3f7^hwh%^dbL1 z1GAuD87LS8B83s}G=FY)?thb4qoBY-b!%dU0=~89NGe%@-Kmj@p@tVobHRvVq1b`g z={I?(SA6N=<4I@fa40Jc=t<;39#j^;^M)xlbl^xGynkqN?Aob z=H-x=lLI320{{{c@>#AOjzLlP&q)u~11YgFVw2o|Jc!eLs{&_)`L9}&?k@0>X$E3o zt4qgdXdbG72RaKvlaS~6wxq;y;)6jxmdKi5If5_gVk)y4rvU~O)`X!vRw+;D$B z%yHYO{mx{p4-R~@uF#&Bf=iW{&`d!|=%S5fXJ*W_toaUmB6C1|;OcA9kx=4V-A4Mc zYLsL5dGfvq7t0WZI>Yd6S%s|Vkic|zmSOViFJ?!IzO0%dLy$LXM*dvHq%k@ z;2AvCPaZJsDeu^dK1HkW+*Ki;!GJN~^i5aoO(!5=$QCwu%Q*SM#jgi1nooRj7AHf3 zSSsMc{;QKZPnLwqbt?Y+JgjLk6p4E8jdlZ@O{O>;Ff%3r313BroJ?rovCbx7*x1-y zX9ZQ}yR)SZCzoZ4SPE?kmW|+YfKU+ME~Z7Yfr+h=z5QVbBm-bSpAcc%!!mUvhMH!m zJYiH!PlxJQj(+a6@4i;^$jvXopZ2%t}^y8!m_2E04FQ z7>o|cDlyK#vsNIyGB2uIVIPs3!DjLhiULQc_N<1`9q4maoRe( z12(#;xVT(S?`Cn6geD2HlO8W&6h)I&K5ZZu&Vj$O;O)`6CFcfaWoiL#QJG`Y+p58I zaXKR5XoXj}Z6)7!ogbH}Hwh)xqjyU=HkB&Mo11ehUBKa_!dp8+aDp3uokm zSaktfCy0;*XAqZ08KJ+9mtBNi8{?LjSBn(|hw|B=TBsQ$BN*(VN`bi!W}gZC<7Xnl zNzs9Pm{cBpC5!@_`thy}LHJ6@8%|A0hWMAq=90RGU0{Rfy}+Ps;^RIZc6wUsrO2ND}Zb=)*X?CVf?VUv=)PbjG?dd(j?b$mjHeB^(U4<2srwt*Ag(s zdEZ3&$iqw=&#GwQ|J%Teu>4k_mz^D(`0jS;-rNe(TD{1z@6`uTr#^?%X}mgU%-$p& zg7Bcg=tp8Etbi|b&<%#Kt$bigYWnnG!zwG_Y9?Bc?<2H+VrOyNG1QtYV7m*z*9${Iz)DeSC6tYxKM%WM;cMg_S))HdXg3DYyGbCu!>2&W zgGSL8)HW$#p5dzq4h=Q&-~TIi1UjHIcn6+Gf=i{{5`#V~^kSxdcaoYxSw=aA-T=t= z1L0ergOipmUBC^V83E|rSXJ=i#gqCfeGafCQxVWdYwX#JH;C1H+|u1i>7hM|HN9E^ z`1fj$)eJIR$w62FA)Y4QeZR00v{paji!kc%0d^Xv*a0ya>?MVxh{dqzl>IAELZZW6 zM=B)`K->k{Li8T_t>F2>FLX;i!RKh+LsVY)YE$wkIAN0JzatlbA$K`j(rn2x;_QJ& z-R_3_v{hE0@a7{+!%s!F-tPQo)5A&V2#_nGxjFKD5GHsCc2&Owk^``Qc>XUze3wr( z&BcoC+9~k7s~f)-%4I+<!&+azyRQmODd}Bu{$)9u3s(twgGkw}iU>Ne7h>xKhY<6x=wf!zv z2H8+r8A?rpxRo7M12T<-@o$F7&RUZO_d<3>qpIW6y5K-VS)SJk5e3{4QlwK*C>V%V z`9=*=!>_-hyncM)iM|jDP4&rcUwf=1PV=&j1<#$I776D84@tF`^DO1LY5BDJlZ1OG zHBPSBj>Q7O4GrsP8hFmbnWQy7D z*sDlAq4tqYA>o@K-3ZI_Wk7!*k44AQNj^D-+6)-MW7<|i#cWDK&9RK)A`Ze%u zyamJYLrs>8A{RbUf2wp6u~&#+W64(`S5w0cH~x|n0N&w|=zHKlb^3**bzV?@EYv;0 zE5<2a1o3#g>C6zl+|X$9&ElJSCtQopq%k_nAH-dt41zbBLl{3#NI3e&&U|t`<}Hrf zxyhop<6~gkW{|pN_+qMG=FPN9UJK3S+gtbIW#O&kiX}ys&E~5f#*L-yPg659RD3Fsa^ub5dRwD@e_A zDkZ%6zG*k%XAP^Dc753~uY&wtvmZXngQIQq8VTeZ)yT<>S!hyJmj~{uih8ECx=AWOC$M<~|TyTa3%y&bFn9E9K*N&-0i`_@#U>x(Wl#ZSk0WdIvB(x8dWTd+&fV=xuQcVH394s}<@mcBMi?h?#J>Ns?bCje z9v-PF+Fg%g`(S4LN)8G-?0Qsns+`Q@X;bIaI>`MtTh11Tf_gRA#&$%R{k2JH@%E<< zoU6_E@-AL%#-*2dP`Hf+r>%}88H?G zmsoe!+*$bHSd5M0?J>TT4-)Ro{}DW^&O@CeFRHlsE*BU?m`$zI!gXRspN4hm<)f&b z2H!_u-Z)k4Uxn)st^#$=`kqXQcM90d5Lc0bgkkXvk1dgk7))8i4c1-yqP}6y;qR5J zEHl-@#~_Ui^9g6dZZI%3qR*=Rqzra-<=H#4YnkZ}on}Ppcp07}-aqVL3Tl7rhNs>B zh8jP=3`iy}Nh#vhY)p?(L>@}$wx)qA#4NLyghW&+9lqe6d_T}&#(Wu?eO{rW)e+Fg z-E1N=@W#6}(Pbzc_dx=L$_nUj+%CWZyJB2mz`_D9Tc|d4kI#i{E-aDJa4>r@8YJ1e z^us_#Mn>+g*Fu@&(QG`QCwJG3|ts-%s$Ea6tsN^=r| z#0kG&w8bThIwPToiIA0vpK>OgKR}YKxDv*6>0eL!za`V4=%va@^F`=Cl4PehA(zyy zb~c6dBCNig(_EjZy}5Q=TgbbWoDnex!Hq|xk9e84wWUwYV(+bMOgmoO#iAbG&R*Iy zQwzD*ZI+aj$21|7OjE=@p5)?CeN*qwMi)(y5Vl$*zh_wqe(UI?KbBtM_CM({t9B4*kE4`raZJuL0JlOQ5#<{y0*)D!nY&#{N*L zp9|^fdVQ5ixsBOWjN7hqJI0*EVnjNN-Jn^JDoHlECj? zV2TTyX;m9^v5TtBQ_YMxqUIS@A{Az8pv;=Aa?Y9XkUs!-(&a31`S1u0A$-TD7rvi2 z{#;tYpy^_ozEw@`Bo=#QoLzFq@7{?d?J~+VE$MxG`peDmLn|_4_y%#3X~Tp`0riph z`ylG1sq;OoE$lfeo5dS**ORn*TW$0U*m+Hg2`z;d?j&yus9}Fi(Dweqn4HY;1%3^O z&YtR{chx}cse}L%bPV1=qm2vP*lk;wmR9tN#e{O;vo~Z@w***Pct*7!7Tzaf8!Ilu zSPs@V`?m$e58y((w?`T0+rnsTJPFp{1}GDe5QYH4HBZ(!a59uL3kzVMOJ|o(@E*dUpd63V*OYUSBa#mJ z@brl71{|%nGv=_)1O`JlKWDYw#Lv{(hFqNXCJgH zE6HJT6Hv^sUhQ#NZcg15V$0?o{D`6_Gu)A5U_(kvO9PvUF6*c3H2Y$v@_jnEwPO7q zn(86Bt9G{aRt*3i5qck?qgJAC#&FA`uVgg-LkRY-tU-kH`t2s`1qW4Tp_^iO?*gLCG(C~Tv zh^w)M-|Eb;9o0t%sDeq`Ncx#|1-x>$qhKKnCvk`p(W}+EOJo-6q(1&Ap!S$hEVWOM zDWwA{E#Mq7f}z^*4oFp-_(B3$#4%!e#|ub^U%Xf1=VgwY&k_n=2iY}$loRX5Sp>Cj zkKEM;oN{FR_^s^6Pib(iKHu(NK-G#wcsqQ3d8Wmi2>H>mcnJ4S`X6Qyx%e^Qa52B9 z4rH>zqcz6}^F!-B9n@TL7FFj?glt$AbXgxwVUL+QJ@dZM+T3ACw9kUEa(vK7r|+`KJn&s0`_4SbUbX}q$r0Fe5{=m65csuN~;Gy>R+#}%c)?5 zxd6uS>lLajPURye#A8|=FmZ#7NW;X0s(i5a_0?JLgoki}^v!eWhs;|NvjkHnpx}St z&xTOS5pOD|BF_#S5IzRsyK=9u;V%82(1%}VCGA8dNn(cv2MtS1R(v(8;Wx9ChaWvF zF80a!y$hTpdL7dFt?6fYZ?@zA`NgE8vC`n5LP!=qG* z8qC2@?YYBa7;KPU57k8QE?{5|=oO;=vik}(do6LHp$+BZg{oUOyX42hj%D1}RwYTr z!r+eV)A_7^=?zSrpr+^w!I~nZECPmUgAZ;i@U@Rn5N1=&^o>iJ8cri=5T4Df34Z-=I)8rY~ODUhBhl<(Si!)K^V(PRsn1 z

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�tSD6#@@zL>kwdK{W|t1X(USZU({0{ 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 diff --git a/examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-helpmenu.png b/examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-helpmenu.png deleted file mode 100644 index 0dc4392b94c3bc947862927de563c521aecf7dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10856 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 Y+2k4VN%X|GzeM4bX?451RHrV*mgE diff --git a/examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-screenshot.png b/examples/corelib/serialization/streambookmarks/doc/images/xmlstreamexample-screenshot.png deleted file mode 100644 index bbaa423061a944df7b7cfc1d142f2fd5c783087c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22323 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

19k5HhWUQgz;DXFsj{V)aG#D$ht3(I-vGI zzNNLfLY-^m*#^xMR_ffK zOGxFW-qz`eiy-drOOen!T{^u@E3pS>^+H!A;>{CN@A3b%V%88`Owvkedl=T!o1SHK z(17!WE!Hv)ih0T@^<}%Z1){R$ipO+KNEs#Fh1Uv+A99m}jxYz6do@ci1ciR&0M$>< z@6ZP}6mRCqHz3cuCcaR0X-l6ijm2Ec$W7j%oxo+tiDuh-KT0q2PbJH{?Kl)oZkS|L z?-CtcnOsam8rLWRz2|okQ*Z{#dEjpO+@ub|B8>)mqxx%gsDFlz#uatqMVp9!0n}^M AY5)KL diff --git a/examples/corelib/serialization/streambookmarks/doc/src/qxmlstreambookmarks.qdoc b/examples/corelib/serialization/streambookmarks/doc/src/qxmlstreambookmarks.qdoc index 108d7738..8e32dd8d 100644 --- a/examples/corelib/serialization/streambookmarks/doc/src/qxmlstreambookmarks.qdoc +++ b/examples/corelib/serialization/streambookmarks/doc/src/qxmlstreambookmarks.qdoc @@ -3,169 +3,221 @@ /*! \example serialization/streambookmarks + \examplecategory {Data Processing & I/O} + \meta tag {network} \title QXmlStream Bookmarks Example - \examplecategory {Input/Output} - \brief Demonstrates how to read and write to XBEL files. + \brief Demonstrates how to read and write XBEL files. \ingroup xml-examples - The QXmlStream Bookmarks example provides a reader for XML Bookmark - Exchange Language (XBEL) files using Qt's QXmlStreamReader class - for reading, and QXmlStreamWriter class for writing the files. + The QXmlStream Bookmarks example provides a viewer for XML Bookmark Exchange + Language (XBEL) files. It can read bookmarks using Qt's QXmlStreamReader and + write them back out again using QXmlStreamWriter. As this example aims to + show how to use these reader and writer types, it provides no means to open + a bookmark, add a new one, or merge two bookmark files, and only minimal + scope for editing bookmarks. None the less, it could surely be extended with + such features, if desired. - \image xmlstreamexample-screenshot.png + \image screenshot.png \section1 XbelWriter Class Definition - The \c XbelWriter class contains a private instance of QXmlStreamWriter, - which provides an XML writer with a streaming API. \c XbelWriter also - has a reference to the QTreeWidget instance where the bookmark hierarchy - is stored. + The \c XbelWriter class takes a \l{QTreeWidget}{tree widget} describing a + hierarchy of folders containing bookmarks. Its \c writeFile() provides the + means to write out this hierarchy, in XBEL format, to a given output device. + + Internally, it records the tree widget it was given and packages a private + instance of QXmlStreamWriter, which provides it with the means to stream + XML. It has an internal \c writeItem() to write each item in its tree. \snippet serialization/streambookmarks/xbelwriter.h 0 \section1 XbelWriter Class Implementation - The \c XbelWriter constructor accepts a \a treeWidget to initialize within - its definition. We enable \l{QXmlStreamWriter}'s auto-formatting property - to ensure line-breaks and indentations are added automatically to empty - sections between elements, increasing readability as the data is split into - several lines. + The \c XbelWriter constructor accepts the \a treeWidget it will describe. It + stores that and enables \l{QXmlStreamWriter}'s auto-formatting property. + This last splits the data into several lines, with indentation to indicate + the structure of the tree, which makes the XML output easier to read. \snippet serialization/streambookmarks/xbelwriter.cpp 0 - The \c writeFile() function accepts a QIODevice object and sets it using - \c setDevice(). This function then writes the document type - definition(DTD), the start element, the version, and \c{treeWidget}'s - top-level items. + The \c writeFile() function accepts a QIODevice object and directs its + QXmlStreamWriter member to write to this device, using \c setDevice(). This + function then writes the document type definition(DTD), the start element, + the version, and delegates writing of each of the \c{treeWidget}'s top-level + items to \c writeItem(). Finally, it closes the document and returns. \snippet serialization/streambookmarks/xbelwriter.cpp 1 - The \c writeItem() function accepts a QTreeWidgetItem object and writes it - to the stream, depending on its \c tagName, which can either be a "folder", - "bookmark", or "separator". + The \c writeItem() function accepts a QTreeWidgetItem object and writes to + its XML stream a representation of the object, which depends on its \c + UserRole, which can be one of a \c{"folder"}, \c{"bookmark"}, + or \c{"separator"}. Within each folder, it calls itself recursively on each + child item, to recursively include a representation of each child within the + folder's XML element. \snippet serialization/streambookmarks/xbelwriter.cpp 2 \section1 XbelReader Class Definition - The \c XbelReader contains a private instance of QXmlStreamReader, the - companion class to QXmlStreamWriter. \c XbelReader also contains a - reference to the QTreeWidget that is used to group the bookmarks according - to their hierarchy. + The \c XbelReader takes a \l{QTreeWidget}{tree widget} to populate with + items describing a bookmark hierarchy. It supports reading XBEL data from a + QIODevice as a source of these items. If parsing of the XBEL data fails, it + can report what went wrong. + + Internally, it records the QTreeWidget that it will populate and packages an + instance of QXmlStreamReader, the companion class to QXmlStreamWriter, which + it will use to read XBEL data. \snippet serialization/streambookmarks/xbelreader.h 0 \section1 XbelReader Class Implementation - The \c XbelReader constructor accepts a QTreeWidget to initialize the - \c treeWidget within its definition. A QStyle object is used to set - \c{treeWidget}'s style property. The \c folderIcon is set to QIcon::Normal - mode where the pixmap is only displayed when the user is not interacting - with the icon. The QStyle::SP_DirClosedIcon, QStyle::SP_DirOpenIcon, and - QStyle::SP_FileIcon correspond to standard pixmaps that follow the style - of your GUI. + Since the XBEL reader is only concerned with reading XML elements, it makes + extensive use of the \l{QXmlStreamReader::}{readNextStartElement()} + convenience function. + + The \c XbelReader constructor requires a QTreeWidget that it will populate. + It populates the tree widget's style with suitable icons: a folder icon that + changes form to indicate whether each folder as open or closed; and a + standard file icon for the individual bookmarks within those folders. \snippet serialization/streambookmarks/xbelreader.cpp 0 - The \c read() function accepts a QIODevice and sets it using - \l{QXmlStreamReader::}{setDevice()}. The actual process of reading only - takes place if the file is a valid XBEL 1.0 file. Note that the XML input - needs to be well-formed to be accepted by QXmlStreamReader. Otherwise, the - \l{QXmlStreamReader::}{raiseError()} function is used to display an error - message. Since the XBEL reader is only concerned with reading XML elements, - it makes extensive use of the \l{QXmlStreamReader::}{readNextStartElement()} - convenience function. + The \c read() function accepts a QIODevice. It directs its QXmlStreamReader + member to read content from that device. Note that the XML input must be + well-formed to be accepted by QXmlStreamReader. First it reads the outer + structure and verifies the content is an XBEL 1.0 file; if it is, \c read() + delegates the actual reading of content to the internal \c readXBEL(). + + Otherwise, the \l{QXmlStreamReader::}{raiseError()} function is used to + record an error message. The reader itself may also do the same if it + encounters errors in the input. When \c read() has finished, it returns + true if there were no errors. \snippet serialization/streambookmarks/xbelreader.cpp 1 - The \c errorString() function is used if an error occurred, in order to - obtain a description of the error complete with line and column number - information. + If \c read() returns false, its caller can obtain a description of the + error, complete with line and column number within the stream, by calling + the \c errorString() function. \snippet serialization/streambookmarks/xbelreader.cpp 2 - The \c readXBEL() function reads the name of a startElement and calls - the appropriate function to read it, depending on whether if its a - "folder", "bookmark" or "separator". Otherwise, it calls - \l{QXmlStreamReader::}{skipCurrentElement()}. The Q_ASSERT() macro is used - to provide a pre-condition for the function. + The \c readXBEL() function reads the name of a startElement and calls the + appropriate function to read it, depending on whether if its tag name + is \c{"folder"}, \c{"bookmark"} or \c{"separator"}. Any other elements + encountered are skipped. The function starts with a precondition, verifying + that the XML reader has just opened an \c{"xbel"} element. \snippet serialization/streambookmarks/xbelreader.cpp 3 - The \c readTitle() function reads the bookmark's title. - - \snippet serialization/streambookmarks/xbelreader.cpp 4 - - The \c readSeparator() function creates a separator and sets its flags. - The text is set to 30 "0xB7", the HEX equivalent for period. The element - is then skipped using \l{QXmlStreamReader::}{skipCurrentElement()}. + The \c readBookmark() function creates a new editable item representing a + single bookmark. It records the XML \c{"href"} attribute of the current + element as second column text of the item and provisionally sets its first + column text to \c{"Unknown title"} before scanning the rest of the element + for a title element to over-ride that, skipping any unrecognized child + elements. \snippet serialization/streambookmarks/xbelreader.cpp 5 + The \c readTitle() function reads a bookmark's title and records it as the + title (first column text) of the item for which it was called. + + \snippet serialization/streambookmarks/xbelreader.cpp 6 + + The \c readSeparator() function creates a separator and sets its flags. The + separator item's text is set to 30 centered dots. The rest of the element is + then skipped using \l{QXmlStreamReader::}{skipCurrentElement()}. + + \snippet serialization/streambookmarks/xbelreader.cpp 6 + + The \c readFolder() function creates an item and iterates the content of the + folder element, adding children to this item to represent the contents of + the folder element. The loop over folder content is similar in form to the + one in \c readXBEL(), save that it now accepts a title element to set the + title of the folder. + + \snippet serialization/streambookmarks/xbelreader.cpp 7 + + The \c createChildItem() helper function creates a new tree widget item + that's either a child of the given item or, if no parent item is given, a + direct child of the tree widget. It sets the new item's \c UserRole to the + tag name of the current XML element, matching how XbelWriter::writeFile() + uses that \c UserRole. + + \snippet serialization/streambookmarks/xbelreader.cpp 8 + \section1 MainWindow Class Definition - The \c MainWindow class is a subclass of QMainWindow, with a - \c File menu and a \c Help menu. + The \c MainWindow class is a subclass of QMainWindow, with a \c File menu + and a \c Help menu. \snippet serialization/streambookmarks/mainwindow.h 0 \section1 MainWindow Class Implementation - The \c MainWindow constructor instantiates the QTreeWidget object, \c - treeWidget and sets its header with a QStringList object, \c labels. - The constructor also invokes \c createActions() and \c createMenus() - to set up the menus and their corresponding actions. The \c statusBar() - is used to display the message "Ready" and the window's size is fixed - to 480x320 pixels. + The \c MainWindow constructor sets up its QTreeWidget object, \c treeWidget, + as its own central widget, with column headings for the title and location + of each book-mark. It configures a custom menu that enables the user to + perform actions on individual bookmarks within the tree widget. + + It invokes \c createMenus() to set up its own menus and their corresponding + actions. It sets its title, announces itself as ready and sets its size to a + reasonable proportion of the available screen space. \snippet serialization/streambookmarks/mainwindow.cpp 0 - The \c open() function enables the user to open an XBEL file using - QFileDialog::getOpenFileName(). A warning message is displayed along - with the \c fileName and \c errorString if the file cannot be read or - if there is a parse error. + A custom menu, triggered when the user right-clicks on a bookmark, provides + for copying the bookmark as a link or directing a desktop browser to open + the URL it references. This menu is implemented (when relevant features are + enabled) by \c onCustomContextMenuRequested(). \snippet serialization/streambookmarks/mainwindow.cpp 1 - The \c saveAs() function displays a QFileDialog, prompting the user for - a \c fileName using QFileDialog::getSaveFileName(). Similar to the - \c open() function, this function also displays a warning message if - the file cannot be written to. + The \c createMenus() function creates the \c fileMenu and \c helpMenu and + adds QAction objects to them, bound variously to the \c open(), \c saveAs() + and \c about() functions, along with QWidget::close() and + QApplication::aboutQt(). The connections are as shown below: \snippet serialization/streambookmarks/mainwindow.cpp 2 - The \c about() function displays a QMessageBox with a brief description - of the example. - - \snippet serialization/streambookmarks/mainwindow.cpp 3 - - In order to implement the \c open(), \c saveAs(), \c exit(), \c about() - and \c aboutQt() functions, we connect them to QAction objects and - add them to the \c fileMenu and \c helpMenu. The connections are as shown - below: - - \snippet serialization/streambookmarks/mainwindow.cpp 5 - - The \c createMenus() function creates the \c fileMenu and \c helpMenu - and adds the QAction objects to them in order to create the menu shown - in the screenshot below: + This creates the menu shown in the screenshots below: \table \row - \li \inlineimage xmlstreamexample-filemenu.png - \li \inlineimage xmlstreamexample-helpmenu.png + \li \inlineimage filemenu.png + \li \inlineimage helpmenu.png \endtable + The \c open() function, when triggered, offers the user a file dialog to use + to select a bookmarks file. If a file is selected, it is parsed using an \c + XBelReader to populate the \c treeWidget with bookmarks. If problems arise + with opening or parsing the file, a suitable warning message is displayed to + the user, including file name and error message. Otherwise, the bookmarks + read from the file are displayed and the window's status bar briefly reports + that the file has been loaded. + + \snippet serialization/streambookmarks/mainwindow.cpp 3 + + The \c saveAs() function displays a QFileDialog, prompting the user for a \c + fileName, to which to save a copy of the bookmarks data. Similar to the \c + open() function, this function also displays a warning message if the file + cannot be written to. + + \snippet serialization/streambookmarks/mainwindow.cpp 4 + + The \c about() function displays a QMessageBox with a brief description of + the example, or general information about Qt and the version of it in use. + \snippet serialization/streambookmarks/mainwindow.cpp 5 \section1 \c{main()} Function The \c main() function instantiates \c MainWindow and invokes the \c show() - function. + function to display it, then its \c open(), as this is most likely what the + user shall want to do first. \snippet serialization/streambookmarks/main.cpp 0 - See the \l{http://pyxml.sourceforge.net/topics/xbel/} - {XML Bookmark Exchange Language Resource Page} for more information - about XBEL files. + See the \l{https://pyxml.sourceforge.net/topics/xbel/} {XML Bookmark + Exchange Language Resource Page} for more information about XBEL files. */ diff --git a/examples/corelib/serialization/streambookmarks/jennifer.xbel b/examples/corelib/serialization/streambookmarks/jennifer.xbel index 2501c118..d5042368 100644 --- a/examples/corelib/serialization/streambookmarks/jennifer.xbel +++ b/examples/corelib/serialization/streambookmarks/jennifer.xbel @@ -3,66 +3,66 @@ Qt Resources - + Qt home page - + Qt Partners - - Training + + Professional Services - - Qt 5 documentation - - - Frequently Asked Questions + + Qt Documentation Community Resources - + + The Qt Project + + Qt Centre - - QtForum.org + + Forum.Qt.org - + The Independent Qt Tutorial - + German Qt Forum - + Korean Qt Community Site - + Russian Qt Forum Online Dictionaries - + Dictionary.com - + Merriam-Webster Online - + Cambridge Dictionaries Online - + OneLook Dictionary Search - - TU Chemnitz German-English Dictionary + + BEOLINGUS, a service of TU Chemnitz Trésor de la Langue Française informatisé - + Dictionnaire de l'Académie Française diff --git a/examples/corelib/serialization/streambookmarks/main.cpp b/examples/corelib/serialization/streambookmarks/main.cpp index 75b5d646..0fd317de 100644 --- a/examples/corelib/serialization/streambookmarks/main.cpp +++ b/examples/corelib/serialization/streambookmarks/main.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include - #include "mainwindow.h" +#include + //! [0] int main(int argc, char *argv[]) { diff --git a/examples/corelib/serialization/streambookmarks/mainwindow.cpp b/examples/corelib/serialization/streambookmarks/mainwindow.cpp index 644681d7..a863f77a 100644 --- a/examples/corelib/serialization/streambookmarks/mainwindow.cpp +++ b/examples/corelib/serialization/streambookmarks/mainwindow.cpp @@ -1,22 +1,33 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include - #include "mainwindow.h" #include "xbelreader.h" #include "xbelwriter.h" -//! [0] -MainWindow::MainWindow() -{ - QStringList labels; - labels << tr("Title") << tr("Location"); +#include +#include +#include +#include +#include +#include - treeWidget = new QTreeWidget; +#include +#if QT_CONFIG(clipboard) +# include +#endif +#include +#include +#include + +using namespace Qt::StringLiterals; + +//! [0] +MainWindow::MainWindow() : treeWidget(new QTreeWidget) +{ treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch); - treeWidget->setHeaderLabels(labels); -#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) + treeWidget->setHeaderLabels(QStringList{tr("Title"), tr("Location")}); +#if QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(treeWidget, &QWidget::customContextMenuRequested, this, &MainWindow::onCustomContextMenuRequested); @@ -33,7 +44,8 @@ MainWindow::MainWindow() } //! [0] -#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) +//! [1] +#if QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) void MainWindow::onCustomContextMenuRequested(const QPoint &pos) { const QTreeWidgetItem *item = treeWidget->itemAt(pos); @@ -49,78 +61,10 @@ void MainWindow::onCustomContextMenuRequested(const QPoint &pos) else if (action == openAction) QDesktopServices::openUrl(QUrl(url)); } -#endif // !QT_NO_CONTEXTMENU && !QT_NO_CLIPBOARD - -//! [1] -void MainWindow::open() -{ - QString fileName = - QFileDialog::getOpenFileName(this, tr("Open Bookmark File"), - QDir::currentPath(), - tr("XBEL Files (*.xbel *.xml)")); - if (fileName.isEmpty()) - return; - - treeWidget->clear(); - - - QFile file(fileName); - if (!file.open(QFile::ReadOnly | QFile::Text)) { - QMessageBox::warning(this, tr("QXmlStream Bookmarks"), - tr("Cannot read file %1:\n%2.") - .arg(QDir::toNativeSeparators(fileName), - file.errorString())); - return; - } - - XbelReader reader(treeWidget); - if (!reader.read(&file)) { - QMessageBox::warning(this, tr("QXmlStream Bookmarks"), - tr("Parse error in file %1:\n\n%2") - .arg(QDir::toNativeSeparators(fileName), - reader.errorString())); - } else { - statusBar()->showMessage(tr("File loaded"), 2000); - } - -} +#endif // QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) //! [1] //! [2] -void MainWindow::saveAs() -{ - QString fileName = - QFileDialog::getSaveFileName(this, tr("Save Bookmark File"), - QDir::currentPath(), - tr("XBEL Files (*.xbel *.xml)")); - if (fileName.isEmpty()) - return; - - QFile file(fileName); - if (!file.open(QFile::WriteOnly | QFile::Text)) { - QMessageBox::warning(this, tr("QXmlStream Bookmarks"), - tr("Cannot write file %1:\n%2.") - .arg(QDir::toNativeSeparators(fileName), - file.errorString())); - return; - } - - XbelWriter writer(treeWidget); - if (writer.writeFile(&file)) - statusBar()->showMessage(tr("File saved"), 2000); -} -//! [2] - -//! [3] -void MainWindow::about() -{ - QMessageBox::about(this, tr("About QXmlStream Bookmarks"), - tr("The QXmlStream Bookmarks example demonstrates how to use Qt's " - "QXmlStream classes to read and write XML documents.")); -} -//! [3] - -//! [5] void MainWindow::createMenus() { QMenu *fileMenu = menuBar()->addMenu(tr("&File")); @@ -137,6 +81,71 @@ void MainWindow::createMenus() QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(tr("&About"), this, &MainWindow::about); - helpMenu->addAction(tr("About &Qt"), qApp, &QCoreApplication::quit); + helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); +} +//! [2] + +//! [3] +void MainWindow::open() +{ + QFileDialog fileDialog(this, tr("Open Bookmark File"), QDir::currentPath()); + fileDialog.setMimeTypeFilters({"application/x-xbel"_L1}); + if (fileDialog.exec() != QDialog::Accepted) + return; + + treeWidget->clear(); + + const QString fileName = fileDialog.selectedFiles().constFirst(); + QFile file(fileName); + if (!file.open(QFile::ReadOnly | QFile::Text)) { + QMessageBox::warning(this, tr("QXmlStream Bookmarks"), + tr("Cannot read file %1:\n%2.") + .arg(QDir::toNativeSeparators(fileName), file.errorString())); + return; + } + + XbelReader reader(treeWidget); + if (!reader.read(&file)) { + QMessageBox::warning( + this, tr("QXmlStream Bookmarks"), + tr("Parse error in file %1:\n\n%2") + .arg(QDir::toNativeSeparators(fileName), reader.errorString())); + } else { + statusBar()->showMessage(tr("File loaded"), 2000); + } +} +//! [3] + +//! [4] +void MainWindow::saveAs() +{ + QFileDialog fileDialog(this, tr("Save Bookmark File"), QDir::currentPath()); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + fileDialog.setDefaultSuffix("xbel"_L1); + fileDialog.setMimeTypeFilters({"application/x-xbel"_L1}); + if (fileDialog.exec() != QDialog::Accepted) + return; + + const QString fileName = fileDialog.selectedFiles().constFirst(); + QFile file(fileName); + if (!file.open(QFile::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, tr("QXmlStream Bookmarks"), + tr("Cannot write file %1:\n%2.") + .arg(QDir::toNativeSeparators(fileName), file.errorString())); + return; + } + + XbelWriter writer(treeWidget); + if (writer.writeFile(&file)) + statusBar()->showMessage(tr("File saved"), 2000); +} +//! [4] + +//! [5] +void MainWindow::about() +{ + QMessageBox::about(this, tr("About QXmlStream Bookmarks"), + tr("The QXmlStream Bookmarks example demonstrates how to use Qt's " + "QXmlStream classes to read and write XML documents.")); } //! [5] diff --git a/examples/corelib/serialization/streambookmarks/mainwindow.h b/examples/corelib/serialization/streambookmarks/mainwindow.h index 7a4a922e..d9efe6b5 100644 --- a/examples/corelib/serialization/streambookmarks/mainwindow.h +++ b/examples/corelib/serialization/streambookmarks/mainwindow.h @@ -22,13 +22,13 @@ public slots: void open(); void saveAs(); void about(); -#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) +#if QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) void onCustomContextMenuRequested(const QPoint &pos); #endif private: void createMenus(); - QTreeWidget *treeWidget; + QTreeWidget *const treeWidget; }; //! [0] diff --git a/examples/corelib/serialization/streambookmarks/streambookmarks.pro b/examples/corelib/serialization/streambookmarks/streambookmarks.pro index 9b067c7b..34d2caae 100644 --- a/examples/corelib/serialization/streambookmarks/streambookmarks.pro +++ b/examples/corelib/serialization/streambookmarks/streambookmarks.pro @@ -8,7 +8,7 @@ SOURCES = main.cpp \ QT += widgets requires(qtConfig(filedialog)) -EXAMPLE_FILES = frank.xbel jennifer.xbel +EXAMPLE_FILES = jennifer.xbel # install target.path = $$[QT_INSTALL_EXAMPLES]/corelib/serialization/streambookmarks diff --git a/examples/corelib/serialization/streambookmarks/xbelreader.cpp b/examples/corelib/serialization/streambookmarks/xbelreader.cpp index 74e25f12..c622cf66 100644 --- a/examples/corelib/serialization/streambookmarks/xbelreader.cpp +++ b/examples/corelib/serialization/streambookmarks/xbelreader.cpp @@ -1,20 +1,21 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include - #include "xbelreader.h" +#include +#include + +using namespace Qt::StringLiterals; + //! [0] -XbelReader::XbelReader(QTreeWidget *treeWidget) - : treeWidget(treeWidget) +XbelReader::XbelReader(QTreeWidget *treeWidget) : treeWidget(treeWidget) { QStyle *style = treeWidget->style(); - folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon), - QIcon::Normal, QIcon::Off); - folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), - QIcon::Normal, QIcon::On); + folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, + QIcon::Off); + folderIcon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Normal, QIcon::On); bookmarkIcon.addPixmap(style->standardPixmap(QStyle::SP_FileIcon)); } //! [0] @@ -25,12 +26,10 @@ bool XbelReader::read(QIODevice *device) xml.setDevice(device); if (xml.readNextStartElement()) { - if (xml.name() == QLatin1String("xbel") - && xml.attributes().value(versionAttribute()) == QLatin1String("1.0")) { + if (xml.name() == "xbel"_L1 && xml.attributes().value("version"_L1) == "1.0"_L1) readXBEL(); - } else { + else xml.raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); - } } return !xml.error(); @@ -50,15 +49,15 @@ QString XbelReader::errorString() const //! [3] void XbelReader::readXBEL() { - Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("xbel")); + Q_ASSERT(xml.isStartElement() && xml.name() == "xbel"_L1); while (xml.readNextStartElement()) { - if (xml.name() == QLatin1String("folder")) - readFolder(0); - else if (xml.name() == QLatin1String("bookmark")) - readBookmark(0); - else if (xml.name() == QLatin1String("separator")) - readSeparator(0); + if (xml.name() == "folder"_L1) + readFolder(nullptr); + else if (xml.name() == "bookmark"_L1) + readBookmark(nullptr); + else if (xml.name() == "separator"_L1) + readSeparator(nullptr); else xml.skipCurrentElement(); } @@ -66,75 +65,76 @@ void XbelReader::readXBEL() //! [3] //! [4] -void XbelReader::readTitle(QTreeWidgetItem *item) -{ - Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("title")); - - QString title = xml.readElementText(); - item->setText(0, title); -} -//! [4] - -//! [5] -void XbelReader::readSeparator(QTreeWidgetItem *item) -{ - Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("separator")); - - QTreeWidgetItem *separator = createChildItem(item); - separator->setFlags(item->flags() & ~Qt::ItemIsSelectable); - separator->setText(0, QString(30, u'\xB7')); - xml.skipCurrentElement(); -} -//! [5] - -void XbelReader::readFolder(QTreeWidgetItem *item) -{ - Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("folder")); - - QTreeWidgetItem *folder = createChildItem(item); - bool folded = (xml.attributes().value(foldedAttribute()) != QLatin1String("no")); - folder->setExpanded(!folded); - - while (xml.readNextStartElement()) { - if (xml.name() == QLatin1String("title")) - readTitle(folder); - else if (xml.name() == QLatin1String("folder")) - readFolder(folder); - else if (xml.name() == QLatin1String("bookmark")) - readBookmark(folder); - else if (xml.name() == QLatin1String("separator")) - readSeparator(folder); - else - xml.skipCurrentElement(); - } -} - void XbelReader::readBookmark(QTreeWidgetItem *item) { - Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("bookmark")); + Q_ASSERT(xml.isStartElement() && xml.name() == "bookmark"_L1); QTreeWidgetItem *bookmark = createChildItem(item); bookmark->setFlags(bookmark->flags() | Qt::ItemIsEditable); bookmark->setIcon(0, bookmarkIcon); bookmark->setText(0, QObject::tr("Unknown title")); - bookmark->setText(1, xml.attributes().value(hrefAttribute()).toString()); + bookmark->setText(1, xml.attributes().value("href"_L1).toString()); while (xml.readNextStartElement()) { - if (xml.name() == QLatin1String("title")) + if (xml.name() == "title"_L1) readTitle(bookmark); else xml.skipCurrentElement(); } } +//! [4] +//! [5] +void XbelReader::readTitle(QTreeWidgetItem *item) +{ + Q_ASSERT(xml.isStartElement() && xml.name() == "title"_L1); + item->setText(0, xml.readElementText()); +} +//! [5] + +//! [6] +void XbelReader::readSeparator(QTreeWidgetItem *item) +{ + Q_ASSERT(xml.isStartElement() && xml.name() == "separator"_L1); + constexpr char16_t midDot = u'\xB7'; + static const QString dots(30, midDot); + + QTreeWidgetItem *separator = createChildItem(item); + separator->setFlags(item ? item->flags() & ~Qt::ItemIsSelectable : Qt::ItemFlags{}); + separator->setText(0, dots); + xml.skipCurrentElement(); +} +//! [6] + +//! [7] +void XbelReader::readFolder(QTreeWidgetItem *item) +{ + Q_ASSERT(xml.isStartElement() && xml.name() == "folder"_L1); + + QTreeWidgetItem *folder = createChildItem(item); + bool folded = xml.attributes().value("folded"_L1) != "no"_L1; + folder->setExpanded(!folded); + + while (xml.readNextStartElement()) { + if (xml.name() == "title"_L1) + readTitle(folder); + else if (xml.name() == "folder"_L1) + readFolder(folder); + else if (xml.name() == "bookmark"_L1) + readBookmark(folder); + else if (xml.name() == "separator"_L1) + readSeparator(folder); + else + xml.skipCurrentElement(); + } +} +//! [7] + +//! [8] QTreeWidgetItem *XbelReader::createChildItem(QTreeWidgetItem *item) { - QTreeWidgetItem *childItem; - if (item) { - childItem = new QTreeWidgetItem(item); - } else { - childItem = new QTreeWidgetItem(treeWidget); - } + QTreeWidgetItem *childItem = item ? new QTreeWidgetItem(item) : new QTreeWidgetItem(treeWidget); childItem->setData(0, Qt::UserRole, xml.name().toString()); return childItem; } +//! [8] diff --git a/examples/corelib/serialization/streambookmarks/xbelreader.h b/examples/corelib/serialization/streambookmarks/xbelreader.h index 81a59b32..a3fa59d8 100644 --- a/examples/corelib/serialization/streambookmarks/xbelreader.h +++ b/examples/corelib/serialization/streambookmarks/xbelreader.h @@ -21,13 +21,8 @@ public: //! [1] bool read(QIODevice *device); - QString errorString() const; - static inline QString versionAttribute() { return QStringLiteral("version"); } - static inline QString hrefAttribute() { return QStringLiteral("href"); } - static inline QString foldedAttribute() { return QStringLiteral("folded"); } - private: //! [2] void readXBEL(); diff --git a/examples/corelib/serialization/streambookmarks/xbelwriter.cpp b/examples/corelib/serialization/streambookmarks/xbelwriter.cpp index 6cfcd2bc..596696c6 100644 --- a/examples/corelib/serialization/streambookmarks/xbelwriter.cpp +++ b/examples/corelib/serialization/streambookmarks/xbelwriter.cpp @@ -1,18 +1,15 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include - #include "xbelwriter.h" #include "xbelreader.h" -static inline QString yesValue() { return QStringLiteral("yes"); } -static inline QString noValue() { return QStringLiteral("no"); } -static inline QString titleElement() { return QStringLiteral("title"); } +#include + +using namespace Qt::StringLiterals; //! [0] -XbelWriter::XbelWriter(const QTreeWidget *treeWidget) - : treeWidget(treeWidget) +XbelWriter::XbelWriter(const QTreeWidget *treeWidget) : treeWidget(treeWidget) { xml.setAutoFormatting(true); } @@ -24,9 +21,9 @@ bool XbelWriter::writeFile(QIODevice *device) xml.setDevice(device); xml.writeStartDocument(); - xml.writeDTD(QStringLiteral("")); - xml.writeStartElement(QStringLiteral("xbel")); - xml.writeAttribute(XbelReader::versionAttribute(), QStringLiteral("1.0")); + xml.writeDTD(""_L1); + xml.writeStartElement("xbel"_L1); + xml.writeAttribute("version"_L1, "1.0"_L1); for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) writeItem(treeWidget->topLevelItem(i)); @@ -39,21 +36,21 @@ bool XbelWriter::writeFile(QIODevice *device) void XbelWriter::writeItem(const QTreeWidgetItem *item) { QString tagName = item->data(0, Qt::UserRole).toString(); - if (tagName == QLatin1String("folder")) { + if (tagName == "folder"_L1) { bool folded = !item->isExpanded(); xml.writeStartElement(tagName); - xml.writeAttribute(XbelReader::foldedAttribute(), folded ? yesValue() : noValue()); - xml.writeTextElement(titleElement(), item->text(0)); + xml.writeAttribute("folded"_L1, folded ? "yes"_L1 : "no"_L1); + xml.writeTextElement("title"_L1, item->text(0)); for (int i = 0; i < item->childCount(); ++i) writeItem(item->child(i)); xml.writeEndElement(); - } else if (tagName == QLatin1String("bookmark")) { + } else if (tagName == "bookmark"_L1) { xml.writeStartElement(tagName); if (!item->text(1).isEmpty()) - xml.writeAttribute(XbelReader::hrefAttribute(), item->text(1)); - xml.writeTextElement(titleElement(), item->text(0)); + xml.writeAttribute("href"_L1, item->text(1)); + xml.writeTextElement("title"_L1, item->text(0)); xml.writeEndElement(); - } else if (tagName == QLatin1String("separator")) { + } else if (tagName == "separator"_L1) { xml.writeEmptyElement(tagName); } } diff --git a/examples/corelib/threads/CMakeLists.txt b/examples/corelib/threads/CMakeLists.txt index 4ced9a50..3548be96 100644 --- a/examples/corelib/threads/CMakeLists.txt +++ b/examples/corelib/threads/CMakeLists.txt @@ -1,8 +1,10 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -qt_internal_add_example(semaphores) -qt_internal_add_example(waitconditions) +if(NOT ANDROID) + qt_internal_add_example(semaphores) + qt_internal_add_example(waitconditions) +endif() if(TARGET Qt6::Widgets) qt_internal_add_example(mandelbrot) qt_internal_add_example(queuedcustomtype) diff --git a/examples/corelib/threads/doc/src/mandelbrot.qdoc b/examples/corelib/threads/doc/src/mandelbrot.qdoc index fa9a7fc3..a42a8ee8 100644 --- a/examples/corelib/threads/doc/src/mandelbrot.qdoc +++ b/examples/corelib/threads/doc/src/mandelbrot.qdoc @@ -3,7 +3,7 @@ /*! \example threads/mandelbrot - \title Mandelbrot Example + \title Mandelbrot \ingroup qtconcurrent-mtexamples \brief The Mandelbrot example demonstrates multi-thread programming @@ -151,7 +151,7 @@ it needs to access \c{RenderThread}'s member variables (e.g., in \c render()). - The \c forever keyword is, like \c foreach, a Qt pseudo-keyword. + The \c forever keyword is a Qt pseudo-keyword. \snippet threads/mandelbrot/renderthread.cpp 4 \snippet threads/mandelbrot/renderthread.cpp 5 diff --git a/examples/corelib/threads/mandelbrot/main.cpp b/examples/corelib/threads/mandelbrot/main.cpp index d0d46809..8aafebf7 100644 --- a/examples/corelib/threads/mandelbrot/main.cpp +++ b/examples/corelib/threads/mandelbrot/main.cpp @@ -2,15 +2,14 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "mandelbrotwidget.h" +#include "renderthread.h" #include - -#include - #include #include #include -#include + +using namespace Qt::StringLiterals; //! [0] int main(int argc, char *argv[]) @@ -18,10 +17,10 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); QCommandLineParser parser; - parser.setApplicationDescription("Qt Mandelbrot Example"); + parser.setApplicationDescription(u"Qt Mandelbrot Example"_s); parser.addHelpOption(); parser.addVersionOption(); - QCommandLineOption passesOption("passes", "Number of passes (1-8)", "passes"); + QCommandLineOption passesOption(u"passes"_s, u"Number of passes (1-8)"_s, u"passes"_s); parser.addOption(passesOption); parser.process(app); diff --git a/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp b/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp index e0f33a2b..bbe69483 100644 --- a/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp +++ b/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp @@ -4,19 +4,20 @@ #include "mandelbrotwidget.h" #include +#include #include #include #include //! [0] -const double DefaultCenterX = -0.637011; -const double DefaultCenterY = -0.0395159; -const double DefaultScale = 0.00403897; +constexpr double DefaultCenterX = -0.637011; +constexpr double DefaultCenterY = -0.0395159; +constexpr double DefaultScale = 0.00403897; -const double ZoomInFactor = 0.8; -const double ZoomOutFactor = 1 / ZoomInFactor; -const int ScrollStep = 20; +constexpr double ZoomInFactor = 0.8; +constexpr double ZoomOutFactor = 1 / ZoomInFactor; +constexpr int ScrollStep = 20; //! [0] //! [1] @@ -46,7 +47,8 @@ void MandelbrotWidget::paintEvent(QPaintEvent * /* event */) if (pixmap.isNull()) { painter.setPen(Qt::white); - painter.drawText(rect(), Qt::AlignCenter|Qt::TextWordWrap, tr("Rendering initial image, please wait...")); + painter.drawText(rect(), Qt::AlignCenter|Qt::TextWordWrap, + tr("Rendering initial image, please wait...")); //! [2] //! [3] return; //! [3] //! [4] @@ -60,47 +62,47 @@ void MandelbrotWidget::paintEvent(QPaintEvent * /* event */) //! [6] //! [7] } else { //! [7] //! [8] - auto previewPixmap = qFuzzyCompare(pixmap.devicePixelRatio(), qreal(1)) + const auto previewPixmap = qFuzzyCompare(pixmap.devicePixelRatio(), qreal(1)) ? pixmap : pixmap.scaled(pixmap.deviceIndependentSize().toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - double scaleFactor = pixmapScale / curScale; - int newWidth = int(previewPixmap.width() * scaleFactor); - int newHeight = int(previewPixmap.height() * scaleFactor); - int newX = pixmapOffset.x() + (previewPixmap.width() - newWidth) / 2; - int newY = pixmapOffset.y() + (previewPixmap.height() - newHeight) / 2; + const double scaleFactor = pixmapScale / curScale; + const int newWidth = int(previewPixmap.width() * scaleFactor); + const int newHeight = int(previewPixmap.height() * scaleFactor); + const int newX = pixmapOffset.x() + (previewPixmap.width() - newWidth) / 2; + const int newY = pixmapOffset.y() + (previewPixmap.height() - newHeight) / 2; painter.save(); painter.translate(newX, newY); painter.scale(scaleFactor, scaleFactor); - QRectF exposed = painter.transform().inverted().mapRect(rect()).adjusted(-1, -1, 1, 1); + const QRectF exposed = painter.transform().inverted().mapRect(rect()) + .adjusted(-1, -1, 1, 1); painter.drawPixmap(exposed, previewPixmap, exposed); painter.restore(); } //! [8] //! [9] - QFontMetrics metrics = painter.fontMetrics(); + const QFontMetrics metrics = painter.fontMetrics(); if (!info.isEmpty()){ - int infoWidth = metrics.horizontalAdvance(info); - int infoHeight = metrics.height(); + const int infoWidth = metrics.horizontalAdvance(info); + const int infoHeight = (infoWidth/width() + 1) * (metrics.height() + 5); painter.setPen(Qt::NoPen); painter.setBrush(QColor(0, 0, 0, 127)); - infoHeight = (infoWidth/width()+1) * (infoHeight + 5); painter.drawRect((width() - infoWidth) / 2 - 5, 0, infoWidth + 10, infoHeight); painter.setPen(Qt::white); painter.drawText(rect(), Qt::AlignHCenter|Qt::AlignTop|Qt::TextWordWrap, info); } - int helpWidth = metrics.horizontalAdvance(help); - int helpHeight = metrics.height(); + const int helpWidth = metrics.horizontalAdvance(help); + const int helpHeight = (helpWidth/width() + 1) * (metrics.height() + 5); painter.setPen(Qt::NoPen); painter.setBrush(QColor(0, 0, 0, 127)); - helpHeight = (helpWidth/width()+1) * (helpHeight + 5); - painter.drawRect((width() - helpWidth) / 2 - 5, height()-helpHeight, helpWidth + 10, helpHeight); + painter.drawRect((width() - helpWidth) / 2 - 5, height()-helpHeight, helpWidth + 10, + helpHeight); painter.setPen(Qt::white); painter.drawText(rect(), Qt::AlignHCenter|Qt::AlignBottom|Qt::TextWordWrap, help); @@ -184,8 +186,8 @@ void MandelbrotWidget::mouseReleaseEvent(QMouseEvent *event) lastDragPos = QPoint(); const auto pixmapSize = pixmap.deviceIndependentSize().toSize(); - int deltaX = (width() - pixmapSize.width()) / 2 - pixmapOffset.x(); - int deltaY = (height() - pixmapSize.height()) / 2 - pixmapOffset.y(); + const int deltaX = (width() - pixmapSize.width()) / 2 - pixmapOffset.x(); + const int deltaY = (height() - pixmapSize.height()) / 2 - pixmapOffset.y(); scroll(deltaX, deltaY); } } diff --git a/examples/corelib/threads/mandelbrot/mandelbrotwidget.h b/examples/corelib/threads/mandelbrot/mandelbrotwidget.h index 23c3a2bf..642feebd 100644 --- a/examples/corelib/threads/mandelbrot/mandelbrotwidget.h +++ b/examples/corelib/threads/mandelbrot/mandelbrotwidget.h @@ -4,11 +4,14 @@ #ifndef MANDELBROTWIDGET_H #define MANDELBROTWIDGET_H -#include -#include -#include #include "renderthread.h" +#include +#include + +QT_BEGIN_NAMESPACE +class QGestureEvent; +QT_END_NAMESPACE //! [0] class MandelbrotWidget : public QWidget diff --git a/examples/corelib/threads/mandelbrot/renderthread.cpp b/examples/corelib/threads/mandelbrot/renderthread.cpp index 9e6c884f..77a14a6a 100644 --- a/examples/corelib/threads/mandelbrot/renderthread.cpp +++ b/examples/corelib/threads/mandelbrot/renderthread.cpp @@ -4,7 +4,6 @@ #include "renderthread.h" #include - #include #include @@ -70,16 +69,16 @@ void RenderThread::run() //! [3] //! [4] - int halfWidth = resultSize.width() / 2; + const int halfWidth = resultSize.width() / 2; //! [4] //! [5] - int halfHeight = resultSize.height() / 2; + const int halfHeight = resultSize.height() / 2; QImage image(resultSize, QImage::Format_RGB32); image.setDevicePixelRatio(devicePixelRatio); int pass = 0; while (pass < numPasses) { const int MaxIterations = (1 << (2 * pass + 6)) + 32; - const int Limit = 4; + constexpr int Limit = 4; bool allBlack = true; timer.restart(); diff --git a/examples/corelib/threads/semaphores/CMakeLists.txt b/examples/corelib/threads/semaphores/CMakeLists.txt index bccf6e1e..fee3f7a5 100644 --- a/examples/corelib/threads/semaphores/CMakeLists.txt +++ b/examples/corelib/threads/semaphores/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(semaphores LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/corelib/threads/semaphores/semaphores.cpp b/examples/corelib/threads/semaphores/semaphores.cpp index 5a495551..103f331b 100644 --- a/examples/corelib/threads/semaphores/semaphores.cpp +++ b/examples/corelib/threads/semaphores/semaphores.cpp @@ -7,9 +7,9 @@ #include //! [0] -const int DataSize = 100000; +constexpr int DataSize = 100000; -const int BufferSize = 8192; +constexpr int BufferSize = 8192; char buffer[BufferSize]; QSemaphore freeBytes(BufferSize); diff --git a/examples/corelib/threads/waitconditions/CMakeLists.txt b/examples/corelib/threads/waitconditions/CMakeLists.txt index 45818e2b..a51cc5f8 100644 --- a/examples/corelib/threads/waitconditions/CMakeLists.txt +++ b/examples/corelib/threads/waitconditions/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(waitconditions LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/dbus/CMakeLists.txt b/examples/dbus/CMakeLists.txt index 738d1e47..b6276f56 100644 --- a/examples/dbus/CMakeLists.txt +++ b/examples/dbus/CMakeLists.txt @@ -4,9 +4,11 @@ if(NOT TARGET Qt6::DBus) return() endif() -qt_internal_add_example(pingpong) -if(QT_FEATURE_process) - qt_internal_add_example(complexpingpong) +if(NOT ANDROID) + qt_internal_add_example(pingpong) + if(QT_FEATURE_process) + qt_internal_add_example(complexpingpong) + endif() endif() if(TARGET Qt6::Widgets) qt_internal_add_example(chat) diff --git a/examples/dbus/complexpingpong/CMakeLists.txt b/examples/dbus/complexpingpong/CMakeLists.txt index 377b56b1..3d7f0089 100644 --- a/examples/dbus/complexpingpong/CMakeLists.txt +++ b/examples/dbus/complexpingpong/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(complexpingpong LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/dbus/doc/src/chat.qdoc b/examples/dbus/doc/src/chat.qdoc index 12bd498a..905c937e 100644 --- a/examples/dbus/doc/src/chat.qdoc +++ b/examples/dbus/doc/src/chat.qdoc @@ -4,6 +4,7 @@ /*! \example chat \title D-Bus Chat + \examplecategory {Connectivity} \ingroup examples-dbus \brief Demonstrates communication among instances of an application. diff --git a/examples/dbus/doc/src/complexpingpong.qdoc b/examples/dbus/doc/src/complexpingpong.qdoc index 0521eafb..84fccdf5 100644 --- a/examples/dbus/doc/src/complexpingpong.qdoc +++ b/examples/dbus/doc/src/complexpingpong.qdoc @@ -4,6 +4,7 @@ /*! \example complexpingpong \title D-Bus Complex Ping Pong + \examplecategory {Connectivity} \ingroup examples-dbus \brief Demonstrates usage of the Qt D-Bus typesystem. diff --git a/examples/dbus/doc/src/pingpong.qdoc b/examples/dbus/doc/src/pingpong.qdoc index 1e2b114a..1ab0ec62 100644 --- a/examples/dbus/doc/src/pingpong.qdoc +++ b/examples/dbus/doc/src/pingpong.qdoc @@ -4,6 +4,7 @@ /*! \example pingpong \title D-Bus Ping Pong + \examplecategory {Connectivity} \ingroup examples-dbus \brief Demonstrates a simple message system using D-Bus. diff --git a/examples/dbus/pingpong/CMakeLists.txt b/examples/dbus/pingpong/CMakeLists.txt index 5d598137..d9b28443 100644 --- a/examples/dbus/pingpong/CMakeLists.txt +++ b/examples/dbus/pingpong/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(pingpong LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/dbus/remotecontrolledcar/doc/src/dbus-remotecontrolledcar.qdoc b/examples/dbus/remotecontrolledcar/doc/src/dbus-remotecontrolledcar.qdoc index a9c04e82..94c914b6 100644 --- a/examples/dbus/remotecontrolledcar/doc/src/dbus-remotecontrolledcar.qdoc +++ b/examples/dbus/remotecontrolledcar/doc/src/dbus-remotecontrolledcar.qdoc @@ -4,6 +4,7 @@ /*! \example remotecontrolledcar \title D-Bus Remote Controlled Car + \examplecategory {Connectivity} \ingroup examples-dbus \brief Shows how to use Qt D-Bus to control a car from another application. diff --git a/examples/embedded/flightinfo/flightinfo.cpp b/examples/embedded/flightinfo/flightinfo.cpp index c4d81177..96a3e272 100644 --- a/examples/embedded/flightinfo/flightinfo.cpp +++ b/examples/embedded/flightinfo/flightinfo.cpp @@ -342,8 +342,6 @@ private: int main(int argc, char **argv) { - Q_INIT_RESOURCE(flightinfo); - QApplication app(argc, argv); FlightInfo w; diff --git a/examples/embedded/styleexample/main.cpp b/examples/embedded/styleexample/main.cpp index 2a7577e8..dba57e2d 100644 --- a/examples/embedded/styleexample/main.cpp +++ b/examples/embedded/styleexample/main.cpp @@ -7,7 +7,6 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - Q_INIT_RESOURCE(styleexample); app.setApplicationName("style"); app.setOrganizationName("QtProject"); diff --git a/examples/examples.pro b/examples/examples.pro index fe6c6dc7..15e8167f 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -3,8 +3,7 @@ CONFIG += no_docs_target SUBDIRS = \ corelib \ - embedded \ - qpa + embedded !contains(TEMPLATE, "vc.*") { # QTBUG-91033 qtHaveModule(dbus): SUBDIRS += dbus diff --git a/examples/gui/doc/src/rasterwindow.qdoc b/examples/gui/doc/src/rasterwindow.qdoc index 4458f127..601b1d00 100644 --- a/examples/gui/doc/src/rasterwindow.qdoc +++ b/examples/gui/doc/src/rasterwindow.qdoc @@ -4,6 +4,7 @@ /*! \example rasterwindow \title Raster Window Example + \examplecategory {Graphics & Multimedia} \brief This example shows how to create a minimal QWindow based application using QPainter for rendering. diff --git a/examples/network/CMakeLists.txt b/examples/network/CMakeLists.txt index 4e19a2df..3aab043c 100644 --- a/examples/network/CMakeLists.txt +++ b/examples/network/CMakeLists.txt @@ -4,7 +4,7 @@ if(NOT TARGET Qt6::Network) return() endif() -if(NOT INTEGRITY) +if(NOT INTEGRITY AND NOT ANDROID) qt_internal_add_example(dnslookup) endif() if(TARGET Qt6::Widgets) @@ -18,6 +18,7 @@ if(TARGET Qt6::Widgets) qt_internal_add_example(multicastsender) qt_internal_add_example(fortuneclient) qt_internal_add_example(fortuneserver) + qt_internal_add_example(rsslisting) endif() if(QT_FEATURE_processenvironment AND TARGET Qt6::Widgets) qt_internal_add_example(network-chat) diff --git a/examples/network/dnslookup/CMakeLists.txt b/examples/network/dnslookup/CMakeLists.txt index e90cdaff..39f680f3 100644 --- a/examples/network/dnslookup/CMakeLists.txt +++ b/examples/network/dnslookup/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.16) project(dnslookup LANGUAGES CXX) +if (ANDROID) + message(FATAL_ERROR "This project cannot be built on Android.") +endif() + if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() diff --git a/examples/network/dnslookup/dnslookup.cpp b/examples/network/dnslookup/dnslookup.cpp index 4af4567e..9ebdfb1f 100644 --- a/examples/network/dnslookup/dnslookup.cpp +++ b/examples/network/dnslookup/dnslookup.cpp @@ -79,7 +79,7 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *qu if (query->nameServer.isNull() || query->nameServer.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol) { return { Status::Error, - u"Bad nameserver address: %1"_qs.arg(nameserver) }; + u"Bad nameserver address: %1"_s.arg(nameserver) }; } } @@ -88,14 +88,14 @@ CommandLineParseResult parseCommandLine(QCommandLineParser &parser, DnsQuery *qu if (std::optional type = typeFromParameter(typeParameter)) query->type = *type; else - return { Status::Error, u"Bad record type: %1"_qs.arg(typeParameter) }; + return { Status::Error, u"Bad record type: %1"_s.arg(typeParameter) }; } const QStringList positionalArguments = parser.positionalArguments(); if (positionalArguments.isEmpty()) - return { Status::Error, u"Argument 'name' missing."_qs }; + return { Status::Error, u"Argument 'name' missing."_s }; if (positionalArguments.size() > 1) - return { Status::Error, u"Several 'name' arguments specified."_qs }; + return { Status::Error, u"Several 'name' arguments specified."_s }; query->name = positionalArguments.first(); return { Status::Ok }; @@ -202,7 +202,7 @@ int main(int argc, char *argv[]) case Status::Ok: break; case Status::Error: - std::fputs(qPrintable(parseResult.errorString.value_or(u"Unknown error occurred"_qs)), + std::fputs(qPrintable(parseResult.errorString.value_or(u"Unknown error occurred"_s)), stderr); std::fputs("\n\n", stderr); std::fputs(qPrintable(parser.helpText()), stderr); diff --git a/examples/network/doc/src/secureudpclient.qdoc b/examples/network/doc/src/secureudpclient.qdoc index 0f673b0a..b7a51c08 100644 --- a/examples/network/doc/src/secureudpclient.qdoc +++ b/examples/network/doc/src/secureudpclient.qdoc @@ -4,6 +4,7 @@ /*! \example secureudpclient \title DTLS client + \examplecategory {Networking} \ingroup examples-network \brief This example demonstrates how to implement client-side DTLS connections. diff --git a/examples/network/doc/src/secureudpserver.qdoc b/examples/network/doc/src/secureudpserver.qdoc index f98ee741..3d224d91 100644 --- a/examples/network/doc/src/secureudpserver.qdoc +++ b/examples/network/doc/src/secureudpserver.qdoc @@ -4,6 +4,7 @@ /*! \example secureudpserver \title DTLS server + \examplecategory {Networking} \ingroup examples-network \brief This examples demonstrates how to implement a simple DTLS server. diff --git a/examples/network/doc/src/torrent.qdoc b/examples/network/doc/src/torrent.qdoc index 301be186..124a6972 100644 --- a/examples/network/doc/src/torrent.qdoc +++ b/examples/network/doc/src/torrent.qdoc @@ -4,6 +4,7 @@ /*! \example torrent \title Torrent Example + \examplecategory {Networking} \ingroup examples-network \brief Demonstrates complex TCP/IP operations. diff --git a/examples/network/network.pro b/examples/network/network.pro index 79815609..a0fc95db 100644 --- a/examples/network/network.pro +++ b/examples/network/network.pro @@ -8,18 +8,16 @@ qtHaveModule(widgets) { blockingfortuneclient \ broadcastreceiver \ broadcastsender \ + fortuneclient \ + fortuneserver \ http \ - threadedfortuneserver \ - torrent \ multicastreceiver \ - multicastsender + multicastsender \ + rsslisting \ + threadedfortuneserver \ + torrent qtConfig(processenvironment): SUBDIRS += network-chat - - SUBDIRS += \ - fortuneclient \ - fortuneserver - qtConfig(ssl): SUBDIRS += securesocketclient qtConfig(dtls): SUBDIRS += secureudpserver secureudpclient qtConfig(sctp): SUBDIRS += multistreamserver multistreamclient diff --git a/examples/corelib/serialization/rsslisting/CMakeLists.txt b/examples/network/rsslisting/CMakeLists.txt similarity index 90% rename from examples/corelib/serialization/rsslisting/CMakeLists.txt rename to examples/network/rsslisting/CMakeLists.txt index 405a01ce..fc9d8d12 100644 --- a/examples/corelib/serialization/rsslisting/CMakeLists.txt +++ b/examples/network/rsslisting/CMakeLists.txt @@ -8,7 +8,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") endif() -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/corelib/serialization/rsslisting") +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/network/rsslisting") find_package(Qt6 REQUIRED COMPONENTS Core Gui Network Widgets) diff --git a/examples/network/rsslisting/doc/images/rsslisting.png b/examples/network/rsslisting/doc/images/rsslisting.png new file mode 100644 index 0000000000000000000000000000000000000000..0b05375f938edd0f3bb72ffd0cc6aa07f670c718 GIT binary patch literal 19739 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 TvTT$BoqFc!>gTe~DWM4fClXeE literal 0 HcmV?d00001 diff --git a/examples/network/rsslisting/doc/src/rsslisting.qdoc b/examples/network/rsslisting/doc/src/rsslisting.qdoc new file mode 100644 index 00000000..a1e91932 --- /dev/null +++ b/examples/network/rsslisting/doc/src/rsslisting.qdoc @@ -0,0 +1,129 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \example rsslisting + \examplecategory {Networking} + \meta tag {serialization} + \title A minimal RSS listing application + + \brief A demonstration of how to fetch and display a network resource. + + This example shows how to fetch a resource the user has requested and + display data contained in the response, illustrated by an RSS listing + application. (RDF Site Summary, or Really Simple Syndication, is a standard + format for communicating updates to web sites. See + https://www.rssboard.org/rss-specification for details.) The user inferface + in the illustration is simple, as the focus of this example is on how to use + networking, but naturally a more sophisticated interface would be wanted for + a serious RSS reader. + + The example also illustrates how to do asynchronous parsing of data as it is + received, preserving state in member variables so that an incremental parser + can consume chunks of data as they arrive over the network. Constituents of + the parsed content may start in one chunk of data but not be completed until + a later chunk, requiring the parser to retain state between calls. + + \image rsslisting.png + + The main program is fairly minimal. It simply instantiates a \l QApplication + and the \c RSSListing widget, shows the latter and hands over control to the + former. For the sake of illustration, it gives the widget the Qt blog's URL + as default value for the resource to check. + + \snippet rsslisting/main.cpp 0 + + \section1 The RSSListing class + + \snippet rsslisting/rsslisting.h 0 + + The widget itself provides a simple user interface for specifying the URL to + fetch and, once available updates are displayed, controlling the downloading + of updated items. A \l QLineEdit provides for input of the URL, and a + \l QTreeWidget for display of the results once fetched. + + The widget downloads and parses the RSS (a form of XML) asynchronously, + feeding the data to an XML reader as it arrives. This supports reading of + very large data sources. Because the data is streamed from the network + through the XML reader, there is no need to retain the full text of the XML + in memory. In other context, a similar approach can allow the user to + interrupt such incremental loading. + + \section2 Construction + + \snippet rsslisting/rsslisting.cpp setup + + The constructor sets up the assorted components of the widget and connects + their various signals to the slots it shall use to handle them. + + The user interface consists of a line edit, a push button, and a list view + widget. The line edit is used for entering the URL to fetch; the push button + starts the process of fetching updates. The line edit is empty by default, + but the constructor's caller can override that, as our \c main() has done. + In any case, the user can replace the default with the URL of another RSS + feed. + + The list view shows the updated items reported in the RSS feed. + Double-clicking on one of these sends its URL to the user's browser or other + user agent using \l QDesktopServices::openUrl(). + + \section2 The slots + + \snippet rsslisting/rsslisting.cpp slots + + All slots are kept simple by delegating any hard work to private methods. + + When the user completes input of a URL, either by clicking the "Fetch" + button or by pressing the return key in the line edit, the \c fetch() slot + disables the "Fetch" button and disables further editing of the line edit. + It clears the display of available updates and delegates to \c get() the + initiating of an HTTP GET request. + + When data is received, the network reply triggers its \l {QNetworkReply::} + {readyRead()} signal, which \c get() connects to the \c consumeData() + slot. This checks the response got a successful status code and, if it did, + calls \c parseXml() to consume the data. + + If the network reply gets an error, this is delivered to the \c error() + slot, which reports the error, clears the XML stream reader then disconnects + from the reply and deletes it. + + On completion (whether successful or otherwise) of a network reply, the \c + finished() slot restores the UI to be ready to accept a new URL to fetch by + re-enabling the line edit and "Fetch" button. + + \section2 The get() method + + \snippet rsslisting/rsslisting.cpp get + + The private \c get() method is used by the \c fetch() slot to initiate an + HTTP GET request. It first clears the XML stream reader and, if a reply is + currently active, disconnects and deletes it. If the URL it has been passed + is valid, it asks the network access manager to GET it. It connects its + relevant slots to signals of the resulting reply (if any) and sets up its + XML stream reader to read data from the reply - a network reply object is + also a \c QIODevice, from which data can be read. + + \section2 The parseXml() method + + \snippet rsslisting/rsslisting.cpp parse + + When data is received, and thus made available to the XML stream reader, \c + parseXml() reads from the XML stream, checking for \c item elements and, + within them, \c title and \c link elements. It will use the \c{rss:about} + attribute of an \c item as URL in the Link column of the tree-view, failing + that the content of its \c link element; and it uses the content of the \c + title element in the Title column of the tree-view. As each \c item element + closes, its details are turned into a new row in the tree widget, with the + extracted title and URL in the Title and Link columns. + + The variables that keep track of the parsing state - \c linkString, \c + titleString and \c currentTag - are member variables of the \c RSSListing + class, even though they are only accessed from this method, because this + method may be called repeatedly, as new data arrives, and one chunk of + received data may start an element that isn't completed until a later chunk + arrives. This enables the parser to operate asynchronously as the data + arrives, instead of having to wait until all the data has arrived. + + \sa QNetworkReply, QXmlStreamReader +*/ diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part1/main.cpp b/examples/network/rsslisting/main.cpp similarity index 50% rename from examples/widgets/tutorials/gettingStarted/gsQt/part1/main.cpp rename to examples/network/rsslisting/main.cpp index ef8c6ed1..7a64db8a 100644 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part1/main.cpp +++ b/examples/network/rsslisting/main.cpp @@ -1,15 +1,16 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +#include "rsslisting.h" #include +using namespace Qt::StringLiterals; -int main(int argc, char *argv[]) +//! [0] +int main(int argc, char **argv) { QApplication app(argc, argv); - - QTextEdit textEdit; - textEdit.show(); - + RSSListing rsslisting(u"https://www.qt.io/blog/rss.xml"_s); + rsslisting.show(); return app.exec(); } - +//! [0] diff --git a/examples/network/rsslisting/rsslisting.cpp b/examples/network/rsslisting/rsslisting.cpp new file mode 100644 index 00000000..ed7c163c --- /dev/null +++ b/examples/network/rsslisting/rsslisting.cpp @@ -0,0 +1,126 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "rsslisting.h" + +#include +#include +#include + +//! [setup] +RSSListing::RSSListing(const QString &url, QWidget *parent) + : QWidget(parent), currentReply(0) +{ + connect(&manager, &QNetworkAccessManager::finished, this, &RSSListing::finished); + + lineEdit = new QLineEdit(this); + lineEdit->setText(url); + connect(lineEdit, &QLineEdit::returnPressed, this, &RSSListing::fetch); + + fetchButton = new QPushButton(tr("Fetch"), this); + connect(fetchButton, &QPushButton::clicked, this, &RSSListing::fetch); + + treeWidget = new QTreeWidget(this); + connect(treeWidget, &QTreeWidget::itemActivated, + // Open the link in the browser: + this, [](QTreeWidgetItem *item) { QDesktopServices::openUrl(QUrl(item->text(1))); }); + treeWidget->setHeaderLabels(QStringList { tr("Title"), tr("Link") }); + treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents); + + QHBoxLayout *hboxLayout = new QHBoxLayout; + hboxLayout->addWidget(lineEdit); + hboxLayout->addWidget(fetchButton); + + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addLayout(hboxLayout); + layout->addWidget(treeWidget); + + setWindowTitle(tr("RSS listing example")); + resize(640, 480); +} +//! [setup] + +//! [slots] +void RSSListing::fetch() +{ + lineEdit->setReadOnly(true); + fetchButton->setEnabled(false); + treeWidget->clear(); + + get(QUrl(lineEdit->text())); +} + +void RSSListing::consumeData() +{ + int statusCode = currentReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (statusCode >= 200 && statusCode < 300) + parseXml(); +} + +void RSSListing::error(QNetworkReply::NetworkError) +{ + qWarning("error retrieving RSS feed"); + xml.clear(); + currentReply->disconnect(this); + currentReply->deleteLater(); + currentReply = nullptr; +} + +void RSSListing::finished(QNetworkReply *reply) +{ + Q_UNUSED(reply); + lineEdit->setReadOnly(false); + fetchButton->setEnabled(true); +} +//! [slots] + +// Private methods + +//! [get] +void RSSListing::get(const QUrl &url) +{ + if (currentReply) { + currentReply->disconnect(this); + currentReply->deleteLater(); + } + currentReply = url.isValid() ? manager.get(QNetworkRequest(url)) : nullptr; + if (currentReply) { + connect(currentReply, &QNetworkReply::readyRead, this, &RSSListing::consumeData); + connect(currentReply, &QNetworkReply::errorOccurred, this, &RSSListing::error); + + } + xml.setDevice(currentReply); // Equivalent to clear() if currentReply is null. +} +//! [get] + +// TODO: this is a candidate for showing how to use coroutines, once available. +//! [parse] +void RSSListing::parseXml() +{ + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement()) { + if (xml.name() == u"item") { + linkString = xml.attributes().value("rss:about").toString(); + titleString.clear(); + } + currentTag = xml.name().toString(); + } else if (xml.isEndElement()) { + if (xml.name() == u"item") { + + QTreeWidgetItem *item = new QTreeWidgetItem; + item->setText(0, titleString); + item->setText(1, linkString); + treeWidget->addTopLevelItem(item); + } + } else if (xml.isCharacters() && !xml.isWhitespace()) { + if (currentTag == "title") + titleString += xml.text(); + else if (currentTag == "link") + linkString += xml.text(); + } + } + if (xml.error() && xml.error() != QXmlStreamReader::PrematureEndOfDocumentError) + qWarning() << "XML ERROR:" << xml.lineNumber() << ": " << xml.errorString(); +} +//! [parse] diff --git a/examples/corelib/serialization/rsslisting/rsslisting.h b/examples/network/rsslisting/rsslisting.h similarity index 81% rename from examples/corelib/serialization/rsslisting/rsslisting.h rename to examples/network/rsslisting/rsslisting.h index 81c655f6..499bc5d1 100644 --- a/examples/corelib/serialization/rsslisting/rsslisting.h +++ b/examples/network/rsslisting/rsslisting.h @@ -7,49 +7,48 @@ #include #include #include -#include #include -#include - QT_BEGIN_NAMESPACE class QLineEdit; +class QPushButton; class QTreeWidget; class QTreeWidgetItem; -class QPushButton; +class QUrl; QT_END_NAMESPACE +//! [0] class RSSListing : public QWidget { Q_OBJECT public: - RSSListing(QWidget *widget = nullptr); + explicit RSSListing(const QString &url = QString(), QWidget *widget = nullptr); public slots: void fetch(); void finished(QNetworkReply *reply); - void readyRead(); - void metaDataChanged(); - void itemActivated(QTreeWidgetItem * item); + void consumeData(); void error(QNetworkReply::NetworkError); private: void parseXml(); void get(const QUrl &url); + // Parser state: QXmlStreamReader xml; QString currentTag; QString linkString; QString titleString; + // Network state: QNetworkAccessManager manager; QNetworkReply *currentReply; + // UI elements: QLineEdit *lineEdit; QTreeWidget *treeWidget; QPushButton *fetchButton; - }; +//! [0] #endif - diff --git a/examples/corelib/serialization/rsslisting/rsslisting.pro b/examples/network/rsslisting/rsslisting.pro similarity index 66% rename from examples/corelib/serialization/rsslisting/rsslisting.pro rename to examples/network/rsslisting/rsslisting.pro index 7619755b..aacbe312 100644 --- a/examples/corelib/serialization/rsslisting/rsslisting.pro +++ b/examples/network/rsslisting/rsslisting.pro @@ -4,5 +4,5 @@ QT += network widgets requires(qtConfig(treewidget)) # install -target.path = $$[QT_INSTALL_EXAMPLES]/corelib/serialization/rsslisting +target.path = $$[QT_INSTALL_EXAMPLES]/network/rsslisting INSTALLS += target diff --git a/examples/network/securesocketclient/main.cpp b/examples/network/securesocketclient/main.cpp index 5898bf08..7a59e6f7 100644 --- a/examples/network/securesocketclient/main.cpp +++ b/examples/network/securesocketclient/main.cpp @@ -11,8 +11,6 @@ QT_REQUIRE_CONFIG(ssl); int main(int argc, char **argv) { - Q_INIT_RESOURCE(securesocketclient); - QApplication app(argc, argv); if (!QSslSocket::supportsSsl()) { diff --git a/examples/network/torrent/main.cpp b/examples/network/torrent/main.cpp index a7a795fb..649f3343 100644 --- a/examples/network/torrent/main.cpp +++ b/examples/network/torrent/main.cpp @@ -9,8 +9,6 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - Q_INIT_RESOURCE(icons); - MainWindow window; window.show(); diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 2b075de2..eb7e2d27 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -7,7 +7,6 @@ if(TARGET Qt6::Widgets) qt_internal_add_example(contextinfo) qt_internal_add_example(2dpainting) qt_internal_add_example(hellogl2) - qt_internal_add_example(qopenglwidget) qt_internal_add_example(cube) qt_internal_add_example(textures) qt_internal_add_example(stereoqopenglwidget) diff --git a/examples/opengl/doc/src/2dpainting.qdoc b/examples/opengl/doc/src/2dpainting.qdoc index 934097f3..5fcb5ad3 100644 --- a/examples/opengl/doc/src/2dpainting.qdoc +++ b/examples/opengl/doc/src/2dpainting.qdoc @@ -5,6 +5,7 @@ \example 2dpainting \title 2D Painting Example \ingroup examples-widgets-opengl + \examplecategory {Graphics & Multimedia} \brief The 2D Painting example shows how QPainter and QOpenGLWidget can be used together to display accelerated 2D graphics on supported hardware. diff --git a/examples/opengl/doc/src/cube.qdoc b/examples/opengl/doc/src/cube.qdoc index e0a18706..cbcc460b 100644 --- a/examples/opengl/doc/src/cube.qdoc +++ b/examples/opengl/doc/src/cube.qdoc @@ -5,11 +5,14 @@ \example cube \ingroup examples-widgets-opengl \title Cube OpenGL ES 2.0 example + \examplecategory {Data Visualization & 3D} - \brief The Cube OpenGL ES 2.0 example shows how to write mouse rotatable - textured 3D cube using OpenGL ES 2.0 with Qt. It shows how to handle - polygon geometries efficiently and how to write simple vertex and - fragment shader for programmable graphics pipeline. In addition it + \brief Shows how to manually rotate a textured 3D cube with user input. + + The Cube OpenGL ES 2.0 example shows how to manually rotate a textured 3D + cube with user input, using OpenGL ES 2.0 with Qt. It shows how to + handle polygon geometries efficiently and how to write a simple vertex and + fragment shader for a programmable graphics pipeline. In addition it shows how to use quaternions for representing 3D object orientation. This example has been written for OpenGL ES 2.0 but it works also on diff --git a/examples/opengl/doc/src/hellogl2.qdoc b/examples/opengl/doc/src/hellogl2.qdoc index 3a81b0df..bb85e7ee 100644 --- a/examples/opengl/doc/src/hellogl2.qdoc +++ b/examples/opengl/doc/src/hellogl2.qdoc @@ -5,6 +5,7 @@ \example hellogl2 \title Hello GL2 Example \ingroup examples-widgets-opengl + \examplecategory {Data Visualization & 3D} \brief The Hello GL2 example demonstrates the basic use of the OpenGL-related classes provided with Qt. diff --git a/examples/opengl/doc/src/hellogles3.qdoc b/examples/opengl/doc/src/hellogles3.qdoc index e76536d9..bb699ec1 100644 --- a/examples/opengl/doc/src/hellogles3.qdoc +++ b/examples/opengl/doc/src/hellogles3.qdoc @@ -5,24 +5,144 @@ \example hellogles3 \title Hello GLES3 Example \ingroup examples-widgets-opengl + \examplecategory {Graphics & Multimedia} - \brief The Hello GLES3 example demonstrates easy, cross-platform usage of - OpenGL ES 3.0 functions via QOpenGLExtraFunctions in an application that + \brief Demonstrates OpenGL ES 3.0 functions via QOpenGLExtraFunctions. + + \image hellogles3-example.png + \section1 Overview + + This example demonstrates easy, cross-platform usage of OpenGL ES 3.0 + functions via QOpenGLExtraFunctions in an application that works identically on desktop platforms with OpenGL 3.3 and mobile/embedded devices with OpenGL ES 3.0. - The code is always the same, with the exception of two places: - \list - \li The OpenGL context creation has to have a sufficiently high version - number for the features that are in use. - \li The shader code's version directive is different. - \endlist - - This example has no QWidget dependencies. Instead, it uses QOpenGLWindow, a + This example has no QWidget dependencies, it uses QOpenGLWindow, a convenience subclass of QWindow that allows easy implementation of windows that contain OpenGL-rendered content. In this sense it complements the \l{OpenGL Window Example}, which shows the implementation of an OpenGL-based QWindow without using the convenience subclass. - \image hellogles3-example.png + The Qt logo shape implementation is included from the \l{Hello GL2 Example}. + + In other aspects pertaining to using OpenGL there are the following + differences. + + \list + \li The OpenGL context creation has to have a sufficiently high version + number for the features that are in use. + \li The shader's version directive is different. + \endlist + + \section1 Setting up in main.cpp + + Here we instantiate our QGuiApplication, QSurfaceformat and set its + \l{QSurfaceFormat::depthBufferSize()}{depth buffer size}: + + \quotefromfile hellogles3/main.cpp + \skipto int main(int argc, char *argv[]) + \printuntil fmt.setDepthBufferSize(24); + + We request an OpenGL 3.3 core or OpenGL ES 3.0 context, depending on + QOpenGLContext::openGLModuleType(): + + \skipto if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) { + \printuntil QSurfaceFormat::setDefaultFormat(fmt); + + We set the default surface format and instantiate our GLWindow \c glWindow. + + \section1 Implementing GLWindow + + This class delivers the features of the example application. + + To start, \c GLWindow is declared by implementing a subclass of + QOpenGLWindow: + + \quotefromfile hellogles3/glwindow.h + \skipto class GLWindow : public QOpenGLWindow + \printto { + + The following properties are declared using Q_PROPERTY: + + \printto public: + + The following public functions are declared: + + \printto private slots: + + The following private objects are declared: + + \printto }; + + On the implementation side, those functions that are not declared inline are + implemented (or re-implemented) in \c{glwindow.cpp}. The following selections + will cover implementation particulars pertaining to the use of OpenGL ES 3.0. + + \section2 Animations + + The following code pertains to the animations, and won't be explored here: + + \quotefromfile hellogles3/glwindow.cpp + \skipto GLWindow::GLWindow() + \printto static const char *vertexShaderSource = + + For more information see the documentation for \l QPropertyAnimation, + \l QSequentialAnimationGroup. + + \section2 Shaders + The shaders are defined like so: + + \printto QByteArray versionedShaderCode(const char *src) + + \note These are OpenGL version agnostic. We take this and append + the version like so: + + \printto void GLWindow::initializeGL() + + \section2 Initializing OpenGL + + Initializing the shader program in handled by \c initializeGL(): + + \printuntil m_program = new QOpenGLShaderProgram; + \skipto m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, versionedShaderCode(vertexShaderSource)); + + Now the OpenGL version is prepended and the various matrices and light + position is set: + + \printuntil m_lightPosLoc = m_program->uniformLocation("lightPos"); + + While not strictly required for ES 3, a vertex array object is created. + + \skipto delete m_vao; + \printuntil f->glEnable(GL_CULL_FACE); + + \section2 Resizing the window + + The perspective needs to be aligned with the new window size as so: + + \skipto void GLWindow::resizeGL(int w, int h) + \printto void GLWindow::paintGL() + + \section2 Painting + + We use QOpenGLExtraFunctions instead of QOpenGLFunctions as we want to + do more than what GL(ES) 2.0 offers: + + \printuntil QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions(); + + We clear the screen and buffers and bind our shader program and texture: + + \printuntil m_texture->bind(); + + Logic for handling an initial \c paintGL() call or a call after a + \c resizeGL() call is implemented like so: + + \printuntil } + + Last, we demonstrate a function introduced in OpenGL 3.1 or OpenGL ES 3.0: + + \skipto f->glDrawArraysInstanced(GL_TRIANGLES, 0, m_logo.vertexCount(), 32 * 36); + \printuntil } + + This works because we earlier requested 3.3 or 3.0 context. */ diff --git a/examples/opengl/doc/src/openglwindow.qdoc b/examples/opengl/doc/src/openglwindow.qdoc index 505ff20f..44ef047a 100644 --- a/examples/opengl/doc/src/openglwindow.qdoc +++ b/examples/opengl/doc/src/openglwindow.qdoc @@ -4,6 +4,8 @@ /*! \example openglwindow \title OpenGL Window Example + \ingroup examples-widgets-opengl + \examplecategory {Graphics & Multimedia} \brief This example shows how to create a minimal QWindow based application for the purpose of using OpenGL. diff --git a/examples/opengl/doc/src/stereoqopenglwidget.qdoc b/examples/opengl/doc/src/stereoqopenglwidget.qdoc index c4e51f9c..6037d370 100644 --- a/examples/opengl/doc/src/stereoqopenglwidget.qdoc +++ b/examples/opengl/doc/src/stereoqopenglwidget.qdoc @@ -4,7 +4,7 @@ /*! \example stereoqopenglwidget \title QOpenGLWidget Stereoscopic Rendering Example - + \examplecategory {Graphics & Multimedia} \brief This example shows how to create a minimal QOpenGLWidget based application with stereoscopic rendering support. diff --git a/examples/opengl/hellogl2/window.h b/examples/opengl/hellogl2/window.h index f9e06079..2099bc11 100644 --- a/examples/opengl/hellogl2/window.h +++ b/examples/opengl/hellogl2/window.h @@ -6,10 +6,8 @@ #include -QT_BEGIN_NAMESPACE -class QSlider; -class QPushButton; -QT_END_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QSlider) +QT_FORWARD_DECLARE_CLASS(QPushButton) class GLWidget; class MainWindow; diff --git a/examples/opengl/hellogles3/glwindow.h b/examples/opengl/hellogles3/glwindow.h index fc2a0e48..54bc531a 100644 --- a/examples/opengl/hellogles3/glwindow.h +++ b/examples/opengl/hellogles3/glwindow.h @@ -9,14 +9,10 @@ #include #include "../hellogl2/logo.h" -QT_BEGIN_NAMESPACE - -class QOpenGLTexture; -class QOpenGLShaderProgram; -class QOpenGLBuffer; -class QOpenGLVertexArrayObject; - -QT_END_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QOpenGLTexture) +QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram) +QT_FORWARD_DECLARE_CLASS(QOpenGLBuffer) +QT_FORWARD_DECLARE_CLASS(QOpenGLVertexArrayObject) class GLWindow : public QOpenGLWindow { diff --git a/examples/opengl/opengl.pro b/examples/opengl/opengl.pro index b0eac5ee..f33921a7 100644 --- a/examples/opengl/opengl.pro +++ b/examples/opengl/opengl.pro @@ -7,7 +7,6 @@ qtHaveModule(widgets) { SUBDIRS += contextinfo \ 2dpainting \ hellogl2 \ - qopenglwidget \ cube \ textures \ stereoqopenglwidget diff --git a/examples/opengl/openglwindow/openglwindow.h b/examples/opengl/openglwindow/openglwindow.h index 579f9eed..41bcbab9 100644 --- a/examples/opengl/openglwindow/openglwindow.h +++ b/examples/opengl/openglwindow/openglwindow.h @@ -7,11 +7,9 @@ #include #include -QT_BEGIN_NAMESPACE -class QPainter; -class QOpenGLContext; -class QOpenGLPaintDevice; -QT_END_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QPainter) +QT_FORWARD_DECLARE_CLASS(QOpenGLContext) +QT_FORWARD_DECLARE_CLASS(QOpenGLPaintDevice) //! [1] class OpenGLWindow : public QWindow, protected QOpenGLFunctions diff --git a/examples/opengl/stereoqopenglwidget/CMakeLists.txt b/examples/opengl/stereoqopenglwidget/CMakeLists.txt index 69fd304b..214b359c 100644 --- a/examples/opengl/stereoqopenglwidget/CMakeLists.txt +++ b/examples/opengl/stereoqopenglwidget/CMakeLists.txt @@ -26,11 +26,11 @@ set_target_properties(stereoqopenglwidget PROPERTIES ) target_link_libraries(stereoqopenglwidget PUBLIC - Qt::Core - Qt::Gui - Qt::OpenGL - Qt::OpenGLWidgets - Qt::Widgets + Qt6::Core + Qt6::Gui + Qt6::OpenGL + Qt6::OpenGLWidgets + Qt6::Widgets ) diff --git a/examples/opengl/textures/main.cpp b/examples/opengl/textures/main.cpp index c1e91e62..7e5f0646 100644 --- a/examples/opengl/textures/main.cpp +++ b/examples/opengl/textures/main.cpp @@ -8,8 +8,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(textures); - QApplication app(argc, argv); QSurfaceFormat format; diff --git a/examples/qtconcurrent/imagescaling/doc/src/qtconcurrent-imagescaling.qdoc b/examples/qtconcurrent/imagescaling/doc/src/qtconcurrent-imagescaling.qdoc index 6e17d408..499cb165 100644 --- a/examples/qtconcurrent/imagescaling/doc/src/qtconcurrent-imagescaling.qdoc +++ b/examples/qtconcurrent/imagescaling/doc/src/qtconcurrent-imagescaling.qdoc @@ -6,6 +6,7 @@ \meta tags {widgets, threads, network} \title Image Scaling \ingroup qtconcurrentexamples + \examplecategory {Networking} \brief Demonstrates how to asynchronously download and scale images. This example shows how to use the QFuture, QPromise, and QFutureWatcher diff --git a/examples/qtconcurrent/primecounter/doc/src/qtconcurrent-primecounter.qdoc b/examples/qtconcurrent/primecounter/doc/src/qtconcurrent-primecounter.qdoc index 75877c5a..de6c94b0 100644 --- a/examples/qtconcurrent/primecounter/doc/src/qtconcurrent-primecounter.qdoc +++ b/examples/qtconcurrent/primecounter/doc/src/qtconcurrent-primecounter.qdoc @@ -6,6 +6,7 @@ \meta tags {widgets, threads} \title Prime Counter \ingroup qtconcurrentexamples + \examplecategory {Data Processing & I/O} \brief Demonstrates how to monitor the progress of concurrent operations. The following example demonstrates how to create an interactive and diff --git a/examples/qtconcurrent/wordcount/doc/src/qtconcurrent-wordcount.qdoc b/examples/qtconcurrent/wordcount/doc/src/qtconcurrent-wordcount.qdoc index 50b6fc29..adefdfdc 100644 --- a/examples/qtconcurrent/wordcount/doc/src/qtconcurrent-wordcount.qdoc +++ b/examples/qtconcurrent/wordcount/doc/src/qtconcurrent-wordcount.qdoc @@ -6,6 +6,7 @@ \meta tags {threads, console} \title Word Count \ingroup qtconcurrentexamples + \examplecategory {Data Processing & I/O} \brief Demonstrates how to use the map-reduce algorithm. The Qt Concurrent \e {Word Count} example demonstrates the use of the diff --git a/examples/sql/books/bookwindow.cpp b/examples/sql/books/bookwindow.cpp index 2ec5459e..b7baad48 100644 --- a/examples/sql/books/bookwindow.cpp +++ b/examples/sql/books/bookwindow.cpp @@ -89,6 +89,7 @@ BookWindow::BookWindow() ); ui.bookTable->setCurrentIndex(model->index(0, 0)); + ui.bookTable->selectRow(0); createMenuBar(); } diff --git a/examples/sql/books/bookwindow.h b/examples/sql/books/bookwindow.h index ba569292..8030516e 100644 --- a/examples/sql/books/bookwindow.h +++ b/examples/sql/books/bookwindow.h @@ -22,8 +22,8 @@ private slots: private: void showError(const QSqlError &err); Ui::BookWindow ui; - QSqlRelationalTableModel *model; - int authorIdx, genreIdx; + QSqlRelationalTableModel *model = nullptr; + int authorIdx = 0, genreIdx = 0; void createMenuBar(); }; diff --git a/examples/sql/books/bookwindow.ui b/examples/sql/books/bookwindow.ui index ce8f9f93..c93726c5 100644 --- a/examples/sql/books/bookwindow.ui +++ b/examples/sql/books/bookwindow.ui @@ -64,6 +64,9 @@ Details + + QFormLayout::ExpandingFieldsGrow + diff --git a/examples/sql/books/main.cpp b/examples/sql/books/main.cpp index d06568ed..e65ac936 100644 --- a/examples/sql/books/main.cpp +++ b/examples/sql/books/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char * argv[]) { - Q_INIT_RESOURCE(books); - QApplication app(argc, argv); BookWindow win; diff --git a/examples/sql/doc/src/books.qdoc b/examples/sql/doc/src/books.qdoc index c08d2f97..b4ca8bdd 100644 --- a/examples/sql/doc/src/books.qdoc +++ b/examples/sql/doc/src/books.qdoc @@ -5,6 +5,7 @@ \example books \title Books \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief Shows how to use Qt SQL classes with a model/view framework. The Books example shows how Qt's SQL classes can be used with the model/view diff --git a/examples/sql/doc/src/cachedtable.qdoc b/examples/sql/doc/src/cachedtable.qdoc index 35b8fdd4..ff60f7b1 100644 --- a/examples/sql/doc/src/cachedtable.qdoc +++ b/examples/sql/doc/src/cachedtable.qdoc @@ -3,8 +3,9 @@ /*! \example cachedtable - \title Cached Table Example + \title Cached SQL Table \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The Cached Table example shows how a table view can be used to access a database, caching any changes to the data until the user explicitly submits them using a diff --git a/examples/sql/doc/src/drilldown.qdoc b/examples/sql/doc/src/drilldown.qdoc index 4e432b70..7d1c997a 100644 --- a/examples/sql/doc/src/drilldown.qdoc +++ b/examples/sql/doc/src/drilldown.qdoc @@ -5,6 +5,7 @@ \example drilldown \title Drill Down Example \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The Drill Down example shows how to read data from a database as well as submit changes, using the QSqlRelationalTableModel and diff --git a/examples/sql/doc/src/masterdetail.qdoc b/examples/sql/doc/src/masterdetail.qdoc index 9fcf5087..fec579a6 100644 --- a/examples/sql/doc/src/masterdetail.qdoc +++ b/examples/sql/doc/src/masterdetail.qdoc @@ -5,6 +5,7 @@ \example masterdetail \title Master Detail Example \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The Master Detail Example shows how to present data from different data sources in the same application. The album titles, and the diff --git a/examples/sql/doc/src/querymodel.qdoc b/examples/sql/doc/src/querymodel.qdoc index 38f7acab..c9fa4cec 100644 --- a/examples/sql/doc/src/querymodel.qdoc +++ b/examples/sql/doc/src/querymodel.qdoc @@ -5,6 +5,7 @@ \example querymodel \title Query Model Example \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The Query Model example shows how to make customized versions of data obtained from a SQL query, using a model that encapsulates diff --git a/examples/sql/doc/src/relationaltablemodel.qdoc b/examples/sql/doc/src/relationaltablemodel.qdoc index cf95cb4a..371fef81 100644 --- a/examples/sql/doc/src/relationaltablemodel.qdoc +++ b/examples/sql/doc/src/relationaltablemodel.qdoc @@ -5,6 +5,7 @@ \example relationaltablemodel \title Relational Table Model Example \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The Relational Table Model example shows how to use table views with a relational model to visualize the relations between items in a database. diff --git a/examples/sql/doc/src/sqlbrowser.qdoc b/examples/sql/doc/src/sqlbrowser.qdoc index 0cabea09..ad783f57 100644 --- a/examples/sql/doc/src/sqlbrowser.qdoc +++ b/examples/sql/doc/src/sqlbrowser.qdoc @@ -5,6 +5,7 @@ \example sqlbrowser \title SQL Browser \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The SQL Browser example shows how a data browser can be used to visualize the results of SQL statements on a live database. diff --git a/examples/sql/doc/src/sqlwidgetmapper.qdoc b/examples/sql/doc/src/sqlwidgetmapper.qdoc index 2e921f47..7740e50b 100644 --- a/examples/sql/doc/src/sqlwidgetmapper.qdoc +++ b/examples/sql/doc/src/sqlwidgetmapper.qdoc @@ -5,6 +5,7 @@ \example sqlwidgetmapper \title SQL Widget Mapper Example \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The SQL Widget Mapper example shows how to use a map information from a database to widgets on a form. @@ -101,8 +102,7 @@ As a result, the user is able to select an item from the combo box, and the associated value is written back to the model. - The rest of the constructor is very similar to that of the - \l{Simple Widget Mapper Example}: + The rest of the constructor sets up connections and layouts: \snippet sqlwidgetmapper/window.cpp Set up connections and layouts diff --git a/examples/sql/doc/src/tablemodel.qdoc b/examples/sql/doc/src/tablemodel.qdoc index 420c3cd9..1542d121 100644 --- a/examples/sql/doc/src/tablemodel.qdoc +++ b/examples/sql/doc/src/tablemodel.qdoc @@ -5,6 +5,7 @@ \example tablemodel \title Table Model Example \ingroup sql_examples + \examplecategory {Data Processing & I/O} \brief The Table Model example shows how to use a specialized SQL table model with table views to edit information in a database. diff --git a/examples/sql/drilldown/main.cpp b/examples/sql/drilldown/main.cpp index 5828a37a..77b87252 100644 --- a/examples/sql/drilldown/main.cpp +++ b/examples/sql/drilldown/main.cpp @@ -11,8 +11,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(drilldown); - QApplication app(argc, argv); if (!createConnection()) diff --git a/examples/sql/masterdetail/main.cpp b/examples/sql/masterdetail/main.cpp index 8b6ee618..e99d8e86 100644 --- a/examples/sql/masterdetail/main.cpp +++ b/examples/sql/masterdetail/main.cpp @@ -11,8 +11,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(masterdetail); - QApplication app(argc, argv); if (!createConnection()) diff --git a/examples/vulkan/doc/src/hellovulkancubes.qdoc b/examples/vulkan/doc/src/hellovulkancubes.qdoc index dc60b8bb..992a7643 100644 --- a/examples/vulkan/doc/src/hellovulkancubes.qdoc +++ b/examples/vulkan/doc/src/hellovulkancubes.qdoc @@ -7,6 +7,7 @@ \title Hello Vulkan Cubes Example \ingroup examples-vulkan \brief Shows the basics of using QVulkanWindow. + \examplecategory {Graphics & Multimedia} The \e{Hello Vulkan Cubes Example} shows more advanced usage of QVulkanWindow. diff --git a/examples/vulkan/doc/src/hellovulkantriangle.qdoc b/examples/vulkan/doc/src/hellovulkantriangle.qdoc index 75b08510..d716132c 100644 --- a/examples/vulkan/doc/src/hellovulkantriangle.qdoc +++ b/examples/vulkan/doc/src/hellovulkantriangle.qdoc @@ -7,6 +7,7 @@ \ingroup examples-vulkan \title Hello Vulkan Triangle Example \brief Shows the basics of rendering with QVulkanWindow and the Vulkan API. + \examplecategory {Graphics & Multimedia} The \e{Hello Vulkan Triangle Example} creates a full graphics pipeline, including a vertex and fragment shader, to render a triangle. diff --git a/examples/vulkan/doc/src/hellovulkanwidget.qdoc b/examples/vulkan/doc/src/hellovulkanwidget.qdoc index 0166a361..0f9ecf62 100644 --- a/examples/vulkan/doc/src/hellovulkanwidget.qdoc +++ b/examples/vulkan/doc/src/hellovulkanwidget.qdoc @@ -7,6 +7,7 @@ \ingroup examples-vulkan \title Hello Vulkan Widget Example \brief Shows the usage of QVulkanWindow in QWidget applications. + \examplecategory {Graphics & Multimedia} The \e{Hello Vulkan Widget Example} is a variant of \l hellovulkantriangle that embeds the QVulkanWindow into a QWidget-based user interface using diff --git a/examples/vulkan/hellovulkancubes/mainwindow.h b/examples/vulkan/hellovulkancubes/mainwindow.h index 2e931c1a..8ecb0002 100644 --- a/examples/vulkan/hellovulkancubes/mainwindow.h +++ b/examples/vulkan/hellovulkancubes/mainwindow.h @@ -6,12 +6,10 @@ #include -QT_BEGIN_NAMESPACE -class QLCDNumber; -class QLabel; -class QPushButton; -class QCheckBox; -QT_END_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QLCDNumber) +QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QPushButton) +QT_FORWARD_DECLARE_CLASS(QCheckBox) class VulkanWindow; diff --git a/examples/vulkan/hellovulkanwidget/hellovulkanwidget.h b/examples/vulkan/hellovulkanwidget/hellovulkanwidget.h index d545e681..cbebe17f 100644 --- a/examples/vulkan/hellovulkanwidget/hellovulkanwidget.h +++ b/examples/vulkan/hellovulkanwidget/hellovulkanwidget.h @@ -7,13 +7,11 @@ #include "../shared/trianglerenderer.h" #include -class VulkanWindow; +QT_FORWARD_DECLARE_CLASS(QTabWidget) +QT_FORWARD_DECLARE_CLASS(QPlainTextEdit) +QT_FORWARD_DECLARE_CLASS(QLCDNumber) -QT_BEGIN_NAMESPACE -class QTabWidget; -class QPlainTextEdit; -class QLCDNumber; -QT_END_NAMESPACE +class VulkanWindow; class MainWindow : public QWidget { diff --git a/examples/widgets/CMakeLists.txt b/examples/widgets/CMakeLists.txt index 315865b8..c5d3de8b 100644 --- a/examples/widgets/CMakeLists.txt +++ b/examples/widgets/CMakeLists.txt @@ -9,7 +9,6 @@ if(QT_FEATURE_animation) endif() add_subdirectory(desktop) add_subdirectory(dialogs) -add_subdirectory(effects) qt_internal_add_example(gallery) add_subdirectory(gestures) add_subdirectory(graphicsview) @@ -17,7 +16,6 @@ add_subdirectory(itemviews) add_subdirectory(layouts) add_subdirectory(painting) add_subdirectory(richtext) -add_subdirectory(scroller) add_subdirectory(tools) add_subdirectory(touch) add_subdirectory(tutorials) @@ -28,6 +26,3 @@ endif() if(QT_FEATURE_cursor) add_subdirectory(mainwindows) endif() -if(QT_FEATURE_opengl AND TARGET Qt6::Gui) - qt_internal_add_example(windowcontainer) -endif() diff --git a/examples/widgets/animation/easing/main.cpp b/examples/widgets/animation/easing/main.cpp index a1c01698..26009a6b 100644 --- a/examples/widgets/animation/easing/main.cpp +++ b/examples/widgets/animation/easing/main.cpp @@ -6,7 +6,6 @@ int main(int argc, char **argv) { - Q_INIT_RESOURCE(easing); QApplication app(argc, argv); Window w; diff --git a/examples/widgets/desktop/systray/doc/src/systray.qdoc b/examples/widgets/desktop/systray/doc/src/systray.qdoc index 5c435038..b0dff58e 100644 --- a/examples/widgets/desktop/systray/doc/src/systray.qdoc +++ b/examples/widgets/desktop/systray/doc/src/systray.qdoc @@ -4,6 +4,7 @@ /*! \example desktop/systray \title System Tray Icon Example + \examplecategory {Desktop} \ingroup examples-widgets \brief The System Tray Icon example shows how to add an icon with a menu and popup messages to a desktop environment's system tray. diff --git a/examples/widgets/desktop/systray/main.cpp b/examples/widgets/desktop/systray/main.cpp index d01f813d..d13bde11 100644 --- a/examples/widgets/desktop/systray/main.cpp +++ b/examples/widgets/desktop/systray/main.cpp @@ -10,8 +10,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(systray); - QApplication app(argc, argv); if (!QSystemTrayIcon::isSystemTrayAvailable()) { diff --git a/examples/widgets/dialogs/CMakeLists.txt b/examples/widgets/dialogs/CMakeLists.txt index a4031a68..b16cbc7f 100644 --- a/examples/widgets/dialogs/CMakeLists.txt +++ b/examples/widgets/dialogs/CMakeLists.txt @@ -2,12 +2,10 @@ # SPDX-License-Identifier: BSD-3-Clause if(QT_FEATURE_wizard) - qt_internal_add_example(classwizard) qt_internal_add_example(trivialwizard) + if(Qt6::PrintSupport) + qt_internal_add_example(licensewizard) + endif() endif() -qt_internal_add_example(extension) qt_internal_add_example(standarddialogs) qt_internal_add_example(tabdialog) -if(QT_FEATURE_wizard AND TARGET Qt6::PrintSupport) - qt_internal_add_example(licensewizard) -endif() diff --git a/examples/widgets/dialogs/dialogs.pro b/examples/widgets/dialogs/dialogs.pro index 1983c854..24936882 100644 --- a/examples/widgets/dialogs/dialogs.pro +++ b/examples/widgets/dialogs/dialogs.pro @@ -1,9 +1,7 @@ QT_FOR_CONFIG += widgets TEMPLATE = subdirs -SUBDIRS = classwizard \ - extension \ - licensewizard \ +SUBDIRS = licensewizard \ standarddialogs \ tabdialog \ trivialwizard diff --git a/examples/widgets/dialogs/licensewizard/licensewizard.cpp b/examples/widgets/dialogs/licensewizard/licensewizard.cpp index 05888ac6..67fa46bf 100644 --- a/examples/widgets/dialogs/licensewizard/licensewizard.cpp +++ b/examples/widgets/dialogs/licensewizard/licensewizard.cpp @@ -288,9 +288,12 @@ void ConclusionPage::initializePage() "You can use this software for 30 days and make one " "backup, but you are not allowed to distribute it."); } else if (wizard()->hasVisitedPage(LicenseWizard::Page_Details)) { +//! [accessField] + const QString emailAddress = field("details.email").toString(); licenseText = tr("First-Time License Agreement: " "You can use this software subject to the license " - "you will receive by email."); + "you will receive by email sent to %1.").arg(emailAddress); +//! [accessField] } else { licenseText = tr("Upgrade License Agreement: " "This software is licensed under the terms of your " diff --git a/examples/widgets/dialogs/licensewizard/main.cpp b/examples/widgets/dialogs/licensewizard/main.cpp index 13e13f0e..d16b5dc6 100644 --- a/examples/widgets/dialogs/licensewizard/main.cpp +++ b/examples/widgets/dialogs/licensewizard/main.cpp @@ -10,8 +10,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(licensewizard); - QApplication app(argc, argv); #ifndef QT_NO_TRANSLATION diff --git a/examples/widgets/dialogs/trivialwizard/trivialwizard.cpp b/examples/widgets/dialogs/trivialwizard/trivialwizard.cpp index 83de13f0..b9321338 100644 --- a/examples/widgets/dialogs/trivialwizard/trivialwizard.cpp +++ b/examples/widgets/dialogs/trivialwizard/trivialwizard.cpp @@ -86,10 +86,12 @@ int main(int argc, char *argv[]) app.installTranslator(translator); #endif +//! [linearAddPage] QWizard wizard; wizard.addPage(createIntroPage()); wizard.addPage(createRegistrationPage()); wizard.addPage(createConclusionPage()); +//! [linearAddPage] wizard.setWindowTitle("Trivial Wizard"); wizard.show(); diff --git a/examples/widgets/doc/dropsite.qdoc b/examples/widgets/doc/dropsite.qdoc index 5ebf0ff3..4c38ffc5 100644 --- a/examples/widgets/doc/dropsite.qdoc +++ b/examples/widgets/doc/dropsite.qdoc @@ -4,6 +4,7 @@ /*! \example draganddrop/dropsite \title Drop Site Example + \examplecategory {User Interface Components} \brief The example shows how to distinguish the various MIME formats available in a drag and drop operation. diff --git a/examples/widgets/doc/images/calendar-example.png b/examples/widgets/doc/images/calendar-example.png deleted file mode 100644 index 895ce76b096e900706266dbd071ebbb027cead82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13539 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 UtZJ&rmv&_>aGgX$$f1DNk`gNK~NuhpZ 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

E`} z3$7juf%~#GvY+Az6|y>Z_G+3@!3ei0kKa#i*zNp9Sv(90iU6d&vyM@ zv+-dL?3s)ONK5E~rl|;RXO@Xr?n29xF~W3E*Td)(R_Nw{n)am;vpq3r)!2IM zn3e!+XAGb>-@#7(ZY^5Re48oLu_BOmNI8+fMjuA4G2cUYQ6O3Hl_6(yd!ldd>_8K3Sl;PF+@Up6hKJ=n6G1SuhxS_h0fc z7)dLpv}cy@APO-iDS9aYI+5Zyyr76K`y)Sb=C_ z3B`Y~r9-=$$`RN~37M6~SstyYn)aV*z;rrje*3wma7W$?!Q?D5l%aNj30AF3E>$Mz zpHo@R>-b%dk)~|RtK=1miHEFHj<02wIyu2iMTyY(R#%mhwZ=$?N z*aZstl3~a}M>}Bzio(L9DgDbx^U*~8GSZ$GP{2qZr3pOo+eqWjmifNw?C-X`QS}t9 zw)`pV!Syl=+4o<-1_!6}fre*tIP%>pRBtf^UJ)$VP+eqhWfecgI!C_#Y|};}7Exw# zUH^I&8n_z&z`z0}>dPaHVd+Yepfb8&6$Xz6A(?Ku3XK1FXI{S2*5>N$gxcpHAcK;z zXl7$LR~F%FogCe5f}5W>&N@X{Y)^jMV6r+4U|aSoC!7=>^E<`+^bB7bd#{Ix4`DS~-#GXTxL13yXWunOGUYU!HY-sS}1XJPCxF+`c3@$Sz*zlHJc a3I%MaC0HCgv$sKjMp;q)R`yM^7yk#wqZ=py diff --git a/examples/widgets/doc/images/draganddroppuzzle-example.png b/examples/widgets/doc/images/draganddroppuzzle-example.png deleted file mode 100644 index ca6844581e1e6a0e04d09cf1d1c7969444fef841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259104 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�ueTUJ0K|Ym8 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%0DX8J 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
8qGFTjW6r)RrvTzdtF6rmGd=jo5I* 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
^IeLinIz_fr2AWamy*=;5z7{->)c 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�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 z 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 Y1*%}xhbbe+yZ`_I07*qoM6N<$f*S3T`~Uy| diff --git a/examples/widgets/doc/images/imageviewer-zoom_in_1.png b/examples/widgets/doc/images/imageviewer-zoom_in_1.png deleted file mode 100644 index 05b0fffecbc6e8b741b01219a2f2a058c67e6cbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84559 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

GR#*PH@$+%+>phIDjSt+# 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 z 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 diff --git a/examples/widgets/doc/images/plugandpaint-plugindialog.png b/examples/widgets/doc/images/plugandpaint-plugindialog.png deleted file mode 100644 index 4b601bd58b70b03d806eff02d5f50d23e9cbbbd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8706 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 diff --git a/examples/widgets/doc/images/plugandpaint.png b/examples/widgets/doc/images/plugandpaint.png deleted file mode 100644 index bd5d001f911756572d67f5953ba3fb636f7fac59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7540 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 JspSy$zW~p$ClUYv diff --git a/examples/widgets/doc/images/stylesheet-pagefold.png b/examples/widgets/doc/images/stylesheet-pagefold.png deleted file mode 100644 index d1358f326b5e17d3322ddec03fe8314e7daad3d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29118 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 diff --git a/examples/widgets/doc/src/addressbook.qdoc b/examples/widgets/doc/src/addressbook.qdoc index 24bcee5a..8f251229 100644 --- a/examples/widgets/doc/src/addressbook.qdoc +++ b/examples/widgets/doc/src/addressbook.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/addressbook \title Address Book + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The address book example shows how to use proxy models to display different views onto data from a single model. diff --git a/examples/widgets/doc/src/affine.qdoc b/examples/widgets/doc/src/affine.qdoc index accbf9ad..5aded0bd 100644 --- a/examples/widgets/doc/src/affine.qdoc +++ b/examples/widgets/doc/src/affine.qdoc @@ -4,8 +4,9 @@ /*! \example painting/affine \title Affine Transformations + \examplecategory {Graphics & Multimedia} \ingroup examples-painting - \brief Demonstrates how affine transformations in QPainter works. + \brief Demonstrates how affine transformations in QPainter work. \brief In this example we show Qt's ability to perform affine transformations on painting operations. diff --git a/examples/widgets/doc/src/analogclock.qdoc b/examples/widgets/doc/src/analogclock.qdoc index 27d14be8..4191b5e1 100644 --- a/examples/widgets/doc/src/analogclock.qdoc +++ b/examples/widgets/doc/src/analogclock.qdoc @@ -3,7 +3,7 @@ /*! \example widgets/analogclock - \examplecategory {Graphics} + \examplecategory {Graphics & Multimedia} \meta tags {widgets} \title Analog Clock diff --git a/examples/widgets/doc/src/application.qdoc b/examples/widgets/doc/src/application.qdoc deleted file mode 100644 index 43073a81..00000000 --- a/examples/widgets/doc/src/application.qdoc +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example mainwindows/application - \title Qt Widgets - Application Example - \ingroup examples-mainwindow - - \brief The Application example shows how to implement a standard - widget application with menus, toolbars, and a status bar. The example - itself is a simple text editor program built around QPlainTextEdit. - - \image application.png Screenshot of the Application example - - Nearly all of the code for the Application example is in the \c - MainWindow class, which inherits QMainWindow. QMainWindow - provides the framework for windows that have menus, toolbars, - dock windows, and a status bar. The application provides - \uicontrol{File}, \uicontrol{Edit}, and \uicontrol{Help} entries in the menu - bar, with the following popup menus: - - \image application-menus.png The Application example's menu system - - The status bar at the bottom of the main window shows a - description of the menu item or toolbar button under the cursor. - - To keep the example simple, recently opened files aren't shown in - the \uicontrol{File} menu, even though this feature is desired in 90% - of applications. Furthermore, this example can only load one file at a - time. The \l{mainwindows/mdi}{MDI} example shows how to lift these - restrictions and how to implement recently opened files handling. - - \section1 MainWindow Class Definition - - Here's the class definition: - - \snippet mainwindows/application/mainwindow.h 0 - - The public API is restricted to the constructor. In the \c - protected section, we reimplement QWidget::closeEvent() to detect - when the user attempts to close the window, and warn the user - about unsaved changes. In the \c{private slots} section, we - declare slots that correspond to menu entries, as well as a - mysterious \c documentWasModified() slot. Finally, in the \c - private section of the class, we have various members that will - be explained in due time. - - \section1 MainWindow Class Implementation - - \snippet mainwindows/application/mainwindow.cpp 0 - - We start by including \c , a header file that contains the - definition of all classes in the Qt Core, Qt GUI and Qt Widgets - modules. This saves us from the trouble of having to include - every class individually. We also include \c mainwindow.h. - - You might wonder why we don't include \c in \c - mainwindow.h and be done with it. The reason is that including - such a large header from another header file can rapidly degrade - performances. Here, it wouldn't do any harm, but it's still - generally a good idea to include only the header files that are - strictly necessary from another header file. - - \snippet mainwindows/application/mainwindow.cpp 1 - \snippet mainwindows/application/mainwindow.cpp 2 - - In the constructor, we start by creating a QPlainTextEdit widget as a - child of the main window (the \c this object). Then we call - QMainWindow::setCentralWidget() to tell that this is going to be - the widget that occupies the central area of the main window, - between the toolbars and the status bar. - - Then we call \c createActions() and \c createStatusBar(), two private - functions that set up the user interface. After that, we call \c - readSettings() to restore the user's preferences. - - We establish a signal-slot connection between the QPlainTextEdit's - document object and our \c documentWasModified() slot. Whenever - the user modifies the text in the QPlainTextEdit, we want to update - the title bar to show that the file was modified. - - At the end, we set the window title using the private - \c setCurrentFile() function. We'll come back to this later. - - \target close event handler - \snippet mainwindows/application/mainwindow.cpp 3 - \snippet mainwindows/application/mainwindow.cpp 4 - - When the user attempts to close the window, we call the private - function \c maybeSave() to give the user the possibility to save - pending changes. The function returns true if the user wants the - application to close; otherwise, it returns false. In the first - case, we save the user's preferences to disk and accept the close - event; in the second case, we ignore the close event, meaning - that the application will stay up and running as if nothing - happened. - - \snippet mainwindows/application/mainwindow.cpp 5 - \snippet mainwindows/application/mainwindow.cpp 6 - - The \c newFile() slot is invoked when the user selects - \uicontrol{File|New} from the menu. We call \c maybeSave() to save any - pending changes and if the user accepts to go on, we clear the - QPlainTextEdit and call the private function \c setCurrentFile() to - update the window title and clear the - \l{QWidget::windowModified}{windowModified} flag. - - \snippet mainwindows/application/mainwindow.cpp 7 - \snippet mainwindows/application/mainwindow.cpp 8 - - The \c open() slot is invoked when the user clicks - \uicontrol{File|Open}. We pop up a QFileDialog asking the user to - choose a file. If the user chooses a file (i.e., \c fileName is - not an empty string), we call the private function \c loadFile() - to actually load the file. - - \snippet mainwindows/application/mainwindow.cpp 9 - \snippet mainwindows/application/mainwindow.cpp 10 - - The \c save() slot is invoked when the user clicks - \uicontrol{File|Save}. If the user hasn't provided a name for the file - yet, we call \c saveAs(); otherwise, we call the private function - \c saveFile() to actually save the file. - - \snippet mainwindows/application/mainwindow.cpp 11 - \snippet mainwindows/application/mainwindow.cpp 12 - - In \c saveAs(), we start by popping up a QFileDialog asking the - user to provide a name. If the user clicks \uicontrol{Cancel}, the - returned file name is empty, and we do nothing. - - \snippet mainwindows/application/mainwindow.cpp 13 - \snippet mainwindows/application/mainwindow.cpp 14 - - The application's About box is done using one statement, using - the QMessageBox::about() static function and relying on its - support for an HTML subset. - - The \l{QObject::tr()}{tr()} call around the literal string marks - the string for translation. It is a good habit to call - \l{QObject::tr()}{tr()} on all user-visible strings, in case you - later decide to translate your application to other languages. - The \l{Internationalization with Qt} overview covers - \l{QObject::tr()}{tr()} in more detail. - - \snippet mainwindows/application/mainwindow.cpp 15 - \snippet mainwindows/application/mainwindow.cpp 16 - - The \c documentWasModified() slot is invoked each time the text - in the QPlainTextEdit changes because of user edits. We call - QWidget::setWindowModified() to make the title bar show that the - file was modified. How this is done varies on each platform. - - \snippet mainwindows/application/mainwindow.cpp 17 - \snippet mainwindows/application/mainwindow.cpp 18 - \dots - \snippet mainwindows/application/mainwindow.cpp 22 - - The \c createActions() private function, which is called from the - \c MainWindow constructor, creates \l{QAction}s and populates - the menus and two toolbars. The code is very - repetitive, so we show only the actions corresponding to - \uicontrol{File|New}, \uicontrol{File|Open}, and \uicontrol{Help|About Qt}. - - A QAction is an object that represents one user action, such as - saving a file or invoking a dialog. An action can be put in a - QMenu or a QToolBar, or both, or in any other widget that - reimplements QWidget::actionEvent(). - - An action has a text that is shown in the menu, an icon, a - shortcut key, a tooltip, a status tip (shown in the status bar), - a "What's This?" text, and more. It emits a - \l{QAction::triggered()}{triggered()} signal whenever the user - invokes the action (e.g., by clicking the associated menu item or - toolbar button). - - Instances of QAction can be created by passing a parent QObject or - by using one of the convenience functions of QMenu, QMenuBar or QToolBar. - We create the actions that are in a menu as well as in a toolbar - parented on the window to prevent ownership issues. For actions - that are only in the menu, we use the convenience function - QMenu::addAction(), which allows us to pass text, icon and the - target object and its slot member function. - - Creating toolbars is very similar to creating menus. The same - actions that we put in the menus can be reused in the toolbars. - After creating the action, we add it to the toolbar using - QToolBar::addAction(). - - The code above contains one more idiom that must be explained. - For some of the actions, we specify an icon as a QIcon to the - QAction constructor. We use QIcon::fromTheme() to obtain - the correct standard icon from the underlying window system. - If that fails due to the platform not supporting it, we - pass a file name as fallback. Here, the file name starts - with \c{:}. Such file names aren't ordinary file names, but - rather path in the executable's stored resources. We'll come back - to this when we review the \c application.qrc file that's part of - the project. - - \snippet mainwindows/application/mainwindow.cpp 23 - \snippet mainwindows/application/mainwindow.cpp 24 - - The \uicontrol{Edit|Cut} and \uicontrol{Edit|Copy} actions must be available - only when the QPlainTextEdit contains selected text. We disable them - by default and connect the QPlainTextEdit::copyAvailable() signal to - the QAction::setEnabled() slot, ensuring that the actions are - disabled when the text editor has no selection. - - Just before we create the \uicontrol{Help} menu, we call - QMenuBar::addSeparator(). This has no effect for most widget - styles (e.g., Windows and \macos styles), but for some - styles this makes sure that \uicontrol{Help} is pushed to the right - side of the menu bar. - - \snippet mainwindows/application/mainwindow.cpp 32 - \snippet mainwindows/application/mainwindow.cpp 33 - - QMainWindow::statusBar() returns a pointer to the main window's - QStatusBar widget. Like with \l{QMainWindow::menuBar()}, the - widget is automatically created the first time the function is - called. - - \snippet mainwindows/application/mainwindow.cpp 34 - \snippet mainwindows/application/mainwindow.cpp 36 - - The \c readSettings() function is called from the constructor to - load the user's preferences and other application settings. The - QSettings class provides a high-level interface for storing - settings permanently on disk. On Windows, it uses the (in)famous - Windows registry; on \macos, it uses the native XML-based - CFPreferences API; on Unix/X11, it uses text files. - - The QSettings constructor takes arguments that identify your - company and the name of the product. This ensures that the - settings for different applications are kept separately. - - We use QSettings::value() to extract the value of the geometry setting. - The second argument to QSettings::value() is - optional and specifies a default value for the setting if there - exists none. This value is used the first time the application is - run. - - We use QWidget::saveGeometry() and Widget::restoreGeometry() to - save the position. They use an opaque QByteArray to store - screen number, geometry and window state. - - \snippet mainwindows/application/mainwindow.cpp 37 - \snippet mainwindows/application/mainwindow.cpp 39 - - The \c writeSettings() function is called from \c closeEvent(). - Writing settings is similar to reading them, except simpler. The - arguments to the QSettings constructor must be the same as in \c - readSettings(). - - \snippet mainwindows/application/mainwindow.cpp 40 - \snippet mainwindows/application/mainwindow.cpp 41 - - The \c maybeSave() function is called to save pending changes. If - there are pending changes, it pops up a QMessageBox giving the - user to save the document. The options are QMessageBox::Yes, - QMessageBox::No, and QMessageBox::Cancel. The \uicontrol{Yes} button is - made the default button (the button that is invoked when the user - presses \uicontrol{Return}) using the QMessageBox::Default flag; the - \uicontrol{Cancel} button is made the escape button (the button that is - invoked when the user presses \uicontrol{Esc}) using the - QMessageBox::Escape flag. - - The \c maybeSave() function returns \c true in all cases, except - when the user clicks \uicontrol{Cancel} or saving the file fails. - The caller must check the return value and stop whatever it was - doing if the return value is \c false. - - \snippet mainwindows/application/mainwindow.cpp 42 - \snippet mainwindows/application/mainwindow.cpp 43 - - In \c loadFile(), we use QFile and QTextStream to read in the - data. The QFile object provides access to the bytes stored in a - file. - - We start by opening the file in read-only mode. The QFile::Text - flag indicates that the file is a text file, not a binary file. - On Unix and \macos, this makes no difference, but on Windows, - it ensures that the "\\r\\n" end-of-line sequence is converted to - "\\n" when reading. - - If we successfully opened the file, we use a QTextStream object - to read in the data. QTextStream automatically converts the 8-bit - data into a Unicode QString and supports various encodings. If no - encoding is specified, QTextStream assumes the file is encoded in - UTF-8. - - Since the call to QTextStream::readAll() might take some time, we - set the cursor to be Qt::WaitCursor for the entire application - while it goes on. - - At the end, we call the private \c setCurrentFile() function, - which we'll cover in a moment, and we display the string "File - loaded" in the status bar for 2 seconds (2000 milliseconds). - - \snippet mainwindows/application/mainwindow.cpp 44 - \snippet mainwindows/application/mainwindow.cpp 45 - - Saving a file is similar to loading one. We use QSaveFile to ensure - all data are safely written and existing files are not damaged - should writing fail. - We use the QFile::Text flag to make sure that on Windows, "\\n" - is converted into "\\r\\n" to conform to the Windows convention. - - - \snippet mainwindows/application/mainwindow.cpp 46 - \snippet mainwindows/application/mainwindow.cpp 47 - - The \c setCurrentFile() function is called to reset the state of - a few variables when a file is loaded or saved, or when the user - starts editing a new file (in which case \c fileName is empty). - We update the \c curFile variable, clear the - QTextDocument::modified flag and the associated \c - QWidget:windowModified flag, and update the window title to - contain the new file name (or \c untitled.txt). - - The \c strippedName() function call around \c curFile in the - QWidget::setWindowTitle() call shortens the file name to exclude - the path. Here's the function: - - \snippet mainwindows/application/mainwindow.cpp 48 - \snippet mainwindows/application/mainwindow.cpp 49 - - \section1 The main() Function - - The \c main() function for this application is typical of - applications that contain one main window: - - \snippet mainwindows/application/main.cpp 0 - - The main function uses QCommandLineParser to check whether some file - argument was passed to the application and loads it via - MainWindow::loadFile(). - - \section1 The Resource File - - As you will probably recall, for some of the actions, we - specified icons with file names starting with \c{:} and mentioned - that such file names aren't ordinary file names, but path in the - executable's stored resources. These resources are compiled - - The resources associated with an application are specified in a - \c .qrc file, an XML-based file format that lists files on the - disk. Here's the \c application.qrc file that's used by the - Application example: - - \quotefile mainwindows/application/application.qrc - - The \c .png files listed in the \c application.qrc file are files - that are part of the Application example's source tree. Paths are - relative to the directory where the \c application.qrc file is - located (the \c mainwindows/application directory). - - The resource file must be mentioned in the \c application.pro - file so that \c qmake knows about it: - - \snippet mainwindows/application/application.pro 0 - - \c qmake will produce make rules to generate a file called \c - qrc_application.cpp that is linked into the application. This - file contains all the data for the images and other resources as - static C++ arrays of compressed binary data. See - \l{resources.html}{The Qt Resource System} for more information - about resources. -*/ diff --git a/examples/widgets/doc/src/basicdrawing.qdoc b/examples/widgets/doc/src/basicdrawing.qdoc index 7413dfc8..afba853f 100644 --- a/examples/widgets/doc/src/basicdrawing.qdoc +++ b/examples/widgets/doc/src/basicdrawing.qdoc @@ -4,6 +4,7 @@ /*! \example painting/basicdrawing \title Basic Drawing Example + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief The Basic Drawing example shows how to display basic graphics primitives in a variety of styles using the QPainter diff --git a/examples/widgets/doc/src/basicgraphicslayouts.qdoc b/examples/widgets/doc/src/basicgraphicslayouts.qdoc index ce7176bf..07ead4e4 100644 --- a/examples/widgets/doc/src/basicgraphicslayouts.qdoc +++ b/examples/widgets/doc/src/basicgraphicslayouts.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/basicgraphicslayouts \title Basic Graphics Layouts Example + \examplecategory {Graphics & Multimedia} \ingroup examples-graphicsview-layout \brief Demonstrates how to create basic graphics layout. diff --git a/examples/widgets/doc/src/basiclayouts.qdoc b/examples/widgets/doc/src/basiclayouts.qdoc index c5551468..e6f1cab4 100644 --- a/examples/widgets/doc/src/basiclayouts.qdoc +++ b/examples/widgets/doc/src/basiclayouts.qdoc @@ -4,6 +4,7 @@ /*! \example layouts/basiclayouts \title Basic Layouts Example + \examplecategory {User Interface Components} \brief Shows how to use the standard layout managers. \e{Basic Layouts} shows how to use the standard layout managers that are diff --git a/examples/widgets/doc/src/basicsortfiltermodel.qdoc b/examples/widgets/doc/src/basicsortfiltermodel.qdoc index 969ee0a9..c0b8a5f4 100644 --- a/examples/widgets/doc/src/basicsortfiltermodel.qdoc +++ b/examples/widgets/doc/src/basicsortfiltermodel.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/basicsortfiltermodel \title Basic Sort/Filter Model Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Basic Sort/Filter Model example illustrates how to use QSortFilterProxyModel to perform basic sorting and filtering. diff --git a/examples/widgets/doc/src/borderlayout.qdoc b/examples/widgets/doc/src/borderlayout.qdoc deleted file mode 100644 index 9ec5e96d..00000000 --- a/examples/widgets/doc/src/borderlayout.qdoc +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example layouts/borderlayout - \title Border Layout Example - \ingroup examples-layout - \brief Shows how to arrange child widgets along a border. - - \e{Border Layout} implements a layout that arranges child widgets to - surround the main area. - - \image borderlayout-example.png - - The constructor of the Window class creates a QTextBrowser object, - to which a BorderLayout named \c layout is added. The declaration - of the BorderLayout class is quoted at the end of this document. - - \quotefromfile layouts/borderlayout/window.cpp - \skipto Window::Window() - \printuntil BorderLayout - - Several labeled widgets are added to \c layout with the orientation - \c {Center}, \c {North}, \c {West}, \c {East 1}, \c {East 2}, and - \c {South}. - - \skipto layout->addWidget - \printuntil setWindowTitle - - createLabel() in class \c Window sets the text of the labeled widgets - and the style. - - \skipto QLabel *Window::createLabel - \printuntil /^\}/ - - Class BorderLayout contains all the utilitarian functions for formatting - the widgets it contains. - - \quotefromfile layouts/borderlayout/borderlayout.h - \skipto class - \printuntil /^\}/ - - For more information, visit the \l{Layout Management} page. - - \include examples-run.qdocinc -*/ diff --git a/examples/widgets/doc/src/calculator.qdoc b/examples/widgets/doc/src/calculator.qdoc index cc015e46..c59d3cd1 100644 --- a/examples/widgets/doc/src/calculator.qdoc +++ b/examples/widgets/doc/src/calculator.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/calculator \title Calculator Example + \examplecategory {User Interface Components} \ingroup examples-widgets \ingroup examples-layout \brief The example shows how to use signals and slots to implement the diff --git a/examples/widgets/doc/src/calendar.qdoc b/examples/widgets/doc/src/calendar.qdoc deleted file mode 100644 index 218ea5ea..00000000 --- a/examples/widgets/doc/src/calendar.qdoc +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example richtext/calendar - \title Calendar Example - \ingroup examples-richtext - \brief The Calendar example shows how to create rich text content - and display it using a rich text editor. - - \brief The Calendar example shows how to create rich text content and display it using - a rich text editor. - - \image calendar-example.png - - Specifically, the example demonstrates the following: - - \list - \li Use of a text editor with a text document - \li Insertion of tables and frames into a document - \li Navigation within a table - \li Insert text in different styles - \endlist - - The rich text editor used to display the document is used within a main window - application. - - \section1 MainWindow Class Definition - - The \c MainWindow class provides a text editor widget and some controls to - allow the user to change the month and year shown. The font size used for the - text can also be adjusted. - - \snippet richtext/calendar/mainwindow.h 0 - - The private \c insertCalendar() function performs most of the work, relying on - the \c fontSize and \c selectedDate variables to write useful information to - the \c editor. - - \section1 MainWindow Class Implementation - - The \c MainWindow constructor sets up the user interface and initializes - variables used to generate a calendar for each month. - - \snippet richtext/calendar/mainwindow.cpp 0 - - We begin by setting default values for the selected date that will be highlighted - in the calendar and the font size to be used. Since we are using a QMainWindow - for the user interface, we construct a widget for use as the central widget. - - The user interface will include a line of controls above the generated calendar; - we construct a label and a combobox to allow the month to be selected, and a - spin box for the year. These widgets are configured to provide a reasonable range - of values for the user to try: - - \snippet richtext/calendar/mainwindow.cpp 1 - - We use the \c selectedDate object to obtain the current month and year, and we - set these in the combobox and spin box: - - The font size is displayed in a spin box which we restrict to a sensible range - of values: - - \snippet richtext/calendar/mainwindow.cpp 2 - - We construct an editor and use the \c insertCalendar() function to create - a calendar for it. Each calendar is displayed in the same text editor; in - this example we use a QTextBrowser since we do not allow the calendar to be - edited. - - The controls used to set the month, year, and font size will not have any - effect on the appearance of the calendar unless we make some signal-slot - connections: - - \snippet richtext/calendar/mainwindow.cpp 3 - - The signals are connected to some simple slots in the \c MainWindow class - which we will describe later. - - We create layouts to manage the widgets we constructed: - - \snippet richtext/calendar/mainwindow.cpp 4 - - Finally, the central widget is set for the window. - - Each calendar is created for the editor by the \c insertCalendar() function - which uses the date and font size, defined by the private \a selectedDate - and \c fontSize variables, to produce a suitable plan for the specified - month and year. - - \snippet richtext/calendar/mainwindow.cpp 5 - - We begin by clearing the editor's rich text document, and obtain a text - cursor from the editor that we will use to add content. We also create a - QDate object based on the currently selected date. - - The calendar is made up of a table with a gray background color that contains - seven columns: one for each day of the week. It is placed in the center of the - page with equal space to the left and right of it. All of these properties are - set in a QTextTableFormat object: - - \snippet richtext/calendar/mainwindow.cpp 6 - - Each cell in the table will be padded and spaced to make the text easier to - read. - - We want the columns to have equal widths, so we provide a list containing - percentage widths for each of them and set the constraints in the - QTextTableFormat: - - \snippet richtext/calendar/mainwindow.cpp 7 - - The constraints used for the column widths are only useful if the table has - an appropriate number of columns. With the format for the table defined, we - construct a new table with one row and seven columns at the current cursor - position: - - \snippet richtext/calendar/mainwindow.cpp 8 - - We only need one row to start with; more can be added as we need them. Using - this approach means that we do not need to perform any date calculations - until we add cells to the table. - - When inserting objects into a document with the cursor's insertion functions, - the cursor is automatically moved inside the newly inserted object. This means - that we can immediately start modifying the table from within: - - \snippet richtext/calendar/mainwindow.cpp 9 - - Since the table has an outer frame, we obtain the frame and its format so that - we can customize it. After making the changes we want, we set the frame's format - using the modified format object. We have given the table an outer border one - pixel wide. - - \snippet richtext/calendar/mainwindow.cpp 10 - - In a similar way, we obtain the cursor's current character format and - create customized formats based on it. - - We do not set the format on the cursor because this would change the default - character format; instead, we use the customized formats explicitly when we - insert text. The following loop inserts the days of the week into the table - as bold text: - - \snippet richtext/calendar/mainwindow.cpp 11 - - For each day of the week, we obtain an existing table cell in the first row - (row 0) using the table's \l{QTextTable::cellAt()}{cellAt()} function. Since - we start counting the days of the week at day 1 (Monday), we subtract 1 from - \c weekDay to ensure that we obtain the cell for the correct column of the - table. - - Before text can be inserted into a cell, we must obtain a cursor with the - correct position in the document. The cell provides a function for this - purpose, and we use this cursor to insert text using the \c boldFormat - character format that we created earlier: - - \snippet richtext/calendar/mainwindow.cpp 12 - - Inserting text into document objects usually follows the same pattern. - Each object can provide a new cursor that corresponds to the first valid - position within itself, and this can be used to insert new content. We - continue to use this pattern as we insert the days of the month into the - table. - - Since every month has more than seven days, we insert a single row to begin - and add days until we reach the end of the month. If the current date is - encountered, it is inserted with a special format (created earlier) that - makes it stand out: - - \snippet richtext/calendar/mainwindow.cpp 13 - - We add a new row to the table at the end of each week only if the next week - falls within the currently selected month. - - For each calendar that we create, we change the window title to reflect the - currently selected month and year: - - \snippet richtext/calendar/mainwindow.cpp 14 - - The \c insertCalendar() function relies on up-to-date values for the month, - year, and font size. These are set in the following slots: - - \snippet richtext/calendar/mainwindow.cpp 15 - - The \c setFontSize() function simply changes the private \c fontSize variable - before updating the calendar. - - \snippet richtext/calendar/mainwindow.cpp 16 - - The \c setMonth slot is called when the QComboBox used to select the month is - updated. The value supplied is the currently selected row in the combobox. - We add 1 to this value to obtain a valid month number, and create a new QDate - based on the existing one. The calendar is then updated to use this new date. - - \snippet richtext/calendar/mainwindow.cpp 17 - - The \c setYear() slot is called when the QDateTimeEdit used to select the - year is updated. The value supplied is a QDate object; this makes - the construction of a new value for \c selectedDate simple. We update the - calendar afterwards to use this new date. -*/ diff --git a/examples/widgets/doc/src/calendarwidget.qdoc b/examples/widgets/doc/src/calendarwidget.qdoc index 6a91f5ef..898f4bbd 100644 --- a/examples/widgets/doc/src/calendarwidget.qdoc +++ b/examples/widgets/doc/src/calendarwidget.qdoc @@ -3,6 +3,7 @@ /*! \title Calendar Widget Example + \examplecategory {Graphics & Multimedia} \example widgets/calendarwidget \ingroup examples-widgets \ingroup examples-layout diff --git a/examples/widgets/doc/src/charactermap.qdoc b/examples/widgets/doc/src/charactermap.qdoc deleted file mode 100644 index ee616230..00000000 --- a/examples/widgets/doc/src/charactermap.qdoc +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! -\example widgets/charactermap -\title Character Map Example -\ingroup examples-widgets -\brief The Character Map example shows how to create a custom widget that can -both display its own content and respond to user input. - -The example displays an array of characters which the user can click on -to enter text in a line edit. The contents of the line edit can then be -copied into the clipboard, and pasted into other applications. The -purpose behind this sort of tool is to allow users to enter characters -that may be unavailable or difficult to locate on their keyboards. - -\borderedimage charactermap-example.png -\caption Screenshot of the Character Map example - -The example consists of the following classes: - -\list -\li \c CharacterWidget displays the available characters in the current - font and style. -\li \c MainWindow provides a standard main window that contains font and - style information, a view onto the characters, a line edit, and a push - button for submitting text to the clipboard. -\endlist - -\section1 CharacterWidget Class Definition - -The \c CharacterWidget class is used to display an array of characters in -a user-specified font and style. For flexibility, we subclass QWidget and -reimplement only the functions that we need to provide basic rendering -and interaction features. - -The class definition looks like this: - -\snippet widgets/charactermap/characterwidget.h 0 - -The widget does not contain any other widgets, so it must provide its own -size hint to allow its contents to be displayed correctly. -We reimplement \l{QWidget::paintEvent()} to draw custom content. We also -reimplement \l{QWidget::mousePressEvent()} to allow the user to interact -with the widget. - -The updateFont() and updateStyle() slots are used to update the font and -style of the characters in the widget whenever the user changes the -settings in the application. -The class defines the characterSelected() signal so that other parts -of the application are informed whenever the user selects a character in -the widget. -As a courtesy, the widget provides a tooltip that shows the current -character value. We reimplement the \l{QWidget::mouseMoveEvent()} event -handler and define showToolTip() to enable this feature. - -The \c columns, \c displayFont and \c currentKey private data members -are used to record the number of columns to be shown, the current font, -and the currently highlighted character in the widget. - -\section1 CharacterWidget Class Implementation - -Since the widget is to be used as a simple canvas, the constructor just -calls the base class constructor and defines some default values for -private data members. - -\snippet widgets/charactermap/characterwidget.cpp 0 - -We initialize \c currentKey with a value of -1 to indicate -that no character is initially selected. We enable mouse tracking to -allow us to follow the movement of the cursor across the widget. - -The class provides two functions to allow the font and style to be set up. -Each of these modify the widget's display font and call update(): - -\snippet widgets/charactermap/characterwidget.cpp 1 -\codeline -\snippet widgets/charactermap/characterwidget.cpp 2 - -We use a fixed size font for the display. Similarly, a fixed size hint is -provided by the sizeHint() function: - -\snippet widgets/charactermap/characterwidget.cpp 3 - -Three standard event functions are implemented so that the widget -can respond to clicks, provide tooltips, and render the available -characters. The paintEvent() shows how the contents of the widget are -arranged and displayed: - -\snippet widgets/charactermap/characterwidget.cpp 6 - -A QPainter is created for the widget and, in all cases, we ensure that the -widget's background is painted. The painter's font is set to the -user-specified display font. - -The area of the widget that needs to be redrawn is used to determine which -characters need to be displayed: - -\snippet widgets/charactermap/characterwidget.cpp 7 - -Using integer division, we obtain the row and column numbers of each -characters that should be displayed, and we draw a square on the widget -for each character displayed. - -\snippet widgets/charactermap/characterwidget.cpp 8 -\snippet widgets/charactermap/characterwidget.cpp 9 - -The symbols for each character in the array are drawn within each square, -with the symbol for the most recently selected character displayed in red: - -\snippet widgets/charactermap/characterwidget.cpp 10 - -We do not need to take into account the difference between the area -displayed in the viewport and the area we are drawing on because -everything outside the visible area will be clipped. - -The mousePressEvent() defines how the widget responds to mouse clicks. - -\snippet widgets/charactermap/characterwidget.cpp 5 - -We are only interested when the user clicks with the left mouse button -over the widget. When this happens, we calculate which character was -selected and emit the characterSelected() signal. -The character's number is found by dividing the x and y-coordinates of -the click by the size of each character's grid square. Since the number -of columns in the widget is defined by the \c columns variable, we -simply multiply the row index by that value and add the column number -to obtain the character number. - -If any other mouse button is pressed, the event is passed on to the -QWidget base class. This ensures that the event can be handled properly -by any other interested widgets. - -The mouseMoveEvent() maps the mouse cursor's position in global -coordinates to widget coordinates, and determines the character that -was clicked by performing the calculation - -\snippet widgets/charactermap/characterwidget.cpp 4 - -The tooltip is given a position defined in global coordinates. - -\section1 MainWindow Class Definition - -The \c MainWindow class provides a minimal user interface for the example, -with only a constructor, slots that respond to signals emitted by standard -widgets, and some convenience functions that are used to set up the user -interface. - -The class definition looks like this: - -\snippet widgets/charactermap/mainwindow.h 0 - -The main window contains various widgets that are used to control how -the characters will be displayed, and defines the findFonts() function -for clarity and convenience. The findStyles() slot is used by the widgets -to determine the styles that are available, insertCharacter() inserts -a user-selected character into the window's line edit, and -updateClipboard() synchronizes the clipboard with the contents of the -line edit. - -\section1 MainWindow Class Implementation - -In the constructor, we set up the window's central widget and fill it with -some standard widgets (two comboboxes, a line edit, and a push button). -We also construct a CharacterWidget custom widget, and add a QScrollArea -so that we can view its contents: - -\snippet widgets/charactermap/mainwindow.cpp 0 - -QScrollArea provides a viewport onto the \c CharacterWidget when we set -its widget and handles much of the work needed to provide a scrolling -viewport. - -The font combo box is automatically populated with a list of available -fonts. We list the available styles for the current font in the style -combobox using the following function: - -\snippet widgets/charactermap/mainwindow.cpp 1 - -The line edit and push button are used to supply text to the clipboard: - -\snippet widgets/charactermap/mainwindow.cpp 2 - -We also obtain a clipboard object so that we can send text entered by the -user to other applications. - -Most of the signals emitted in the example come from standard widgets. -We connect these signals to slots in this class, and to the slots provided -by other widgets. - -\snippet widgets/charactermap/mainwindow.cpp 4 - -The font combobox's -\l{QFontComboBox::currentFontChanged()}{currentFontChanged()} signal is -connected to the findStyles() function so that the list of available styles -can be shown for each font that is used. Since both the font and the style -can be changed by the user, the font combobox's currentFontChanged() signal -and the style combobox's -\l{QComboBox::currentIndexChanged()}{currentIndexChanged()} are connected -directly to the character widget. - -The final two connections allow characters to be selected in the character -widget, and text to be inserted into the clipboard: - -\snippet widgets/charactermap/mainwindow.cpp 5 - -The character widget emits the characterSelected() custom signal when -the user clicks on a character, and this is handled by the insertCharacter() -function in this class. The clipboard is changed when the push button emits -the clicked() signal, and we handle this with the updateClipboard() function. - -The remaining code in the constructor sets up the layout of the central widget, -and provides a window title: - -\snippet widgets/charactermap/mainwindow.cpp 6 - -The font combobox is automatically populated with a list of available font -families. The styles that can be used with each font are found by the -findStyles() function. This function is called whenever the user selects a -different font in the font combobox. - -\snippet widgets/charactermap/mainwindow.cpp 7 - -We begin by recording the currently selected style, and we clear the -style combobox so that we can insert the styles associated with the -current font family. - -\snippet widgets/charactermap/mainwindow.cpp 8 - -We use the font database to collect the styles that are available for the -current font, and insert them into the style combobox. The current item is -reset if the original style is not available for this font. - -The last two functions are slots that respond to signals from the character -widget and the main window's push button. The insertCharacter() function is -used to insert characters from the character widget when the user clicks a -character: - -\snippet widgets/charactermap/mainwindow.cpp 9 - -The character is inserted into the line edit at the current cursor position. - -The main window's "To clipboard" push button is connected to the -updateClipboard() function so that, when it is clicked, the clipboard is -updated to contain the contents of the line edit: - -\snippet widgets/charactermap/mainwindow.cpp 10 - -We copy all the text from the line edit to the clipboard, but we do not clear -the line edit. -*/ diff --git a/examples/widgets/doc/src/chart.qdoc b/examples/widgets/doc/src/chart.qdoc deleted file mode 100644 index abb1b3ab..00000000 --- a/examples/widgets/doc/src/chart.qdoc +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/chart - \title Chart Example - \ingroup examples-itemviews - \brief The Chart example shows how to create a custom view for the model/view framework. - - \image chart-example.png - - In this example, the items in a table model are represented as slices in a pie chart, - relying on the flexibility of the model/view architecture to handle custom editing - and selection features. - - \b{Note that you only need to create a new view class if your data requires a - specialized representation.} You should first consider using a standard QListView, - QTableView, or QTreeView with a custom QItemDelegate subclass if you need to - represent data in a special way. - - \omit - \section1 PieView Class Definition - - The \c PieView class is a subclass of QAbstractItemView. The base class provides - much of the functionality required by view classes, so we only need to provide - implementations for three public functions: visualRect(), scrollTo(), and - indexAt(). However, the view needs to maintain strict control over its look and - feel, so we also provide implementations for a number of other functions: - - \snippet itemviews/chart/pieview.h 0 - - - - \section1 PieView Class Implementation - - The paint event renders the data from the standard item model as a pie chart. - We interpret the data in the following way: - - \list - \li Column 0 contains data in two different roles: - The \l{Qt::ItemDataRole}{DisplayRole} contains a label, and the - \l{Qt::ItemDataRole}{DecorationRole} contains the color of the pie slice. - \li Column 1 contains a quantity which we will convert to the angular extent of - the slice. - \endlist - - The figure is always drawn with the chart on the left and the key on - the right. This means that we must try and obtain an area that is wider - than it is tall. We do this by imposing a particular aspect ratio on - the chart and applying it to the available vertical space. This ensures - that we always obtain the maximum horizontal space for the aspect ratio - used. - We also apply fixed size margin around the figure. - - We use logical coordinates to draw the chart and key, and position them - on the view using viewports. - \endomit -*/ diff --git a/examples/widgets/doc/src/chip.qdoc b/examples/widgets/doc/src/chip.qdoc index a76e1195..817fc7d6 100644 --- a/examples/widgets/doc/src/chip.qdoc +++ b/examples/widgets/doc/src/chip.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/chip \title 40000 Chips + \examplecategory {Graphics & Multimedia} \ingroup examples-graphicsview \brief Visualizes a huge graphic view scene with 40000 chip items. diff --git a/examples/widgets/doc/src/classwizard.qdoc b/examples/widgets/doc/src/classwizard.qdoc deleted file mode 100644 index 8494a3c7..00000000 --- a/examples/widgets/doc/src/classwizard.qdoc +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example dialogs/classwizard - \title Class Wizard Example - \ingroup examples-dialogs - - \brief The Class Wizard example shows how to implement linear - wizards using QWizard. - - \image classwizard.png Screenshot of the Class Wizard example - - Most wizards have a linear structure, with page 1 followed by - page 2 and so on until the last page. Some wizards are more - complex in that they allow different traversal paths based on the - information provided by the user. The - \l{dialogs/licensewizard}{License Wizard} example shows how to - create such wizards. - - The Class Wizard example consists of the following classes: - - \list - \li \c ClassWizard inherits QWizard and provides a - three-step wizard that generates the skeleton of a C++ class - based on the user's input. - \li \c IntroPage, \c ClassInfoPage, \c CodeStylePage, \c - OutputFilesPage, and \c ConclusionPage are QWizardPage - subclasses that implement the wizard pages. - \endlist - - \section1 ClassWizard Class Definition - - \image classwizard-flow.png The Class Wizard pages - - We will see how to subclass QWizard to implement our own wizard. - The concrete wizard class is called \c ClassWizard and provides - five pages: - - \list - \li The first page is an introduction page, telling the user what - the wizard is going to do. - \li The second page asks for a class name and a base class, and - allows the user to specify whether the class should have a \c - Q_OBJECT macro and what constructors it should provide. - \li The third page allows the user to set some options related to the code - style, such as the macro used to protect the header file from - multiple inclusion (e.g., \c MYDIALOG_H). - \li The fourth page allows the user to specify the names of the - output files. - \li The fifth page is a conclusion page. - \endlist - - Although the program is just an example, if you press \uicontrol Finish - (\uicontrol Done on \macos), actual C++ source files will actually be - generated. - - \section1 The ClassWizard Class - - Here's the \c ClassWizard definition: - - \snippet dialogs/classwizard/classwizard.h 0 - - The class reimplements QDialog's \l{QDialog::}{accept()} slot. - This slot is called when the user clicks \uicontrol{Finish}. - - Here's the constructor: - - \snippet dialogs/classwizard/classwizard.cpp 1 - - We instantiate the five pages and insert them into the wizard - using QWizard::addPage(). The order in which they are inserted - is also the order in which they will be shown later on. - - We call QWizard::setPixmap() to set the banner and the - background pixmaps for all pages. The banner is used as a - background for the page header when the wizard's style is - \l{QWizard::}{ModernStyle}; the background is used as the - dialog's background in \l{QWizard::}{MacStyle}. (See \l{Elements - of a Wizard Page} for more information.) - - \snippet dialogs/classwizard/classwizard.cpp 3 - \snippet dialogs/classwizard/classwizard.cpp 4 - \dots - \snippet dialogs/classwizard/classwizard.cpp 5 - \snippet dialogs/classwizard/classwizard.cpp 6 - - If the user clicks \uicontrol Finish, we extract the information from - the various pages using QWizard::field() and generate the files. - The code is long and tedious (and has barely anything to do with - noble art of designing wizards), so most of it is skipped here. - See the actual example in the Qt distribution for the details if - you're curious. - - \section1 The IntroPage Class - - The pages are defined in \c classwizard.h and implemented in \c - classwizard.cpp, together with \c ClassWizard. We will start with - the easiest page: - - \snippet dialogs/classwizard/classwizard.h 1 - \codeline - \snippet dialogs/classwizard/classwizard.cpp 7 - - A page inherits from QWizardPage. We set a - \l{QWizardPage::}{title} and a - \l{QWizard::WatermarkPixmap}{watermark pixmap}. By not setting - any \l{QWizardPage::}{subTitle}, we ensure that no header is - displayed for this page. (On Windows, it is customary for wizards - to display a watermark pixmap on the first and last pages, and to - have a header on the other pages.) - - Then we create a QLabel and add it to a layout. - - \section1 The ClassInfoPage Class - - The second page is defined and implemented as follows: - - \snippet dialogs/classwizard/classwizard.h 2 - \codeline - \snippet dialogs/classwizard/classwizard.cpp 9 - \dots - \snippet dialogs/classwizard/classwizard.cpp 12 - \dots - \snippet dialogs/classwizard/classwizard.cpp 13 - - First, we set the page's \l{QWizardPage::}{title}, - \l{QWizardPage::}{subTitle}, and \l{QWizard::LogoPixmap}{logo - pixmap}. The logo pixmap is displayed in the page's header in - \l{QWizard::}{ClassicStyle} and \l{QWizard::}{ModernStyle}. - - Then we create the child widgets, create \l{Registering and Using - Fields}{wizard fields} associated with them, and put them into - layouts. The \c className field is created with an asterisk (\c - *) next to its name. This makes it a \l{mandatory fields}{mandatory field}, that - is, a field that must be filled before the user can press the - \uicontrol Next button (\uicontrol Continue on \macos). The fields' values - can be accessed from any other page using QWizardPage::field(), - or from the wizard code using QWizard::field(). - - \section1 The CodeStylePage Class - - The third page is defined and implemented as follows: - - \snippet dialogs/classwizard/classwizard.h 3 - \codeline - \snippet dialogs/classwizard/classwizard.cpp 14 - \dots - \snippet dialogs/classwizard/classwizard.cpp 15 - \codeline - \snippet dialogs/classwizard/classwizard.cpp 16 - - The code in the constructor is very similar to what we did for \c - ClassInfoPage, so we skipped most of it. - - The \c initializePage() function is what makes this class - interesting. It is reimplemented from QWizardPage and is used to - initialize some of the page's fields with values from the - previous page (namely, \c className and \c baseClass). For - example, if the class name on page 2 is \c SuperDuperWidget, the - default macro name on page 3 is \c SUPERDUPERWIDGET_H. - - The \c OutputFilesPage and \c ConclusionPage classes are very - similar to \c CodeStylePage, so we won't review them here. - - \sa QWizard, {License Wizard Example}, {Trivial Wizard Example} -*/ diff --git a/examples/widgets/doc/src/collidingmice-example.qdoc b/examples/widgets/doc/src/collidingmice-example.qdoc index 4f685940..54c893ee 100644 --- a/examples/widgets/doc/src/collidingmice-example.qdoc +++ b/examples/widgets/doc/src/collidingmice-example.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/collidingmice \title Colliding Mice Example + \examplecategory {Graphics & Multimedia} \brief Demonstrates how to animate items on a graphics view. \ingroup examples-graphicsview diff --git a/examples/widgets/doc/src/coloreditorfactory.qdoc b/examples/widgets/doc/src/coloreditorfactory.qdoc index a7da4d68..bf4a13c9 100644 --- a/examples/widgets/doc/src/coloreditorfactory.qdoc +++ b/examples/widgets/doc/src/coloreditorfactory.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/coloreditorfactory \title Color Editor Factory Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief This example shows how to create an editor that can be used by a QItemDelegate. diff --git a/examples/widgets/doc/src/combowidgetmapper.qdoc b/examples/widgets/doc/src/combowidgetmapper.qdoc index 2f53bfd1..8a3e285d 100644 --- a/examples/widgets/doc/src/combowidgetmapper.qdoc +++ b/examples/widgets/doc/src/combowidgetmapper.qdoc @@ -4,20 +4,14 @@ /*! \example itemviews/combowidgetmapper \title Combo Widget Mapper Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Combo Widget Mapper example shows how to use a custom delegate to map information from a model to specific widgets on a form. \image combowidgetmapper-example.png - In the \l{Simple Widget Mapper Example}, we showed the basic use of a - widget mapper to relate data exposed by a model to simple input widgets - in a user interface. However, sometimes we want to use input widgets that - expose data as choices to the user, such as QComboBox, and we need a way - to relate their input to the values stored in the model. - - This example is very similar to the \l{Simple Widget Mapper Example}. - Again, we create a \c Window class with an almost identical user interface, + We create a \c Window class with an almost identical user interface, except that, instead of providing a spin box so that each person's age can be entered, we provide a combo box to allow their addresses to be classified as "Home", "Work" or "Other". @@ -65,8 +59,7 @@ interfering with the other input widgets. The implementation is shown later. \endomit - The rest of the constructor is very similar to that of the - \l{Simple Widget Mapper Example}: + The rest of the constructor sets up connections and layouts: \snippet itemviews/combowidgetmapper/window.cpp Set up connections and layouts diff --git a/examples/widgets/doc/src/completer.qdoc b/examples/widgets/doc/src/completer.qdoc index a64d7e1e..f3e4fe8f 100644 --- a/examples/widgets/doc/src/completer.qdoc +++ b/examples/widgets/doc/src/completer.qdoc @@ -4,6 +4,7 @@ /*! \example tools/completer \title Completer Example + \examplecategory {User Interface Components} \ingroup examples-widgets-tools \brief The Completer example shows how to provide string-completion facilities @@ -45,7 +46,7 @@ \snippet tools/completer/fsmodel.cpp 0 As mentioned earlier, the \c data() function is reimplemented in order to - get it to return the entire file parth for the display role. For example, + get it to return the entire file path for the display role. For example, with a QFileSystemModel, you will see "Program Files" in the view. However, with \c FileSystemModel, you will see "C:\\Program Files". @@ -201,7 +202,7 @@ \snippet tools/completer/mainwindow.cpp 14 - The \c changeMaxVisible() update the maximum number of visible items in + The \c changeMaxVisible() updates the maximum number of visible items in the completer. \snippet tools/completer/mainwindow.cpp 15 diff --git a/examples/widgets/doc/src/composition.qdoc b/examples/widgets/doc/src/composition.qdoc index 99fc0661..38cd34bc 100644 --- a/examples/widgets/doc/src/composition.qdoc +++ b/examples/widgets/doc/src/composition.qdoc @@ -4,6 +4,7 @@ /*! \example painting/composition \title Composition Modes + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief Demonstrates how Composition Modes work in QPainter. @@ -18,5 +19,5 @@ drawn on top of the destination. In addition to these standard modes, Qt defines the complete set of composition modes - as defined by X. Porter and Y. Duff. See the QPainter documentation for details. + as defined by T. Porter and T. Duff. See the QPainter documentation for details. */ diff --git a/examples/widgets/doc/src/concentriccircles.qdoc b/examples/widgets/doc/src/concentriccircles.qdoc index ffdb0986..38842619 100644 --- a/examples/widgets/doc/src/concentriccircles.qdoc +++ b/examples/widgets/doc/src/concentriccircles.qdoc @@ -4,6 +4,7 @@ /*! \example painting/concentriccircles \title Concentric Circles Example + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief Demonstrates the improved quality that antialiasing and floating point precision gives. @@ -13,7 +14,7 @@ how to do simple animations. The application's main window displays several widgets which are - drawn using the various combinations of precision and + drawn using various combinations of precision and anti-aliasing. \image concentriccircles-example.png diff --git a/examples/widgets/doc/src/customsortfiltermodel.qdoc b/examples/widgets/doc/src/customsortfiltermodel.qdoc index 5ee98362..b6ff8e7b 100644 --- a/examples/widgets/doc/src/customsortfiltermodel.qdoc +++ b/examples/widgets/doc/src/customsortfiltermodel.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/customsortfiltermodel \title Custom Sort/Filter Model Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Custom Sort/Filter Model example illustrates how to subclass QSortFilterProxyModel to perform advanced sorting and filtering. diff --git a/examples/widgets/doc/src/deform.qdoc b/examples/widgets/doc/src/deform.qdoc index 371f1a41..bda32f8c 100644 --- a/examples/widgets/doc/src/deform.qdoc +++ b/examples/widgets/doc/src/deform.qdoc @@ -4,6 +4,7 @@ /*! \example painting/deform \title Vector Deformation + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief Demonstrates how to manipulate the elements of a QPainterPath. diff --git a/examples/widgets/doc/src/diagramscene.qdoc b/examples/widgets/doc/src/diagramscene.qdoc index 115f22ce..cd196136 100644 --- a/examples/widgets/doc/src/diagramscene.qdoc +++ b/examples/widgets/doc/src/diagramscene.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/diagramscene \title Diagram Scene Example + \examplecategory {Graphics & Multimedia} \ingroup examples-graphicsview \brief Demonstrate how to use the Graphics View framework. @@ -12,7 +13,7 @@ The Diagram Scene example is an application in which you can create a flowchart diagram. It is possible to add flowchart shapes and text and connect the shapes by arrows as shown in the image - above. The shapes, arrows, and text can be given different + above. The shapes, arrows, and text can be given different colors, and it is possible to change the font, style, and underline of the text. @@ -121,9 +122,7 @@ We show an example of the creation of an action. The functionality the actions trigger is discussed in the slots we - connect the actions to. You can see the \l{Qt Widgets - Application - Example}{application example} if you need a high-level - introduction to actions. + connect the actions to. The is the \c createMenus() function: @@ -289,7 +288,7 @@ added to the scene. We set the mode of the scene back to the mode before the item was inserted, which is ItemMove or InsertText depending on which button is checked in the \c pointerTypeGroup. - We must also uncheck the button in the in the \c buttonGroup. + We must also uncheck the button in the \c buttonGroup. Here is the implementation of \c textInserted(): diff --git a/examples/widgets/doc/src/digitalclock.qdoc b/examples/widgets/doc/src/digitalclock.qdoc deleted file mode 100644 index d2427717..00000000 --- a/examples/widgets/doc/src/digitalclock.qdoc +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/digitalclock - \title Digital Clock Example - \ingroup examples-widgets - \brief The Digital Clock example shows how to use QLCDNumber to display a - number with LCD-like digits. - - \borderedimage digitalclock-example.png - \caption Screenshot of the Digital Clock example - - This example also demonstrates how QTimer can be used to update a widget - at regular intervals. - - \section1 DigitalClock Class Definition - - The \c DigitalClock class provides a clock widget showing the time with - hours and minutes separated by a blinking colon. We subclass QLCDNumber - and implement a private slot called \c showTime() to update the clock - display: - - \snippet widgets/digitalclock/digitalclock.h 0 - - \section1 DigitalClock Class Implementation - - \snippet widgets/digitalclock/digitalclock.cpp 0 - - In the constructor, we first change the look of the LCD numbers. The - QLCDNumber::Filled style produces raised segments filled with the - foreground color (typically black). We also set up a one-second timer - to keep track of the current time, and we connect - its \l{QTimer::timeout()}{timeout()} signal to the private \c showTime() slot - so that the display is updated every second. Then, we - call the \c showTime() slot; without this call, there would be a one-second - delay at startup before the time is shown. - - \snippet widgets/digitalclock/digitalclock.cpp 1 - \snippet widgets/digitalclock/digitalclock.cpp 2 - - The \c showTime() slot is called whenever the clock display needs - to be updated. - - The current time is converted into a string with the format "hh:mm". - When QTime::second() is a even number, the colon in the string is - replaced with a space. This makes the colon appear and vanish every - other second. - - Finally, we call QLCDNumber::display() to update the widget. -*/ diff --git a/examples/widgets/doc/src/dirview.qdoc b/examples/widgets/doc/src/dirview.qdoc deleted file mode 100644 index 5c63d99e..00000000 --- a/examples/widgets/doc/src/dirview.qdoc +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/dirview - \title Dir View Example - \ingroup examples-itemviews - \brief This example demonstrates the usage of a tree view, and smooth flicking on a touchscreen. - - The Dir View example shows a tree view of the local file - system. It uses the QFileSystemModel class to provide file - and directory information. - - \borderedimage dirview-example.png - - \quotefromfile itemviews/dirview/main.cpp - \skipto QCommandLineParser parser - \printuntil parser.positionalArguments - - The example supports a number of command line options. - These options include: - \list - \li Application description - \li -help option - \li -version option - \li if the optionc {-c} is specified, the application will not - use custom directory options - \endlist - - \skipto QFileSystemModel - \printuntil tree.setModel - - Declares \c model as data model for reading the local filesystem. - \c model.setRootPath("") sets the current folder as the folder from - which \c model will start reading. - QTreeView object \c tree visualizes the filesystem in a tree structure. - - \skipto tree.setAnimated(false) - \printuntil tree.setColumnWidth - - Sets layout options for animation, indentation, sorting, and sizing of the - filesystem tree. - - \skipto QScroller::grabGesture - \printuntil QScroller::grabGesture - - Creates a \l QScroller instance to recognize gestures on touchscreens, - so that you can flick the tree view with your finger. -*/ diff --git a/examples/widgets/doc/src/dockwidgets.qdoc b/examples/widgets/doc/src/dockwidgets.qdoc deleted file mode 100644 index 9907cea2..00000000 --- a/examples/widgets/doc/src/dockwidgets.qdoc +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example mainwindows/dockwidgets - \title Dock Widgets Example - \ingroup examples-mainwindow - - \brief The Dock Widgets example shows how to add dock windows to an - application. It also shows how to use Qt's rich text engine. - - \image dockwidgets-example.png Screenshot of the Dock Widgets example - - The application presents a simple business letter template, and has - a list of customer names and addresses and a list of standard - phrases in two dock windows. The user can click a customer to have - their name and address inserted into the template, and click one or - more of the standard phrases. Errors can be corrected by clicking - the Undo button. Once the letter has been prepared it can be printed - or saved as HTML. - - \section1 MainWindow Class Definition - - Here's the class definition: - - \snippet mainwindows/dockwidgets/mainwindow.h 0 - - We will now review each function in turn. - - \section1 MainWindow Class Implementation - - \snippet mainwindows/dockwidgets/mainwindow.cpp 0 - - We start by including \c , a header file that contains the - definition of all classes in the Qt Core, Qt GUI and Qt Widgets - modules. This saves us from having to include - every class individually and is especially convenient if we add new - widgets. We also include \c mainwindow.h. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 1 - - In the constructor, we start by creating a QTextEdit widget. Then we call - QMainWindow::setCentralWidget(). This function passes ownership of - the QTextEdit to the \c MainWindow and tells the \c MainWindow that - the QTextEdit will occupy the \c MainWindow's central area. - - Then we call \c createActions(), \c createMenus(), \c - createToolBars(), \c createStatusBar(), and \c createDockWindows() - to set up the user interface. Finally we call \c setWindowTitle() to - give the application a title, and \c newLetter() to create a new - letter template. - - We won't quote the \c createActions(), \c createMenus(), \c - createToolBars(), and \c createStatusBar() functions since they - follow the same pattern as all the other Qt examples. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 9 - - We create the customers dock window first, and in addition to a - window title, we also pass it a \c this pointer so that it becomes a - child of \c MainWindow. Normally we don't have to pass a parent - because widgets are parented automatically when they are laid out: - but dock windows aren't laid out using layouts. - - We've chosen to restrict the customers dock window to the left and - right dock areas. (So the user cannot drag the dock window to the - top or bottom dock areas.) The user can drag the dock window out of - the dock areas entirely so that it becomes a free floating window. - We can change this (and whether the dock window is moveable or - closable) using QDockWidget::setFeatures(). - - Once we've created the dock window we create a list widget with the - dock window as parent, then we populate the list and make it the - dock window's widget. Finally we add the dock widget to the \c - MainWindow using \c addDockWidget(), choosing to put it in the right - dock area. - - We undertake a similar process for the paragraphs dock window, - except that we don't restrict which dock areas it can be dragged to. - - Finally we set up the signal-slot connections. If the user clicks a - customer or a paragraph their \c currentTextChanged() signal will be - emitted and we connect these to \c insertCustomer() and - addParagraph() passing the text that was clicked. - - We briefly discuss the rest of the implementation, but have now - covered everything relating to dock windows. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 2 - - In this function we clear the QTextEdit so that it is empty. Next we - create a QTextCursor on the QTextEdit. We move the cursor to the - start of the document and create and format a frame. We then create - some character formats and a table format. We insert a table into - the document and insert the company's name and address into a table - using the table and character formats we created earlier. Then we - insert the skeleton of the letter including two markers \c NAME and - \c ADDRESS. We will also use the \c{Yours sincerely,} text as a marker. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 6 - - If the user clicks a customer we split the customer details into - pieces. We then look for the \c NAME marker using the \c find() - function. This function selects the text it finds, so when we call - \c insertText() with the customer's name the name replaces the marker. - We then look for the \c ADDRESS marker and replace it with each line - of the customer's address. Notice that we wrapped all the insertions - between a \c beginEditBlock() and \c endEditBlock() pair. This means - that the entire name and address insertion is treated as a single - operation by the QTextEdit, so a single undo will revert all the - insertions. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 7 - - This function works in a similar way to \c insertCustomer(). First - we look for the marker, in this case, \c {Yours sincerely,}, and then - replace it with the standard paragraph that the user clicked. Again - we use a \c beginEditBlock() ... \c endEditBlock() pair so that the - insertion can be undone as a single operation. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 3 - - Qt's QTextDocument class makes printing documents easy. We simply - take the QTextEdit's QTextDocument, set up the printer and print the - document. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 4 - - QTextEdit can output its contents in HTML format, so we prompt the - user for the name of an HTML file and if they provide one we simply - write the QTextEdit's contents in HTML format to the file. - - \snippet mainwindows/dockwidgets/mainwindow.cpp 5 - - If the focus is in the QTextEdit, pressing \uicontrol Ctrl+Z undoes as - expected. But for the user's convenience we provide an - application-wide undo function that simply calls the QTextEdit's - undo: this means that the user can undo regardless of where the - focus is in the application. -*/ diff --git a/examples/widgets/doc/src/draganddroppuzzle.qdoc b/examples/widgets/doc/src/draganddroppuzzle.qdoc deleted file mode 100644 index c2504b24..00000000 --- a/examples/widgets/doc/src/draganddroppuzzle.qdoc +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example draganddrop/puzzle - \title Drag and Drop Puzzle Example - - \brief The Drag and Drop Puzzle example demonstrates a way of using the drag and drop system with - item view widgets. - - \image draganddroppuzzle-example.png - - This example is an implementation of a simple jigsaw puzzle game using Qt's - drag and drop API. - The \l{Item Views Puzzle Example}{Item View Puzzle} example shows - many of the same features, but takes an alternative approach that uses Qt's - model/view framework to manage drag and drop operations. -*/ diff --git a/examples/widgets/doc/src/dragdroprobot.qdoc b/examples/widgets/doc/src/dragdroprobot.qdoc index ca62bf73..6b7f6952 100644 --- a/examples/widgets/doc/src/dragdroprobot.qdoc +++ b/examples/widgets/doc/src/dragdroprobot.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/dragdroprobot \title Drag and Drop Robot Example + \examplecategory {Graphics & Multimedia} \ingroup examples-graphicsview \brief Demonstrates how to drag and drop items in a graphics view. diff --git a/examples/widgets/doc/src/draggableicons.qdoc b/examples/widgets/doc/src/draggableicons.qdoc index 9a0290c8..fd4f9e69 100644 --- a/examples/widgets/doc/src/draggableicons.qdoc +++ b/examples/widgets/doc/src/draggableicons.qdoc @@ -4,6 +4,7 @@ /*! \example draganddrop/draggableicons \title Draggable Icons Example + \examplecategory {User Interface Components} \brief The Draggable Icons example shows how to drag and drop image data between widgets in the same application, and between different applications. diff --git a/examples/widgets/doc/src/draggabletext.qdoc b/examples/widgets/doc/src/draggabletext.qdoc index 3cc3560b..6e15e7f9 100644 --- a/examples/widgets/doc/src/draggabletext.qdoc +++ b/examples/widgets/doc/src/draggabletext.qdoc @@ -4,6 +4,7 @@ /*! \example draganddrop/draggabletext \title Draggable Text Example + \examplecategory {User Interface Components} \brief Illustrates how to drag and drop text between widgets. \brief The Draggable Text example shows how to drag and drop textual data between widgets diff --git a/examples/widgets/doc/src/dynamiclayouts.qdoc b/examples/widgets/doc/src/dynamiclayouts.qdoc deleted file mode 100644 index 5dea8a7f..00000000 --- a/examples/widgets/doc/src/dynamiclayouts.qdoc +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example layouts/dynamiclayouts - \title Dynamic Layouts Example - \brief Shows how to re-orient widgets in running applications. - - \e{Dynamic Layouts} implements dynamically placed widgets within running - applications. The widget placement depends on whether \c Horizontal or \c - Vertical is chosen. - - \borderedimage dynamiclayouts-example.png - For more information, visit the \l{Layout Management} page. - - \section1 Dialog Constructor - - To begin with, the application creates the UI components by calling the - following methods: - - \list - \li createRotatableGroupBox() - \li createOptionsGroupBox() - \li createButtonBox() - \endlist - - It then adds the UI components to a GridLayout (\c mainLayout). - - Finally, \c Dialog::rotateWidgets() is called. - - \quotefromfile layouts/dynamiclayouts/dialog.cpp - \skipuntil createRotatableGroupBox - \printuntil setWindowTitle - - \section1 Creating the Main Widgets - - The \c createRotatableGroupBox() method creates a rotatable group box, - then adds a series of widgets: - - \list - \li QSpinBox - \li QSlider - \li QDial - \li QProgressBar - \endlist - - It goes on to add signals and slots to each widget, and assigns - a QGridLayout called \a rotatableLayout. - - \skipto Dialog::createRotatableGroupBox - \printuntil /^\}/ - - \section1 Adding Options - - \c createOptionsGroupBox() creates the following widgets: - \list - \li \c optionsGroupBox - \li \c buttonsOrientationLabel - \li \c buttonsOrientationComboBox. The orientation of the ComboBox is either - \c horizontal (default value) or \c vertical. These two values - are added during the startup of the application. It is not possible - to leave the option empty. - \endlist - - \skipto Dialog::createOptionsGroupBox() - \printuntil /^\}/ - - \section1 Adding Buttons - - createButtonBox() constructs a QDialogButtonBox called \c buttonBox - to which are added a \c closeButton, a \c helpButton and a - \c rotateWidgetsButton. - It then assigns a signal and a slot to each button in \c buttonBox. - - \skipto Dialog::createButtonBox() - \printuntil /^\}/ - - - \section1 Rotating the Widgets - - Removes the current widgets and activates the next widget. - - \quotefromfile layouts/dynamiclayouts/dialog.cpp - \skipto Dialog::rotateWidgets() - \printuntil rotatableLayout->addWidget(rotatableWidgets[i] - \printuntil } - \printuntil } - - \include examples-run.qdocinc -*/ - diff --git a/examples/widgets/doc/src/easing.qdoc b/examples/widgets/doc/src/easing.qdoc index c9f8752b..776d1613 100644 --- a/examples/widgets/doc/src/easing.qdoc +++ b/examples/widgets/doc/src/easing.qdoc @@ -4,6 +4,7 @@ /*! \example animation/easing \title Easing Curves Example + \examplecategory {Graphics & Multimedia} \brief The Easing Curves example shows how to use easing curves to control the speed of an animation. diff --git a/examples/widgets/doc/src/echoplugin.qdoc b/examples/widgets/doc/src/echoplugin.qdoc index 4cdd7005..1dfc19df 100644 --- a/examples/widgets/doc/src/echoplugin.qdoc +++ b/examples/widgets/doc/src/echoplugin.qdoc @@ -4,6 +4,7 @@ /*! \example tools/echoplugin \title Echo Plugin Example + \examplecategory {Data Processing & I/O} \ingroup examples-widgets-tools \ingroup examples-layout @@ -175,7 +176,5 @@ create plugins. We give an example of a plugin that extends Qt in the \l{Style - Plugin Example}{style plugin} example. The \l{Plug & Paint - Example}{plug and paint} example shows how to create static - plugins. + Plugin Example}{style plugin} example. */ diff --git a/examples/widgets/doc/src/editabletreemodel.qdoc b/examples/widgets/doc/src/editabletreemodel.qdoc index 96166107..efadfc68 100644 --- a/examples/widgets/doc/src/editabletreemodel.qdoc +++ b/examples/widgets/doc/src/editabletreemodel.qdoc @@ -4,9 +4,10 @@ /*! \example itemviews/editabletreemodel \title Editable Tree Model Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief This example shows how to implement a simple item-based tree model that can - be used with other classes the model/view framework. + be used with other classes in the model/view framework. \image itemviews-editabletreemodel.png diff --git a/examples/widgets/doc/src/elasticnodes.qdoc b/examples/widgets/doc/src/elasticnodes.qdoc index fbe50646..14ea63ef 100644 --- a/examples/widgets/doc/src/elasticnodes.qdoc +++ b/examples/widgets/doc/src/elasticnodes.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/elasticnodes \title Elastic Nodes Example + \examplecategory {Graphics & Multimedia} \ingroup examples-graphicsview \brief Demonstrates how to interact with graphical items in a scene. diff --git a/examples/widgets/doc/src/embeddeddialogs.qdoc b/examples/widgets/doc/src/embeddeddialogs.qdoc deleted file mode 100644 index 09df334c..00000000 --- a/examples/widgets/doc/src/embeddeddialogs.qdoc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example graphicsview/embeddeddialogs - \title Embedded Dialogs - \ingroup examples-graphicsview-layout - \brief Demonstrates how to embed dialogs into a graphics view. - - This example shows how to embed standard dialogs into - Graphics View. It also shows how you can customize the - proxy class and add window shadows. - - \image embeddeddialogs-demo.png -*/ diff --git a/examples/widgets/doc/src/extension.qdoc b/examples/widgets/doc/src/extension.qdoc deleted file mode 100644 index 8f35e0e1..00000000 --- a/examples/widgets/doc/src/extension.qdoc +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example dialogs/extension - \title Extension Example - \ingroup examples-dialogs - - \brief The Extension example shows how to add an extension to a QDialog - using the QAbstractButton::toggled() signal and the - QWidget::setVisible() slot. - - \image extension-example.png Screenshot of the Extension example - - The Extension application lets the user add search parameters in - a dialog and launch a simple or advanced search. - - The simple search has two options: \uicontrol {Match case} and \uicontrol - {Search from start}. The advanced search offers search for \uicontrol {Whole words}, - \uicontrol {Search backward}, and \uicontrol {Search selection}. The - application starts with simple search as the default. Click the \uicontrol More button - to show the advanced search options: - - \image extension_more.png Screenshot of the Extension example - - \section1 FindDialog Class Definition - - The \c FindDialog class inherits QDialog. QDialog is the - base class for dialog windows. A dialog window is a top-level - window mostly used for short-term tasks and brief communications - with the user. - - \snippet dialogs/extension/finddialog.h 0 - - The \c FindDialog widget is the main application widget, and - displays the application's search options and controlling - buttons. - - In addition to the constructor, there are several child widgets: - - \list - \li A QLineEdit with an associated QLabel to let the - user type a word to search for. - \li Several \l {QCheckBox}{QCheckBox}es to facilitate the search options. - \li Three \l {QPushButton}{QPushButton}s: - \list - \li the \uicontrol Find button to start a search - \li the \uicontrol More button to enable an advanced search - \li a QWidget representing the application's extension part - \endlist - \endlist - - \section1 FindDialog Class Implementation - - Create the standard child widgets for the simple search in the constructor: - the QLineEdit with the associated QLabel, two {QCheckBox}es and all the - \l {QPushButton}{QPushButton}s. - - \snippet dialogs/extension/finddialog.cpp 0 - - This snippet illustrates how you can define a shortcut key - for a widget. A shortcut should be defined by putting the ampersand - character (\c &) in front of the letter that should - become the shortcut. - For example, for \uicontrol {Find what}, pressing \uicontrol Alt - and \uicontrol w transfers focus to the QLineEdit widget. - Shortcuts can also be used for checking on or off a checkmark. - For example, pressing \uicontrol Alt and \uicontrol c puts the check mark - on \uicontrol {Match Case} if it was unchecked and vice versa. - It is the QLabel::setBuddy() method that links a widget to the shortcut - character if it has been defined. - - Set the \uicontrol Find button's default property to true, using the - QPushButton::setDefault() function. Then the push button will be - pressed if the user presses the Enter (or Return) key. Note that a - QDialog can only have one default button. - - \snippet dialogs/extension/finddialog.cpp 2 - - Create the extension widget, and the \l {QCheckBox}{QCheckBox}es associated - with the advanced search options. - - \snippet dialogs/extension/finddialog.cpp 3 - - Now that the extension widget is created, connect the \uicontrol - More button's \l{QAbstractButton::toggled()}{toggled()} signal to - the extension widget's \l{QWidget::setVisible()}{setVisible()} slot. - - The QAbstractButton::toggled() signal is emitted whenever a - checkable button changes its state. The signal's argument is true - if the button is checked, or false if the button is unchecked. The - QWidget::setVisible() slot sets the widget's visible status. If - the status is true the widget is shown, otherwise the widget is - hidden. - - Since the \uicontrol More button is checkable, the connection makes - sure that the extension widget is shown depending on the state of - the \uicontrol More button. - - Create checkboxes associated with the advanced search options in - a layout installed on the extension widget. - - \snippet dialogs/extension/finddialog.cpp 4 - - Before creating the main layout, create several child layouts - for the widgets. First align the QLabel and its buddy, the - QLineEdit, using a QHBoxLayout. Then align the QLabel and the QLineEdit - vertically with the checkboxes associated with the simple search, - using a QVBoxLayout. Create also a QVBoxLayout for the buttons. - Finally, lay out the two latter layouts and the extension widget - using a QGridLayout. - - \snippet dialogs/extension/finddialog.cpp 5 - - Hide the extension widget using the QWidget::hide() - function, making the application only show the simple search - options when it starts. When the user wants to access the advanced - search options, the dialog only needs to change the visibility of - the extension widget. Qt's layout management takes care of the - dialog's appearance. -*/ diff --git a/examples/widgets/doc/src/fademessage.qdoc b/examples/widgets/doc/src/fademessage.qdoc deleted file mode 100644 index bd46593a..00000000 --- a/examples/widgets/doc/src/fademessage.qdoc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example effects/fademessage - \title Fade Message Effect Example - \ingroup examples-graphicsview-graphicseffects - \brief Demonstrates how to apply effects on items in the view. - - \div { style="text-align: left"} - \inlineimage fademessageeffect-example.png - \inlineimage fademessageeffect-example-faded.png - \enddiv - -*/ diff --git a/examples/widgets/doc/src/fetchmore.qdoc b/examples/widgets/doc/src/fetchmore.qdoc index 1e80e803..d8dae18f 100644 --- a/examples/widgets/doc/src/fetchmore.qdoc +++ b/examples/widgets/doc/src/fetchmore.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/fetchmore \title Fetch More Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Fetch More example shows how to add items to an item view model on demand. diff --git a/examples/widgets/doc/src/flowlayout.qdoc b/examples/widgets/doc/src/flowlayout.qdoc index 5a3316b6..03dfc164 100644 --- a/examples/widgets/doc/src/flowlayout.qdoc +++ b/examples/widgets/doc/src/flowlayout.qdoc @@ -4,6 +4,7 @@ /*! \example layouts/flowlayout \title Flow Layout Example + \examplecategory {User Interface Components} \ingroup examples-layout \brief Shows how to arrange widgets for different window sizes. diff --git a/examples/widgets/doc/src/fontsampler.qdoc b/examples/widgets/doc/src/fontsampler.qdoc deleted file mode 100644 index 3b014b57..00000000 --- a/examples/widgets/doc/src/fontsampler.qdoc +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example painting/fontsampler - \title Font Sampler Example - \ingroup examples-painting - \brief The Font Sampler example shows how to preview and print multi-page documents. - - The Font Sampler example shows how to preview and print multi-page documents. - - \image fontsampler-example.png -*/ diff --git a/examples/widgets/doc/src/fridgemagnets.qdoc b/examples/widgets/doc/src/fridgemagnets.qdoc deleted file mode 100644 index fccadd3b..00000000 --- a/examples/widgets/doc/src/fridgemagnets.qdoc +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example draganddrop/fridgemagnets - \title Fridge Magnets Example - \brief The Fridge Magnets example illustrates how to move around several types of - MIME-encoded data with drag and drop. - - The Fridge Magnets example shows how to supply more than one type - of MIME-encoded data with a drag and drop operation. - - \image fridgemagnets-example.png - - With this application the user can play around with a collection - of fridge magnets, using drag and drop to form new sentences from - the words on the magnets. The example consists of two classes: - - \list - \li \c DragLabel is a custom widget representing one - single fridge magnet. - \li \c DragWidget provides the main application window. - \endlist - - We will first take a look at the \c DragLabel class, then we will - examine the \c DragWidget class. - - \section1 DragLabel Class Definition - - Each fridge magnet is represented by an instance of the \c - DragLabel class: - - \snippet draganddrop/fridgemagnets/draglabel.h 0 - - Each instance of this QLabel subclass will be used to display an - pixmap generated from a text string. Since we cannot store both - text and a pixmap in a standard label, we declare a private variable - to hold the original text, and we define an additional member - function to allow it to be accessed. - - \section1 DragLabel Class Implementation - - In the \c DragLabel constructor, we first create a QImage object - on which we will draw the fridge magnet's text and frame: - - \snippet draganddrop/fridgemagnets/draglabel.cpp 0 - - Its size depends on the current font size, and its format is - QImage::Format_ARGB32_Premultiplied; i.e., the image is stored - using a premultiplied 32-bit ARGB format (0xAARRGGBB). - - We then construct a font object that uses the application's - default font, and set its style strategy. The style strategy tells - the font matching algorithm what type of fonts should be used to - find an appropriate default family. The QFont::ForceOutline forces - the use of outline fonts. - - To draw the text and frame onto the image, we use the QPainter - class. QPainter provides highly optimized methods to do most of - the drawing GUI programs require. It can draw everything from - simple lines to complex shapes like pies and chords. It can also - draw aligned text and pixmaps. - - \snippet draganddrop/fridgemagnets/draglabel.cpp 1 - - A painter can be activated by passing a paint device to the - constructor, or by using the \l{QPainter::}{begin()} method as we - do in this example. The \l{QPainter::}{end()} method deactivates - it. Note that the latter function is called automatically upon - destruction when the painter is activated by its constructor. The - QPainter::Antialiasing render hint ensures that the paint engine - will antialias the edges of primitives if possible. - - When the painting is done, we convert our image to a pixmap using - QPixmap's \l {QPixmap::}{fromImage()} method. This method also - takes an optional flags argument, and converts the given image to - a pixmap using the specified flags to control the conversion (the - flags argument is a bitwise-OR of the Qt::ImageConversionFlags; - passing 0 for flags sets all the default options). - - \snippet draganddrop/fridgemagnets/draglabel.cpp 2 - - Finally, we set the label's \l{QLabel::pixmap}{pixmap property} - and store the label's text for later use. - - \e{Note that setting the pixmap clears any previous content, including - any text previously set using QLabel::setText(), and disables - the label widget's buddy shortcut, if any.} - - \section1 DragWidget Class Definition - - The \c DragWidget class inherits QWidget, providing support for - drag and drop operations: - - \snippet draganddrop/fridgemagnets/dragwidget.h 0 - - To make the widget responsive to drag and drop operations, we simply - reimplement the \l{QWidget::}{dragEnterEvent()}, - \l{QWidget::}{dragMoveEvent()} and \l{QWidget::}{dropEvent()} event - handlers inherited from QWidget. - - We also reimplement \l{QWidget::}{mousePressEvent()} to make the - widget responsive to mouse clicks. This is where we will write code - to start drag and drop operations. - - \section1 DragWidget Class Implementation - - In the constructor, we first open the file containing the words on - our fridge magnets: - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 0 - - QFile is an I/O device for reading and writing text and binary - files and resources, and may be used by itself or in combination - with QTextStream or QDataStream. We have chosen to read the - contents of the file using the QTextStream class that provides a - convenient interface for reading and writing text. - - We then create the fridge magnets. As long as there is data (the - QTextStream::atEnd() method returns true if there is no more data - to be read from the stream), we read one line at a time using - QTextStream's \l {QTextStream::}{readLine()} method. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 1 - - For each line, we create a \c DragLabel object using the read line - as text, we calculate its position and ensure that it is visible by - calling the QWidget::show() method. We set the Qt::WA_DeleteOnClose - attribute on each label to ensure that any unused labels will be - deleted; we will need to create new labels and delete old ones when - they are dragged around, and this ensures that the example does not - leak memory. - - We also set the \c FridgeMagnets widget's palette, minimum size - and window title. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 2 - - Finally, to enable our user to move the fridge magnets around, we - must also set the \c FridgeMagnets widget's - \l{QWidget::acceptDrops}{acceptDrops} property. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 3 - - Setting this property to true announces to the system that this - widget \e may be able to accept drop events (events that are sent - when drag and drop actions are completed). Later, we will - implement the functions that ensure that the widget accepts the - drop events it is interested in. - - \section2 Dragging - - Let's take a look at the \l{QWidget::}{mousePressEvent()} event - handler, where drag and drop operations begin: - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 13 - \snippet draganddrop/fridgemagnets/dragwidget.cpp 14 - - Mouse events occur when a mouse button is pressed or released - inside a widget, or when the mouse cursor is moved. By - reimplementing the \l{QWidget::}{mousePressEvent()} method we - ensure that we will receive mouse press events for the widget - containing the fridge magnets. - - Whenever we receive such an event, we first check to see if the - position of the click coincides with one of the labels. If not, - we simply return. - - If the user clicked a label, we determine the position of the - \e{hot spot} (the position of the click relative to the top-left - corner of the label). We create a byte array to store the label's - text and the hot spot, and we use a QDataStream object to stream - the data into the byte array. - - With all the information in place, we create a new QMimeData object. - As mentioned above, QMimeData objects associate the data that they - hold with the corresponding MIME types to ensure that information - can be safely transferred between applications. The - \l{QMimeData::}{setData()} method sets the data associated with a - given MIME type. In our case, we associate our item data with the - custom \c application/x-fridgemagnet type. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 15 - - Note that we also associate the magnet's text with the - \c text/plain MIME type using QMimeData's \l{QMimeData::}{setText()} - method. Below, we will see how our widget detects both these MIME - types with its event handlers. - - Finally, we create a QDrag object. It is the QDrag class that - handles most of the details of a drag and drop operation, - providing support for MIME-based drag and drop data transfer. The - data to be transferred by the drag and drop operation is contained - in a QMimeData object. When we call QDrag's - \l{QDrag::}{setMimeData()} method the ownership of our item data is - transferred to the QDrag object. - - We call the \l{QDrag::}{setPixmap()} function to set the pixmap used - to represent the data during the drag and drop operation. - Typically, this pixmap shows an icon that represents the MIME type - of the data being transferred, but any pixmap can be used. In this - example, we simply use the pixmap used by the label itself to make - it look like the fridge magnet itself is being moved. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 16 - - We also specify the cursor's hot spot, its position relative to the - top-level corner of the drag pixmap, to be the point we calculated - above. This makes the process of dragging the label feel more natural - because the cursor always points to the same place on the label - during the drag operation. - - We start the drag operation using QDrag's \l{QDrag::}{exec()} function, - requesting that the magnet is copied when the drag is completed. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 17 - - The function returns the drop action actually performed by the user - (this can be either a copy or a move action in this case); if this - action is equal to Qt::MoveAction we will close the activated - fridge magnet widget because we will create a new one to replace it - (see the \l{drop}{dropEvent()} implementation). Otherwise, if - the drop is outside our main widget, we simply show the widget in - its original position. - - \section2 Dropping - - When a a drag and drop action enters our widget, we will receive a - drag enter \e event. QDragEnterEvent inherits most of its - functionality from QDragMoveEvent, which in turn inherits most of - its functionality from QDropEvent. Note that we must accept this - event in order to receive the drag move events that are sent while - the drag and drop action is in progress. The drag enter event is - always immediately followed by a drag move event. - - In our \c dragEnterEvent() implementation, we first determine - whether we support the event's MIME type or not: - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 4 - \snippet draganddrop/fridgemagnets/dragwidget.cpp 5 - \snippet draganddrop/fridgemagnets/dragwidget.cpp 6 - - If the type is \c application/x-fridgemagnet and the event - origins from any of this application's fridge magnet widgets, we - first set the event's drop action using the - QDropEvent::setDropAction() method. An event's drop action is the - action to be performed on the data by the target. Qt::MoveAction - indicates that the data is moved from the source to the target. - - Then we call the event's \l {QDragMoveEvent::}{accept()} method to - indicate that we have handled the event. In general, unaccepted - events might be propagated to the parent widget. If the event - origins from any other widget, we simply accept the proposed - action. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 7 - - We also accept the proposed action if the event's MIME type is \c - text/plain, i.e., if QMimeData::hasText() returns true. If the - event has any other type, on the other hand, we call the event's - \l {QDragMoveEvent::}{ignore()} method allowing the event to be - propagated further. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 8 - - Drag move events occur when the cursor enters a widget, when it - moves within the widget, and when a modifier key is pressed on the - keyboard while the widget has focus. Our widget will receive drag - move events repeatedly while a drag is within its boundaries. We - reimplement the \l {QWidget::}{dragMoveEvent()} method, and - examine the event in the exact same way as we did with drag enter - events. - - Note that the \l{QWidget::}{dropEvent()} event handler behaves - slightly differently: We first get hold of the event's MIME - data. - - \target drop - \snippet draganddrop/fridgemagnets/dragwidget.cpp 9 - - The QMimeData class provides a container for data that - records information about its MIME type. QMimeData objects - associate the data that they hold with the corresponding MIME - types to ensure that information can be safely transferred between - applications, and copied around within the same application. - - We retrieve the data associated with the \c application/x-fridgemagnet - MIME type using a data stream in order to create a new \c DragLabel - object. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 10 - - The QDataStream class provides serialization of binary data to a - QIODevice (a data stream is a binary stream of encoded information - which is completely independent of the host computer's operating - system, CPU or byte order). - - Finally, we create a label and move it to the event's position: - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 11 - - If the source of the event is also the widget receiving the - drop event, we set the event's drop action to Qt::MoveAction and - call the event's \l{QDragMoveEvent::}{accept()} - method. Otherwise, we simply accept the proposed action. This - means that labels are moved rather than copied in the same - window. However, if we drag a label to a second instance of the - Fridge Magnets example, the default action is to copy it, leaving - the original in the first instance. - - If the event's MIME type is \c text/plain (i.e., if - QMimeData::hasText() returns true) we retrieve its text and split - it into words. For each word we create a new \c DragLabel action, - and show it at the event's position plus an offset depending on - the number of words in the text. In the end we accept the proposed - action. This lets the user drop selected text from a text editor or - Web browser onto the widget to add more fridge magnets. - - \snippet draganddrop/fridgemagnets/dragwidget.cpp 12 - - If the event has any other type, we call the event's - \l{QDragMoveEvent::}{ignore()} method allowing the event to be - propagated further. - - \section1 Summary - - We set our main widget's \l{QWidget::}{acceptDrops} property - and reimplemented QWidget's \l{QWidget::}{dragEnterEvent()}, - \l{QWidget::}{dragMoveEvent()} and \l{QWidget::}{dropEvent()} event - handlers to support content dropped on our widget. - - In addition, we reimplemented the \l{QWidget::}{mousePressEvent()} - function to let the user pick up fridge magnets in the first place. - - Because data is communicated using drag and drop operations and - encoded using MIME types, you can run more than one instance of this - example, and transfer magnets between them. -*/ diff --git a/examples/widgets/doc/src/frozencolumn.qdoc b/examples/widgets/doc/src/frozencolumn.qdoc index 54040bc9..c213ba17 100644 --- a/examples/widgets/doc/src/frozencolumn.qdoc +++ b/examples/widgets/doc/src/frozencolumn.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/frozencolumn \title Frozen Column Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief This example demonstrates how to freeze a column within a QTableView. diff --git a/examples/widgets/doc/src/gallery.qdoc b/examples/widgets/doc/src/gallery.qdoc index 5287fb5b..36b76d8f 100644 --- a/examples/widgets/doc/src/gallery.qdoc +++ b/examples/widgets/doc/src/gallery.qdoc @@ -5,6 +5,7 @@ \example gallery \meta {tag} {gallery} \title Widgets Gallery Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Widgets Gallery example shows widgets relevant for designing UIs. diff --git a/examples/widgets/doc/src/gradients.qdoc b/examples/widgets/doc/src/gradients.qdoc index 5a951ffb..5b84493c 100644 --- a/examples/widgets/doc/src/gradients.qdoc +++ b/examples/widgets/doc/src/gradients.qdoc @@ -4,6 +4,7 @@ /*! \example painting/gradients \title Gradients + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief Shows how gradients can be used with QPainter. diff --git a/examples/widgets/doc/src/graphicsview-flowlayout.qdoc b/examples/widgets/doc/src/graphicsview-flowlayout.qdoc deleted file mode 100644 index 179f3501..00000000 --- a/examples/widgets/doc/src/graphicsview-flowlayout.qdoc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example graphicsview/flowlayout - \title Graphics View Flow Layout Example - \ingroup examples-graphicsview-layout - \brief Demonstrates flow layout on a graphics view scene. - - The Graphics View Flow Layout example shows the use of a flow layout - in a Graphics View widget. - - \image graphicsflowlayout-example.png - - This example uses a Graphics View to display the widget, which is a more - customizable approach than displaying the flow layout in the application - window (See \l {Flow Layout Example}). - - Graphics View Flow Layout snippet: - - \snippet graphicsview/flowlayout/main.cpp 1 - - Flow Layout Example snippet: - - \snippet layouts/flowlayout/main.cpp 1 - - -*/ diff --git a/examples/widgets/doc/src/graphicsview-simpleanchorlayout.qdoc b/examples/widgets/doc/src/graphicsview-simpleanchorlayout.qdoc index 49301013..a269aac5 100644 --- a/examples/widgets/doc/src/graphicsview-simpleanchorlayout.qdoc +++ b/examples/widgets/doc/src/graphicsview-simpleanchorlayout.qdoc @@ -4,6 +4,7 @@ /*! \example graphicsview/simpleanchorlayout \title Simple Anchor Layout Example + \examplecategory {Graphics & Multimedia} \ingroup examples-graphicsview-layout \brief Demonstrates anchor layout on a graphics view scene. diff --git a/examples/widgets/doc/src/groupbox.qdoc b/examples/widgets/doc/src/groupbox.qdoc index 5c565f1c..aa339098 100644 --- a/examples/widgets/doc/src/groupbox.qdoc +++ b/examples/widgets/doc/src/groupbox.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/groupbox \title Group Box Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Group Box example shows how to use the different kinds of group boxes in Qt. diff --git a/examples/widgets/doc/src/icons.qdoc b/examples/widgets/doc/src/icons.qdoc deleted file mode 100644 index 8ec062ea..00000000 --- a/examples/widgets/doc/src/icons.qdoc +++ /dev/null @@ -1,805 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/icons - \title Icons Example - \ingroup examples-widgets - \brief The Icons example shows how QIcon can generate pixmaps reflecting - an icon's state, mode and size. - - These pixmaps are generated from the set of pixmaps made available to the - icon, and are used by Qt widgets to show an icon representing a particular - action. - - \image icons-example.png Screenshot of the Icons example - - Contents: - - \tableofcontents - - \section1 QIcon Overview - - The QIcon class provides scalable icons in different modes and - states. An icon's state and mode are depending on the intended use - of the icon. Qt currently defines four modes: - - \table - \header \li Mode \li Description - \row - \li QIcon::Normal - \li Display the pixmap when the user is not interacting with the - icon, but the functionality represented by the icon is - available. - \row - \li QIcon::Active - \li Display the pixmap when the functionality represented by the - icon is available and the user is interacting with the icon, - for example, moving the mouse over it or clicking it. - \row - \li QIcon::Disabled - \li Display the pixmap when the functionality represented by - the icon is not available. - \row - \li QIcon::Selected - \li Display the pixmap when the icon is selected. - \endtable - - QIcon's states are QIcon::On and QIcon::Off, which will display - the pixmap when the widget is in the respective state. The most - common usage of QIcon's states are when displaying checkable tool - buttons or menu entries (see QAbstractButton::setCheckable() and - QAction::setCheckable()). When a tool button or menu entry is - checked, the QIcon's state is \l{QIcon::}{On}, otherwise it's - \l{QIcon::}{Off}. You can, for example, use the QIcon's states to - display differing pixmaps depending on whether the tool button or - menu entry is checked or not. - - A QIcon can generate smaller, larger, active, disabled, and - selected pixmaps from the set of pixmaps it is given. Such - pixmaps are used by Qt widgets to show an icon representing a - particular action. - - \section1 Overview of the Icons Application - - With the Icons application you get a preview of an icon's - generated pixmaps reflecting its different states, modes and size. - - When an image is loaded into the application, it is converted into - a pixmap and becomes a part of the set of pixmaps available to the - icon. An image can be excluded from this set by checking off the - related checkbox. The application provides a sub directory - containing sets of images explicitly designed to illustrate how Qt - renders an icon in different modes and states. - - The application allows you to manipulate the icon size with some - predefined sizes and a spin box. The predefined sizes are style - dependent, but most of the styles have the same values. Only the - \macos style differs by using 32 pixels instead of 16 pixels - for toolbar buttons. You can navigate between the available styles - using the \uicontrol View menu. - - \image icons-view-menu.png Screenshot of the View menu - - The \uicontrol View menu also provide the option to make the application - guess the icon state and mode from an image's file name. The \uicontrol - File menu provide the options of adding an image and removing all - images. These last options are also available through a context - menu that appears if you press the right mouse button within the - table of image files. In addition, the \uicontrol File menu provide an - \uicontrol Exit option, and the \uicontrol Help menu provide information about - the example and about Qt. - - \image icons_find_normal.png Screenshot of the Find Files - - The screenshot above shows the application with one image file - loaded. The \uicontrol {Guess Image Mode/State} is enabled and the - style is Plastique. - - When QIcon is provided with only one available pixmap, that - pixmap is used for all the states and modes. In this case the - pixmap's icon mode is set to normal, and the generated pixmaps - for the normal and active modes will look the same. But in - disabled and selected mode, Qt will generate a slightly different - pixmap. - - The next screenshot shows the application with an additional file - loaded, providing QIcon with two available pixmaps. Note that the - new image file's mode is set to disabled. When rendering the \uicontrol - Disabled mode pixmaps, Qt will now use the new image. We can see - the difference: The generated disabled pixmap in the first - screenshot is slightly darker than the pixmap with the originally - set disabled mode in the second screenshot. - - \image icons_find_normal_disabled.png Screenshot of the Find Files - - When Qt renders the icon's pixmaps it searches through the set of - available pixmaps following a particular algorithm. The algorithm - is documented in QIcon, but we will describe some particular cases - below. - - \image icons_monkey_active.png Screenshot of the Find Files - - In the screenshot above, we have set \c monkey_on_32x32 to be an - Active/On pixmap and \c monkey_off_64x64 to be Normal/Off. To - render the other six mode/state combinations, QIcon uses the - search algorithm described in the table below: - - \table 100% - \header \li{2,1} Requested Pixmap \li {8,1} Preferred Alternatives (mode/state) - \header \li Mode \li State \li 1 \li 2 \li 3 \li 4 \li 5 \li 6 \li 7 \li 8 - \row \li{1,2} Normal \li Off \li \b N0 \li A0 \li N1 \li A1 \li D0 \li S0 \li D1 \li S1 - \row \li On \li N1 \li \b A1 \li N0 \li A0 \li D1 \li S1 \li D0 \li S0 - \row \li{1,2} Active \li Off \li A0 \li \b N0 \li A1 \li N1 \li D0 \li S0 \li D1 \li S1 - \row \li On \li \b A1 \li N1 \li A0 \li N0 \li D1 \li S1 \li D0 \li S0 - \row \li{1,2} Disabled \li Off \li D0 \li \b {N0'} \li A0' \li D1 \li N1' \li A1' \li S0' \li S1' - \row \li On \li D1 \li N1' \li \b {A1'} \li D0 \li N0' \li A0' \li S1' \li S0' - \row \li{1,2} Selected \li Off \li S0 \li \b {N0''} \li A0'' \li S1 \li N1'' \li A1'' \li D0'' \li D1'' - \row \li On \li S1 \li N1'' \li \b {A1''} \li S0 \li N0'' \li A0'' \li D1'' \li D0'' - \endtable - - In the table, "0" and "1" stand for "Off" and "On", respectively. - Single quotes indicates that QIcon generates a disabled ("grayed - out") version of the pixmap; similarly, double quuote indicate - that QIcon generates a selected ("blued out") version of the - pixmap. - - The alternatives used in the screenshot above are shown in bold. - For example, the Disabled/Off pixmap is derived by graying out - the Normal/Off pixmap (\c monkey_off_64x64). - - In the next screenshots, we loaded the whole set of monkey - images. By checking or unchecking file names from the image list, - we get different results: - - \table - \row - \li \inlineimage icons_monkey.png Screenshot of the Monkey Files - \li \inlineimage icons_monkey_mess.png Screenshot of the Monkey Files - \endtable - - For any given mode/state combination, it is possible to specify - several images at different resolutions. When rendering an - icon, QIcon will automatically pick the most suitable image - and scale it down if necessary. (QIcon never scales up images, - because this rarely looks good.) - - The screenshots below shows what happens when we provide QIcon - with three images (\c qt_extended_16x16.png, \c qt_extended_32x32.png, \c - qt_extended_48x48.png) and try to render the QIcon at various - resolutions: - - \table - \row - \li - \li \inlineimage icons_qt_extended_8x8.png Qt Extended icon at 8 x 8 - \li \inlineimage icons_qt_extended_16x16.png Qt Extended icon at 16 x 16 - \li \inlineimage icons_qt_extended_17x17.png Qt Extended icon at 17 x 17 - \row - \li - \li 8 x 8 - \li \b {16 x 16} - \li 17 x 17 - \row - \li \inlineimage icons_qt_extended_32x32.png Qt Extended icon at 32 x 32 - \li \inlineimage icons_qt_extended_33x33.png Qt Extended icon at 33 x 33 - \li \inlineimage icons_qt_extended_48x48.png Qt Extended icon at 48 x 48 - \li \inlineimage icons_qt_extended_64x64.png Qt Extended icon at 64 x 64 - \row - \li \b {32 x 32} - \li 33 x 33 - \li \b {48 x 48} - \li 64 x 64 - \endtable - - For sizes up to 16 x 16, QIcon uses \c qt_extended_16x16.png and - scales it down if necessary. For sizes between 17 x 17 and 32 x - 32, it uses \c qt_extended_32x32.png. For sizes above 32 x 32, it uses - \c qt_extended_48x48.png. - - \section1 Line-by-Line Walkthrough - - The Icons example consists of four classes: - - \list - \li \c MainWindow inherits QMainWindow and is the main application - window. - \li \c IconPreviewArea is a custom widget that displays all - combinations of states and modes for a given icon. - \li \c IconSizeSpinBox is a subclass of QSpinBox that lets the - user enter icon sizes (e.g., "48 x 48"). - \li \c ImageDelegate is a subclass of QStyledItemDelegate that - provides comboboxes for letting the user set the mode and state - associated with an image. - \endlist - - We will start by reviewing the \c IconPreviewArea class before we - take a look at the \c MainWindow class. Finally, we will review the - \c IconSizeSpinBox and \c ImageDelegate classes. - - \section2 IconPreviewArea Class Definition - - An \c IconPreviewArea widget consists of a group box containing a grid of - QLabel widgets displaying headers and pixmaps. - - \image icons_preview_area.png Screenshot of IconPreviewArea. - - \snippet widgets/icons/iconpreviewarea.h 0 - - The \c IconPreviewArea class inherits QWidget. It displays the - generated pixmaps corresponding to an icon's possible states and - modes at a given size. - - \snippet widgets/icons/iconpreviewarea.cpp 42 - - We would like the table columns to be in the order QIcon::Normal, - QIcon::Active, QIcon::Disabled, QIcon::Selected and the rows in the order - QIcon::Off, QIcon::On, which does not match the enumeration. The above code - provides arrays allowing to map from enumeration value to row/column - (by using QList::indexOf()) and back by using the array index and lists - of the matching strings. Qt's containers can be easily populated by - using C++ 11 initializer lists. - - We need two public functions to set the current icon and the - icon's size. In addition the class has three private functions: We - use the \c createHeaderLabel() and \c createPixmapLabel() - functions when constructing the preview area, and we need the \c - updatePixmapLabels() function to update the preview area when - the icon or the icon's size has changed. - - The \c NumModes and \c NumStates constants reflect \l{QIcon}'s - number of currently defined modes and states. - - \section2 IconPreviewArea Class Implementation - - \snippet widgets/icons/iconpreviewarea.cpp 0 - - In the constructor we create the labels displaying the headers and - the icon's generated pixmaps, and add them to a grid layout. - - When creating the header labels, we make sure the enums \c - NumModes and \c NumStates defined in the \c .h file, correspond - with the number of labels that we create. Then if the enums at - some point are changed, the \c Q_ASSERT() macro will alert that this - part of the \c .cpp file needs to be updated as well. - - If the application is built in debug mode, the \c Q_ASSERT() - macro will expand to - - \code - if (!condition) - qFatal("ASSERT: "condition" in file ..."); - \endcode - - In release mode, the macro simply disappear. The mode can be set - in the application's \c .pro file. One way to do so is to add an - option to \c qmake when building the application: - - \code - qmake "CONFIG += debug" icons.pro - \endcode - - or - - \code - qmake "CONFIG += release" icons.pro - \endcode - - Another approach is to add this line directly to the \c .pro - file. - - \snippet widgets/icons/iconpreviewarea.cpp 1 - \codeline - \snippet widgets/icons/iconpreviewarea.cpp 2 - - The public \c setIcon() and \c setSize() functions change the icon - or the icon size, and make sure that the generated pixmaps are - updated. - - \snippet widgets/icons/iconpreviewarea.cpp 3 - \codeline - \snippet widgets/icons/iconpreviewarea.cpp 4 - - We use the \c createHeaderLabel() and \c createPixmapLabel() - functions to create the preview area's labels displaying the - headers and the icon's generated pixmaps. Both functions return - the QLabel that is created. - - \snippet widgets/icons/iconpreviewarea.cpp 5 - - We use the private \c updatePixmapLabel() function to update the - generated pixmaps displayed in the preview area. - - For each mode, and for each state, we retrieve a pixmap using the - QIcon::pixmap() function, which generates a pixmap corresponding - to the given state, mode and size. We pass the QWindows instance - obtained by calling QWidget::windowHandle() on the top level - widget (QWidget::nativeParentWidget()) in order to retrieve - the pixmap that matches best. - We format a tooltip displaying size, actual size and device pixel - ratio. - - \section2 MainWindow Class Definition - - The \c MainWindow widget consists of three main elements: an - images group box, an icon size group box and a preview area. - - \image icons-example.png Screenshot of the Icons example - - \snippet widgets/icons/mainwindow.h 0 - - The MainWindow class inherits from QMainWindow. We reimplement the - constructor, and declare several private slots: - - \list - \li The \c about() slot simply provides information about the example. - \li The \c changeStyle() slot changes the application's GUI style and - adjust the style dependent size options. - \li The \c changeSize() slot changes the size of the preview area's icon. - \li The \c changeIcon() slot updates the set of pixmaps available to the - icon displayed in the preview area. - \li The \c addSampleImages() slot allows the user to load a new image - from the samples provided into the application. - \li The \c addOtherImages() slot allows the user to load a new image from - the directory obtained by calling - QStandardPaths::standardLocations(QStandardPaths::PicturesLocation). - \li The \c screenChanged() updates the display in the \uicontrol{High DPI} - group box to correctly display the parameters of the current screen - the window is located on. - \endlist - - In addition we declare several private functions to simplify the - constructor. - - \section2 MainWindow Class Implementation - - \snippet widgets/icons/mainwindow.cpp 0 - - In the constructor we first create the main window's central - widget and its child widgets, and put them in a grid layout. Then - we create the menus with their associated entries and actions. - - We set the window title and determine the current style for the - application. We also enable the icon size spin box by clicking the - associated radio button, making the current value of the spin box - the icon's initial size. - - \snippet widgets/icons/mainwindow.cpp 1 - - The \c about() slot displays a message box using the static - QMessageBox::about() function. In this example it displays a - simple box with information about the example. - - The \c about() function looks for a suitable icon in four - locations: It prefers its parent's icon if that exists. If it - doesn't, the function tries the top-level widget containing - parent, and if that fails, it tries the active window. As a last - resort it uses the QMessageBox's Information icon. - - \snippet widgets/icons/mainwindow.cpp 2 - - In the \c changeStyle() slot we first check the slot's - parameter. If it is false we immediately return, otherwise we find - out which style to change to, i.e. which action that triggered the - slot, using the QObject::sender() function. - - This function returns the sender as a QObject pointer. Since we - know that the sender is a QAction object, we can safely cast the - QObject. We could have used a C-style cast or a C++ \c - static_cast(), but as a defensive programming technique we use a - \l qobject_cast(). The advantage is that if the object has the - wrong type, a null pointer is returned. Crashes due to null - pointers are much easier to diagnose than crashes due to unsafe - casts. - - \snippet widgets/icons/mainwindow.cpp 3 - \snippet widgets/icons/mainwindow.cpp 4 - - Once we have the action, we extract the style name using - QAction::data(). Then we create a QStyle object using the static - QStyleFactory::create() function. - - Although we can assume that the style is supported by the - QStyleFactory: To be on the safe side, we use the \c Q_ASSERT() - macro to check if the created style is valid before we use the - QApplication::setStyle() function to set the application's GUI - style to the new style. QApplication will automatically delete - the style object when a new style is set or when the application - exits. - - The predefined icon size options provided in the application are - style dependent, so we need to update the labels in the icon size - group box and in the end call the \c changeSize() slot to update - the icon's size. - - \snippet widgets/icons/mainwindow.cpp 5 - - The \c changeSize() slot sets the size for the preview area's - icon. - - It is invoked by the QButtonGroup whose members are radio buttons for - controlling the icon size. In \c createIconSizeGroupBox(), each button is - assigned a QStyle::PixelMetric value as an id, which is passed as a - parameter to the slot. - - The special value \c OtherSize indicates that the spin box is - enabled. If it is, we extract the extent of the new size from the - box. If it's not, we query the style for the metric. Then we create - a QSize object based on the extent, and use that object to set the - size of the preview area's icon. - - \snippet widgets/icons/mainwindow.cpp 12 - - The function \c addImages() is called by the slot addSampleImages() - passing the samples directory, or by the slot addOtherImages() - passing the directory obtained by querying - QStandardPaths::standardLocations(). - - The first thing we do is to show a file dialog to the user. - We initialize it to show the filters returned by - QImageReader::supportedMimeTypes(). - - For each of the files the file dialog returns, we add a row to the - table widget. The table widget is listing the images the user has - loaded into the application. - - \snippet widgets/icons/mainwindow.cpp 13 - - We retrieve the image name using the QFileInfo::baseName() - function that returns the base name of the file without the path, - and create the first table widget item in the row. - We check if a high resolution version of the image exists (identified by - the suffix \c @2x on the base name) and display that along with the size - in the tooltip. - - We add the file's complete name to the item's data. Since an item can - hold several information pieces, we need to assign the file name a role - that will distinguish it from other data. This role can be Qt::UserRole - or any value above it. - - We also make sure that the item is not editable by removing the - Qt::ItemIsEditable flag. Table items are editable by default. - - \snippet widgets/icons/mainwindow.cpp 15 - - Then we create the second and third items in the row making the - default mode Normal and the default state Off. But if the \uicontrol - {Guess Image Mode/State} option is checked, and the file name - contains "_act", "_dis", or "_sel", the modes are changed to - Active, Disabled, or Selected. And if the file name contains - "_on", the state is changed to On. The sample files in the - example's \c images subdirectory respect this naming convention. - - \snippet widgets/icons/mainwindow.cpp 18 - - In the end we add the items to the associated row, and use the - QTableWidget::openPersistentEditor() function to create - comboboxes for the mode and state columns of the items. - - Due to the connection between the table widget's \l - {QTableWidget::itemChanged()}{itemChanged()} signal and the \c - changeIcon() slot, the new image is automatically converted into a - pixmap and made part of the set of pixmaps available to the icon - in the preview area. So, corresponding to this fact, we need to - make sure that the new image's check box is enabled. - - \snippet widgets/icons/mainwindow.cpp 6 - - The \c changeIcon() slot is called when the user alters the set - of images listed in the QTableWidget, to update the QIcon object - rendered by the \c IconPreviewArea. - - We first create a QIcon object, and then we run through the - QTableWidget, which lists the images the user has loaded into the - application. - - \snippet widgets/icons/mainwindow.cpp 8 - - We also extract the image file's name using the - QTableWidgetItem::data() function. This function takes a - Qt::DataItemRole as an argument to retrieve the right data - (remember that an item can hold several pieces of information) - and returns it as a QVariant. Then we use the - QVariant::toString() function to get the file name as a QString. - - To create a pixmap from the file, we need to first create an - image and then convert this image into a pixmap using - QPixmap::fromImage(). Once we have the final pixmap, we add it, - with its associated mode and state, to the QIcon's set of - available pixmaps. - - \snippet widgets/icons/mainwindow.cpp 11 - - After running through the entire list of images, we change the - icon of the preview area to the one we just created. - - \snippet widgets/icons/mainwindow.cpp 20 - - In the \c removeAllImages() slot, we simply set the table widget's - row count to zero, automatically removing all the images the user - has loaded into the application. Then we update the set of pixmaps - available to the preview area's icon using the \c changeIcon() - slot. - - \image icons_images_groupbox.png Screenshot of the images group box - - The \c createImagesGroupBox() function is implemented to simplify - the constructor. The main purpose of the function is to create a - QTableWidget that will keep track of the images the user has - loaded into the application. - - \snippet widgets/icons/mainwindow.cpp 21 - - First we create a group box that will contain the table widget. - Then we create a QTableWidget and customize it to suit our - purposes. - - We call QAbstractItemView::setSelectionMode() to prevent the user - from selecting items. - - The QAbstractItemView::setItemDelegate() call sets the item - delegate for the table widget. We create a \c ImageDelegate that - we make the item delegate for our view. - - The QStyledItemDelegate class can be used to provide an editor for an item view - class that is subclassed from QAbstractItemView. Using a delegate - for this purpose allows the editing mechanism to be customized and - developed independently from the model and view. - - In this example we derive \c ImageDelegate from QStyledItemDelegate. - QStyledItemDelegate usually provides line editors, while our subclass - \c ImageDelegate, provides comboboxes for the mode and state - fields. - - \snippet widgets/icons/mainwindow.cpp 22 - - Then we customize the QTableWidget's horizontal header, and hide - the vertical header. - - \snippet widgets/icons/mainwindow.cpp 24 - - At the end, we connect the QTableWidget::itemChanged() signal to - the \c changeIcon() slot to ensure that the preview area is in - sync with the image table. - - \image icons_size_groupbox.png Screenshot of the icon size group box - - The \c createIconSizeGroupBox() function is called from the - constructor. It creates the widgets controlling the size of the - preview area's icon. - - \snippet widgets/icons/mainwindow.cpp 26 - - First we create a group box that will contain all the widgets; - then we create the radio buttons and the spin box. We add the - radio buttons to an instance of QButtonGroup, using the value - of the QStyle::PixelMetric they represent as an integer id. - - \snippet widgets/icons/mainwindow.cpp 40 - - We introduce an enumeration constant \c OtherSize to represent - a custom size. - - The spin box is not a regular QSpinBox but an \c IconSizeSpinBox. - The \c IconSizeSpinBox class inherits QSpinBox and reimplements - two functions: QSpinBox::textFromValue() and - QSpinBox::valueFromText(). The \c IconSizeSpinBox is designed to - handle icon sizes, e.g., "32 x 32", instead of plain integer - values. - - \snippet widgets/icons/mainwindow.cpp 27 - - Then we connect all of the radio buttons - \l{QRadioButton::toggled()}{toggled()} signals and the spin box's - \l {QSpinBox::valueChanged()}{valueChanged()} signal to the \c - changeSize() slot to make sure that the size of the preview - area's icon is updated whenever the user changes the icon size. - In the end we put the widgets in a layout that we install on the - group box. - - \snippet widgets/icons/mainwindow.cpp 28 - - In the \c createActions() function we create and customize all the - actions needed to implement the functionality associated with the - menu entries in the application. - - In particular we create the \c styleActionGroup based on the - currently available GUI styles using - QStyleFactory. QStyleFactory::keys() returns a list of valid keys, - typically including "windows" and "fusion". Depending on the platform, - "windowsvista" and "macos" may be available. - - We create one action for each key, and adds the action to the - action group. Also, for each action, we call QAction::setData() - with the style name. We will retrieve it later using - QAction::data(). - - As we go along, we create the \uicontrol File, \uicontrol View and - \uicontrol Help menus and add the actions to them. - - The QMenu class provides a menu widget for use in menu bars, - context menus, and other popup menus. We put each menu in the - application's menu bar, which we retrieve using - QMainWindow::menuBar(). - - \snippet widgets/icons/mainwindow.cpp 30 - - QWidgets have a \l{QWidget::contextMenuPolicy}{contextMenuPolicy} - property that controls how the widget should behave when the user - requests a context menu (e.g., by right-clicking). We set the - QTableWidget's context menu policy to Qt::ActionsContextMenu, - meaning that the \l{QAction}s associated with the widget should - appear in its context menu. - - Then we add the \uicontrol{Add Image} and \uicontrol{Remove All Images} - actions to the table widget. They will then appear in the table - widget's context menu. - - \snippet widgets/icons/mainwindow.cpp 31 - - In the \c checkCurrentStyle() function we go through the group of - style actions, looking for the current GUI style. - - For each action, we first extract the style name using - QAction::data(). Since this is only a QStyleFactory key (e.g., - "macos"), we cannot compare it directly to the current - style's class name. We need to create a QStyle object using the - static QStyleFactory::create() function and compare the class - name of the created QStyle object with that of the current style. - As soon as we are done with a QStyle candidate, we delete it. - - For all QObject subclasses that use the \c Q_OBJECT macro, the - class name of an object is available through its - \l{QObject::metaObject()}{meta-object}. - - We can assume that the style is supported by - QStyleFactory, but to be on the safe side we use the \c - Q_ASSERT() macro to make sure that QStyleFactory::create() - returned a valid pointer. - - \snippet widgets/icons/mainwindow.cpp 44 - - We overload the show() function to set up the updating of the - current screen in \c screenChanged(). After calling QWidget::show(), - the QWindow associated with the QWidget is created and we can - connect to its QWindow::screenChanged() signal. - - \section2 IconSizeSpinBox Class Definition - - \snippet widgets/icons/iconsizespinbox.h 0 - - The \c IconSizeSpinBox class is a subclass of QSpinBox. A plain - QSpinBox can only handle integers. But since we want to display - the spin box's values in a more sophisticated way, we need to - subclass QSpinBox and reimplement the QSpinBox::textFromValue() - and QSpinBox::valueFromText() functions. - - \image icons_size_spinbox.png Screenshot of the icon size spinbox - - \section2 IconSizeSpinBox Class Implementation - - \snippet widgets/icons/iconsizespinbox.cpp 0 - - The constructor is trivial. - - \snippet widgets/icons/iconsizespinbox.cpp 2 - - QSpinBox::textFromValue() is used by the spin box whenever it - needs to display a value. The default implementation returns a - base 10 representation of the \c value parameter. - - Our reimplementation returns a QString of the form "32 x 32". - - \snippet widgets/icons/iconsizespinbox.cpp 1 - - The QSpinBox::valueFromText() function is used by the spin box - whenever it needs to interpret text typed in by the user. Since - we reimplement the \c textFromValue() function we also need to - reimplement the \c valueFromText() function to interpret the - parameter text and return the associated int value. - - We parse the text using a regular expression (a QRegularExpression). We - define an expression that matches one or several digits, - optionally followed by whitespace, an "x" or the times symbol, - whitespace and one or several digits again. - - The first digits of the regular expression are captured using - parentheses. This enables us to use the QRegularExpressionMatch::captured() - or QRegularExpressionMatch::capturedTexts() functions to extract the matched - characters. If the first and second numbers of the spin box value - differ (e.g., "16 x 24"), we use the first number. - - When the user presses \uicontrol Enter, QSpinBox first calls - QSpinBox::valueFromText() to interpret the text typed by the - user, then QSpinBox::textFromValue() to present it in a canonical - format (e.g., "16 x 16"). - - \section2 ImageDelegate Class Definition - - \snippet widgets/icons/imagedelegate.h 0 - - The \c ImageDelegate class is a subclass of QStyledItemDelegate. The - QStyledItemDelegate class provides display and editing facilities for - data items from a model. A single QStyledItemDelegate object is - responsible for all items displayed in a item view (in our case, - a QTableWidget). - - A QStyledItemDelegate can be used to provide an editor for an item view - class that is subclassed from QAbstractItemView. Using a delegate - for this purpose allows the editing mechanism to be customized and - developed independently from the model and view. - - \snippet widgets/icons/imagedelegate.h 1 - - The default implementation of QStyledItemDelegate creates a QLineEdit. - Since we want the editor to be a QComboBox, we need to subclass - QStyledItemDelegate and reimplement the QStyledItemDelegate::createEditor(), - QStyledItemDelegate::setEditorData() and QStyledItemDelegate::setModelData() - functions. - - \snippet widgets/icons/imagedelegate.h 2 - - The \c emitCommitData() slot is used to emit the - QImageDelegate::commitData() signal with the appropriate - argument. - - \section2 ImageDelegate Class Implementation - - \snippet widgets/icons/imagedelegate.cpp 0 - - The constructor is trivial. - - \snippet widgets/icons/imagedelegate.cpp 1 - - The default QStyledItemDelegate::createEditor() implementation returns - the widget used to edit the item specified by the model and item - index for editing. The parent widget and style option are used to - control the appearance of the editor widget. - - Our reimplementation creates and populates a combobox instead of - the default line edit. The contents of the combobox depends on - the column in the table for which the editor is requested. Column - 1 contains the QIcon modes, whereas column 2 contains the QIcon - states. - - In addition, we connect the combobox's \l - {QComboBox::activated()}{activated()} signal to the \c - emitCommitData() slot to emit the - QAbstractItemDelegate::commitData() signal whenever the user - chooses an item using the combobox. This ensures that the rest of - the application notices the change and updates itself. - - \snippet widgets/icons/imagedelegate.cpp 2 - - The QStyledItemDelegate::setEditorData() function is used by - QTableWidget to transfer data from a QTableWidgetItem to the - editor. The data is stored as a string; we use - QComboBox::findText() to locate it in the combobox. - - Delegates work in terms of models, not items. This makes it - possible to use them with any item view class (e.g., QListView, - QListWidget, QTreeView, etc.). The transition between model and - items is done implicitly by QTableWidget; we don't need to worry - about it. - - \snippet widgets/icons/imagedelegate.cpp 3 - - The QStyledItemDelegate::setEditorData() function is used by QTableWidget - to transfer data back from the editor to the \l{QTableWidgetItem}. - - \snippet widgets/icons/imagedelegate.cpp 4 - - The \c emitCommitData() slot simply emit the - QAbstractItemDelegate::commitData() signal for the editor that - triggered the slot. This signal must be emitted when the editor - widget has completed editing the data, and wants to write it back - into the model. - - \section2 The Implementation of the Function main() - - \snippet widgets/icons/main.cpp 45 - - We use QCommandLineParser to handle any command line options or parameters - passed to the application. Then, we resize the main window according - to the available screen geometry and show it. -*/ diff --git a/examples/widgets/doc/src/imagecomposition.qdoc b/examples/widgets/doc/src/imagecomposition.qdoc index 3b192f37..42ddab22 100644 --- a/examples/widgets/doc/src/imagecomposition.qdoc +++ b/examples/widgets/doc/src/imagecomposition.qdoc @@ -4,6 +4,7 @@ /*! \example painting/imagecomposition \title Image Composition Example + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \ingroup examples-layout \brief Shows how composition modes work in QPainter. diff --git a/examples/widgets/doc/src/imageviewer.qdoc b/examples/widgets/doc/src/imageviewer.qdoc deleted file mode 100644 index aa6eec46..00000000 --- a/examples/widgets/doc/src/imageviewer.qdoc +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/imageviewer - \title Image Viewer Example - \ingroup examples-widgets - \brief The example shows how to combine QLabel and QScrollArea to - display an image. - - QLabel is typically used for displaying text, - but it can also display an image. QScrollArea provides a - scrolling view around another widget. If the child widget exceeds - the size of the frame, QScrollArea automatically provides scroll - bars. - - The example demonstrates how QLabel's ability to scale its - contents (QLabel::scaledContents), and QScrollArea's ability to - automatically resize its contents (QScrollArea::widgetResizable), - can be used to implement zooming and scaling features. In - addition the example shows how to use QPainter to print an image. - - \borderedimage imageviewer-example.png - \caption Screenshot of the Image Viewer example - - With the Image Viewer application, the users can view an image of - their choice. The \uicontrol File menu gives the user the possibility - to: - - \list - \li \uicontrol{Open...} - Open an image file - \li \uicontrol{Print...} - Print an image - \li \uicontrol{Exit} - Exit the application - \endlist - - Once an image is loaded, the \uicontrol View menu allows the users to: - - \list - \li \uicontrol{Zoom In} - Scale the image up by 25% - \li \uicontrol{Zoom Out} - Scale the image down by 25% - \li \uicontrol{Normal Size} - Show the image at its original size - \li \uicontrol{Fit to Window} - Stretch the image to occupy the entire window - \endlist - - In addition the \uicontrol Help menu provides the users with information - about the Image Viewer example in particular, and about Qt in - general. - - \section1 ImageViewer Class Definition - - \snippet widgets/imageviewer/imageviewer.h 0 - - The \c ImageViewer class inherits from QMainWindow. We reimplement - the constructor, and create several private slots to facilitate - the menu entries. In addition we create four private functions. - - We use \c createActions() and \c createMenus() when constructing - the \c ImageViewer widget. We use the \c updateActions() function - to update the menu entries when a new image is loaded, or when - the \uicontrol {Fit to Window} option is toggled. The zoom slots use \c - scaleImage() to perform the zooming. In turn, \c - scaleImage() uses \c adjustScrollBar() to preserve the focal point after - scaling an image. - - \section1 ImageViewer Class Implementation - - \snippet widgets/imageviewer/imageviewer.cpp 0 - - In the constructor we first create the label and the scroll area. - - We set \c {imageLabel}'s size policy to \l - {QSizePolicy::Ignored}{ignored}, making the users able to scale - the image to whatever size they want when the \uicontrol {Fit to Window} - option is turned on. Otherwise, the default size polizy (\l - {QSizePolicy::Preferred}{preferred}) will make scroll bars appear - when the scroll area becomes smaller than the label's minimum size - hint. - - We ensure that the label will scale its contents to fill all - available space, to enable the image to scale properly when - zooming. If we omitted to set the \c {imageLabel}'s \l - {QLabel::scaledContents}{scaledContents} property, zooming in - would enlarge the QLabel, but leave the pixmap at - its original size, exposing the QLabel's background. - - We make \c imageLabel the scroll area's child widget, and we make - \c scrollArea the central widget of the QMainWindow. At the end - we create the associated actions and menus, and customize the \c - {ImageViewer}'s appearance. - - \snippet widgets/imageviewer/imageviewer.cpp 1 - - In the \c open() slot, we show a file dialog to the user. We compile - a list of mime types for use as a filter by querying QImageReader - for the available mime type names. - - We show the file dialog until a valid file name is entered or - the user cancels. - - The function \c loadFile() is used to load the image. - - \snippet widgets/imageviewer/imageviewer.cpp 2 - - In the \c loadFile() function, we instantiate a QImageReader - and enable automatic transformations by calling - QImageReader::setAutoTransform(). For files in JPEG format, - this ensures that portrait mode images of digital cameras are shown - correctly by applying the appropriate orientation read from the - EXIF meta data stored in the image file. - - We then load the image using QImageReader::read(). If this returns - a null image, indicating that the file is not an image file, - we use a QMessageBox to alert the user. - - The QMessageBox class provides a modal dialog with a short - message, an icon, and some buttons. As with QFileDialog the - easiest way to create a QMessageBox is to use its static - convenience functions. QMessageBox provides a range of different - messages arranged along two axes: severity (question, - information, warning and critical) and complexity (the number of - necessary response buttons). In this particular example an - information message with an \uicontrol OK button (the default) is - sufficient, since the message is part of a normal operation. - - \snippet widgets/imageviewer/imageviewer.cpp 4 - - If the format is supported, we display the image in \c imageLabel - by setting the label's \l {QLabel::pixmap}{pixmap}. Then we enable - the \uicontrol Print and \uicontrol {Fit to Window} menu entries and update - the rest of the view menu entries. The \uicontrol Open and \uicontrol Exit - entries are enabled by default. - - If the \uicontrol {Fit to Window} option is turned off, the - QScrollArea::widgetResizable property is \c false and it is - our responsibility (not QScrollArea's) to give the QLabel a - reasonable size based on its contents. We call - \{QWidget::adjustSize()}{adjustSize()} to achieve this, which is - essentially the same as - - \code - imageLabel->resize(imageLabel->pixmap()->size()); - \endcode - - In the \c print() slot, we first make sure that an image has been - loaded into the application: - - \snippet widgets/imageviewer/imageviewer.cpp 5 - \snippet widgets/imageviewer/imageviewer.cpp 6 - - If the application is built in debug mode, the \c Q_ASSERT() macro - will expand to - - \code - if (imageLabel->pixmap().isNull()) - qFatal("ASSERT: "imageLabel->pixmap().isNull()" in file ..."); - \endcode - - In release mode, the macro simply disappear. The mode can be set - in the application's \c .pro file. One way to do so is to add an - option to \uicontrol qmake when building the application: - - \code - qmake "CONFIG += debug" foo.pro - \endcode - - or - - \code - qmake "CONFIG += release" foo.pro - \endcode - - Another approach is to add this line directly to the \c .pro - file. - - \snippet widgets/imageviewer/imageviewer.cpp 7 - \snippet widgets/imageviewer/imageviewer.cpp 8 - - Then we present a print dialog allowing the user to choose a - printer and to set a few options. We construct a painter with a - QPrinter as the paint device. We set the painter's window - and viewport in such a way that the image is as large as possible - on the paper, but without altering its - \l{Qt::KeepAspectRatio}{aspect ratio}. - - In the end we draw the pixmap at position (0, 0). - - \snippet widgets/imageviewer/imageviewer.cpp 9 - \snippet widgets/imageviewer/imageviewer.cpp 10 - - We implement the zooming slots using the private \c scaleImage() - function. We set the scaling factors to 1.25 and 0.8, - respectively. These factor values ensure that a \uicontrol {Zoom In} - action and a \uicontrol {Zoom Out} action will cancel each other (since - 1.25 * 0.8 == 1), and in that way the normal image size can be - restored using the zooming features. - - The screenshots below show an image in its normal size, and the - same image after zooming in: - - \table - \row - \li \inlineimage imageviewer-original_size.png - \li \inlineimage imageviewer-zoom_in_1.png - \li \inlineimage imageviewer-zoom_in_2.png - \endtable - - \snippet widgets/imageviewer/imageviewer.cpp 11 - \snippet widgets/imageviewer/imageviewer.cpp 12 - - When zooming, we use the QLabel's ability to scale its contents. - Such scaling doesn't change the actual size hint of the contents. - And since the \l {QLabel::adjustSize()}{adjustSize()} function - use those size hint, the only thing we need to do to restore the - normal size of the currently displayed image is to call \c - adjustSize() and reset the scale factor to 1.0. - - \snippet widgets/imageviewer/imageviewer.cpp 13 - \snippet widgets/imageviewer/imageviewer.cpp 14 - - The \c fitToWindow() slot is called each time the user toggled - the \uicontrol {Fit to Window} option. If the slot is called to turn on - the option, we tell the scroll area to resize its child widget - with the QScrollArea::setWidgetResizable() function. Then we - disable the \uicontrol {Zoom In}, \uicontrol {Zoom Out} and \uicontrol {Normal - Size} menu entries using the private \c updateActions() function. - - If the \l {QScrollArea::widgetResizable} property is set to \c - false (the default), the scroll area honors the size of its child - widget. If this property is set to \c true, the scroll area will - automatically resize the widget in order to avoid scroll bars - where they can be avoided, or to take advantage of extra space. - But the scroll area will honor the minimum size hint of its child - widget independent of the widget resizable property. So in this - example we set \c {imageLabel}'s size policy to \l - {QSizePolicy::Ignored}{ignored} in the constructor, to avoid that - scroll bars appear when the scroll area becomes smaller than the - label's minimum size hint. - - The screenshots below shows an image in its normal size, and the - same image with the \uicontrol {Fit to window} option turned on. - Enlarging the window will stretch the image further, as shown in - the third screenshot. - - \table - \row - \li \inlineimage imageviewer-original_size.png - \li \inlineimage imageviewer-fit_to_window_1.png - \li \inlineimage imageviewer-fit_to_window_2.png - \endtable - - If the slot is called to turn off the option, the - {QScrollArea::setWidgetResizable} property is set to \c false. We - also restore the image pixmap to its normal size by adjusting the - label's size to its content. And in the end we update the view - menu entries. - - \snippet widgets/imageviewer/imageviewer.cpp 15 - \snippet widgets/imageviewer/imageviewer.cpp 16 - - We implement the \c about() slot to create a message box - describing what the example is designed to show. - - \snippet widgets/imageviewer/imageviewer.cpp 17 - \snippet widgets/imageviewer/imageviewer.cpp 18 - - In the private \c createAction() function, we create the - actions providing the application features and populate - a menu with them. - - We assign a short-cut key to each action and connect them to the - appropriate slots. We only enable the \c openAct and \c exitAct at - the time of creation, the others are updated once an image has - been loaded into the application. In addition we make the \c - fitToWindowAct \l {QAction::checkable}{checkable}. - - The QMenu class provides a menu widget for use in menu bars, - context menus, and other popup menus. The QMenuBar class provides - a horizontal menu bar that consists of a list of pull-down menu - items. So we put the menus in the \c {ImageViewer}'s - menu bar which we retrieve with the QMainWindow::menuBar() - function. - - \snippet widgets/imageviewer/imageviewer.cpp 21 - \snippet widgets/imageviewer/imageviewer.cpp 22 - - The private \c updateActions() function enables or disables the - \uicontrol {Zoom In}, \uicontrol {Zoom Out} and \uicontrol {Normal Size} menu - entries depending on whether the \uicontrol {Fit to Window} option is - turned on or off. - - \snippet widgets/imageviewer/imageviewer.cpp 23 - \snippet widgets/imageviewer/imageviewer.cpp 24 - - In \c scaleImage(), we use the \c factor parameter to calculate - the new scaling factor for the displayed image, and resize \c - imageLabel. Since we set the - \l{QLabel::scaledContents}{scaledContents} property to \c true in - the constructor, the call to QWidget::resize() will scale the - image displayed in the label. We also adjust the scroll bars to - preserve the focal point of the image. - - At the end, if the scale factor is less than 33.3% or greater - than 300%, we disable the respective menu entry to prevent the - image pixmap from becoming too large, consuming too much - resources in the window system. - - \snippet widgets/imageviewer/imageviewer.cpp 25 - \snippet widgets/imageviewer/imageviewer.cpp 26 - - Whenever we zoom in or out, we need to adjust the scroll bars in - consequence. It would have been tempting to simply call - - \code - scrollBar->setValue(int(factor * scrollBar->value())); - \endcode - - but this would make the top-left corner the focal point, not the - center. Therefore we need to take into account the scroll bar - handle's size (the \l{QScrollBar::pageStep}{page step}). -*/ diff --git a/examples/widgets/doc/src/interview.qdoc b/examples/widgets/doc/src/interview.qdoc deleted file mode 100644 index 328e4fc9..00000000 --- a/examples/widgets/doc/src/interview.qdoc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/interview - \title Interview - \ingroup examples-itemviews - \brief This example demonstrates the usage of the model/view framework. - - \brief The Interview example explores the flexibility and scalability of the - model/view framework by presenting an infinitely deep data structure using a model - and three different types of view. - - \image interview-demo.png -*/ diff --git a/examples/widgets/doc/src/itemviewspuzzle.qdoc b/examples/widgets/doc/src/itemviewspuzzle.qdoc deleted file mode 100644 index c1e0c361..00000000 --- a/examples/widgets/doc/src/itemviewspuzzle.qdoc +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/puzzle - \title Item Views Puzzle Example - \ingroup examples-itemviews - \brief The Puzzle example shows how to enable drag and drop with a custom model - to allow items to be transferred between a view and another widget. - - \image itemviewspuzzle-example.png - - This example is an implementation of a simple jigsaw puzzle game using the - built-in support for drag and drop provided by Qt's model/view framework. - The \l{Drag and Drop Puzzle Example}{Drag and Drop Puzzle} example shows - many of the same features, but takes an alternative approach that uses Qt's - drag and drop API at the application level to handle drag and drop - operations. -*/ diff --git a/examples/widgets/doc/src/licensewizard.qdoc b/examples/widgets/doc/src/licensewizard.qdoc index 2770a38a..66c822e4 100644 --- a/examples/widgets/doc/src/licensewizard.qdoc +++ b/examples/widgets/doc/src/licensewizard.qdoc @@ -4,6 +4,7 @@ /*! \example dialogs/licensewizard \title License Wizard Example + \examplecategory {User Interface Components} \ingroup examples-dialogs \brief The License Wizard example shows how to implement complex wizards in @@ -13,7 +14,7 @@ Most wizards have a linear structure, with page 1 followed by page 2 and so on until the last page. The - \l{dialogs/classwizard}{Class Wizard} example shows how to create + \l{dialogs/trivialwizard}{Trivial Wizard} example shows how to create such wizards. Some wizards are more complex in that they allow different @@ -191,5 +192,5 @@ option and disconnect the \c printButtonClicked() slot. \endlist - \sa QWizard, {Class Wizard Example}, {Trivial Wizard Example} + \sa QWizard, {Trivial Wizard Example} */ diff --git a/examples/widgets/doc/src/lineedits.qdoc b/examples/widgets/doc/src/lineedits.qdoc index c268f473..d11c080c 100644 --- a/examples/widgets/doc/src/lineedits.qdoc +++ b/examples/widgets/doc/src/lineedits.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/lineedits \title Line Edits Example + \examplecateogry {User Interface Components} \ingroup examples-widgets \brief The Line Edits example demonstrates the many ways that QLineEdit can be used, and shows the effects of various properties and validators diff --git a/examples/widgets/doc/src/mainwindow.qdoc b/examples/widgets/doc/src/mainwindow.qdoc deleted file mode 100644 index ca284012..00000000 --- a/examples/widgets/doc/src/mainwindow.qdoc +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example mainwindows/mainwindow - \title Main Window - \ingroup examples-mainwindow - - \brief The Main Window example shows Qt's extensive support for tool bars, - dock windows, menus, and other standard application features. - - \image mainwindow-demo.png -*/ diff --git a/examples/widgets/doc/src/mdi.qdoc b/examples/widgets/doc/src/mdi.qdoc deleted file mode 100644 index 23daeeb9..00000000 --- a/examples/widgets/doc/src/mdi.qdoc +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example mainwindows/mdi - \title MDI Example - \ingroup examples-mainwindow - - \brief The MDI example shows how to implement a Multiple Document Interface using Qt's - QMdiArea class. - - \image mdi-example.png - -*/ diff --git a/examples/widgets/doc/src/menus.qdoc b/examples/widgets/doc/src/menus.qdoc index 2bffd17b..db03eeec 100644 --- a/examples/widgets/doc/src/menus.qdoc +++ b/examples/widgets/doc/src/menus.qdoc @@ -4,6 +4,7 @@ /*! \example mainwindows/menus \title Menus Example + \examplecategory {User Interface Components} \ingroup examples-mainwindow \ingroup examples-layout diff --git a/examples/widgets/doc/src/movie.qdoc b/examples/widgets/doc/src/movie.qdoc deleted file mode 100644 index d5aebc41..00000000 --- a/examples/widgets/doc/src/movie.qdoc +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/movie - \title Movie Example - \ingroup examples-widgets - \brief The Movie example demonstrates how to use QMovie and QLabel to - display animations. - - QMovie is mostly useful if one wants to play - a simple animation without the added complexity of a multimedia - framework to install and deploy. - - \borderedimage movie-example.png -*/ diff --git a/examples/widgets/doc/src/orderform.qdoc b/examples/widgets/doc/src/orderform.qdoc index 529ed6d2..7ae89dfd 100644 --- a/examples/widgets/doc/src/orderform.qdoc +++ b/examples/widgets/doc/src/orderform.qdoc @@ -4,6 +4,7 @@ /*! \example richtext/orderform \title Order Form Example + \examplecategory {User Interface Components} \ingroup examples-richtext \brief The Order Form example shows how to generate rich text documents by combining a simple template with data input by the diff --git a/examples/widgets/doc/src/painterpaths.qdoc b/examples/widgets/doc/src/painterpaths.qdoc index 55e78c84..05d21cc0 100644 --- a/examples/widgets/doc/src/painterpaths.qdoc +++ b/examples/widgets/doc/src/painterpaths.qdoc @@ -4,6 +4,7 @@ /*! \example painting/painterpaths \title Painter Paths Example + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief The Painter Paths example shows how painter paths can be used to beuild complex shapes for rendering. diff --git a/examples/widgets/doc/src/pathstroke.qdoc b/examples/widgets/doc/src/pathstroke.qdoc index 01c3771d..cfb98bc3 100644 --- a/examples/widgets/doc/src/pathstroke.qdoc +++ b/examples/widgets/doc/src/pathstroke.qdoc @@ -4,6 +4,7 @@ /*! \example painting/pathstroke \title Path Stroking + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief The Path Stroking example shows various types of pens that can be used with QPainter. diff --git a/examples/widgets/doc/src/pixelator.qdoc b/examples/widgets/doc/src/pixelator.qdoc deleted file mode 100644 index ab6f639d..00000000 --- a/examples/widgets/doc/src/pixelator.qdoc +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/pixelator - \title Pixelator Example - \ingroup examples-itemviews - \brief The Pixelator example shows how delegates can be used to customize the way that - items are rendered in standard item views. - - \image pixelator-example.png - - By default, QTreeView, QTableView, and QListView use a standard item delegate - to display and edit a set of common data types that are sufficient for many - applications. However, an application may need to represent items of data in a - particular way, or provide support for rendering more specialized data types, - and this often requires the use of a custom delegate. - - In this example, we show how to use custom delegates to modify the appearance - of standard views. To do this, we implement the following components: - - \list - \li A model which represents each pixel in an image as an item of data, where each - item contains a value for the brightness of the corresponding pixel. - \li A custom delegate that uses the information supplied by the model to represent - each pixel as a black circle on a white background, where the radius of the - circle corresponds to the darkness of the pixel. - \endlist - - This example may be useful for developers who want to implement their own table - models or custom delegates. The process of creating custom delegates for editing - item data is covered in the \l{Spin Box Delegate Example}{Spin Box Delegate} - example. - - \section1 ImageModel Class Definition - - The \c ImageModel class is defined as follows: - - \snippet itemviews/pixelator/imagemodel.h 0 - - Since we only require a simple, read-only table model, we only need to implement - functions to indicate the dimensions of the image and supply data to other - components. - - \section1 ImageModel Class Implementation - - The constructor is trivial: - - \snippet itemviews/pixelator/imagemodel.cpp 0 - - The \c setImage() function sets the image that will be used by the model: - - \snippet itemviews/pixelator/imagemodel.cpp 1 - - The QAbstractItemModel::reset() call tells the view(s) that the model - has changed. - - The \c rowCount() and \c columnCount() functions return the height and width of - the image respectively: - - \snippet itemviews/pixelator/imagemodel.cpp 2 - \snippet itemviews/pixelator/imagemodel.cpp 3 - - Since the image is a simple two-dimensional structure, the \c parent arguments - to these functions are unused. They both simply return the relevant size from - the underlying image object. - - The \c data() function returns data for the item that corresponds to a given - model index in a format that is suitable for a particular role: - - \snippet itemviews/pixelator/imagemodel.cpp 4 - - In this implementation, we only check that the model index is valid, and that - the role requested is the \l{Qt::ItemDataRole}{DisplayRole}. If so, the function - returns the grayscale value of the relevant pixel in the image; otherwise, a null - model index is returned. - - This model can be used with QTableView to display the integer brightness values - for the pixels in the image. However, we will implement a custom delegate to - display this information in a more artistic way. - - The \c headerData() function is also reimplemented: - - \snippet itemviews/pixelator/imagemodel.cpp 5 - - We return (1, 1) as the size hint for a header item. If we - didn't, the headers would default to a larger size, preventing - us from displaying really small items (which can be specified - using the \uicontrol{Pixel size} combobox). - - \section1 PixelDelegate Class Definition - - The \c PixelDelegate class is defined as follows: - - \snippet itemviews/pixelator/pixeldelegate.h 0 - - This class provides only basic features for a delegate so, unlike the - \l{Spin Box Delegate Example}{Spin Box Delegate} example, we subclass - QAbstractItemDelegate instead of QItemDelegate. - - We only need to reimplement \l{QAbstractItemDelegate::paint()}{paint()} and - \l{QAbstractItemDelegate::sizeHint()}{sizeHint()} in this class. - However, we also provide a delegate-specific \c setPixelSize() function so - that we can change the delegate's behavior via the signals and slots mechanism. - - \section1 PixelDelegate Class Implementation - - The \c PixelDelegate constructor is used to set up a default value for - the size of each "pixel" that it renders. The base class constructor is - also called to ensure that the delegate is set up with a parent object, - if one is supplied: - - \snippet itemviews/pixelator/pixeldelegate.cpp 0 - - Each item is rendered by the delegate's - \l{QAbstractItemDelegate::paint()}{paint()} function. The view calls this - function with a ready-to-use QPainter object, style information that the - delegate should use to correctly draw the item, and an index to the item in - the model: - - \snippet itemviews/pixelator/pixeldelegate.cpp 1 - - The first task the delegate has to perform is to draw the item's background - correctly. Usually, selected items appear differently to non-selected items, - so we begin by testing the state passed in the style option and filling the - background if necessary. - - The radius of each circle is calculated in the following lines of code: - - \snippet itemviews/pixelator/pixeldelegate.cpp 3 - \snippet itemviews/pixelator/pixeldelegate.cpp 4 - - First, the largest possible radius of the circle is determined by taking the - smallest dimension of the style option's \c rect attribute. - Using the model index supplied, we obtain a value for the brightness of the - relevant pixel in the image. The radius of the circle is calculated by - scaling the brightness to fit within the item and subtracting it from the - largest possible radius. - - \snippet itemviews/pixelator/pixeldelegate.cpp 5 - \snippet itemviews/pixelator/pixeldelegate.cpp 6 - \snippet itemviews/pixelator/pixeldelegate.cpp 7 - - We save the painter's state, turn on antialiasing (to obtain smoother - curves), and turn off the pen. - - \snippet itemviews/pixelator/pixeldelegate.cpp 8 - \snippet itemviews/pixelator/pixeldelegate.cpp 9 - - The foreground of the item (the circle representing a pixel) must be - rendered using an appropriate brush. For unselected items, we will use a - solid black brush; selected items are drawn using a predefined brush from - the style option's palette. - - \snippet itemviews/pixelator/pixeldelegate.cpp 10 - - Finally, we paint the circle within the rectangle specified by the style - option and we call \l{QPainter::}{restore()} on the painter. - - The \c paint() function does not have to be particularly complicated; it is - only necessary to ensure that the state of the painter when the function - returns is the same as it was when it was called. This usually - means that any transformations applied to the painter must be preceded by - a call to QPainter::save() and followed by a call to QPainter::restore(). - - The delegate's \l{QAbstractItemDelegate::}{sizeHint()} function - returns a size for the item based on the predefined pixel size, initially set - up in the constructor: - - \snippet itemviews/pixelator/pixeldelegate.cpp 11 - - The delegate's size is updated whenever the pixel size is changed. - We provide a custom slot to do this: - - \snippet itemviews/pixelator/pixeldelegate.cpp 12 - - \section1 Using The Custom Delegate - - In this example, we use a main window to display a table of data, using the - custom delegate to render each cell in a particular way. Much of the - \c MainWindow class performs tasks that are not related to item views. Here, - we only quote the parts that are relevant. You can look at the rest of the - implementation by following the links to the code at the top of this - document. - - In the constructor, we set up a table view, turn off its grid, and hide its - headers: - - \snippet itemviews/pixelator/mainwindow.cpp 0 - \dots - \snippet itemviews/pixelator/mainwindow.cpp 1 - - This enables the items to be drawn without any gaps between them. Removing - the headers also prevents the user from adjusting the sizes of individual - rows and columns. - - We also set the minimum section size to 1 on the headers. If we - didn't, the headers would default to a larger size, preventing - us from displaying really small items (which can be specified - using the \uicontrol{Pixel size} combobox). - - The custom delegate is constructed with the main window as its parent, so - that it will be deleted correctly later, and we set it on the table view. - - \snippet itemviews/pixelator/mainwindow.cpp 2 - - Each item in the table view will be rendered by the \c PixelDelegate - instance. - - We construct a spin box to allow the user to change the size of each "pixel" - drawn by the delegate: - - \snippet itemviews/pixelator/mainwindow.cpp 3 - - This spin box is connected to the custom slot we implemented in the - \c PixelDelegate class. This ensures that the delegate always draws each - pixel at the currently specified size: - - \snippet itemviews/pixelator/mainwindow.cpp 4 - \dots - \snippet itemviews/pixelator/mainwindow.cpp 5 - - We also connect the spin box to a slot in the \c MainWindow class. This - forces the view to take into account the new size hints for each item; - these are provided by the delegate in its \c sizeHint() function. - - \snippet itemviews/pixelator/mainwindow.cpp 6 - - We explicitly resize the columns and rows to match the - \uicontrol{Pixel size} combobox. -*/ diff --git a/examples/widgets/doc/src/plugandpaint.qdoc b/examples/widgets/doc/src/plugandpaint.qdoc deleted file mode 100644 index 2ee08311..00000000 --- a/examples/widgets/doc/src/plugandpaint.qdoc +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example tools/plugandpaint/app - \title Plug & Paint Example - \ingroup examples-widgets-tools - - \brief Demonstrates how to extend Qt applications using plugins. - - \image plugandpaint.png Screenshot of the Plug & Paint example - - A plugin is a dynamic library that can be loaded at run-time to - extend an application. Qt makes it possible to create custom - plugins and to load them using QPluginLoader. To ensure that - plugins don't get lost, it is also possible to link them - statically to the executable. The Plug & Paint example uses - plugins to support custom brushes, shapes, and image filters. A - single plugin can provide multiple brushes, shapes, and/or - filters. - - If you want to learn how to make your own application extensible - through plugins, we recommend that you start by reading this - overview, which explains how to make an application use plugins. - Afterwards, you can read the - \l{tools/plugandpaint/plugins/basictools}{Basic Tools} and - \l{tools/plugandpaint/plugins/extrafilters}{Extra Filters} - overviews, which show how to implement static and dynamic - plugins, respectively. - - Plug & Paint consists of the following classes: - - \list - \li \c MainWindow is a QMainWindow subclass that provides the menu - system and that contains a \c PaintArea as the central widget. - \li \c PaintArea is a QWidget that allows the user to draw using a - brush and to insert shapes. - \li \c PluginDialog is a dialog that shows information about the - plugins detected by the application. - \li \c BrushInterface, \c ShapeInterface, and \c FilterInterface are - abstract base classes that can be implemented by plugins to - provide custom brushes, shapes, and image filters. - \endlist - - \section1 The Plugin Interfaces - - We will start by reviewing the interfaces defined in \c - interfaces.h. These interfaces are used by the Plug & Paint - application to access extra functionality. They are implemented - in the plugins. - - - \snippet tools/plugandpaint/app/interfaces.h 0 - - The \c BrushInterface class declares four pure virtual functions. - The first pure virtual function, \c brushes(), returns a list of - strings that identify the brushes provided by the plugin. By - returning a QStringList instead of a QString, we make it possible - for a single plugin to provide multiple brushes. The other - functions have a \c brush parameter to identify which brush - (among those returned by \c brushes()) is used. - - \c mousePress(), \c mouseMove(), and \c mouseRelease() take a - QPainter and one or two \l{QPoint}s, and return a QRect - identifying which portion of the image was altered by the brush. - - The class also has a virtual destructor. Interface classes - usually don't need such a destructor (because it would make - little sense to \c delete the object that implements the - interface through a pointer to the interface), but some compilers - emit a warning for classes that declare virtual functions but no - virtual destructor. We provide the destructor to keep these - compilers happy. - - \snippet tools/plugandpaint/app/interfaces.h 1 - - The \c ShapeInterface class declares a \c shapes() function that - works the same as \c{BrushInterface}'s \c brushes() function, and - a \c generateShape() function that has a \c shape parameter. - Shapes are represented by a QPainterPath, a data type that can - represent arbitrary 2D shapes or combinations of shapes. The \c - parent parameter can be used by the plugin to pop up a dialog - asking the user to specify more information. - - \snippet tools/plugandpaint/app/interfaces.h 2 - - The \c FilterInterface class declares a \c filters() function - that returns a list of filter names, and a \c filterImage() - function that applies a filter to an image. - - \snippet tools/plugandpaint/app/interfaces.h 4 - - To make it possible to query at run-time whether a plugin - implements a given interface, we must use the \c - Q_DECLARE_INTERFACE() macro. The first argument is the name of - the interface. The second argument is a string identifying the - interface in a unique way. By convention, we use a "Java package - name" syntax to identify interfaces. If we later change the - interfaces, we must use a different string to identify the new - interface; otherwise, the application might crash. It is therefore - a good idea to include a version number in the string, as we did - above. - - The \l{tools/plugandpaint/plugins/basictools}{Basic Tools} plugin - and the \l{tools/plugandpaint/plugins/extrafilters}{Extra Filters} - plugin shows how to derive from \c BrushInterface, \c - ShapeInterface, and \c FilterInterface. - - A note on naming: It might have been tempting to give the \c - brushes(), \c shapes(), and \c filters() functions a more generic - name, such as \c keys() or \c features(). However, that would - have made multiple inheritance impractical. When creating - interfaces, we should always try to give unique names to the pure - virtual functions. - - \section1 The MainWindow Class - - The \c MainWindow class is a standard QMainWindow subclass, as - found in many of the other examples (e.g., - \l{mainwindows/application}{Application}). Here, we'll - concentrate on the parts of the code that are related to plugins. - - \snippet tools/plugandpaint/app/mainwindow.cpp 4 - - The \c loadPlugins() function is called from the \c MainWindow - constructor to detect plugins and update the \uicontrol{Brush}, - \uicontrol{Shapes}, and \uicontrol{Filters} menus. We start by handling static - plugins (available through QPluginLoader::staticInstances()) - - To the application that uses the plugin, a Qt plugin is simply a - QObject. That QObject implements plugin interfaces using multiple - inheritance. - - \snippet tools/plugandpaint/app/mainwindow.cpp 5 - - The next step is to load dynamic plugins. We initialize the \c - pluginsDir member variable to refer to the \c plugins - subdirectory of the Plug & Paint example. On Unix, this is just a - matter of initializing the QDir variable with - QApplication::applicationDirPath(), the path of the executable - file, and to do a \l{QDir::cd()}{cd()}. On Windows and \macos, - this file is usually located in a subdirectory, so we need to - take this into account. - - \snippet tools/plugandpaint/app/mainwindow.cpp 6 - \snippet tools/plugandpaint/app/mainwindow.cpp 7 - \snippet tools/plugandpaint/app/mainwindow.cpp 8 - - We use QDir::entryList() to get a list of all files in that - directory. Then we iterate over the result using a range-based for loop - and try to load the plugin using QPluginLoader. - - The QObject provided by the plugin is accessible through - QPluginLoader::instance(). If the dynamic library isn't a Qt - plugin, or if it was compiled against an incompatible version of - the Qt library, QPluginLoader::instance() returns a null pointer. - - If QPluginLoader::instance() is non-null, we add it to the menus. - - \snippet tools/plugandpaint/app/mainwindow.cpp 9 - - At the end, we enable or disable the \uicontrol{Brush}, \uicontrol{Shapes}, - and \uicontrol{Filters} menus based on whether they contain any items. - - \snippet tools/plugandpaint/app/mainwindow.cpp 10 - - For each plugin (static or dynamic), we check which interfaces it - implements using \l qobject_cast(). First, we try to cast the - plugin instance to a \c BrushInterface; if it works, we call the - private function \c addToMenu() with the list of brushes returned - by \c brushes(). Then we do the same with the \c ShapeInterface - and the \c FilterInterface. - - \snippet tools/plugandpaint/app/mainwindow.cpp 3 - - The \c aboutPlugins() slot is called on startup and can be - invoked at any time through the \uicontrol{About Plugins} action. It - pops up a \c PluginDialog, providing information about the loaded - plugins. - - \image plugandpaint-plugindialog.png Screenshot of the Plugin dialog - - - The \c addToMenu() function is called from \c loadPlugin() to - create \l{QAction}s for custom brushes, shapes, or filters and - add them to the relevant menu. The QAction is created with the - plugin from which it comes from as the parent; this makes it - convenient to get access to the plugin later. - - \snippet tools/plugandpaint/app/mainwindow.cpp 0 - - The \c changeBrush() slot is invoked when the user chooses one of - the brushes from the \uicontrol{Brush} menu. We start by finding out - which action invoked the slot using QObject::sender(). Then we - get the \c BrushInterface out of the plugin (which we - conveniently passed as the QAction's parent) and we call \c - PaintArea::setBrush() with the \c BrushInterface and the string - identifying the brush. Next time the user draws on the paint - area, \c PaintArea will use this brush. - - \snippet tools/plugandpaint/app/mainwindow.cpp 1 - - The \c insertShape() is invoked when the use chooses one of the - shapes from the \uicontrol{Shapes} menu. We retrieve the QAction that - invoked the slot, then the \c ShapeInterface associated with that - QAction, and finally we call \c ShapeInterface::generateShape() - to obtain a QPainterPath. - - \snippet tools/plugandpaint/app/mainwindow.cpp 2 - - The \c applyFilter() slot is similar: We retrieve the QAction - that invoked the slot, then the \c FilterInterface associated to - that QAction, and finally we call \c - FilterInterface::filterImage() to apply the filter onto the - current image. - - \section1 The PaintArea Class - - The \c PaintArea class contains some code that deals with \c - BrushInterface, so we'll review it briefly. - - \snippet tools/plugandpaint/app/paintarea.cpp 0 - - In \c setBrush(), we simply store the \c BrushInterface and the - brush that are given to us by \c MainWindow. - - \snippet tools/plugandpaint/app/paintarea.cpp 1 - - In the \l{QWidget::mouseMoveEvent()}{mouse move event handler}, - we call the \c BrushInterface::mouseMove() function on the - current \c BrushInterface, with the current brush. The mouse - press and mouse release handlers are very similar. - - \section1 The PluginDialog Class - - The \c PluginDialog class provides information about the loaded - plugins to the user. Its constructor takes a path to the plugins - and a list of plugin file names. It calls \c findPlugins() - to fill the QTreeWdiget with information about the plugins: - - \snippet tools/plugandpaint/app/plugindialog.cpp 0 - - The \c findPlugins() is very similar to \c - MainWindow::loadPlugins(). It uses QPluginLoader to access the - static and dynamic plugins. Its helper function \c - populateTreeWidget() uses \l qobject_cast() to find out which - interfaces are implemented by the plugins: - - \snippet tools/plugandpaint/app/plugindialog.cpp 1 - - \section1 Importing Static Plugins - - The \l{tools/plugandpaint/plugins/basictools}{Basic Tools} plugin - is built as a static plugin, to ensure that it is always - available to the application. This requires using the - Q_IMPORT_PLUGIN() macro somewhere in the application (in a \c - .cpp file) and specifying the plugin in the \c .pro file. - - For Plug & Paint, we have chosen to put Q_IMPORT_PLUGIN() in \c - main.cpp: - - \snippet tools/plugandpaint/app/main.cpp 0 - - The argument to Q_IMPORT_PLUGIN() is the plugin name, which corresponds - with the name of the class that declares metadata for the plugin with - Q_PLUGIN_METADATA(). - - In the \c .pro file, we need to specify the static library. - Here's the project file for building Plug & Paint: - - \snippet tools/plugandpaint/app/app.pro 0 - - The \c LIBS line variable specifies the library \c pnp_basictools - located in the \c ../plugandpaint/plugins/basictools directory. - (Although the \c LIBS syntax has a distinct Unix flavor, \c qmake - supports it on all platforms.) - - The \c CONFIG() code at the end is necessary for this example - because the example is part of the Qt distribution and Qt can be - configured to be built simultaneously in debug and in release - modes. You don't need to for your own plugin applications. - - This completes our review of the Plug & Paint application. At - this point, you might want to take a look at the - \l{tools/plugandpaint/plugins/basictools}{Basic Tools} example - plugin. -*/ - -/*! - \example tools/plugandpaint/plugins/basictools - \title Plug & Paint Basic Tools Example - \brief A plugin providing the basic tools for painting functionality. - - \image plugandpaint.png Screenshot of the Plug & Paint example - - The Basic Tools example is a static plugin for the - \l{tools/plugandpaint/app}{Plug & Paint} example. It provides a set - of basic brushes, shapes, and filters. Through the Basic Tools - example, we will review the four steps involved in writing a Qt - plugin: - - \list 1 - \li Declare a plugin class. - \li Implement the interfaces provided by the plugin. - \li Export the plugin using the Q_PLUGIN_METADATA() macro. - \li Build the plugin using an adequate \c .pro file. - \endlist - - \section1 Declaration of the Plugin Class - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.h 0 - - We start by including \c interfaces.h, which defines the plugin - interfaces for the \l{tools/plugandpaint/app}{Plug & Paint} - application. For the \c #include to work, we need to add an \c - INCLUDEPATH entry to the \c .pro file with the path to the - header file. - - The \c BasicToolsPlugin class is a QObject subclass that - implements the \c BrushInterface, the \c ShapeInterface, and the - \c FilterInterface. This is done through multiple inheritance. - The \c Q_INTERFACES() macro is necessary to tell \l{moc}, Qt's - meta-object compiler, that the base classes are plugin - interfaces. Without the \c Q_INTERFACES() macro, we couldn't use - \l qobject_cast() in the \l{tools/plugandpaint/app}{Plug & Paint} - application to detect interfaces. - For an explanation for the \c Q_PLUGIN_METADATA() macro see - \l {Exporting the Plugin}. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.h 2 - - In the \c public section of the class, we declare all the - functions from the three interfaces. - - \section1 Implementation of the Brush Interface - - Let's now review the implementation of the \c BasicToolsPlugin - member functions inherited from \c BrushInterface. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 0 - - The \c brushes() function returns a list of brushes provided by - this plugin. We provide three brushes: \uicontrol{Pencil}, \uicontrol{Air - Brush}, and \uicontrol{Random Letters}. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 1 - - On a mouse press event, we just call \c mouseMove() to draw the - spot where the event occurred. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 2 - - In \c mouseMove(), we start by saving the state of the QPainter - and we compute a few variables that we'll need later. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 3 - - Then comes the brush-dependent part of the code: - - \list - \li If the brush is \uicontrol{Pencil}, we just call - QPainter::drawLine() with the current QPen. - - \li If the brush is \uicontrol{Air Brush}, we start by setting the - painter's QBrush to Qt::Dense6Pattern to obtain a dotted - pattern. Then we draw a circle filled with that QBrush several - times, resulting in a thick line. - - \li If the brush is \uicontrol{Random Letters}, we draw a random letter - at the new cursor position. Most of the code is for setting - the font to be bold and larger than the default font and for - computing an appropriate bounding rect. - \endlist - - At the end, we restore the painter state to what it was upon - entering the function and we return the bounding rectangle. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 4 - - When the user releases the mouse, we do nothing and return an - empty QRect. - - \section1 Implementation of the Shape Interface - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 5 - - The plugin provides three shapes: \uicontrol{Circle}, \uicontrol{Star}, and - \uicontrol{Text...}. The three dots after \uicontrol{Text} are there because - the shape pops up a dialog asking for more information. We know - that the shape names will end up in a menu, so we include the - three dots in the shape name. - - A cleaner but more complicated design would have been to - distinguish between the internal shape name and the name used in - the user interface. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 6 - - The \c generateShape() creates a QPainterPath for the specified - shape. If the shape is \uicontrol{Text}, we pop up a QInputDialog to - let the user enter some text. - - \section1 Implementation of the Filter Interface - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 7 - - The plugin provides three filters: \uicontrol{Invert Pixels}, \uicontrol{Swap - RGB}, and \uicontrol{Grayscale}. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.cpp 8 - - The \c filterImage() function takes a filter name and a QImage as - parameters and returns an altered QImage. The first thing we do - is to convert the image to a 32-bit RGB format, to ensure that - the algorithms will work as expected. For example, - QImage::invertPixels(), which is used to implement the - \uicontrol{Invert Pixels} filter, gives counterintuitive results for - 8-bit images, because they invert the indices into the color - table instead of inverting the color table's entries. - - \section1 Exporting the Plugin - - To finally export your plugin you just have to add the - \c Q_PLUGIN_METADATA() macro right next to the \c Q_OBJECT() macro - into the header file of the plugin. - It must contain the plugins IID and optionally a filename pointing - to a json file containing the metadata for the plugin. - - \snippet tools/plugandpaint/plugins/basictools/basictoolsplugin.h 4 - - Within this example the json file does not need to export any metadata, - so it just contains an empty json object. - - \code - {} - \endcode - - \section1 The .pro File - - Here's the project file for building the Basic Tools plugin: - - \snippet tools/plugandpaint/plugins/basictools/basictools.pro 0 - - The \c .pro file differs from typical \c .pro files in many - respects. First, it starts with a \c TEMPLATE entry specifying \c - lib. (The default template is \c app.) It also adds \c plugin to - the \c CONFIG variable. This is necessary on some platforms to - avoid generating symbolic links with version numbers in the file - name, which is appropriate for most dynamic libraries but not for - plugins. - - To make the plugin a static plugin, all that is required is to - specify \c static in addition to \c plugin. The - \l{tools/plugandpaint/plugins/extrafilters}{Extra Filters} plugin, - which is compiled as a dynamic plugin, doesn't specify \c static - in its \c .pro file. - - The \c INCLUDEPATH variable sets the search paths for global - headers (i.e., header files included using \c{#include <...>}). - We add \c ../../app to the list, so that we can include - \c . - - The \c TARGET variable specifies which name we want to give the - target library. We use \c pnp_ as the prefix to show that the - plugin is designed to work with Plug & Paint. On Unix, \c lib is - also prepended to that name. On all platforms, a - platform-specific suffix is appended (e.g., \c .dll on Windows, - \c .a on Linux). - - The \c CONFIG() code at the end is necessary for this example - because the example is part of the Qt distribution and Qt can be - configured to be built simultaneously in debug and in release - modes. You don't need to for your own plugins. -*/ - -/*! - \example tools/plugandpaint/plugins/extrafilters - \title Plug & Paint Extra Filters Example - \brief A plugin providing the extra filters. - - \image plugandpaint.png Screenshot of the Plug & Paint example - - The Extra Filters example is a plugin for the - \l{tools/plugandpaint/app}{Plug & Paint} example. It provides a set - of filters in addition to those provided by the - \l{tools/plugandpaint/plugins/basictools}{Basic Tools} plugin. - - Since the approach is identical to - \l{tools/plugandpaint/plugins/basictools}{Basic Tools}, we won't - review the code here. The only part of interest is the - \c .pro file, since Extra Filters is a dynamic plugin - (\l{tools/plugandpaint/plugins/basictools}{Basic Tools} is - linked statically into the Plug & Paint executable). - - Here's the project file for building the Extra Filters plugin: - - \snippet tools/plugandpaint/plugins/extrafilters/extrafilters.pro 0 - - The \c .pro file differs from typical \c .pro files in many - respects. First, it starts with a \c TEMPLATE entry specifying \c - lib. (The default template is \c app.) It also adds \c plugin to - the \c CONFIG variable. This is necessary on some platforms to - avoid generating symbolic links with version numbers in the file - name, which is appropriate for most dynamic libraries but not for - plugins. - - The \c INCLUDEPATH variable sets the search paths for global - headers (i.e., header files included using \c{#include <...>}). - We add \c ../../app to the list, so that we can include - \c . - - The \c TARGET variable specifies which name we want to give the - target library. We use \c pnp_ as the prefix to show that the - plugin is designed to work with Plug & Paint. On Unix, \c lib is - also prepended to that name. On all platforms, a - platform-specific suffix is appended (e.g., \c .dll on Windows, - \c .so on Linux). - - The \c DESTDIR variable specifies where we want to install the - plugin. We put it in Plug & Paint's \c plugins subdirectory, - since that's where the application looks for dynamic plugins. - - The \c CONFIG() code at the end is necessary for this example - because the example is part of the Qt distribution and Qt can be - configured to be built simultaneously in debug and in release - modes. You don't need to for your own plugins. -*/ diff --git a/examples/widgets/doc/src/regularexpression.qdoc b/examples/widgets/doc/src/regularexpression.qdoc index 8d7aa616..f6f1e876 100644 --- a/examples/widgets/doc/src/regularexpression.qdoc +++ b/examples/widgets/doc/src/regularexpression.qdoc @@ -4,6 +4,7 @@ /*! \example tools/regularexpression \title QRegularExpression Example + \examplecategory {User Interface Components} \ingroup examples-widgets-tools \brief The QRegularExpression example shows how regular expressions in Qt are diff --git a/examples/widgets/doc/src/screenshot.qdoc b/examples/widgets/doc/src/screenshot.qdoc index 54826dc1..2e2b3123 100644 --- a/examples/widgets/doc/src/screenshot.qdoc +++ b/examples/widgets/doc/src/screenshot.qdoc @@ -3,7 +3,8 @@ /*! \example desktop/screenshot - \title Screenshot Example + \title Taking a Screenshot + \examplecategory {Desktop} \ingroup examples-desktop \brief The Screenshot example shows how to take a screenshot of the desktop. diff --git a/examples/widgets/doc/src/scribble.qdoc b/examples/widgets/doc/src/scribble.qdoc index 1a87576e..3cd72053 100644 --- a/examples/widgets/doc/src/scribble.qdoc +++ b/examples/widgets/doc/src/scribble.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/scribble \title Scribble Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Scribble example shows how to reimplement some of QWidget's event handlers to receive the events generated for the diff --git a/examples/widgets/doc/src/settingseditor.qdoc b/examples/widgets/doc/src/settingseditor.qdoc index 55226a98..43c45008 100644 --- a/examples/widgets/doc/src/settingseditor.qdoc +++ b/examples/widgets/doc/src/settingseditor.qdoc @@ -4,6 +4,7 @@ /*! \example tools/settingseditor \title Settings Editor Example + \examplecategory {User Interface Components} \ingroup examples-widgets-tools \brief The Settings Editor example shows how Qt's standard settings support is used in an diff --git a/examples/widgets/doc/src/shapedclock.qdoc b/examples/widgets/doc/src/shapedclock.qdoc index 4ce34126..4bcd0468 100644 --- a/examples/widgets/doc/src/shapedclock.qdoc +++ b/examples/widgets/doc/src/shapedclock.qdoc @@ -3,17 +3,19 @@ /*! \example widgets/shapedclock - \title Shaped Clock Example + \title Translucent Background + \examplecategory {User Interface Components} \ingroup examples-widgets - \brief The Shaped Clock example shows how to apply a translucent background - and a widget mask to a top-level widget to produce a shaped window. + \brief The example shows how to make a round window with a translucent + background. \borderedimage shapedclock-example.png - Widget masks are used to customize the shapes of top-level widgets by - restricting the area available for painting and mouse input. Using a - translucent background facilitates partially transparent windows and smooth - edges. On most window systems, setting certain window flags will cause the + Widgets that set their background to be translucent will be transparent for all + unpainted pixels, and the background will shine through pixels painted with an + opacity of less than 100%. Pixels that are not painted at all will also not + receive any mouse input. This can be used to customize the shapes of top-level + widgets. On most window systems, setting certain window flags will cause the window decoration (title bar, window frame, buttons) to be disabled, allowing specially-shaped windows to be created. In this example, we use this feature to create a circular window containing an analog clock. @@ -30,12 +32,10 @@ \snippet widgets/shapedclock/shapedclock.h 0 - The \l{QWidget::paintEvent()}{paintEvent()} implementation is the same as - that found in the \c AnalogClock class, with one important exception: we - now must also draw background (the clock face) ourselves, since the widget - background is just transparent. We implement \l{QWidget::sizeHint()}{sizeHint()} - so that we don't have to resize the widget explicitly. We also provide an event - handler for resize events. This allows us to update the mask if the clock is resized. + The \l{QWidget::paintEvent()}{paintEvent()} implementation draws an analog clock + on a semi-transparent background (the clock face). In addition, we implement + \l{QWidget::sizeHint()}{sizeHint()} so that we don't have to resize the widget + explicitly. Since the window containing the clock widget will have no title bar, we provide implementations for \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()} and @@ -45,8 +45,9 @@ \section1 ShapedClock Class Implementation - The \c ShapedClock constructor performs many of the same tasks as the \c AnalogClock - constructor. We set up a timer and connect it to the widget's update() slot: + The \c ShapedClock constructor sets up a timer and connect it to the widget's + update() slot. In addition, we add an action to the widget, which will automatically + become available through a context menu when right-clicking on the widget. \snippet widgets/shapedclock/shapedclock.cpp 0 @@ -77,49 +78,14 @@ cursor position in global coordinates. If we drag the widget, we also accept the event. The \c paintEvent() function is mainly the same as described in the - \l{Analog Clock} example. The one addition is that we - use QPainter::drawEllipse() to draw a round clock face with the current - palette's default background color. We make the clock face a bit smaller - than the widget mask, so that the anti-aliased, semi-transparent pixels on - the edge are not clipped away by the widget mask. This gives the shaped - window smooth edges on the screen. + \l{Analog Clock} example. The one addition is that we use QPainter::drawEllipse() to + draw a round clock face. We reduce the painter's opacity to 90%, and use the palette's + default background color. \snippet widgets/shapedclock/shapedclock.cpp 3 - In the \c resizeEvent() handler, we re-use some of the code from the \c - paintEvent() to determine the region of the widget that is visible to the - user. This tells the system the area where mouse clicks should go to us, - and not to whatever window is behind us: - - \snippet widgets/shapedclock/shapedclock.cpp 4 - - Since the clock face is a circle drawn in the center of the widget, this is the region - we use as the mask. - - Although the lack of a window frame may make it difficult for the user to resize the - widget on some platforms, it will not necessarily be impossible. The \c resizeEvent() - function ensures that the widget mask will always be updated if the widget's dimensions - change, and additionally ensures that it will be set up correctly when the widget is - first displayed. - Finally, we implement the \c sizeHint() for the widget so that it is given a reasonable default size when it is first shown: - \snippet widgets/shapedclock/shapedclock.cpp 5 - - \section1 Notes on Widget Masks - - Widget masks are used to hint to the window system that the application - does not want mouse events for areas outside the mask. On most systems, - they also result in coarse visual clipping. To get smooth window edges, one - should use translucent background and anti-aliased painting, as shown in - this example. - - Since QRegion allows arbitrarily complex regions to be created, widget masks can be - made to suit the most unconventionally-shaped windows, and even allow widgets to be - displayed with holes in them. - - Widget masks can also be constructed by using the contents of pixmap to define the - opaque part of the widget. For a pixmap with an alpha channel, a suitable mask can be - obtained with QPixmap::mask(). + \snippet widgets/shapedclock/shapedclock.cpp 4 */ diff --git a/examples/widgets/doc/src/shortcuteditor.qdoc b/examples/widgets/doc/src/shortcuteditor.qdoc index 350609c9..9999a184 100644 --- a/examples/widgets/doc/src/shortcuteditor.qdoc +++ b/examples/widgets/doc/src/shortcuteditor.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/shortcuteditor \title Shortcut Editor Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Shortcut Editor example shows how to create a basic, read-write hierarchical model to use with Qt's standard view and QKeySequenceEdit diff --git a/examples/widgets/doc/src/simpledommodel.qdoc b/examples/widgets/doc/src/simpledommodel.qdoc deleted file mode 100644 index 82bd5c5d..00000000 --- a/examples/widgets/doc/src/simpledommodel.qdoc +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/simpledommodel - \title Simple DOM Model Example - \ingroup examples-itemviews - \brief The Simple DOM Model example shows how an existing class can be adapted for use with - the model/view framework. - - \image simpledommodel-example.png - - Qt provides two complementary sets of classes for reading XML files: The classes based - around QXmlReader provide a SAX-style API for incremental reading of large files, and - the classes based around QDomDocument enable developers to access the contents of XML - files using a Document Object Model (DOM) API. - - In this example, we create a model that uses the DOM API to expose the structure and - contents of XML documents to views via the standard QAbstractModel interface. - - \section1 Design and Concepts - - Reading an XML document with Qt's DOM classes is a straightforward process. Typically, - the contents of a file are supplied to QDomDocument, and nodes are accessed using the - functions provided by QDomNode and its subclasses. - - \omit - For example, the following code - snippet reads the contents of a file into a QDomDocument object and traverses the - document, reading all the plain text that can be found: - - \snippet doc/src/snippets/code/doc_src_examples_simpledommodel.cpp 0 - - In principle, the functions provided by QDomNode can be used to navigate from any - given starting point in a document to the piece of data requested by another component. - Since QDomDocument maintains information about the structure of a document, we can - use this to implement the required virtual functions in a QAbstractItemModel subclass. - \endomit - - The aim is to use the structure provided by QDomDocument by wrapping QDomNode objects - in item objects similar to the \c TreeItem objects used in the - \l{Simple Tree Model Example}{Simple Tree Model} example. - - \section1 DomModel Class Definition - - Let us begin by examining the \c DomModel class: - - \snippet itemviews/simpledommodel/dommodel.h 0 - - The class definition contains all the basic functions that are needed for a - read-only model. Only the constructor and \c document() function are specific to - this model. The private \c domDocument variable is used to hold the document - that is exposed by the model; the \c rootItem variable contains a pointer to - the root item in the model. - - \section1 DomItem Class Definition - - The \c DomItem class is used to hold information about a specific QDomNode in - the document: - - \snippet itemviews/simpledommodel/domitem.h 0 - - Each \c DomItem provides a wrapper for a QDomNode obtained from the underlying - document which contains a reference to the node, it's location in the parent node's - list of child nodes, and a pointer to a parent wrapper item. - - The \c parent(), \c child(), and \c row() functions are convenience functions for - the \c DomModel to use that provide basic information about the item to be discovered - quickly. The node() function provides access to the underlying QDomNode object. - - As well as the information supplied in the constructor, the class maintains a cache - of information about any child items. This is used to provide a collection of - persistent item objects that the model can identify consistently and improve the - performance of the model when accessing child items. - - \section1 DomItem Class Implementation - - Since the \c DomItem class is only a thin wrapper around QDomNode objects, with a - few additional features to help improve performance and memory usage, we can provide - a brief outline of the class before discussing the model itself. - - The constructor simply records details of the QDomNode that needs to be wrapped: - - \snippet itemviews/simpledommodel/domitem.cpp 0 - \snippet itemviews/simpledommodel/domitem.cpp 1 - - As a result, functions to provide the parent wrapper, the row number occupied by - the item in its parent's list of children, and the underlying QDomNode for each item - are straightforward to write: - - \snippet itemviews/simpledommodel/domitem.cpp 4 - \codeline - \snippet itemviews/simpledommodel/domitem.cpp 6 - \codeline - \snippet itemviews/simpledommodel/domitem.cpp 3 - - It is necessary to maintain a collection of items which can be consistently identified - by the model. For that reason, we maintain a hash of child wrapper items that, to - minimize memory usage, is initially empty. The model uses the item's \c child() - function to help create model indexes, and this constructs wrappers for the children - of the item's QDomNode, relating the row number of each child to the newly-constructed - wrapper: - - \snippet itemviews/simpledommodel/domitem.cpp 5 - - If a QDomNode was previously wrapped, the cached wrapper is returned; otherwise, a - new wrapper is constructed and stored for valid children, and zero is returned for - invalid ones. - - The class's destructor deletes all the child items of the wrapper: - - \snippet itemviews/simpledommodel/domitem.cpp 2 - - These, in turn, will delete their children and free any QDomNode objects in use. - - \section1 DomModel Class Implementation - - The structure provided by the \c DomItem class makes the implementation of \c DomModel - similar to the \c TreeModel shown in the - \l{Simple Tree Model Example}{Simple Tree Model} example. - - The constructor accepts an existing document and a parent object for the model: - - \snippet itemviews/simpledommodel/dommodel.cpp 0 - - A shallow copy of the document is stored for future reference, and a root item is - created to provide a wrapper around the document. We assign the root item a row - number of zero only to be consistent since the root item will have no siblings. - - Since the model only contains information about the root item, the destructor only - needs to delete this one item: - - \snippet itemviews/simpledommodel/dommodel.cpp 1 - - All of the child items in the tree will be deleted by the \c DomItem destructor as - their parent items are deleted. - - \section2 Basic Properties of The Model - - Some aspects of the model do not depend on the structure of the underlying document, - and these are simple to implement. - - The number of columns exposed by the model is returned by the \c columnCount() - function: - - \snippet itemviews/simpledommodel/dommodel.cpp 2 - - This value is fixed, and does not depend on the location or type of the underlying - node in the document. We will use these three columns to display different kinds of - data from the underlying document. - - Since we only implement a read-only model, the \c flags() function is straightforward - to write: - - \snippet itemviews/simpledommodel/dommodel.cpp 5 - - Since the model is intended for use in a tree view, the \c headerData() function only - provides a horizontal header: - - \snippet itemviews/simpledommodel/dommodel.cpp 6 - - The model presents the names of nodes in the first column, element attributes in the - second, and any node values in the third. - - \section2 Navigating The Document - - The index() function creates a model index for the item with the given row, column, - and parent in the model: - - \snippet itemviews/simpledommodel/dommodel.cpp 7 - - The function first has to relate the parent index to an item that contains a node - from the underlying document. If the parent index is invalid, it refers to the root - node in the document, so we retrieve the root item that wraps it; otherwise, we - obtain a pointer to the relevant item using the QModelIndex::internalPointer() - function. We are able to extract a pointer in this way because any valid model index - will have been created by this function, and we store pointers to item objects in - any new indexes that we create with QAbstractItemModel::createIndex(): - - \snippet itemviews/simpledommodel/dommodel.cpp 8 - - A child item for the given row is provided by the parent item's \c child() function. - If a suitable child item was found then we call - \l{QAbstractItemModel::createIndex()}{createIndex()} to produce a model index for the - requested row and column, passing a pointer to the child item for it to store - internally. If no suitable child item is found, an invalid model index is returned. - - Note that the items themselves maintain ownership of their child items. This means - that the model does not need to keep track of the child items that have been created, - and can let the items themselves tidy up when they are deleted. - - The number of rows beneath a given item in the model is returned by the \c rowCount() - function, and is the number of child nodes contained by the node that corresponds to - the specified model index: - - \snippet itemviews/simpledommodel/dommodel.cpp 10 - - To obtain the relevant node in the underlying document, we access the item via the - internal pointer stored in the model index. If an invalid index is supplied, the - root item is used instead. We use the item's \c node() function to access the node - itself, and simply count the number of child nodes it contains. - - Since the model is used to represent a hierarchical data structure, it needs to - provide an implementation for the \c parent() function. This returns a model index - that corresponds to the parent of a child model index supplied as its argument: - - \snippet itemviews/simpledommodel/dommodel.cpp 9 - - For valid indexes other than the index corresponding to the root item, we obtain - a pointer to the relevant item using the method described in the \c index() function, - and use the item's \c parent() function to obtain a pointer to the parent item. - - If no valid parent item exists, or if the parent item is the root item, we can simply - follow convention and return an invalid model index. For all other parent items, we - create a model index containing the appropriate row and column numbers, and a pointer - to the parent item we just obtained. - - Data is provided by the \c data() function. For simplicity, we only provide data for - the \l{Qt::DisplayRole}{display role}, returning an invalid variant for all other - requests: - - \snippet itemviews/simpledommodel/dommodel.cpp 3 - - As before, we obtain an item pointer for the index supplied, and use it to obtain - the underlying document node. Depending on the column specified, the data we return - is obtained in different ways: - - \snippet itemviews/simpledommodel/dommodel.cpp 4 - - For the first column, we return the node's name. For the second column, we read any - attributes that the node may have, and return a string that contains a space-separated - list of attribute-value assignments. For the third column, we return any value that - the node may have; this allows the contents of text nodes to be displayed in a view. - - If data from any other column is requested, an invalid variant is returned. - - \section1 Implementation Notes - - Ideally, we would rely on the structure provided by QDomDocument to help us write - the \l{QAbstractItemModel::parent()}{parent()} and - \l{QAbstractItemModel::index()}{index()} functions that are required when subclassing - QAbstractItemModel. However, since Qt's DOM classes use their own system for - dynamically allocating memory for DOM nodes, we cannot guarantee that the QDomNode - objects returned for a given piece of information will be the same for subsequent - accesses to the document. - - We use item wrappers for each QDomNode to provide consistent pointers that the model - can use to navigate the document structure. - \omit - Since these items contain value references to the QDomNode objects themselves, this - has the side effect that the DOM nodes themselves can be used to reliably navigate - the document [not sure about this - QDom* may return different QDomNode objects for - the same piece of information]. However, this advantage is redundant since we need to - use wrapper items to obtain it. [Possible use of QDomNode cache in the model itself.] - \endomit -*/ diff --git a/examples/widgets/doc/src/simpletreemodel.qdoc b/examples/widgets/doc/src/simpletreemodel.qdoc index 5892d052..9d8cc223 100644 --- a/examples/widgets/doc/src/simpletreemodel.qdoc +++ b/examples/widgets/doc/src/simpletreemodel.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/simpletreemodel \title Simple Tree Model Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \ingroup examples-layout \brief The Simple Tree Model example shows how to use a hierarchical model diff --git a/examples/widgets/doc/src/simplewidgetmapper.qdoc b/examples/widgets/doc/src/simplewidgetmapper.qdoc deleted file mode 100644 index 508f9d20..00000000 --- a/examples/widgets/doc/src/simplewidgetmapper.qdoc +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example itemviews/simplewidgetmapper - \title Simple Widget Mapper Example - \ingroup examples-itemviews - \brief The Simple Widget Mapper example shows how to use a widget mapper to display - data from a model in a collection of widgets. - - \image simplewidgetmapper-example.png - - The QDataWidgetMapper class allows information obtained from a - \l{Model Classes}{model} to be viewed and edited in a collection of - widgets instead of in an \l{View Classes}{item view}. - Any model derived from QAbstractItemModel can be used as the source of - data and almost any input widget can be used to display it. - - The example itself is very simple: we create \c Window, a QWidget subclass - that we use to hold the widgets used to present the data, and show it. The - \c Window class will provide buttons that the user can click to show - different records from the model. - - \section1 Window Class Definition - - The class provides a constructor, a slot to keep the buttons up to date, - and a private function to set up the model: - - \snippet itemviews/simplewidgetmapper/window.h Window definition - - In addition to the QDataWidgetMapper object and the controls used to make - up the user interface, we use a QStandardItemModel to hold our data. - We could use a custom model, but this standard implementation is sufficient - for our purposes. - - \section1 Window Class Implementation - - The constructor of the \c Window class can be explained in three parts. - In the first part, we set up the widgets used for the user interface: - - \snippet itemviews/simplewidgetmapper/window.cpp Set up widgets - - We also set up the buddy relationships between various labels and the - corresponding input widgets. - - Next, we set up the widget mapper, relating each input widget to a column - in the model specified by the call to \l{QDataWidgetMapper::}{setModel()}: - - \snippet itemviews/simplewidgetmapper/window.cpp Set up the mapper - - We also connect the mapper to the \uicontrol{Next} and \uicontrol{Previous} buttons - via its \l{QDataWidgetMapper::}{toNext()} and - \l{QDataWidgetMapper::}{toPrevious()} slots. The mapper's - \l{QDataWidgetMapper::}{currentIndexChanged()} signal is connected to the - \c{updateButtons()} slot in the window which we'll show later. - - In the final part of the constructor, we set up the layout, placing each - of the widgets in a grid (we could also use a QFormLayout for this): - - \snippet itemviews/simplewidgetmapper/window.cpp Set up the layout - - Lastly, we set the window title and initialize the mapper by setting it to - refer to the first row in the model. - - The model is initialized in the window's \c{setupModel()} function. Here, - we create a standard model with 5 rows and 3 columns, and we insert some - sample names, addresses and ages into each row: - - \snippet itemviews/simplewidgetmapper/window.cpp Set up the model - - As a result, each row can be treated like a record in a database, and the - widget mapper will read the data from each row, using the column numbers - specified earlier to access the correct data for each widget. This is - shown in the following diagram: - - \image widgetmapper-simple-mapping.png - - Since the user can navigate using the buttons in the user interface, the - example is fully-functional at this point, but to make it a bit more - user-friendly, we implement the \c{updateButtons()} slot to show when the - user is viewing the first or last records: - - \snippet itemviews/simplewidgetmapper/window.cpp Slot for updating the buttons - - If the mapper is referring to the first row in the model, the \uicontrol{Previous} - button is disabled. Similarly, the \uicontrol{Next} button is disabled if the - mapper reaches the last row in the model. - - \section1 More Complex Mappings - - The QDataWidgetMapper class makes it easy to relate information from a - model to widgets in a user interface. However, it is sometimes necessary - to use input widgets which offer choices to the user, such as QComboBox, - in conjunction with a widget mapper. - - In these situations, although the mapping to input widgets remains simple, - more work needs to be done to expose additional data to the widget mapper. - This is covered by the \l{Combo Widget Mapper Example}{Combo Widget Mapper} - and \l{SQL Widget Mapper Example}{SQL Widget Mapper} - examples. -*/ diff --git a/examples/widgets/doc/src/sliders.qdoc b/examples/widgets/doc/src/sliders.qdoc index 26bfd441..871adf00 100644 --- a/examples/widgets/doc/src/sliders.qdoc +++ b/examples/widgets/doc/src/sliders.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/sliders \title Sliders Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Sliders example shows how to use the different types of sliders available in Qt: QSlider, QScrollBar and QDial. diff --git a/examples/widgets/doc/src/spinboxdelegate.qdoc b/examples/widgets/doc/src/spinboxdelegate.qdoc index 025c5021..bd3b68aa 100644 --- a/examples/widgets/doc/src/spinboxdelegate.qdoc +++ b/examples/widgets/doc/src/spinboxdelegate.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/spinboxdelegate \title Spin Box Delegate Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Spin Box Delegate example shows how to create an editor for a custom delegate in the model/view framework by reusing a standard Qt editor widget. diff --git a/examples/widgets/doc/src/spinboxes.qdoc b/examples/widgets/doc/src/spinboxes.qdoc index 263fee91..eb42696c 100644 --- a/examples/widgets/doc/src/spinboxes.qdoc +++ b/examples/widgets/doc/src/spinboxes.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/spinboxes \title Spin Boxes Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Spin Boxes example shows how to use the many different types of spin boxes available in Qt, from a simple QSpinBox widget to more complex diff --git a/examples/widgets/doc/src/spreadsheet.qdoc b/examples/widgets/doc/src/spreadsheet.qdoc index 9d7c89d6..02d5e0a9 100644 --- a/examples/widgets/doc/src/spreadsheet.qdoc +++ b/examples/widgets/doc/src/spreadsheet.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/spreadsheet \title Spreadsheet + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Spreadsheet example shows how to create a simple spreadsheet application. diff --git a/examples/widgets/doc/src/standarddialogs.qdoc b/examples/widgets/doc/src/standarddialogs.qdoc index 6770c918..396f1d10 100644 --- a/examples/widgets/doc/src/standarddialogs.qdoc +++ b/examples/widgets/doc/src/standarddialogs.qdoc @@ -4,6 +4,7 @@ /*! \example dialogs/standarddialogs \title Standard Dialogs Example + \examplecategory {User Interface Components} \ingroup examples-dialogs \brief The Standard Dialogs example shows the standard dialogs that are provided by Qt. diff --git a/examples/widgets/doc/src/stardelegate.qdoc b/examples/widgets/doc/src/stardelegate.qdoc index 5d45577c..44d75e64 100644 --- a/examples/widgets/doc/src/stardelegate.qdoc +++ b/examples/widgets/doc/src/stardelegate.qdoc @@ -4,6 +4,7 @@ /*! \example itemviews/stardelegate \title Star Delegate Example + \examplecategory {User Interface Components} \ingroup examples-itemviews \brief The Star Delegate example shows how to create a delegate that can paint itself and that supports editing. diff --git a/examples/widgets/doc/src/styleplugin.qdoc b/examples/widgets/doc/src/styleplugin.qdoc index d7a1faf2..a866d096 100644 --- a/examples/widgets/doc/src/styleplugin.qdoc +++ b/examples/widgets/doc/src/styleplugin.qdoc @@ -4,6 +4,7 @@ /*! \example tools/styleplugin \title Style Plugin Example + \examplecategory {User Interface Components} \ingroup examples-widgets-tools \brief This example shows how to create a plugin that extends Qt with a new @@ -133,7 +134,4 @@ In the \l{Echo Plugin Example}{echo plugin example} we show how to implement plugins that extends Qt applications rather than Qt itself, which is the case with the style plugin of this example. - The \l{Plug & Paint Example}{plug & paint} example shows how to - implement a static plugin as well as being a more involved example - on plugins that extend applications. */ diff --git a/examples/widgets/doc/src/styles.qdoc b/examples/widgets/doc/src/styles.qdoc deleted file mode 100644 index 53934c40..00000000 --- a/examples/widgets/doc/src/styles.qdoc +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/styles - \title Styles Example - \ingroup examples-widgets - \brief The Styles example illustrates how to create custom widget - drawing styles using Qt, and demonstrates Qt's predefined styles. - - \borderedimage styles-enabledwood.png - \caption Screenshot of the Styles example - - A style in Qt is a subclass of QStyle or of one of its - subclasses. Styles perform drawing on behalf of widgets. Qt - provides a whole range of predefined styles, either built into - the Qt Widgets module or found in plugins. Styles are usually - customized by subclassing QProxyStyle and reimplementing a few - virtual functions. While QProxyStyle provides a transparent way - to customize either a specific style or the appropriate platform's - default style, Qt also provides QCommonStyle as a convenient base - for full custom style implementations. - - In this example, the custom style is called \c NorwegianWoodStyle - and derives from QProxyStyle. Its main features are the wooden - textures used for filling most of the widgets and its round - buttons and comboboxes. - - To implement the style, we use some advanced features provided by - QPainter, such as \l{QPainter::Antialiasing}{antialiasing} (to - obtain smoother button edges), \l{QColor::alpha()}{alpha blending} - (to make the buttons appeared raised or sunken), and - \l{QPainterPath}{painter paths} (to fill the buttons and draw the - outline). We also use many features of QBrush and QPalette. - - The example consists of the following classes: - - \list - \li \c NorwegianWoodStyle inherits from QProxyStyle and implements - the Norwegian Wood style. - \li \c WidgetGallery is a \c QDialog subclass that shows the most - common widgets and allows the user to switch style - dynamically. - \endlist - - \section1 NorwegianWoodStyle Class Definition - - Here's the definition of the \c NorwegianWoodStyle class: - - \snippet widgets/styles/norwegianwoodstyle.h 0 - - The public functions are all declared in QStyle (QProxyStyle's - grandparent class) and reimplemented here to override the Windows - look and feel. The private functions are helper functions. - - \section1 NorwegianWoodStyle Class Implementation - - We will now review the implementation of the \c - NorwegianWoodStyle class. - - \snippet widgets/styles/norwegianwoodstyle.cpp 0 - - The \c standardPalette() function is reimplemented from QStyle. - It returns a QPalette with the style's preferred colors and textures. - Most styles don't need to reimplement that function. The - Norwegian Wood style reimplements it to set a "wooden" palette. - - We start by defining a few \l{QColor}s that we'll need. Then we - load two PNG images. The \c : prefix in the file path indicates - that the PNG files are \l{The Qt Resource System}{embedded - resources}. - - \table - \row \li \inlineimage widgets/styles/images/woodbackground.png - - \li \b{woodbackground.png} - - This texture is used as the background of most widgets. - The wood pattern is horizontal. - - \row \li \inlineimage widgets/styles/images/woodbutton.png - - \li \b{woodbutton.png} - - This texture is used for filling push buttons and - comboboxes. The wood pattern is vertical and more reddish - than the texture used for the background. - \endtable - - The \c midImage variable is initialized to be the same as \c - buttonImage, but then we use a QPainter and fill it with a 25% - opaque black color (a black with an \l{QColor::alpha()}{alpha - channel} of 63). The result is a somewhat darker image than \c - buttonImage. This image will be used for filling buttons that the - user is holding down. - - \snippet widgets/styles/norwegianwoodstyle.cpp 1 - - We initialize the palette. Palettes have various - \l{QPalette::ColorRole}{color roles}, such as QPalette::Base - (used for filling text editors, item views, etc.), QPalette::Text - (used for foreground text), and QPalette::Window (used for - the background of most widgets). Each role has its own QBrush, - which usually is a plain color but can also be a brush pattern or - even a texture (a QPixmap). - - In addition to the roles, palettes have several - \l{QPalette::ColorGroup}{color groups}: active, disabled, and - inactive. The active color group is used for painting widgets in - the active window. The disabled group is used for disabled - widgets. The inactive group is used for all other widgets. Most - palettes have identical active and inactive groups, while the - disabled group uses darker shades. - - We initialize the QPalette object with a brown color. Qt - automatically derivates all color roles for all color groups from - that single color. We then override some of the default values. For - example, we use Qt::darkGreen instead of the default - (Qt::darkBlue) for the QPalette::Highlight role. The - QPalette::setBrush() overload that we use here sets the same - color or brush for all three color groups. - - The \c setTexture() function is a private function that sets the - texture for a certain color role, while preserving the existing - color in the QBrush. A QBrush can hold both a solid color and a - texture at the same time. The solid color is used for drawing - text and other graphical elements where textures don't look good. - - At the end, we set the brush for the disabled color group of the - palette. We use \c woodbackground.png as the texture for all - disabled widgets, including buttons, and use a darker color to - accompany the texture. - - \image styles-disabledwood.png The Norwegian Wood style with disabled widgets - - Let's move on to the other functions reimplemented from - QProxyStyle: - - \snippet widgets/styles/norwegianwoodstyle.cpp 3 - \snippet widgets/styles/norwegianwoodstyle.cpp 4 - - This QStyle::polish() overload is called once on every widget - drawn using the style. We reimplement it to set the Qt::WA_Hover - attribute on \l{QPushButton}s and \l{QComboBox}es. When this - attribute is set, Qt generates paint events when the mouse - pointer enters or leaves the widget. This makes it possible to - render push buttons and comboboxes differently when the mouse - pointer is over them. - - \snippet widgets/styles/norwegianwoodstyle.cpp 5 - \snippet widgets/styles/norwegianwoodstyle.cpp 6 - - This QStyle::unpolish() overload is called to undo any - modification done to the widget in \c polish(). For simplicity, - we assume that the flag wasn't set before \c polish() was called. - In an ideal world, we would remember the original state for each - widgets (e.g., using a QMap) and restore it in - \c unpolish(). - - \snippet widgets/styles/norwegianwoodstyle.cpp 7 - \snippet widgets/styles/norwegianwoodstyle.cpp 8 - - The \l{QStyle::pixelMetric()}{pixelMetric()} function returns the - size in pixels for a certain user interface element. By - reimplementing this function, we can affect the way certain - widgets are drawn and their size hint. Here, we return 8 as the - width around a shown in a QComboBox, ensuring that there is - enough place around the text and the arrow for the Norwegian Wood - round corners. The default value for this setting in the Windows - style is 2. - - We also change the extent of \l{QScrollBar}s, i.e., the height - for a horizontal scroll bar and the width for a vertical scroll - bar, to be 4 pixels more than in the Windows style. This makes the - style a bit more distinctive. - - For all other QStyle::PixelMetric elements, we use the Windows - settings. - - \snippet widgets/styles/norwegianwoodstyle.cpp 9 - \snippet widgets/styles/norwegianwoodstyle.cpp 10 - - The \l{QStyle::styleHint()}{styleHint()} function returns some - hints to widgets or to the base style (in our case QProxyStyle) - about how to draw the widgets. The Windows style returns \c true - for the QStyle::SH_DitherDisabledText hint, resulting in a most - unpleasing visual effect. We override this behavior and return \c - false instead. We also return \c true for the - QStyle::SH_EtchDisabledText hint, meaning that disabled text is - rendered with an embossed look. - - \snippet widgets/styles/norwegianwoodstyle.cpp 11 - \snippet widgets/styles/norwegianwoodstyle.cpp 12 - - The \l{QStyle::drawPrimitive()}{drawPrimitive()} function is - called by Qt widgets to draw various fundamental graphical - elements. Here we reimplement it to draw QPushButton and - QComboBox with round corners. The button part of these widgets is - drawn using the QStyle::PE_PanelButtonCommand primitive element. - - The \c option parameter, of type QStyleOption, contains - everything we need to know about the widget we want to draw on. - In particular, \c option->rect gives the rectangle within which - to draw the primitive element. The \c painter parameter is a - QPainter object that we can use to draw on the widget. - - The \c widget parameter is the widget itself. Normally, all the - information we need is available in \c option and \c painter, so - we don't need \c widget. We can use it to perform special - effects; for example, QMacStyle uses it to animate default - buttons. If you use it, be aware that the caller is allowed to - pass a null pointer. - - We start by defining three \l{QColor}s that we'll need later on. - We also put the x, y, width, and height components of the - widget's rectangle in local variables. The value used for the \c - semiTransparentWhite and for the \c semiTransparentBlack color's - alpha channel depends on whether the mouse cursor is over the - widget or not. Since we set the Qt::WA_Hover attribute on - \l{QPushButton}s and \l{QComboBox}es, we can rely on the - QStyle::State_MouseOver flag to be set when the mouse is over the - widget. - - \snippet widgets/styles/norwegianwoodstyle.cpp 13 - \snippet widgets/styles/norwegianwoodstyle.cpp 14 - - The \c roundRect variable is a QPainterPath. A QPainterPath is is - a vectorial specification of a shape. Any shape (rectangle, - ellipse, spline, etc.) or combination of shapes can be expressed - as a path. We will use \c roundRect both for filling the button - background with a wooden texture and for drawing the outline. The - \c roundRectPath() function is a private function; we will come - back to it later. - - \snippet widgets/styles/norwegianwoodstyle.cpp 15 - \snippet widgets/styles/norwegianwoodstyle.cpp 16 - \snippet widgets/styles/norwegianwoodstyle.cpp 17 - \snippet widgets/styles/norwegianwoodstyle.cpp 18 - - We define two variables, \c brush and \c darker, and initialize - them based on the state of the button: - - \list - \li If the button is a \l{QPushButton::flat}{flat button}, we use - the \l{QPalette::Window}{Window} brush. We set \c - darker to \c true if the button is - \l{QAbstractButton::down}{down} or - \l{QAbstractButton::checked}{checked}. - \li If the button is currently held down by the user or in the - \l{QAbstractButton::checked}{checked} state, we use the - \l{QPalette::Mid}{Mid} component of the palette. We set - \c darker to \c true if the button is - \l{QAbstractButton::checked}{checked}. - \li Otherwise, we use the \l{QPalette::Button}{Button} component - of the palette. - \endlist - - The screenshot below illustrates how \l{QPushButton}s are - rendered based on their state: - - \image styles-woodbuttons.png Norwegian Wood buttons in different states - - To discover whether the button is flat or not, we need to cast - the \c option parameter to QStyleOptionButton and check if the - \l{QStyleOptionButton::features}{features} member specifies the - QStyleOptionButton::Flat flag. The qstyleoption_cast() function - performs a dynamic cast; if \c option is not a - QStyleOptionButton, qstyleoption_cast() returns a null pointer. - - \snippet widgets/styles/norwegianwoodstyle.cpp 19 - \snippet widgets/styles/norwegianwoodstyle.cpp 20 - \snippet widgets/styles/norwegianwoodstyle.cpp 21 - \snippet widgets/styles/norwegianwoodstyle.cpp 22 - \snippet widgets/styles/norwegianwoodstyle.cpp 23 - - We turn on antialiasing on QPainter. Antialiasing is a technique - that reduces the visual distortion that occurs when the edges of - a shape are converted into pixels. For the Norwegian Wood style, - we use it to obtain smoother edges for the round buttons. - - \image styles-aliasing.png Norwegian wood buttons with and without antialiasing - - The first call to QPainter::fillPath() draws the background of - the button with a wooden texture. The second call to - \l{QPainter::fillPath()}{fillPath()} paints the same area with a - semi-transparent black color (a black color with an alpha channel - of 63) to make the area darker if \c darker is true. - - \snippet widgets/styles/norwegianwoodstyle.cpp 24 - \snippet widgets/styles/norwegianwoodstyle.cpp 25 - - Next, we draw the outline. The top-left half of the outline and - the bottom-right half of the outline are drawn using different - \l{QPen}s to produce a 3D effect. Normally, the top-left half of - the outline is drawn lighter whereas the bottom-right half is - drawn darker, but if the button is - \l{QAbstractButton::down}{down} or - \l{QAbstractButton::checked}{checked}, we invert the two - \l{QPen}s to give a sunken look to the button. - - \snippet widgets/styles/norwegianwoodstyle.cpp 26 - - We draw the top-left part of the outline by calling - QPainter::drawPath() with an appropriate - \l{QPainter::setClipRegion()}{clip region}. If the - \l{QStyleOption::direction}{layout direction} is right-to-left - instead of left-to-right, we swap the \c x1, \c x2, \c x3, and \c - x4 variables to obtain correct results. On right-to-left desktop, - the "light" comes from the top-right corner of the screen instead - of the top-left corner; raised and sunken widgets must be drawn - accordingly. - - The diagram below illustrates how 3D effects are drawn according - to the layout direction. The area in red on the diagram - corresponds to the \c topHalf polygon: - - \image styles-3d.png - - An easy way to test how a style looks in right-to-left mode is to - pass the \c -reverse command-line option to the application. This - option is recognized by the QApplication constructor. - - \snippet widgets/styles/norwegianwoodstyle.cpp 32 - \snippet widgets/styles/norwegianwoodstyle.cpp 33 - \snippet widgets/styles/norwegianwoodstyle.cpp 34 - - The bottom-right part of the outline is drawn in a similar - fashion. Then we draw a one-pixel wide outline around the entire - button, using the \l{QPalette::WindowText}{WindowText} component - of the QPalette. - - This completes the QStyle::PE_PanelButtonCommand case of the \c - switch statement. Other primitive elements are handled by the - base style. Let's now turn to the other \c NorwegianWoodStyle - member functions: - - \snippet widgets/styles/norwegianwoodstyle.cpp 35 - \snippet widgets/styles/norwegianwoodstyle.cpp 36 - - We reimplement QStyle::drawControl() to draw the text on a - QPushButton in a bright color when the button is - \l{QAbstractButton::down}{down} or - \l{QAbstractButton::checked}{checked}. - - If the \c option parameter points to a QStyleOptionButton object - (it normally should), we take a copy of the object and modify its - \l{QStyleOption::palette}{palette} member to make the - QPalette::ButtonText be the same as the QPalette::BrightText - component (unless the widget is disabled). - - \snippet widgets/styles/norwegianwoodstyle.cpp 37 - \snippet widgets/styles/norwegianwoodstyle.cpp 38 - - The \c setTexture() function is a private function that sets the - \l{QBrush::texture()}{texture} component of the \l{QBrush}es for - a certain \l{QPalette::ColorRole}{color role}, for all three - \l{QPalette::ColorGroup}{color groups} (active, disabled, - inactive). We used it to initialize the Norwegian Wood palette in - \c standardPalette. - - \snippet widgets/styles/norwegianwoodstyle.cpp 39 - \snippet widgets/styles/norwegianwoodstyle.cpp 40 - - The \c roundRectPath() function is a private function that - constructs a QPainterPath object for round buttons. The path - consists of eight segments: four arc segments for the corners and - four lines for the sides. - - With around 250 lines of code, we have a fully functional custom - style based on one of the predefined styles. Custom styles can be - used to provide a distinct look to an application or family of - applications. - - \section1 WidgetGallery Class - - For completeness, we will quickly review the \c WidgetGallery - class, which contains the most common Qt widgets and allows the - user to change style dynamically. Here's the class definition: - - \snippet widgets/styles/widgetgallery.h 0 - \dots - \snippet widgets/styles/widgetgallery.h 1 - - Here's the \c WidgetGallery constructor: - - \snippet widgets/styles/widgetgallery.cpp 0 - - We start by creating child widgets. The \uicontrol Style combobox is - initialized with all the styles known to QStyleFactory, in - addition to \c NorwegianWood. The \c create...() functions are - private functions that set up the various parts of the \c - WidgetGallery. - - \snippet widgets/styles/widgetgallery.cpp 1 - \snippet widgets/styles/widgetgallery.cpp 2 - - We connect the \uicontrol Style combobox to the \c changeStyle() - private slot, the \uicontrol{Use style's standard palette} check box to - the \c changePalette() slot, and the \uicontrol{Disable widgets} check - box to the child widgets' - \l{QWidget::setDisabled()}{setDisabled()} slot. - - \snippet widgets/styles/widgetgallery.cpp 3 - \snippet widgets/styles/widgetgallery.cpp 4 - - Finally, we put the child widgets in layouts. - - \snippet widgets/styles/widgetgallery.cpp 5 - \snippet widgets/styles/widgetgallery.cpp 6 - - When the user changes the style in the combobox, we call - QApplication::setStyle() to dynamically change the style of the - application. - - \snippet widgets/styles/widgetgallery.cpp 7 - \snippet widgets/styles/widgetgallery.cpp 8 - - If the user turns the \uicontrol{Use style's standard palette} on, the - current style's \l{QStyle::standardPalette()}{standard palette} - is used; otherwise, the system's default palette is honored. - - \snippet widgets/styles/widgetgallery.cpp 9 - \snippet widgets/styles/widgetgallery.cpp 10 - - The \c advanceProgressBar() slot is called at regular intervals - to advance the progress bar. Since we don't know how long the - user will keep the Styles application running, we use a - logarithmic formula: The closer the progress bar gets to 100%, - the slower it advances. - - We will review \c createProgressBar() in a moment. - - \snippet widgets/styles/widgetgallery.cpp 11 - \snippet widgets/styles/widgetgallery.cpp 12 - - The \c createTopLeftGroupBox() function creates the QGroupBox - that occupies the top-left corner of the \c WidgetGallery. We - skip the \c createTopRightGroupBox(), \c - createBottomLeftTabWidget(), and \c createBottomRightGroupBox() - functions, which are very similar. - - \snippet widgets/styles/widgetgallery.cpp 13 - - In \c createProgressBar(), we create a QProgressBar at the bottom - of the \c WidgetGallery and connect its - \l{QTimer::timeout()}{timeout()} signal to the \c - advanceProgressBar() slot. -*/ diff --git a/examples/widgets/doc/src/stylesheet.qdoc b/examples/widgets/doc/src/stylesheet.qdoc deleted file mode 100644 index b85ccdb0..00000000 --- a/examples/widgets/doc/src/stylesheet.qdoc +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/stylesheet - \title Style Sheet Example - \ingroup examples-widgets - \brief The Style Sheet Example shows how to use style sheets. - - \borderedimage stylesheet-pagefold.png - \caption Screen Shot of the Pagefold style sheet - - The Style Sheet example shows how widgets can be styled using Qt Style Sheets. - You can open the style editor by selecting \uicontrol File > \uicontrol Edit Style Sheet, - to select an existing style sheet or design your own style and load it. - - The Style Sheet example consists of 2 classes: - \list - \li \c MainWindow - \li \c StyleSheetEditor - \endlist - - - \section1 MainWindow Class - - \c MainWindow inherits QWidget, and is the application's main window defined in - \c mainwindow.ui. The style of \c MainWindow can be modified with \c StyleSheetEditor. - - - \section1 StyleSheetEditor Class - - \c StyleSheetEditor enables you to open an editor where you can load an existing style sheet. - It is also possible to define a new stylesheet and load it. Its layout is defined in - \c stylesheeteditor.ui. - - \quotefromfile widgets/stylesheet/stylesheeteditor.cpp - \skipto setStyleName - \printline setStyleName - - Sets the specified \a styleName and grays the \c applyButton. - - \skipto setStyleSheetName - \printline setStyleSheetName - - Loads the stylesheet from \c styleSheetName. - - \skipto setModified() - \printline setModified() - - Enables the \c applyButton when the text in the buffer has changed. - - \skipto apply() - \printline apply() - - Sets the stylesheet properties in \l qApp and disables the \c applyButton. - - \skipto loadStyleSheet(const QString &sheetName) - \printline loadStyleSheet(const QString &sheetName) - - Loads the specified \a sheetName, and sets its properties in - \l qApp. - -*/ - diff --git a/examples/widgets/doc/src/syntaxhighlighter.qdoc b/examples/widgets/doc/src/syntaxhighlighter.qdoc index bdd13abd..17bcc1fa 100644 --- a/examples/widgets/doc/src/syntaxhighlighter.qdoc +++ b/examples/widgets/doc/src/syntaxhighlighter.qdoc @@ -4,6 +4,7 @@ /*! \example richtext/syntaxhighlighter \title Syntax Highlighter Example + \examplecategory {User Interface Components} \ingroup examples-richtext \brief The Syntax Highlighter example shows how to perform simple syntax highlighting. diff --git a/examples/widgets/doc/src/tabdialog.qdoc b/examples/widgets/doc/src/tabdialog.qdoc index f3887c94..fb45bbae 100644 --- a/examples/widgets/doc/src/tabdialog.qdoc +++ b/examples/widgets/doc/src/tabdialog.qdoc @@ -4,6 +4,7 @@ /*! \example dialogs/tabdialog \title Tab Dialog Example + \examplecategory {User Interface Components} \ingroup examples-dialogs \brief The Tab Dialog example shows how to construct a tab dialog using the diff --git a/examples/widgets/doc/src/tablet.qdoc b/examples/widgets/doc/src/tablet.qdoc index efbb769e..9d49d8de 100644 --- a/examples/widgets/doc/src/tablet.qdoc +++ b/examples/widgets/doc/src/tablet.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/tablet \title Tablet Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief This example shows how to use a Wacom tablet in Qt applications. @@ -13,7 +14,7 @@ generated. You need to reimplement the \l{QWidget::}{tabletEvent()} event handler if you want to handle tablet events. Events are generated when the tool (stylus) used for drawing enters and leaves the proximity of the - tablet (i.e., when it is close but not pressed down on it), when the tool + tablet (i.e., when it is closed but not pressed down on it), when the tool is pressed down and released from it, when the tool is moved across the tablet, and when one of the buttons on the tool is pressed or released. @@ -31,7 +32,7 @@ draw on the tablet as you use a pencil on paper. When you draw with the airbrush you get a spray of virtual paint; the finger wheel is used to change the density of the spray. When you draw with the art pen, you get a - a line whose width and endpoint angle depend on the rotation of the pen. + line whose width and endpoint angle depend on the rotation of the pen. The pressure and tilt can also be assigned to change the alpha and saturation values of the color and the width of the stroke. @@ -88,8 +89,6 @@ in a submenu of the \b Tablet menu, for selecting which property of each QTabletEvent will be used to vary the translucency (alpha channel) of the line being drawn or color being airbrushed. - (See the \l{Qt Widgets - Application Example}{application example} if you want - a high-level introduction to QActions.) \snippet widgets/tablet/mainwindow.cpp 9 diff --git a/examples/widgets/doc/src/tetrix.qdoc b/examples/widgets/doc/src/tetrix.qdoc deleted file mode 100644 index 1f6ed760..00000000 --- a/examples/widgets/doc/src/tetrix.qdoc +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/tetrix - \title Tetrix Example - \ingroup examples-widgets - \brief The Tetrix example is a Qt version of the classic Tetrix game. - - \borderedimage tetrix-example.png - - The object of the game is to stack pieces dropped from the top of the - playing area so that they fill entire rows at the bottom of the playing area. - - When a row is filled, all the blocks on that row are removed, the player earns - a number of points, and the pieces above are moved down to occupy that row. - If more than one row is filled, the blocks on each row are removed, and the - player earns extra points. - - The \uicontrol{Left} cursor key moves the current piece one space to the left, the - \uicontrol{Right} cursor key moves it one space to the right, the \uicontrol{Up} cursor - key rotates the piece counter-clockwise by 90 degrees, and the \uicontrol{Down} - cursor key rotates the piece clockwise by 90 degrees. - - To avoid waiting for a piece to fall to the bottom of the board, press \uicontrol{D} - to immediately move the piece down by one row, or press the \uicontrol{Space} key to - drop it as close to the bottom of the board as possible. - - This example shows how a simple game can be created using only three classes: - - \list - \li The \c TetrixWindow class is used to display the player's score, number of - lives, and information about the next piece to appear. - \li The \c TetrixBoard class contains the game logic, handles keyboard input, and - displays the pieces on the playing area. - \li The \c TetrixPiece class contains information about each piece. - \endlist - - In this approach, the \c TetrixBoard class is the most complex class, since it - handles the game logic and rendering. One benefit of this is that the - \c TetrixWindow and \c TetrixPiece classes are very simple and contain only a - minimum of code. - - \section1 TetrixWindow Class Definition - - The \c TetrixWindow class is used to display the game information and contains - the playing area: - - \snippet widgets/tetrix/tetrixwindow.h 0 - - We use private member variables for the board, various display widgets, and - buttons to allow the user to start a new game, pause the current game, and quit. - - Although the window inherits QWidget, the constructor does not provide an - argument to allow a parent widget to be specified. This is because the window - will always be used as a top-level widget. - - \section1 TetrixWindow Class Implementation - - The constructor sets up the user interface elements for the game: - - \snippet widgets/tetrix/tetrixwindow.cpp 0 - - We begin by constructing a \c TetrixBoard instance for the playing area and a - label that shows the next piece to be dropped into the playing area; the label - is initially empty. - - Three QLCDNumber objects are used to display the score, number of lives, and - lines removed. These initially show default values, and will be filled in - when a game begins: - - \snippet widgets/tetrix/tetrixwindow.cpp 1 - - Three buttons with shortcuts are constructed so that the user can start a - new game, pause the current game, and quit the application: - - \snippet widgets/tetrix/tetrixwindow.cpp 2 - \snippet widgets/tetrix/tetrixwindow.cpp 3 - - These buttons are configured so that they never receive the keyboard focus; - we want the keyboard focus to remain with the \c TetrixBoard instance so that - it receives all the keyboard events. Nonetheless, the buttons will still respond - to \uicontrol{Alt} key shortcuts. - - We connect \l{QAbstractButton::}{clicked()} signals from the \uicontrol{Start} - and \uicontrol{Pause} buttons to the board, and from the \uicontrol{Quit} button to the - application's \l{QCoreApplication::quit()} slot. - - \snippet widgets/tetrix/tetrixwindow.cpp 4 - \snippet widgets/tetrix/tetrixwindow.cpp 5 - - Signals from the board are also connected to the LCD widgets for the purpose of - updating the score, number of lives, and lines removed from the playing area. - - We place the label, LCD widgets, and the board into a QGridLayout - along with some labels that we create with the \c createLabel() convenience - function: - - \snippet widgets/tetrix/tetrixwindow.cpp 6 - - Finally, we set the grid layout on the widget, give the window a title, and - resize it to an appropriate size. - - The \c createLabel() convenience function simply creates a new label on the - heap, gives it an appropriate alignment, and returns it to the caller: - - \snippet widgets/tetrix/tetrixwindow.cpp 7 - - Since each label will be used in the widget's layout, it will become a child - of the \c TetrixWindow widget and, as a result, it will be deleted when the - window is deleted. - - \section1 TetrixPiece Class Definition - - The \c TetrixPiece class holds information about a piece in the game's - playing area, including its shape, position, and the range of positions it can - occupy on the board: - - \snippet widgets/tetrix/tetrixpiece.h 0 - - Each shape contains four blocks, and these are defined by the \c coords private - member variable. Additionally, each piece has a high-level description that is - stored internally in the \c pieceShape variable. - - The constructor is written inline in the definition, and simply ensures that - each piece is initially created with no shape. The \c shape() function simply - returns the contents of the \c pieceShape variable, and the \c x() and \c y() - functions return the x and y-coordinates of any given block in the shape. - - \section1 TetrixPiece Class Implementation - - The \c setRandomShape() function is used to select a random shape for a piece: - - \snippet widgets/tetrix/tetrixpiece.cpp 0 - - For convenience, it simply chooses a random shape from the \c TetrixShape enum - and calls the \c setShape() function to perform the task of positioning the - blocks. - - The \c setShape() function uses a look-up table of pieces to associate each - shape with an array of block positions: - - \snippet widgets/tetrix/tetrixpiece.cpp 1 - \snippet widgets/tetrix/tetrixpiece.cpp 2 - - These positions are read from the table into the piece's own array of positions, - and the piece's internal shape information is updated to use the new shape. - - The \c x() and \c y() functions are implemented inline in the class definition, - returning positions defined on a grid that extends horizontally and vertically - with coordinates from -2 to 2. Although the predefined coordinates for each - piece only vary horizontally from -1 to 1 and vertically from -1 to 2, each - piece can be rotated by 90, 180, and 270 degrees. - - The \c minX() and \c maxX() functions return the minimum and maximum horizontal - coordinates occupied by the blocks that make up the piece: - - \snippet widgets/tetrix/tetrixpiece.cpp 3 - \snippet widgets/tetrix/tetrixpiece.cpp 4 - - Similarly, the \c minY() and \c maxY() functions return the minimum and maximum - vertical coordinates occupied by the blocks: - - \snippet widgets/tetrix/tetrixpiece.cpp 5 - \snippet widgets/tetrix/tetrixpiece.cpp 6 - - The \c rotatedLeft() function returns a new piece with the same shape as an - existing piece, but rotated counter-clockwise by 90 degrees: - - \snippet widgets/tetrix/tetrixpiece.cpp 7 - - Similarly, the \c rotatedRight() function returns a new piece with the same - shape as an existing piece, but rotated clockwise by 90 degrees: - - \snippet widgets/tetrix/tetrixpiece.cpp 9 - - These last two functions enable each piece to create rotated copies of itself. - - \section1 TetrixBoard Class Definition - - The \c TetrixBoard class inherits from QFrame and contains the game logic and display features: - - \snippet widgets/tetrix/tetrixboard.h 0 - - Apart from the \c setNextPieceLabel() function and the \c start() and \c pause() - public slots, we only provide public functions to reimplement QWidget::sizeHint() - and QWidget::minimumSizeHint(). The signals are used to communicate changes to - the player's information to the \c TetrixWindow instance. - - The rest of the functionality is provided by reimplementations of protected event - handlers and private functions: - - \snippet widgets/tetrix/tetrixboard.h 1 - - The board is composed of a fixed-size array whose elements correspond to - spaces for individual blocks. Each element in the array contains a \c TetrixShape - value corresponding to the type of shape that occupies that element. - - Each shape on the board will occupy four elements in the array, and these will - all contain the enum value that corresponds to the type of the shape. - - We use a QBasicTimer to control the rate at which pieces fall toward the bottom - of the playing area. This allows us to provide an implementation of - \l{QObject::}{timerEvent()} that we can use to update the widget. - - \section1 TetrixBoard Class Implementation - - In the constructor, we customize the frame style of the widget, ensure that - keyboard input will be received by the widget by using Qt::StrongFocus for the - focus policy, and initialize the game state: - - \snippet widgets/tetrix/tetrixboard.cpp 0 - - The first (next) piece is also set up with a random shape. - - The \c setNextPieceLabel() function is used to pass in an externally-constructed - label to the board, so that it can be shown alongside the playing area: - - \snippet widgets/tetrix/tetrixboard.cpp 1 - - We provide a reasonable size hint and minimum size hint for the board, based on - the size of the space for each block in the playing area: - - \snippet widgets/tetrix/tetrixboard.cpp 2 - \snippet widgets/tetrix/tetrixboard.cpp 3 - - By using a minimum size hint, we indicate to the layout in the parent widget - that the board should not shrink below a minimum size. - - A new game is started when the \c start() slot is called. This resets the - game's state, the player's score and level, and the contents of the board: - - \snippet widgets/tetrix/tetrixboard.cpp 4 - - We also emit signals to inform other components of these changes before creating - a new piece that is ready to be dropped into the playing area. We start the - timer that determines how often the piece drops down one row on the board. - - The \c pause() slot is used to temporarily stop the current game by stopping the - internal timer: - - \snippet widgets/tetrix/tetrixboard.cpp 5 - \snippet widgets/tetrix/tetrixboard.cpp 6 - - We perform checks to ensure that the game can only be paused if it is already - running and not already paused. - - The \c paintEvent() function is straightforward to implement. We begin by - calling the base class's implementation of \l{QWidget::}{paintEvent()} before - constructing a QPainter for use on the board: - - \snippet widgets/tetrix/tetrixboard.cpp 7 - - Since the board is a subclass of QFrame, we obtain a QRect that covers the area - \e inside the frame decoration before drawing our own content. - - If the game is paused, we want to hide the existing state of the board and - show some text. We achieve this by painting text onto the widget and returning - early from the function. The rest of the painting is performed after this point. - - The position of the top of the board is found by subtracting the total height - of each space on the board from the bottom of the frame's internal rectangle. - For each space on the board that is occupied by a piece, we call the - \c drawSquare() function to draw a block at that position. - - \snippet widgets/tetrix/tetrixboard.cpp 8 - \snippet widgets/tetrix/tetrixboard.cpp 9 - - Spaces that are not occupied by blocks are left blank. - - Unlike the existing pieces on the board, the current piece is drawn - block-by-block at its current position: - - \snippet widgets/tetrix/tetrixboard.cpp 10 - \snippet widgets/tetrix/tetrixboard.cpp 11 - \snippet widgets/tetrix/tetrixboard.cpp 12 - - The \c keyPressEvent() handler is called whenever the player presses a key while - the \c TetrixBoard widget has the keyboard focus. - - \snippet widgets/tetrix/tetrixboard.cpp 13 - - If there is no current game, the game is running but paused, or if there is no - current shape to control, we simply pass on the event to the base class. - - We check whether the event is about any of the keys that the player uses to - control the current piece and, if so, we call the relevant function to handle - the input: - - \snippet widgets/tetrix/tetrixboard.cpp 14 - - In the case where the player presses a key that we are not interested in, we - again pass on the event to the base class's implementation of - \l{QWidget::}{keyPressEvent()}. - - The \c timerEvent() handler is called every time the class's QBasicTimer - instance times out. We need to check that the event we receive corresponds to - our timer. If it does, we can update the board: - - \snippet widgets/tetrix/tetrixboard.cpp 15 - \snippet widgets/tetrix/tetrixboard.cpp 16 - \snippet widgets/tetrix/tetrixboard.cpp 17 - - If a row (or line) has just been filled, we create a new piece and reset the - timer; otherwise we move the current piece down by one row. We let the base - class handle other timer events that we receive. - - The \c clearBoard() function simply fills the board with the - \c TetrixShape::NoShape value: - - \snippet widgets/tetrix/tetrixboard.cpp 18 - - The \c dropDown() function moves the current piece down as far as possible on - the board, either until it is touching the bottom of the playing area or it is - stacked on top of another piece: - - \snippet widgets/tetrix/tetrixboard.cpp 19 - \snippet widgets/tetrix/tetrixboard.cpp 20 - - The number of rows the piece has dropped is recorded and passed to the - \c pieceDropped() function so that the player's score can be updated. - - The \c oneLineDown() function is used to move the current piece down by one row - (line), either when the user presses the \uicontrol{D} key or when the piece is - scheduled to move: - - \snippet widgets/tetrix/tetrixboard.cpp 21 - - If the piece cannot drop down by one line, we call the \c pieceDropped() function - with zero as the argument to indicate that it cannot fall any further, and that - the player should receive no extra points for the fall. - - The \c pieceDropped() function itself is responsible for awarding points to the - player for positioning the current piece, checking for full rows on the board - and, if no lines have been removed, creating a new piece to replace the current - one: - - \snippet widgets/tetrix/tetrixboard.cpp 22 - \snippet widgets/tetrix/tetrixboard.cpp 23 - - We call \c removeFullLines() each time a piece has been dropped. This scans - the board from bottom to top, looking for blank spaces on each row. - - \snippet widgets/tetrix/tetrixboard.cpp 24 - \snippet widgets/tetrix/tetrixboard.cpp 25 - \snippet widgets/tetrix/tetrixboard.cpp 26 - \snippet widgets/tetrix/tetrixboard.cpp 27 - - If a row contains no blank spaces, the rows above it are copied down by one row - to compress the stack of pieces, the top row on the board is cleared, and the - number of full lines found is incremented. - - \snippet widgets/tetrix/tetrixboard.cpp 28 - \snippet widgets/tetrix/tetrixboard.cpp 29 - - If some lines have been removed, the player's score and the total number of lines - removed are updated. The \c linesRemoved() and \c scoreChanged() signals are - emitted to send these new values to other widgets in the window. - - Additionally, we set the timer to elapse after half a second, set the - \c isWaitingAfterLine flag to indicate that lines have been removed, unset - the piece's shape to ensure that it is not drawn, and update the widget. - The next time that the \c timerEvent() handler is called, a new piece will be - created and the game will continue. - - The \c newPiece() function places the next available piece at the top of the - board, and creates a new piece with a random shape: - - \snippet widgets/tetrix/tetrixboard.cpp 30 - \snippet widgets/tetrix/tetrixboard.cpp 31 - - We place a new piece in the middle of the board at the top. The game is over if - the piece can't move, so we unset its shape to prevent it from being drawn, stop - the timer, and unset the \c isStarted flag. - - The \c showNextPiece() function updates the label that shows the next piece to - be dropped: - - \snippet widgets/tetrix/tetrixboard.cpp 32 - \snippet widgets/tetrix/tetrixboard.cpp 33 - - We draw the piece's component blocks onto a pixmap that is then set on the label. - - The \c tryMove() function is used to determine whether a piece can be positioned - at the specified coordinates: - - \snippet widgets/tetrix/tetrixboard.cpp 34 - - We examine the spaces on the board that the piece needs to occupy and, if they - are already occupied by other pieces, we return \c false to indicate that the - move has failed. - - \snippet widgets/tetrix/tetrixboard.cpp 35 - - If the piece could be placed on the board at the desired location, we update the - current piece and its position, update the widget, and return \c true to indicate - success. - - The \c drawSquare() function draws the blocks (normally squares) that make up - each piece using different colors for pieces with different shapes: - - \snippet widgets/tetrix/tetrixboard.cpp 36 - - We obtain the color to use from a look-up table that relates each shape to an - RGB value, and use the painter provided to draw the block at the specified - coordinates. -*/ diff --git a/examples/widgets/doc/src/textedit.qdoc b/examples/widgets/doc/src/textedit.qdoc deleted file mode 100644 index f41a58fe..00000000 --- a/examples/widgets/doc/src/textedit.qdoc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example richtext/textedit - \title Text Edit - \ingroup examples-richtext - \brief The Text Edit example shows Qt's rich text editing facilities - in action. - - \brief The Text Edit example shows Qt's rich text editing facilities in action, - providing an example document for you to experiment with. - - \image textedit-demo.png -*/ diff --git a/examples/widgets/doc/src/tooltips.qdoc b/examples/widgets/doc/src/tooltips.qdoc index 3af3768f..6dc0d2fb 100644 --- a/examples/widgets/doc/src/tooltips.qdoc +++ b/examples/widgets/doc/src/tooltips.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/tooltips \title Tool Tips Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Tool Tips example shows how to provide static and dynamic tool tips for an application's widgets. diff --git a/examples/widgets/doc/src/transformations.qdoc b/examples/widgets/doc/src/transformations.qdoc index aabb672b..ab54bbcb 100644 --- a/examples/widgets/doc/src/transformations.qdoc +++ b/examples/widgets/doc/src/transformations.qdoc @@ -4,6 +4,7 @@ /*! \example painting/transformations \title Transformations Example + \examplecategory {Graphics & Multimedia} \ingroup examples-painting \brief The Transformations example shows how transformations influence the way that QPainter renders graphics primitives. diff --git a/examples/widgets/doc/src/treemodelcompleter.qdoc b/examples/widgets/doc/src/treemodelcompleter.qdoc index 9734c3bc..ae7c18f4 100644 --- a/examples/widgets/doc/src/treemodelcompleter.qdoc +++ b/examples/widgets/doc/src/treemodelcompleter.qdoc @@ -4,6 +4,7 @@ /*! \example tools/treemodelcompleter \title Tree Model Completer Example + \examplecategory {User Interface Components} \ingroup examples-widgets-tools \brief The Tree Model Completer example shows how to provide completion diff --git a/examples/widgets/doc/src/trivialwizard.qdoc b/examples/widgets/doc/src/trivialwizard.qdoc index f62e9174..75d007f3 100644 --- a/examples/widgets/doc/src/trivialwizard.qdoc +++ b/examples/widgets/doc/src/trivialwizard.qdoc @@ -4,6 +4,7 @@ /*! \example dialogs/trivialwizard \title Trivial Wizard Example + \examplecategory {User Interface Components} \ingroup examples-dialogs \brief The Trivial Wizard example illustrates how to create a linear three-page @@ -55,5 +56,5 @@ \snippet dialogs/trivialwizard/trivialwizard.cpp 10 - \sa QWizard, {Class Wizard Example}, {License Wizard Example} + \sa QWizard, {License Wizard Example} */ diff --git a/examples/widgets/doc/src/undoframework.qdoc b/examples/widgets/doc/src/undoframework.qdoc index 6ca2b4b1..e8d895b7 100644 --- a/examples/widgets/doc/src/undoframework.qdoc +++ b/examples/widgets/doc/src/undoframework.qdoc @@ -4,6 +4,7 @@ /*! \example tools/undoframework \title Undo Framework Example + \examplecategory {Data Processing & I/O} \ingroup examples-widgets-tools \brief This example shows how to implement undo/redo functionality diff --git a/examples/widgets/doc/src/validators.qdoc b/examples/widgets/doc/src/validators.qdoc deleted file mode 100644 index a0b88617..00000000 --- a/examples/widgets/doc/src/validators.qdoc +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example widgets/validators - \title Validators Example - \brief The Validators example shows the signal emission behavior of input - validators. - - \borderedimage validators.png -*/ diff --git a/examples/widgets/doc/src/windowflags.qdoc b/examples/widgets/doc/src/windowflags.qdoc index d521894a..10b04967 100644 --- a/examples/widgets/doc/src/windowflags.qdoc +++ b/examples/widgets/doc/src/windowflags.qdoc @@ -4,6 +4,7 @@ /*! \example widgets/windowflags \title Window Flags Example + \examplecategory {User Interface Components} \ingroup examples-widgets \brief The Window Flags example shows how to use the window flags available in Qt. diff --git a/examples/widgets/draganddrop/CMakeLists.txt b/examples/widgets/draganddrop/CMakeLists.txt index c75600f6..ccd0ef54 100644 --- a/examples/widgets/draganddrop/CMakeLists.txt +++ b/examples/widgets/draganddrop/CMakeLists.txt @@ -4,5 +4,3 @@ qt_internal_add_example(draggableicons) qt_internal_add_example(draggabletext) qt_internal_add_example(dropsite) -qt_internal_add_example(fridgemagnets) -qt_internal_add_example(puzzle) diff --git a/examples/widgets/draganddrop/draganddrop.pro b/examples/widgets/draganddrop/draganddrop.pro index 1ecafd33..ad56f3f6 100644 --- a/examples/widgets/draganddrop/draganddrop.pro +++ b/examples/widgets/draganddrop/draganddrop.pro @@ -1,6 +1,4 @@ TEMPLATE = subdirs SUBDIRS = draggableicons \ draggabletext \ - dropsite \ - fridgemagnets \ - puzzle + dropsite diff --git a/examples/widgets/draganddrop/draggableicons/main.cpp b/examples/widgets/draganddrop/draggableicons/main.cpp index cd22e4e3..fe927085 100644 --- a/examples/widgets/draganddrop/draggableicons/main.cpp +++ b/examples/widgets/draganddrop/draggableicons/main.cpp @@ -8,8 +8,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(draggableicons); - QApplication app(argc, argv); QWidget mainWidget; diff --git a/examples/widgets/draganddrop/draggabletext/main.cpp b/examples/widgets/draganddrop/draggabletext/main.cpp index f6ab39ae..ebfd481e 100644 --- a/examples/widgets/draganddrop/draggabletext/main.cpp +++ b/examples/widgets/draganddrop/draggabletext/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(draggabletext); - QApplication app(argc, argv); DragWidget window; window.show(); diff --git a/examples/widgets/effects/CMakeLists.txt b/examples/widgets/effects/CMakeLists.txt deleted file mode 100644 index 8b1471d1..00000000 --- a/examples/widgets/effects/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -qt_internal_add_example(blurpicker) -qt_internal_add_example(fademessage) diff --git a/examples/widgets/effects/effects.pro b/examples/widgets/effects/effects.pro deleted file mode 100644 index 05911979..00000000 --- a/examples/widgets/effects/effects.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = \ - subdirs -SUBDIRS = \ - blurpicker \ - fademessage diff --git a/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc b/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc index 7722da68..878da3f8 100644 --- a/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc +++ b/examples/widgets/gestures/imagegestures/doc/src/imagegestures.qdoc @@ -4,6 +4,7 @@ /*! \example gestures/imagegestures \title Image Gestures Example + \examplecategory {User Interface Components} \brief Demonstrates the use of simple gestures in a widget. This example shows how to enable gestures for a widget and use gesture input diff --git a/examples/widgets/gestures/imagegestures/imagewidget.cpp b/examples/widgets/gestures/imagegestures/imagewidget.cpp index e17bf3c0..3ee72392 100644 --- a/examples/widgets/gestures/imagegestures/imagewidget.cpp +++ b/examples/widgets/gestures/imagegestures/imagewidget.cpp @@ -149,15 +149,23 @@ void ImageWidget::openDirectory(const QString &path) this->path = path; QDir dir(path); const QStringList nameFilters{"*.jpg", "*.png"}; - files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name); + files = dir.entryInfoList(nameFilters, QDir::Files|QDir::Readable, QDir::Name); position = 0; goToImage(0); update(); } -QImage ImageWidget::loadImage(const QString &fileName) const +/* + With Android's content scheme paths, it might not be possible to simply + append a file name to the chosen directory path to be able to open the image, + because usually paths are returned by an Android file provider and handling those + paths manually is not guaranteed to work. For that reason, it's better to keep + around QFileInfo objects and use absoluteFilePath(). +*/ +QImage ImageWidget::loadImage(const QFileInfo &fileInfo) const { + const QString fileName = fileInfo.absoluteFilePath(); QImageReader reader(fileName); reader.setAutoTransform(true); qCDebug(lcExample) << "loading" << QDir::toNativeSeparators(fileName) << position << '/' << files.size(); @@ -187,7 +195,7 @@ void ImageWidget::goNextImage() prevImage = currentImage; currentImage = nextImage; if (position+1 < files.size()) - nextImage = loadImage(path + QLatin1Char('/') + files.at(position+1)); + nextImage = loadImage(files.at(position + 1)); else nextImage = QImage(); } @@ -204,7 +212,7 @@ void ImageWidget::goPrevImage() nextImage = currentImage; currentImage = prevImage; if (position > 0) - prevImage = loadImage(path + QLatin1Char('/') + files.at(position-1)); + prevImage = loadImage(files.at(position - 1)); else prevImage = QImage(); } @@ -234,12 +242,12 @@ void ImageWidget::goToImage(int index) position = index; if (index > 0) - prevImage = loadImage(path + QLatin1Char('/') + files.at(position-1)); + prevImage = loadImage(files.at(position - 1)); else prevImage = QImage(); - currentImage = loadImage(path + QLatin1Char('/') + files.at(position)); + currentImage = loadImage(files.at(position)); if (position+1 < files.size()) - nextImage = loadImage(path + QLatin1Char('/') + files.at(position+1)); + nextImage = loadImage(files.at(position + 1)); else nextImage = QImage(); update(); diff --git a/examples/widgets/gestures/imagegestures/imagewidget.h b/examples/widgets/gestures/imagegestures/imagewidget.h index 7e814244..b5bbc9ef 100644 --- a/examples/widgets/gestures/imagegestures/imagewidget.h +++ b/examples/widgets/gestures/imagegestures/imagewidget.h @@ -4,6 +4,7 @@ #ifndef IMAGEWIDGET_H #define IMAGEWIDGET_H +#include #include #include #include @@ -40,14 +41,14 @@ private: void swipeTriggered(QSwipeGesture*); //! [class definition begin] - QImage loadImage(const QString &fileName) const; + QImage loadImage(const QFileInfo &fileInfo) const; void loadImage(); void goNextImage(); void goPrevImage(); void goToImage(int index); QString path; - QStringList files; + QFileInfoList files; int position; QImage prevImage, nextImage; diff --git a/examples/widgets/graphicsview/CMakeLists.txt b/examples/widgets/graphicsview/CMakeLists.txt index e0d29131..4eddec0c 100644 --- a/examples/widgets/graphicsview/CMakeLists.txt +++ b/examples/widgets/graphicsview/CMakeLists.txt @@ -3,11 +3,9 @@ qt_internal_add_example(chip) qt_internal_add_example(elasticnodes) -qt_internal_add_example(embeddeddialogs) qt_internal_add_example(collidingmice) qt_internal_add_example(basicgraphicslayouts) qt_internal_add_example(diagramscene) -qt_internal_add_example(flowlayout) qt_internal_add_example(simpleanchorlayout) if(QT_FEATURE_cursor AND QT_FEATURE_draganddrop) qt_internal_add_example(dragdroprobot) diff --git a/examples/widgets/graphicsview/chip/main.cpp b/examples/widgets/graphicsview/chip/main.cpp index bf75db6a..4ccd66bb 100644 --- a/examples/widgets/graphicsview/chip/main.cpp +++ b/examples/widgets/graphicsview/chip/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(images); - QApplication app(argc, argv); app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); diff --git a/examples/widgets/graphicsview/diagramscene/main.cpp b/examples/widgets/graphicsview/diagramscene/main.cpp index 56310b17..699c33f0 100644 --- a/examples/widgets/graphicsview/diagramscene/main.cpp +++ b/examples/widgets/graphicsview/diagramscene/main.cpp @@ -7,8 +7,6 @@ int main(int argv, char *args[]) { - Q_INIT_RESOURCE(diagramscene); - QApplication app(argv, args); MainWindow mainWindow; mainWindow.setGeometry(100, 100, 800, 500); diff --git a/examples/widgets/graphicsview/graphicsview.pro b/examples/widgets/graphicsview/graphicsview.pro index b3e49050..d50f0b1a 100644 --- a/examples/widgets/graphicsview/graphicsview.pro +++ b/examples/widgets/graphicsview/graphicsview.pro @@ -2,12 +2,10 @@ TEMPLATE = subdirs SUBDIRS = \ chip \ elasticnodes \ - embeddeddialogs \ collidingmice \ basicgraphicslayouts \ diagramscene \ dragdroprobot \ - flowlayout \ simpleanchorlayout contains(DEFINES, QT_NO_CURSOR)|!qtConfig(draganddrop): SUBDIRS -= dragdroprobot diff --git a/examples/widgets/itemviews/CMakeLists.txt b/examples/widgets/itemviews/CMakeLists.txt index 96af14b5..9659dafa 100644 --- a/examples/widgets/itemviews/CMakeLists.txt +++ b/examples/widgets/itemviews/CMakeLists.txt @@ -3,26 +3,12 @@ qt_internal_add_example(addressbook) qt_internal_add_example(basicsortfiltermodel) -qt_internal_add_example(chart) qt_internal_add_example(coloreditorfactory) qt_internal_add_example(combowidgetmapper) qt_internal_add_example(customsortfiltermodel) -qt_internal_add_example(dirview) qt_internal_add_example(editabletreemodel) qt_internal_add_example(fetchmore) -qt_internal_add_example(flattreeview) qt_internal_add_example(frozencolumn) -qt_internal_add_example(interview) -qt_internal_add_example(pixelator) -qt_internal_add_example(simpletreemodel) -qt_internal_add_example(simplewidgetmapper) qt_internal_add_example(spinboxdelegate) qt_internal_add_example(spreadsheet) qt_internal_add_example(stardelegate) -qt_internal_add_example(storageview) -if(QT_FEATURE_draganddrop) - qt_internal_add_example(puzzle) -endif() -if(TARGET Qt6::Xml) - qt_internal_add_example(simpledommodel) -endif() diff --git a/examples/widgets/itemviews/editabletreemodel/main.cpp b/examples/widgets/itemviews/editabletreemodel/main.cpp index b7e7b3de..40a8fa10 100644 --- a/examples/widgets/itemviews/editabletreemodel/main.cpp +++ b/examples/widgets/itemviews/editabletreemodel/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(editabletreemodel); - QApplication app(argc, argv); MainWindow window; window.show(); diff --git a/examples/widgets/itemviews/flattreeview/CMakeLists.txt b/examples/widgets/itemviews/flattreeview/CMakeLists.txt deleted file mode 100644 index 2d987148..00000000 --- a/examples/widgets/itemviews/flattreeview/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(flattreeview LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/itemviews/flattreeview") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(flattreeview - main.cpp -) - -set_target_properties(flattreeview PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(flattreeview PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS flattreeview - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/itemviews/flattreeview/flattreeview.pro b/examples/widgets/itemviews/flattreeview/flattreeview.pro deleted file mode 100644 index 05a6573d..00000000 --- a/examples/widgets/itemviews/flattreeview/flattreeview.pro +++ /dev/null @@ -1,7 +0,0 @@ -QT += widgets - -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/itemviews/flattreeview -INSTALLS += target diff --git a/examples/widgets/itemviews/flattreeview/main.cpp b/examples/widgets/itemviews/flattreeview/main.cpp deleted file mode 100644 index f51e24da..00000000 --- a/examples/widgets/itemviews/flattreeview/main.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2017 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -/* - main.cpp - - A simple example that shows a multi-column list using QTreeView. - The data is not a tree, so the first column was made movable. -*/ - -#include -#include -#include -#include - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - QStandardItemModel model(4, 2); - QTreeView treeView; - treeView.setModel(&model); - treeView.setRootIsDecorated(false); - treeView.header()->setFirstSectionMovable(true); - treeView.header()->setStretchLastSection(true); - - for (int row = 0; row < 4; ++row) { - for (int column = 0; column < 2; ++column) { - QModelIndex index = model.index(row, column, QModelIndex()); - model.setData(index, QVariant((row + 1) * (column + 1))); - } - } - - treeView.setWindowTitle(QObject::tr("Flat Tree View")); - treeView.show(); - return app.exec(); -} diff --git a/examples/widgets/itemviews/frozencolumn/main.cpp b/examples/widgets/itemviews/frozencolumn/main.cpp index 901db76d..8cc4a1d7 100644 --- a/examples/widgets/itemviews/frozencolumn/main.cpp +++ b/examples/widgets/itemviews/frozencolumn/main.cpp @@ -10,8 +10,6 @@ int main(int argc, char* argv[]) { - Q_INIT_RESOURCE(grades); - QApplication app( argc, argv ); QStandardItemModel *model=new QStandardItemModel(); @@ -46,4 +44,3 @@ int main(int argc, char* argv[]) tableView->show(); return app.exec(); } - diff --git a/examples/widgets/itemviews/itemviews.pro b/examples/widgets/itemviews/itemviews.pro index b4a002c1..15ad2625 100644 --- a/examples/widgets/itemviews/itemviews.pro +++ b/examples/widgets/itemviews/itemviews.pro @@ -1,24 +1,13 @@ TEMPLATE = subdirs SUBDIRS = addressbook \ basicsortfiltermodel \ - chart \ coloreditorfactory \ combowidgetmapper \ customsortfiltermodel \ - dirview \ editabletreemodel \ fetchmore \ - flattreeview \ frozencolumn \ - interview \ - pixelator \ - puzzle \ - simpledommodel \ simpletreemodel \ - simplewidgetmapper \ spinboxdelegate \ spreadsheet \ - stardelegate \ - storageview -!qtConfig(draganddrop): SUBDIRS -= puzzle -!qtHaveModule(xml): SUBDIRS -= simpledommodel + stardelegate diff --git a/examples/widgets/itemviews/simpletreemodel/main.cpp b/examples/widgets/itemviews/simpletreemodel/main.cpp index 10075a18..ee8edb7c 100644 --- a/examples/widgets/itemviews/simpletreemodel/main.cpp +++ b/examples/widgets/itemviews/simpletreemodel/main.cpp @@ -9,8 +9,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(simpletreemodel); - QApplication app(argc, argv); QFile file(":/default.txt"); diff --git a/examples/widgets/itemviews/spreadsheet/main.cpp b/examples/widgets/itemviews/spreadsheet/main.cpp index 13bd0c93..3c2d676e 100644 --- a/examples/widgets/itemviews/spreadsheet/main.cpp +++ b/examples/widgets/itemviews/spreadsheet/main.cpp @@ -8,8 +8,6 @@ int main(int argc, char **argv) { - Q_INIT_RESOURCE(spreadsheet); - QApplication app(argc, argv); SpreadSheet sheet(10, 6); sheet.setWindowIcon(QPixmap(":/images/interview.png")); @@ -17,5 +15,3 @@ int main(int argc, char **argv) sheet.layout()->setSizeConstraint(QLayout::SetFixedSize); return app.exec(); } - - diff --git a/examples/widgets/layouts/CMakeLists.txt b/examples/widgets/layouts/CMakeLists.txt index 60299638..75355a07 100644 --- a/examples/widgets/layouts/CMakeLists.txt +++ b/examples/widgets/layouts/CMakeLists.txt @@ -2,6 +2,4 @@ # SPDX-License-Identifier: BSD-3-Clause qt_internal_add_example(basiclayouts) -qt_internal_add_example(borderlayout) -qt_internal_add_example(dynamiclayouts) qt_internal_add_example(flowlayout) diff --git a/examples/widgets/layouts/layouts.pro b/examples/widgets/layouts/layouts.pro index c641e8cf..c0b5453f 100644 --- a/examples/widgets/layouts/layouts.pro +++ b/examples/widgets/layouts/layouts.pro @@ -1,5 +1,3 @@ TEMPLATE = subdirs SUBDIRS = basiclayouts \ - borderlayout \ - dynamiclayouts \ flowlayout diff --git a/examples/widgets/mainwindows/CMakeLists.txt b/examples/widgets/mainwindows/CMakeLists.txt index f8457d50..8fec6844 100644 --- a/examples/widgets/mainwindows/CMakeLists.txt +++ b/examples/widgets/mainwindows/CMakeLists.txt @@ -1,8 +1,4 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -qt_internal_add_example(application) -qt_internal_add_example(dockwidgets) -qt_internal_add_example(mainwindow) -qt_internal_add_example(mdi) qt_internal_add_example(menus) diff --git a/examples/widgets/mainwindows/mainwindows.pro b/examples/widgets/mainwindows/mainwindows.pro index 7a53cc6f..75f664f6 100644 --- a/examples/widgets/mainwindows/mainwindows.pro +++ b/examples/widgets/mainwindows/mainwindows.pro @@ -1,6 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = application \ - dockwidgets \ - mainwindow \ - mdi \ - menus +SUBDIRS = menus diff --git a/examples/widgets/painting/CMakeLists.txt b/examples/widgets/painting/CMakeLists.txt index df0bfe90..38ff34c5 100644 --- a/examples/widgets/painting/CMakeLists.txt +++ b/examples/widgets/painting/CMakeLists.txt @@ -11,4 +11,3 @@ qt_internal_add_example(pathstroke) qt_internal_add_example(imagecomposition) qt_internal_add_example(painterpaths) qt_internal_add_example(transformations) -qt_internal_add_example(fontsampler) diff --git a/examples/widgets/painting/affine/main.cpp b/examples/widgets/painting/affine/main.cpp index 3efd2125..1f9c2399 100644 --- a/examples/widgets/painting/affine/main.cpp +++ b/examples/widgets/painting/affine/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char **argv) { - Q_INIT_RESOURCE(affine); - QApplication app(argc, argv); XFormWidget xformWidget(nullptr); diff --git a/examples/widgets/painting/basicdrawing/main.cpp b/examples/widgets/painting/basicdrawing/main.cpp index 67a6d845..1d8fd919 100644 --- a/examples/widgets/painting/basicdrawing/main.cpp +++ b/examples/widgets/painting/basicdrawing/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(basicdrawing); - QApplication app(argc, argv); Window window; window.show(); diff --git a/examples/widgets/painting/deform/main.cpp b/examples/widgets/painting/deform/main.cpp index b81adc09..5ac5b4cc 100644 --- a/examples/widgets/painting/deform/main.cpp +++ b/examples/widgets/painting/deform/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char **argv) { - Q_INIT_RESOURCE(deform); - QApplication app(argc, argv); bool smallScreen = QApplication::arguments().contains("-small-screen"); diff --git a/examples/widgets/painting/gradients/main.cpp b/examples/widgets/painting/gradients/main.cpp index f3b75a74..c1e22975 100644 --- a/examples/widgets/painting/gradients/main.cpp +++ b/examples/widgets/painting/gradients/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(gradients); - QApplication app(argc, argv); GradientWidget gradientWidget; diff --git a/examples/widgets/painting/imagecomposition/main.cpp b/examples/widgets/painting/imagecomposition/main.cpp index cd5468f0..a3cf65a3 100644 --- a/examples/widgets/painting/imagecomposition/main.cpp +++ b/examples/widgets/painting/imagecomposition/main.cpp @@ -8,8 +8,6 @@ //! [0] int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(imagecomposition); - QApplication app(argc, argv); ImageComposer composer; composer.show(); diff --git a/examples/widgets/painting/painting.pro b/examples/widgets/painting/painting.pro index a9749a56..7d5c2e02 100644 --- a/examples/widgets/painting/painting.pro +++ b/examples/widgets/painting/painting.pro @@ -8,8 +8,7 @@ SUBDIRS = basicdrawing \ pathstroke \ imagecomposition \ painterpaths \ - transformations \ - fontsampler + transformations EXAMPLE_FILES = \ shared diff --git a/examples/widgets/painting/pathstroke/main.cpp b/examples/widgets/painting/pathstroke/main.cpp index a5ceb9e3..4f991e8a 100644 --- a/examples/widgets/painting/pathstroke/main.cpp +++ b/examples/widgets/painting/pathstroke/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char **argv) { - Q_INIT_RESOURCE(pathstroke); - QApplication app(argc, argv); bool smallScreen = QApplication::arguments().contains("-small-screen"); diff --git a/examples/widgets/qnx/foreignwindows/collector.cpp b/examples/widgets/qnx/foreignwindows/collector.cpp index 6717488d..8831aab3 100644 --- a/examples/widgets/qnx/foreignwindows/collector.cpp +++ b/examples/widgets/qnx/foreignwindows/collector.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2018 QNX Software Systems. All rights reserved. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include #include diff --git a/examples/widgets/qnx/foreignwindows/collector.h b/examples/widgets/qnx/foreignwindows/collector.h index a6cd00f9..4ee93cbc 100644 --- a/examples/widgets/qnx/foreignwindows/collector.h +++ b/examples/widgets/qnx/foreignwindows/collector.h @@ -1,5 +1,5 @@ // Copyright (C) 2018 QNX Software Systems. All rights reserved. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef COLLECTOR_H_ #define COLLECTOR_H_ diff --git a/examples/widgets/qnx/foreignwindows/main.cpp b/examples/widgets/qnx/foreignwindows/main.cpp index e5cc0ea3..55dfc98f 100644 --- a/examples/widgets/qnx/foreignwindows/main.cpp +++ b/examples/widgets/qnx/foreignwindows/main.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2018 QNX Software Systems. All rights reserved. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include diff --git a/examples/widgets/richtext/CMakeLists.txt b/examples/widgets/richtext/CMakeLists.txt index ea4165b7..a01296d6 100644 --- a/examples/widgets/richtext/CMakeLists.txt +++ b/examples/widgets/richtext/CMakeLists.txt @@ -1,7 +1,5 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -qt_internal_add_example(calendar) qt_internal_add_example(orderform) qt_internal_add_example(syntaxhighlighter) -qt_internal_add_example(textedit) diff --git a/examples/widgets/richtext/richtext.pro b/examples/widgets/richtext/richtext.pro index 499733ec..0d7f6c94 100644 --- a/examples/widgets/richtext/richtext.pro +++ b/examples/widgets/richtext/richtext.pro @@ -1,5 +1,3 @@ TEMPLATE = subdirs -SUBDIRS = calendar \ - orderform \ - syntaxhighlighter \ - textedit +SUBDIRS = orderform \ + syntaxhighlighter diff --git a/examples/widgets/tools/CMakeLists.txt b/examples/widgets/tools/CMakeLists.txt index edf951fe..1d0f35e1 100644 --- a/examples/widgets/tools/CMakeLists.txt +++ b/examples/widgets/tools/CMakeLists.txt @@ -11,8 +11,4 @@ qt_internal_add_example(undoframework) if(QT_FEATURE_library) qt_internal_add_example(echoplugin) - - if(QT_FEATURE_inputdialog) - qt_internal_add_example(plugandpaint) - endif() endif() diff --git a/examples/widgets/tools/completer/main.cpp b/examples/widgets/tools/completer/main.cpp index 4ea6bc1a..060dfe5b 100644 --- a/examples/widgets/tools/completer/main.cpp +++ b/examples/widgets/tools/completer/main.cpp @@ -7,8 +7,6 @@ //! [0] int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(completer); - QApplication app(argc, argv); MainWindow window; window.show(); diff --git a/examples/widgets/tools/customcompleter/main.cpp b/examples/widgets/tools/customcompleter/main.cpp index 13e8544b..060dfe5b 100644 --- a/examples/widgets/tools/customcompleter/main.cpp +++ b/examples/widgets/tools/customcompleter/main.cpp @@ -7,8 +7,6 @@ //! [0] int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(customcompleter); - QApplication app(argc, argv); MainWindow window; window.show(); diff --git a/examples/widgets/tools/echoplugin/CMakeLists.txt b/examples/widgets/tools/echoplugin/CMakeLists.txt index cfe76f4a..548c23fd 100644 --- a/examples/widgets/tools/echoplugin/CMakeLists.txt +++ b/examples/widgets/tools/echoplugin/CMakeLists.txt @@ -2,7 +2,7 @@ # SPDX-License-Identifier: BSD-3-Clause cmake_minimum_required(VERSION 3.16) -project(plugandpaint LANGUAGES CXX) +project(echoplugin LANGUAGES CXX) if(NOT DEFINED INSTALL_EXAMPLESDIR) set(INSTALL_EXAMPLESDIR "examples") diff --git a/examples/widgets/tools/settingseditor/mainwindow.cpp b/examples/widgets/tools/settingseditor/mainwindow.cpp index 68178a37..be9f19e8 100644 --- a/examples/widgets/tools/settingseditor/mainwindow.cpp +++ b/examples/widgets/tools/settingseditor/mainwindow.cpp @@ -151,7 +151,7 @@ void MainWindow::createActions() QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(tr("&About"), this, &MainWindow::about); - helpMenu->addAction(tr("About &Qt"), qApp, &QCoreApplication::quit); + helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); } void MainWindow::setSettingsObject(const SettingsPtr &settings) diff --git a/examples/widgets/tools/tools.pro b/examples/widgets/tools/tools.pro index 4a9dce34..09b693dc 100644 --- a/examples/widgets/tools/tools.pro +++ b/examples/widgets/tools/tools.pro @@ -3,7 +3,6 @@ SUBDIRS = \ completer \ customcompleter \ echoplugin \ - plugandpaint \ regularexpression \ settingseditor \ styleplugin \ @@ -12,6 +11,5 @@ SUBDIRS = \ !qtConfig(library) { SUBDIRS -= \ - echoplugin \ - plugandpaint + echoplugin } diff --git a/examples/widgets/tools/treemodelcompleter/main.cpp b/examples/widgets/tools/treemodelcompleter/main.cpp index 50ca5731..060dfe5b 100644 --- a/examples/widgets/tools/treemodelcompleter/main.cpp +++ b/examples/widgets/tools/treemodelcompleter/main.cpp @@ -7,8 +7,6 @@ //! [0] int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(treemodelcompleter); - QApplication app(argc, argv); MainWindow window; window.show(); diff --git a/examples/widgets/tools/undoframework/main.cpp b/examples/widgets/tools/undoframework/main.cpp index c43b2fcc..8dfa3ffb 100644 --- a/examples/widgets/tools/undoframework/main.cpp +++ b/examples/widgets/tools/undoframework/main.cpp @@ -8,8 +8,6 @@ //! [0] int main(int argv, char *args[]) { - Q_INIT_RESOURCE(undoframework); - QApplication app(argv, args); MainWindow mainWindow; diff --git a/examples/widgets/touch/CMakeLists.txt b/examples/widgets/touch/CMakeLists.txt index 4cf78789..9d7ed621 100644 --- a/examples/widgets/touch/CMakeLists.txt +++ b/examples/widgets/touch/CMakeLists.txt @@ -4,7 +4,4 @@ if(NOT TARGET Qt6::Widgets) return() endif() -qt_internal_add_example(pinchzoom) -qt_internal_add_example(fingerpaint) qt_internal_add_example(knobs) -qt_internal_add_example(dials) diff --git a/examples/widgets/touch/knobs/doc/src/touch-knobs.qdoc b/examples/widgets/touch/knobs/doc/src/touch-knobs.qdoc index 3a41c500..fc6daa37 100644 --- a/examples/widgets/touch/knobs/doc/src/touch-knobs.qdoc +++ b/examples/widgets/touch/knobs/doc/src/touch-knobs.qdoc @@ -4,6 +4,7 @@ /*! \example touch/knobs \title Touch Knobs Example + \examplecategory {User Interface Components} \ingroup touchinputexamples \brief Shows how to create custom controls that accept touch input. diff --git a/examples/widgets/touch/touch.pro b/examples/widgets/touch/touch.pro index 018ec134..4fff58e0 100644 --- a/examples/widgets/touch/touch.pro +++ b/examples/widgets/touch/touch.pro @@ -1,4 +1,4 @@ requires(qtHaveModule(widgets)) TEMPLATE = subdirs -SUBDIRS = pinchzoom fingerpaint knobs dials +SUBDIRS = knobs diff --git a/examples/widgets/tutorials/CMakeLists.txt b/examples/widgets/tutorials/CMakeLists.txt index 02d196db..548c9627 100644 --- a/examples/widgets/tutorials/CMakeLists.txt +++ b/examples/widgets/tutorials/CMakeLists.txt @@ -1,8 +1,6 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -add_subdirectory(addressbook) add_subdirectory(widgets) add_subdirectory(modelview) -add_subdirectory(gettingStarted) qt_internal_add_example(notepad) diff --git a/examples/widgets/tutorials/gettingStarted/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/CMakeLists.txt deleted file mode 100644 index 42cac47b..00000000 --- a/examples/widgets/tutorials/gettingStarted/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(gsQt) diff --git a/examples/widgets/tutorials/gettingStarted/gettingStarted.pro b/examples/widgets/tutorials/gettingStarted/gettingStarted.pro deleted file mode 100644 index 3e377254..00000000 --- a/examples/widgets/tutorials/gettingStarted/gettingStarted.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS += dir_gsqt - -dir_gsqt.file = gsQt/gsqt.pro diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/gsQt/CMakeLists.txt deleted file mode 100644 index a0fd3503..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -qt_internal_add_example(part1) -qt_internal_add_example(part2) -qt_internal_add_example(part3) -qt_internal_add_example(part4) -qt_internal_add_example(part5) diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/gsqt.pro b/examples/widgets/tutorials/gettingStarted/gsQt/gsqt.pro deleted file mode 100644 index 320f3c3e..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/gsqt.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = subdirs - -SUBDIRS = part1 \ - part2 \ - part3 \ - part4 \ - part5 diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part1/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/gsQt/part1/CMakeLists.txt deleted file mode 100644 index d9db469b..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part1/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(getting_started_part1 LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tutorials/gettingStarted/gsQt/part1") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(getting_started_part1 - main.cpp -) - -set_target_properties(getting_started_part1 PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(getting_started_part1 PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS getting_started_part1 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part1/part1.pro b/examples/widgets/tutorials/gettingStarted/gsQt/part1/part1.pro deleted file mode 100644 index 391606bf..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part1/part1.pro +++ /dev/null @@ -1,8 +0,0 @@ - -QT += widgets -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tutorials/gettingStarted/gsQt/part1 -INSTALLS += target - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part2/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/gsQt/part2/CMakeLists.txt deleted file mode 100644 index 93749d31..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part2/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(getting_started_part2 LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tutorials/gettingStarted/gsQt/part2") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(getting_started_part2 - main.cpp -) - -set_target_properties(getting_started_part2 PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(getting_started_part2 PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS getting_started_part2 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part2/main.cpp b/examples/widgets/tutorials/gettingStarted/gsQt/part2/main.cpp deleted file mode 100644 index 722d7889..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part2/main.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - QTextEdit *textEdit = new QTextEdit; - QPushButton *quitButton = new QPushButton("&Quit"); - - QObject::connect(quitButton, &QPushButton::clicked, - qApp, &QApplication::quit); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(textEdit); - layout->addWidget(quitButton); - - QWidget window; - window.setLayout(layout); - - window.show(); - - return app.exec(); -} - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part2/part2.pro b/examples/widgets/tutorials/gettingStarted/gsQt/part2/part2.pro deleted file mode 100644 index e7422e4a..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part2/part2.pro +++ /dev/null @@ -1,8 +0,0 @@ - -QT += widgets -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tutorials/gettingStarted/gsQt/part2 -INSTALLS += target - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part3/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/gsQt/part3/CMakeLists.txt deleted file mode 100644 index 28aee654..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part3/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(getting_started_part3 LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tutorials/gettingStarted/gsQt/part3") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(getting_started_part3 - main.cpp -) - -set_target_properties(getting_started_part3 PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(getting_started_part3 PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS getting_started_part3 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part3/main.cpp b/examples/widgets/tutorials/gettingStarted/gsQt/part3/main.cpp deleted file mode 100644 index 5424dc3c..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part3/main.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include - -class Notepad : public QWidget -{ - Q_OBJECT - -public: - Notepad(); - -private slots: - void quit(); - -private: - QTextEdit *textEdit; - QPushButton *quitButton; - -}; - -Notepad::Notepad() -{ - textEdit = new QTextEdit; - quitButton = new QPushButton(tr("Quit")); - - connect(quitButton, &QPushButton::clicked, - this, &Notepad::quit); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(textEdit); - layout->addWidget(quitButton); - - setLayout(layout); - - setWindowTitle(tr("Notepad")); -} - -void Notepad::quit() -{ - QMessageBox messageBox; - messageBox.setWindowTitle(tr("Notepad")); - messageBox.setText(tr("Do you really want to quit?")); - messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - messageBox.setDefaultButton(QMessageBox::No); - if (messageBox.exec() == QMessageBox::Yes) - qApp->quit(); -} - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - - Notepad notepad; - notepad.show(); - - return app.exec(); -} - -#include "main.moc" - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part3/part3.pro b/examples/widgets/tutorials/gettingStarted/gsQt/part3/part3.pro deleted file mode 100644 index 1577848d..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part3/part3.pro +++ /dev/null @@ -1,8 +0,0 @@ - -QT += widgets -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tutorials/gettingStarted/gsQt/part3 -INSTALLS += target - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part4/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/gsQt/part4/CMakeLists.txt deleted file mode 100644 index a64eca5a..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part4/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(getting_started_part4 LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tutorials/gettingStarted/gsQt/part4") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(getting_started_part4 - main.cpp -) - -set_target_properties(getting_started_part4 PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(getting_started_part4 PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS getting_started_part4 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part4/main.cpp b/examples/widgets/tutorials/gettingStarted/gsQt/part4/main.cpp deleted file mode 100644 index de6436ad..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part4/main.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include - -class Notepad : public QMainWindow -{ - Q_OBJECT - -public: - Notepad(); - -private slots: - void load(); - void save(); - -private: - QTextEdit *textEdit; - - QAction *loadAction; - QAction *saveAction; - QAction *exitAction; - - QMenu *fileMenu; -}; - -Notepad::Notepad() -{ - loadAction = new QAction(tr("&Load"), this); - saveAction = new QAction(tr("&Save"), this); - exitAction = new QAction(tr("E&xit"), this); - - connect(loadAction, &QAction::triggered, - this, &Notepad::load); - connect(saveAction, &QAction::triggered, - this, &Notepad::save); - connect(exitAction, &QAction::triggered, - qApp, &QApplication::quit); - - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(loadAction); - fileMenu->addAction(saveAction); - fileMenu->addSeparator(); - fileMenu->addAction(exitAction); - - textEdit = new QTextEdit; - setCentralWidget(textEdit); - - setWindowTitle(tr("Notepad")); -} - -void Notepad::load() -{ - -} - -void Notepad::save() -{ - -} - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - - Notepad notepad; - notepad.show(); - - return app.exec(); -}; - -#include "main.moc" - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part4/part4.pro b/examples/widgets/tutorials/gettingStarted/gsQt/part4/part4.pro deleted file mode 100644 index 086fac69..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part4/part4.pro +++ /dev/null @@ -1,8 +0,0 @@ - -QT += widgets -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tutorials/gettingStarted/gsQt/part4 -INSTALLS += target - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part5/CMakeLists.txt b/examples/widgets/tutorials/gettingStarted/gsQt/part5/CMakeLists.txt deleted file mode 100644 index 7d5a4f73..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part5/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(getting_started_part5 LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tutorials/gettingStarted/gsQt/part5") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_standard_project_setup() - -qt_add_executable(getting_started_part5 - main.cpp -) - -set_target_properties(getting_started_part5 PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(getting_started_part5 PRIVATE - Qt6::Core - Qt6::Gui - Qt6::Widgets -) - -install(TARGETS getting_started_part5 - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part5/main.cpp b/examples/widgets/tutorials/gettingStarted/gsQt/part5/main.cpp deleted file mode 100644 index 037f1771..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part5/main.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include - -class Notepad : public QMainWindow -{ - Q_OBJECT - -public: - Notepad(); - -private slots: - void open(); - void save(); - -private: - QTextEdit *textEdit; - - QAction *openAction; - QAction *saveAction; - QAction *exitAction; - - QMenu *fileMenu; -}; - -Notepad::Notepad() -{ - openAction = new QAction(tr("&Load"), this); - saveAction = new QAction(tr("&Save"), this); - exitAction = new QAction(tr("E&xit"), this); - - connect(openAction, &QAction::triggered, - this, &Notepad::open); - connect(saveAction, &QAction::triggered, - this, &Notepad::save); - connect(exitAction, &QAction::triggered, - qApp, &QApplication::quit); - - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(openAction); - fileMenu->addAction(saveAction); - fileMenu->addSeparator(); - fileMenu->addAction(exitAction); - - textEdit = new QTextEdit; - setCentralWidget(textEdit); - - setWindowTitle(tr("Notepad")); -} - -void Notepad::open() -{ - QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", - tr("Text Files (*.txt);;C++ Files (*.cpp *.h)")); - - if (!fileName.isEmpty()) { - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly)) { - QMessageBox::critical(this, tr("Error"), tr("Could not open file")); - return; - } - QTextStream in(&file); - textEdit->setText(in.readAll()); - file.close(); - } -} - -void Notepad::save() -{ - - QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", - tr("Text Files (*.txt);;C++ Files (*.cpp *.h)")); - - if (!fileName.isEmpty()) { - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) { - // error message - } else { - QTextStream stream(&file); - stream << textEdit->toPlainText(); - stream.flush(); - file.close(); - } - } -} - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - - Notepad notepad; - notepad.show(); - - return app.exec(); -} - -#include "main.moc" - diff --git a/examples/widgets/tutorials/gettingStarted/gsQt/part5/part5.pro b/examples/widgets/tutorials/gettingStarted/gsQt/part5/part5.pro deleted file mode 100644 index 12378f30..00000000 --- a/examples/widgets/tutorials/gettingStarted/gsQt/part5/part5.pro +++ /dev/null @@ -1,8 +0,0 @@ -QT += widgets -requires(qtConfig(filedialog)) -SOURCES = main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tutorials/gettingStarted/gsQt/part5 -INSTALLS += target - diff --git a/examples/widgets/tutorials/gettingstartedqt.qdoc b/examples/widgets/tutorials/notepad/gettingstartedqt.qdoc similarity index 99% rename from examples/widgets/tutorials/gettingstartedqt.qdoc rename to examples/widgets/tutorials/notepad/gettingstartedqt.qdoc index 152bf8c1..7979d591 100644 --- a/examples/widgets/tutorials/gettingstartedqt.qdoc +++ b/examples/widgets/tutorials/notepad/gettingstartedqt.qdoc @@ -4,6 +4,7 @@ /*! \example tutorials/notepad \title Getting Started Programming with Qt Widgets + \examplecategory {User Interface Components} \brief A tutorial for Qt Widgets based notepad application. In this topic, we teach basic Qt knowledge by implementing a simple @@ -486,10 +487,6 @@ \header \li About \li Here - \row - \li MDI applications - \li QMdiArea, - \l{MDI Example} \row \li Files and I/O devices \li QFile, QIODevice diff --git a/examples/widgets/tutorials/tutorials.pro b/examples/widgets/tutorials/tutorials.pro index 0aaa119d..d9dbbd28 100644 --- a/examples/widgets/tutorials/tutorials.pro +++ b/examples/widgets/tutorials/tutorials.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS += addressbook widgets modelview gettingStarted notepad +SUBDIRS += widgets modelview notepad diff --git a/examples/widgets/widgets.pro b/examples/widgets/widgets.pro index 2dbbefa1..88185821 100644 --- a/examples/widgets/widgets.pro +++ b/examples/widgets/widgets.pro @@ -8,7 +8,6 @@ SUBDIRS = \ desktop \ dialogs \ draganddrop \ - effects \ gallery \ gestures \ graphicsview \ @@ -17,15 +16,11 @@ SUBDIRS = \ mainwindows \ painting \ richtext \ - scroller \ tools \ touch \ tutorials \ widgets -qtHaveModule(gui):qtConfig(opengl): \ - SUBDIRS += windowcontainer - contains(DEFINES, QT_NO_CURSOR): SUBDIRS -= mainwindows !qtConfig(draganddrop): SUBDIRS -= draganddrop !qtConfig(animation): SUBDIRS -= animation diff --git a/examples/widgets/widgets/CMakeLists.txt b/examples/widgets/widgets/CMakeLists.txt index d852233c..6b6a7760 100644 --- a/examples/widgets/widgets/CMakeLists.txt +++ b/examples/widgets/widgets/CMakeLists.txt @@ -4,24 +4,13 @@ qt_internal_add_example(analogclock) qt_internal_add_example(calculator) qt_internal_add_example(calendarwidget) -qt_internal_add_example(charactermap) -qt_internal_add_example(digitalclock) qt_internal_add_example(groupbox) -qt_internal_add_example(icons) -qt_internal_add_example(imageviewer) qt_internal_add_example(lineedits) -if(QT_FEATURE_movie) - qt_internal_add_example(movie) -endif() qt_internal_add_example(scribble) qt_internal_add_example(shapedclock) qt_internal_add_example(shortcuteditor) qt_internal_add_example(sliders) qt_internal_add_example(spinboxes) -qt_internal_add_example(styles) -qt_internal_add_example(stylesheet) qt_internal_add_example(tablet) -qt_internal_add_example(tetrix) qt_internal_add_example(tooltips) -qt_internal_add_example(validators) qt_internal_add_example(windowflags) diff --git a/examples/widgets/widgets/shapedclock/shapedclock.cpp b/examples/widgets/widgets/shapedclock/shapedclock.cpp index 5cc4a540..25225eb5 100644 --- a/examples/widgets/widgets/shapedclock/shapedclock.cpp +++ b/examples/widgets/widgets/shapedclock/shapedclock.cpp @@ -78,7 +78,9 @@ void ShapedClock::paintEvent(QPaintEvent *) painter.setPen(Qt::NoPen); painter.setBrush(palette().window()); + painter.setOpacity(0.9); painter.drawEllipse(QPoint(0, 0), 98, 98); + painter.setOpacity(1.0); painter.setPen(Qt::NoPen); painter.setBrush(hourColor); @@ -114,18 +116,8 @@ void ShapedClock::paintEvent(QPaintEvent *) //! [3] //! [4] -void ShapedClock::resizeEvent(QResizeEvent * /* event */) -{ - int side = qMin(width(), height()); - QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side, - side, QRegion::Ellipse); - setMask(maskedRegion); -} -//! [4] - -//! [5] QSize ShapedClock::sizeHint() const { return QSize(200, 200); } -//! [5] +//! [4] diff --git a/examples/widgets/widgets/shapedclock/shapedclock.h b/examples/widgets/widgets/shapedclock/shapedclock.h index c359a3a0..3dec93cc 100644 --- a/examples/widgets/widgets/shapedclock/shapedclock.h +++ b/examples/widgets/widgets/shapedclock/shapedclock.h @@ -19,7 +19,6 @@ protected: void mouseMoveEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void paintEvent(QPaintEvent *event) override; - void resizeEvent(QResizeEvent *event) override; private: QPoint dragPosition; diff --git a/examples/widgets/widgets/shortcuteditor/shortcuteditormodel.cpp b/examples/widgets/widgets/shortcuteditor/shortcuteditormodel.cpp index 4355f029..612f1fb7 100644 --- a/examples/widgets/widgets/shortcuteditor/shortcuteditormodel.cpp +++ b/examples/widgets/widgets/shortcuteditor/shortcuteditormodel.cpp @@ -257,11 +257,11 @@ bool ShortcutEditorModel::setData(const QModelIndex &index, const QVariant &valu QString keySequenceString = value.toString(); ShortcutEditorModelItem *item = static_cast(index.internalPointer()); QAction *itemAction = item->action(); - if (itemAction - && keySequenceString == itemAction->shortcut().toString(QKeySequence::NativeText)) - return true; - - itemAction->setShortcut(keySequenceString); + if (itemAction) { + if (keySequenceString == itemAction->shortcut().toString(QKeySequence::NativeText)) + return true; + itemAction->setShortcut(keySequenceString); + } Q_EMIT dataChanged(index, index); if (keySequenceString.isEmpty()) diff --git a/examples/widgets/widgets/tooltips/main.cpp b/examples/widgets/widgets/tooltips/main.cpp index 677d9ecd..1cc7f435 100644 --- a/examples/widgets/widgets/tooltips/main.cpp +++ b/examples/widgets/widgets/tooltips/main.cpp @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - Q_INIT_RESOURCE(tooltips); - QApplication app(argc, argv); SortingBox sortingBox; sortingBox.show(); diff --git a/examples/widgets/widgets/widgets.pro b/examples/widgets/widgets/widgets.pro index 36d42842..7384b697 100644 --- a/examples/widgets/widgets/widgets.pro +++ b/examples/widgets/widgets/widgets.pro @@ -2,21 +2,12 @@ TEMPLATE = subdirs SUBDIRS = analogclock \ calculator \ calendarwidget \ - charactermap \ - digitalclock \ groupbox \ - icons \ - imageviewer \ lineedits \ - movie \ scribble \ shapedclock \ sliders \ spinboxes \ - styles \ - stylesheet \ tablet \ - tetrix \ tooltips \ - validators \ windowflags diff --git a/examples/xml/dombookmarks/doc/images/dombookmarks-example.png b/examples/xml/dombookmarks/doc/images/dombookmarks-example.png deleted file mode 100644 index abacacbbfcd46ea6f8eeb9a10d922381e5be4271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19405 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 FO#oHyL-7Cr diff --git a/examples/xml/dombookmarks/doc/images/screenshot.png b/examples/xml/dombookmarks/doc/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..462052ce8a40dd953eabc205b4afe89b18445813 GIT binary patch literal 67075 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%0DT76>;TiUHSIXH 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 literal 0 HcmV?d00001 diff --git a/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc b/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc index 366b3d14..dc757f84 100644 --- a/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc +++ b/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc @@ -3,16 +3,94 @@ /*! \example dombookmarks - \title DOM Bookmarks Example - \examplecategory {Input/Output} + \title DOM Bookmarks Application + \examplecategory {Data Processing & I/O} \ingroup xml-examples + \meta tag {xml} \brief Provides a reader for XML Bookmark Exchange Language files. - The DOM Bookmarks example provides a reader for XML Bookmark Exchange Language (XBEL) - files that uses Qt's DOM-based XML API to read and parse the files. The SAX Bookmarks - example provides an alternative way to read this type of file. + The DOM Bookmarks Application provides a reader for XML Bookmark Exchange + Language (XBEL) files that uses Qt's DOM-based XML API to read and parse + the files. The {QXmlStream Bookmarks Example} provides an alternative + way to read this type of file. - \image dombookmarks-example.png + \image screenshot.png + + \section1 The XbelTree Class Definition + + The XbelTree class has functions for reading and writing to the filesystem. + It inherits from the QTreeWidget class, contains the model for the + displaying of the bookmarks, and allows it to be edited. + + \snippet dombookmarks/xbeltree.h 0 + + \section1 The XbelTree Class Implementation + + The \c XbelTree constructor accepts a QWidget within which it is placed. + The \c folderIcon is set to QIcon::Normal mode where the pixmap is only + displayed when the user is not interacting with the icon. The + QStyle::SP_DirClosedIcon, QStyle::SP_DirOpenIcon, and QStyle::SP_FileIcon + correspond to standard pixmaps that follow the style of your GUI. + + \snippet dombookmarks/xbeltree.cpp 0 + + The \c read() function opens the given QIODevice using + QDomDocument::setContent. If it succeeds opening the file and the top + level headers are verified, the contents of the class is cleared before + the file contents is parsed by iterating all the top level XML nodes and + calling \c parseFolderElement() on each of them. + + \snippet dombookmarks/xbeltree.cpp 1 + + The \c parseFolderElement() function handles the different element types + and calls itself recursively if the element is a subfolder. + + \snippet dombookmarks/xbeltree.cpp 3 + + The \c write() function saves the domDocument to the given QIODevice using + QDomDocument::save. + + \snippet dombookmarks/xbeltree.cpp 2 + + \section1 The MainWindow Class Definition + + The \c MainWindow class is a subclass of QMainWindow, with a + \c File menu and a \c Help menu. + + \snippet dombookmarks/mainwindow.h 0 + + \section1 The MainWindow Class Implementation + + The \c MainWindow constructor instantiates the member XbelTree object, + and sets its header with a QStringList object, \c labels. + The constructor also invokes \c createMenus() to set up the menus. + The \c statusBar() is used to display the message "Ready". + + \snippet dombookmarks/mainwindow.cpp 0 + + The \c createMenus() function populates the menus and sets keyboard + shortcuts. + + \snippet dombookmarks/mainwindow.cpp 4 + + The \c open() function enables the user to open an XBEL file using + QFileDialog. A warning message is displayed along + with the \c fileName and \c errorString if the file cannot be read or + if there is a parse error. If it succeeds it calls \c XbelTree::read(). + + \snippet dombookmarks/mainwindow.cpp 1 + + The \c saveAs() function displays a QFileDialog, prompting the user for + a \c fileName. Similar to the \c open() function, this function also + displays a warning message if the file cannot be written to. If this + succeeds it calls \c XbelTree::write(). + + \snippet dombookmarks/mainwindow.cpp 2 + + The \c about() function displays a QMessageBox with a brief description + of the example. + + \snippet dombookmarks/mainwindow.cpp 3 See the \l{http://pyxml.sourceforge.net/topics/xbel/}{XML Bookmark Exchange Language Resource Page} for more information about XBEL files. diff --git a/examples/xml/dombookmarks/dombookmarks.pro b/examples/xml/dombookmarks/dombookmarks.pro index 280207ee..f6cf6ffc 100644 --- a/examples/xml/dombookmarks/dombookmarks.pro +++ b/examples/xml/dombookmarks/dombookmarks.pro @@ -6,7 +6,7 @@ SOURCES = main.cpp \ QT += xml widgets requires(qtConfig(filedialog)) -EXAMPLE_FILES = frank.xbel jennifer.xbel +EXAMPLE_FILES = jennifer.xbel # install target.path = $$[QT_INSTALL_EXAMPLES]/xml/dombookmarks diff --git a/examples/xml/dombookmarks/jennifer.xbel b/examples/xml/dombookmarks/jennifer.xbel index 2501c118..d5042368 100644 --- a/examples/xml/dombookmarks/jennifer.xbel +++ b/examples/xml/dombookmarks/jennifer.xbel @@ -3,66 +3,66 @@ Qt Resources - + Qt home page - + Qt Partners - - Training + + Professional Services - - Qt 5 documentation - - - Frequently Asked Questions + + Qt Documentation Community Resources - + + The Qt Project + + Qt Centre - - QtForum.org + + Forum.Qt.org - + The Independent Qt Tutorial - + German Qt Forum - + Korean Qt Community Site - + Russian Qt Forum Online Dictionaries - + Dictionary.com - + Merriam-Webster Online - + Cambridge Dictionaries Online - + OneLook Dictionary Search - - TU Chemnitz German-English Dictionary + + BEOLINGUS, a service of TU Chemnitz Trésor de la Langue Française informatisé - + Dictionnaire de l'Académie Française diff --git a/examples/xml/dombookmarks/mainwindow.cpp b/examples/xml/dombookmarks/mainwindow.cpp index 6a03a57b..5e6c68ce 100644 --- a/examples/xml/dombookmarks/mainwindow.cpp +++ b/examples/xml/dombookmarks/mainwindow.cpp @@ -1,11 +1,21 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include - #include "mainwindow.h" #include "xbeltree.h" +#include +#include +#include +#include +#include + +#include +#include + +using namespace Qt::StringLiterals; + +//! [0] MainWindow::MainWindow() { xbelTree = new XbelTree; @@ -19,19 +29,20 @@ MainWindow::MainWindow() const QSize availableSize = screen()->availableGeometry().size(); resize(availableSize.width() / 2, availableSize.height() / 3); } +//! [0] +//! [1] void MainWindow::open() { - QString fileName = - QFileDialog::getOpenFileName(this, tr("Open Bookmark File"), - QDir::currentPath(), - tr("XBEL Files (*.xbel *.xml)")); - if (fileName.isEmpty()) + QFileDialog fileDialog(this, tr("Open Bookmark File"), QDir::currentPath()); + fileDialog.setMimeTypeFilters({"application/x-xbel"_L1}); + if (fileDialog.exec() != QDialog::Accepted) return; + const QString fileName = fileDialog.selectedFiles().constFirst(); QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { - QMessageBox::warning(this, tr("SAX Bookmarks"), + QMessageBox::warning(this, tr("DOM Bookmarks"), tr("Cannot read file %1:\n%2.") .arg(QDir::toNativeSeparators(fileName), file.errorString())); @@ -41,19 +52,22 @@ void MainWindow::open() if (xbelTree->read(&file)) statusBar()->showMessage(tr("File loaded"), 2000); } +//! [1] +//! [2] void MainWindow::saveAs() { - QString fileName = - QFileDialog::getSaveFileName(this, tr("Save Bookmark File"), - QDir::currentPath(), - tr("XBEL Files (*.xbel *.xml)")); - if (fileName.isEmpty()) + QFileDialog fileDialog(this, tr("Save Bookmark File"), QDir::currentPath()); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + fileDialog.setDefaultSuffix("xbel"_L1); + fileDialog.setMimeTypeFilters({"application/x-xbel"_L1}); + if (fileDialog.exec() != QDialog::Accepted) return; + const QString fileName = fileDialog.selectedFiles().constFirst(); QFile file(fileName); if (!file.open(QFile::WriteOnly | QFile::Text)) { - QMessageBox::warning(this, tr("SAX Bookmarks"), + QMessageBox::warning(this, tr("DOM Bookmarks"), tr("Cannot write file %1:\n%2.") .arg(QDir::toNativeSeparators(fileName), file.errorString())); @@ -63,7 +77,9 @@ void MainWindow::saveAs() if (xbelTree->write(&file)) statusBar()->showMessage(tr("File saved"), 2000); } +//! [2] +//! [3] void MainWindow::about() { QMessageBox::about(this, tr("About DOM Bookmarks"), @@ -71,7 +87,9 @@ void MainWindow::about() "use Qt's DOM classes to read and write XML " "documents.")); } +//! [3] +//! [4] void MainWindow::createMenus() { QMenu *fileMenu = menuBar()->addMenu(tr("&File")); @@ -88,5 +106,6 @@ void MainWindow::createMenus() QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(tr("&About"), this, &MainWindow::about); - helpMenu->addAction(tr("About &Qt"), qApp, &QCoreApplication::quit); + helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); } +//! [4] diff --git a/examples/xml/dombookmarks/mainwindow.h b/examples/xml/dombookmarks/mainwindow.h index 55b78c84..82e29012 100644 --- a/examples/xml/dombookmarks/mainwindow.h +++ b/examples/xml/dombookmarks/mainwindow.h @@ -8,6 +8,7 @@ class XbelTree; +//! [0] class MainWindow : public QMainWindow { Q_OBJECT @@ -25,5 +26,6 @@ private: XbelTree *xbelTree; }; +//! [0] #endif diff --git a/examples/xml/dombookmarks/xbeltree.cpp b/examples/xml/dombookmarks/xbeltree.cpp index 5d2e14f1..eff2fea8 100644 --- a/examples/xml/dombookmarks/xbeltree.cpp +++ b/examples/xml/dombookmarks/xbeltree.cpp @@ -1,30 +1,41 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include - #include "xbeltree.h" +#include +#include +#include + +#include +#include +#if QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) +# include +# include +#endif + +#include + +using namespace Qt::StringLiterals; + enum { DomElementRole = Qt::UserRole + 1 }; Q_DECLARE_METATYPE(QDomElement) -static inline QString titleElement() { return QStringLiteral("title"); } -static inline QString folderElement() { return QStringLiteral("folder"); } -static inline QString bookmarkElement() { return QStringLiteral("bookmark"); } +static const auto titleElement = u"title"_s; +static const auto folderElement = u"folder"_s; +static const auto bookmarkElement = u"bookmark"_s; -static inline QString versionAttribute() { return QStringLiteral("version"); } -static inline QString hrefAttribute() { return QStringLiteral("href"); } -static inline QString foldedAttribute() { return QStringLiteral("folded"); } +static const auto versionAttribute = u"version"_s; +static const auto hrefAttribute = u"href"_s; +static const auto foldedAttribute = u"folded"_s; +//! [0] XbelTree::XbelTree(QWidget *parent) : QTreeWidget(parent) { - QStringList labels; - labels << tr("Title") << tr("Location"); - header()->setSectionResizeMode(QHeaderView::Stretch); - setHeaderLabels(labels); + setHeaderLabels({tr("Title"), tr("Location")}); folderIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off); @@ -32,8 +43,9 @@ XbelTree::XbelTree(QWidget *parent) QIcon::Normal, QIcon::On); bookmarkIcon.addPixmap(style()->standardPixmap(QStyle::SP_FileIcon)); } +//! [0] -#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) +#if QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) void XbelTree::contextMenuEvent(QContextMenuEvent *event) { const QTreeWidgetItem *item = itemAt(event->pos()); @@ -49,8 +61,9 @@ void XbelTree::contextMenuEvent(QContextMenuEvent *event) else if (action == openAction) QDesktopServices::openUrl(QUrl(url)); } -#endif // !QT_NO_CONTEXTMENU && !QT_NO_CLIPBOARD +#endif // QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) +//! [1] bool XbelTree::read(QIODevice *device) { QDomDocument::ParseResult result = @@ -69,8 +82,8 @@ bool XbelTree::read(QIODevice *device) QMessageBox::information(window(), tr("DOM Bookmarks"), tr("The file is not an XBEL file.")); return false; - } else if (root.hasAttribute(versionAttribute()) - && root.attribute(versionAttribute()) != QLatin1String("1.0")) { + } else if (root.hasAttribute(versionAttribute) + && root.attribute(versionAttribute) != "1.0"_L1) { QMessageBox::information(window(), tr("DOM Bookmarks"), tr("The file is not an XBEL version 1.0 " "file.")); @@ -81,17 +94,19 @@ bool XbelTree::read(QIODevice *device) disconnect(this, &QTreeWidget::itemChanged, this, &XbelTree::updateDomElement); - QDomElement child = root.firstChildElement(folderElement()); + QDomElement child = root.firstChildElement(folderElement); while (!child.isNull()) { parseFolderElement(child); - child = child.nextSiblingElement(folderElement()); + child = child.nextSiblingElement(folderElement); } connect(this, &QTreeWidget::itemChanged, this, &XbelTree::updateDomElement); return true; } +//! [1] +//! [2] bool XbelTree::write(QIODevice *device) const { const int IndentSize = 4; @@ -100,65 +115,70 @@ bool XbelTree::write(QIODevice *device) const domDocument.save(out, IndentSize); return true; } +//! [2] void XbelTree::updateDomElement(const QTreeWidgetItem *item, int column) { QDomElement element = qvariant_cast(item->data(0, DomElementRole)); if (!element.isNull()) { if (column == 0) { - QDomElement oldTitleElement = element.firstChildElement(titleElement()); - QDomElement newTitleElement = domDocument.createElement(titleElement()); + QDomElement oldTitleElement = element.firstChildElement(titleElement); + QDomElement newTitleElement = domDocument.createElement(titleElement); QDomText newTitleText = domDocument.createTextNode(item->text(0)); newTitleElement.appendChild(newTitleText); element.replaceChild(newTitleElement, oldTitleElement); } else { - if (element.tagName() == bookmarkElement()) - element.setAttribute(hrefAttribute(), item->text(1)); + if (element.tagName() == bookmarkElement) + element.setAttribute(hrefAttribute, item->text(1)); } } } +//! [3] void XbelTree::parseFolderElement(const QDomElement &element, QTreeWidgetItem *parentItem) { QTreeWidgetItem *item = createItem(element, parentItem); - QString title = element.firstChildElement(titleElement()).text(); + QString title = element.firstChildElement(titleElement).text(); if (title.isEmpty()) - title = QObject::tr("Folder"); + title = tr("Folder"); item->setFlags(item->flags() | Qt::ItemIsEditable); item->setIcon(0, folderIcon); item->setText(0, title); - bool folded = (element.attribute(foldedAttribute()) != QLatin1String("no")); + bool folded = (element.attribute(foldedAttribute) != "no"_L1); item->setExpanded(!folded); + constexpr char16_t midDot = u'\xB7'; + static const QString dots = QString(30, midDot); QDomElement child = element.firstChildElement(); while (!child.isNull()) { - if (child.tagName() == folderElement()) { + if (child.tagName() == folderElement) { parseFolderElement(child, item); - } else if (child.tagName() == bookmarkElement()) { + } else if (child.tagName() == bookmarkElement) { QTreeWidgetItem *childItem = createItem(child, item); - QString title = child.firstChildElement(titleElement()).text(); + QString title = child.firstChildElement(titleElement).text(); if (title.isEmpty()) - title = QObject::tr("Folder"); + title = tr("Folder"); childItem->setFlags(item->flags() | Qt::ItemIsEditable); childItem->setIcon(0, bookmarkIcon); childItem->setText(0, title); - childItem->setText(1, child.attribute(hrefAttribute())); - } else if (child.tagName() == QLatin1String("separator")) { + childItem->setText(1, child.attribute(hrefAttribute)); + } else if (child.tagName() == "separator"_L1) { QTreeWidgetItem *childItem = createItem(child, item); childItem->setFlags(item->flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsEditable)); - childItem->setText(0, QString(30, u'\xB7')); + childItem->setText(0, dots); } child = child.nextSiblingElement(); } } +//! [3] QTreeWidgetItem *XbelTree::createItem(const QDomElement &element, QTreeWidgetItem *parentItem) diff --git a/examples/xml/dombookmarks/xbeltree.h b/examples/xml/dombookmarks/xbeltree.h index d39caad5..caaf4c00 100644 --- a/examples/xml/dombookmarks/xbeltree.h +++ b/examples/xml/dombookmarks/xbeltree.h @@ -8,18 +8,19 @@ #include #include +//! [0] class XbelTree : public QTreeWidget { Q_OBJECT public: - XbelTree(QWidget *parent = nullptr); + explicit XbelTree(QWidget *parent = nullptr); bool read(QIODevice *device); bool write(QIODevice *device) const; protected: -#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) +#if QT_CONFIG(clipboard) && QT_CONFIG(contextmenu) void contextMenuEvent(QContextMenuEvent *event) override; #endif @@ -36,5 +37,6 @@ private: QIcon folderIcon; QIcon bookmarkIcon; }; +//! [0] #endif diff --git a/mkspecs/common/macx.conf b/mkspecs/common/macx.conf index 6760aa73..b891c293 100644 --- a/mkspecs/common/macx.conf +++ b/mkspecs/common/macx.conf @@ -9,7 +9,7 @@ QMAKE_MACOSX_DEPLOYMENT_TARGET = 11 QT_MAC_SDK_VERSION_MIN = 11 -QT_MAC_SDK_VERSION_MAX = 13 +QT_MAC_SDK_VERSION_MAX = 14 device.sdk = macosx device.target = device diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index 3c4b284b..114c729f 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -249,15 +249,16 @@ for(ever) { } else { lib_bases = $$MODULE_MODULE$$qtPlatformTargetSuffix() darwin: lib_bases *= $$MODULE_MODULE + add_lib_to_pretargetdeps = false win32|contains(MODULE_CONFIG, staticlib) { lib_prefix = $$MODULE_LIBS/$$QMAKE_PREFIX_STATICLIB lib_suffixes = $$QMAKE_EXTENSION_STATICLIB lib_suffixes *= $$QMAKE_LIB_EXTENSIONS - add_lib_to_pretargetdeps = true + !xcodebuild: \ + add_lib_to_pretargetdeps = true } else { lib_prefix = $$MODULE_LIBS/$$QMAKE_PREFIX_SHLIB lib_suffixes = $$QMAKE_EXTENSION_SHLIB - add_lib_to_pretargetdeps = false } candidates = for(lib_base, lib_bases) { diff --git a/mkspecs/features/toolchain.prf b/mkspecs/features/toolchain.prf index 0040b6c4..bfad10d3 100644 --- a/mkspecs/features/toolchain.prf +++ b/mkspecs/features/toolchain.prf @@ -288,9 +288,12 @@ isEmpty($${target_prefix}.INCDIRS) { } } } - isEmpty(QMAKE_DEFAULT_LIBDIRS)|isEmpty(QMAKE_DEFAULT_INCDIRS): \ + isEmpty(QMAKE_DEFAULT_INCDIRS): \ !integrity: \ - error("failed to parse default search paths from compiler output") + error("failed to parse default include paths from compiler output") + isEmpty(QMAKE_DEFAULT_LIBDIRS): \ + !integrity:!darwin: \ + error("failed to parse default library paths from compiler output") QMAKE_DEFAULT_LIBDIRS = $$unique(QMAKE_DEFAULT_LIBDIRS) } else: ghs { cmd = $$QMAKE_CXX $$QMAKE_CXXFLAGS -$${LITERAL_HASH} -o /tmp/fake_output /tmp/fake_input.cpp @@ -411,7 +414,7 @@ isEmpty($${target_prefix}.INCDIRS) { QMAKE_DEFAULT_INCDIRS = $$split(INCLUDE, $$QMAKE_DIRLIST_SEP) } - unix:if(!cross_compile|host_build) { + unix:!darwin:if(!cross_compile|host_build) { isEmpty(QMAKE_DEFAULT_INCDIRS): QMAKE_DEFAULT_INCDIRS = /usr/include /usr/local/include isEmpty(QMAKE_DEFAULT_LIBDIRS): QMAKE_DEFAULT_LIBDIRS = /lib /usr/lib } diff --git a/qmake/CMakeLists.txt b/qmake/CMakeLists.txt index b61f6f69..d3e8f56a 100644 --- a/qmake/CMakeLists.txt +++ b/qmake/CMakeLists.txt @@ -16,14 +16,14 @@ qt_add_library(QtLibraryInfo OBJECT qmakelibraryinfo.cpp qmakelibraryinfo.h ) +# Make sure we use same parameters when building QtLibraryInfo and other Qt libraries, +# otherwise some compilers may have compilation errors, such as clang-cl. +target_link_libraries(QtLibraryInfo PUBLIC PlatformCommonInternal) + +target_link_libraries(QtLibraryInfo PUBLIC Qt::CorePrivate) + qt_internal_add_sync_header_dependencies(QtLibraryInfo Core) -set_target_properties(QtLibraryInfo PROPERTIES - COMPILE_OPTIONS $ - COMPILE_DEFINITIONS $ - INCLUDE_DIRECTORIES $ - INCLUDE_DIRECTORIES $ -) target_include_directories(QtLibraryInfo PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/library" @@ -41,21 +41,22 @@ target_compile_definitions(QtLibraryInfo PUBLIC PROEVALUATOR_FULL QT_BUILD_QMAKE QT_USE_QSTRINGBUILDER - QT_NO_FOREACH - QT_VERSION_STR="${PROJECT_VERSION}" QT_HOST_MKSPEC="${QT_QMAKE_HOST_MKSPEC}" QT_TARGET_MKSPEC="${QT_QMAKE_TARGET_MKSPEC}" QT_HOST_DATADIR="${hostdatadir}" ${deprecation_define} ) +qt_internal_set_exceptions_flags(QtLibraryInfo OFF) + if(NOT QT_FEATURE_qmake) return() endif() qt_get_tool_target_name(target_name qmake) qt_internal_add_tool(${target_name} - TOOLS_TARGET Core # special case + TRY_RUN + TOOLS_TARGET Core USER_FACING NO_UNITY_BUILD INSTALL_VERSIONED_LINK @@ -97,7 +98,6 @@ qt_internal_add_tool(${target_name} PRECOMPILED_HEADER "qmake_pch.h" LIBRARIES - Qt::CorePrivate QtLibraryInfo ) qt_internal_return_unless_building_tools() diff --git a/qmake/doc/snippets/code/doc_src_qmake-manual.pro b/qmake/doc/snippets/code/doc_src_qmake-manual.pro index 76f0eec2..bb803d11 100644 --- a/qmake/doc/snippets/code/doc_src_qmake-manual.pro +++ b/qmake/doc/snippets/code/doc_src_qmake-manual.pro @@ -961,3 +961,25 @@ translations_de.files = $$PWD/de.lproj/InfoPlist.strings QMAKE_BUNDLE_DATA += translations_en translations_de #! [189] + +#! [TR_EXCLUDE sources] +SOURCES += main.cpp \ + excluded.cpp \ + 3rdparty/sqlite3.h \ + 3rdparty/sqlite3.c +TR_EXCLUDE += excluded.cpp 3rdparty/* +#! [TR_EXCLUDE sources] + +#! [TR_EXCLUDE SUBDIRS] +SUBDIRS += \ + libs \ + apps \ + tests +TR_EXCLUDE += tests +#! [TR_EXCLUDE SUBDIRS] + +#! [TR_EXCLUDE include paths] +linux { + TR_EXCLUDE += /usr/include/boost/* +} +#! [TR_EXCLUDE include paths] diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index 424900b2..875a1ac5 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -118,6 +118,9 @@ For more information about the environment variables that qmake uses when configuring the build process, see \l{Configuring qmake}. + \note Add your project build directory to the list of excluded directories + of any anti-virus application that runs on your system. + \section1 Using Third Party Libraries The guide to \l{Third Party Libraries} shows you how to use simple third @@ -154,7 +157,6 @@ The following sections describe the different types of elements used in project files. - \target ProjectFileElementsVariables \section2 Variables In a project file, variables are used to hold lists of strings. In the @@ -272,9 +274,10 @@ line as the condition. More complex operations on variables that would usually require loops - are provided by built-in functions such as \l{findfunction}{find()}, - \l{unique}{unique()}, and \l{countfunction}{count()}. These functions, and - many others are provided to manipulate + are provided by built-in functions such as \l{find(variablename, substr)} + {find()}, \l{unique(variablename)}{unique()}, and + \l{count(variablename, number)}{count()}. + These functions, and many others are provided to manipulate strings and paths, support user input, and call external tools. For more information about using the functions, see \l{qmake Language}. For lists of all functions and their descriptions, see \l{Replace Functions} and @@ -321,7 +324,6 @@ The \c SUBDIRS variable is used to contain a list of all the subdirectories to be processed. - \target GeneralConfiguration \section1 General Configuration The \l{CONFIG} variable specifies the options and features that the project @@ -488,9 +490,9 @@ You can use the \c options to specify both general and mode-specific settings. Options that only apply to the Makefile mode are described in the - \l{#MakefileMode}{Makefile Mode Options} section, whereas options that influence the + \l{Makefile Mode Options} section, whereas options that influence the creation of project files are described in the - \l{#ProjectMode}{Project Mode Options} section. + \l{Project Mode Options} section. \section1 Files @@ -551,7 +553,6 @@ files. \endlist - \target MakefileMode \section1 Makefile Mode Options \snippet code/doc_src_qmake-manual.pro 9 @@ -593,7 +594,6 @@ is specified, all assignments on the command line after the \c -after option will be postponed until after the specified files are parsed. - \target ProjectMode \section1 Project Mode Options \snippet code/doc_src_qmake-manual.pro 12 @@ -884,7 +884,6 @@ to specify a list of libraries that each project needs to link against, and \c QMAKE_LIBS_X11 would be used to extend this list. - \target ANDROID_ABIS \section1 ANDROID_ABIS \note This variable applies only to Android targets. @@ -902,7 +901,6 @@ it is not recommended since it will override any ABIs specified on the \c qmake command line. - \target ANDROID_API_VERSION \section1 ANDROID_API_VERSION \note This variable applies only to Android targets. @@ -910,7 +908,6 @@ Specifies the Android API level number. For more information, see \l{Android: Build Numbers}{Android Build Numbers}. - \target ANDROID_APPLICATION_ARGUMENTS \section1 ANDROID_APPLICATION_ARGUMENTS \note This variable applies only to Android targets. @@ -923,7 +920,6 @@ ANDROID_APPLICATION_ARGUMENTS = "arg1 arg2 arg3" \endcode - \target ANDROID_BUNDLED_JAR_DEPENDENCIES \section1 ANDROID_BUNDLED_JAR_DEPENDENCIES \note This variable applies only to Android modules. @@ -935,7 +931,6 @@ ANDROID_BUNDLED_JAR_DEPENDENCIES += jar/Qt6Android.jar \endcode - \target ANDROID_DEPLOYMENT_DEPENDENCIES \section1 ANDROID_DEPLOYMENT_DEPENDENCIES \note This variable applies only to Android targets. @@ -954,7 +949,6 @@ provides a way to override the automatic detection entirely, so if a library is listed before its dependencies, it will fail to load on some devices. - \target ANDROID_DEPLOYMENT_SETTINGS_FILE \section1 ANDROID_DEPLOYMENT_SETTINGS_FILE \note This variable applies only to Android targets. @@ -964,7 +958,6 @@ the settings file generated by qmake, thus you have to make sure to provide a valid settings file. - \target ANDROID_EXTRA_LIBS \section1 ANDROID_EXTRA_LIBS \note This variable applies only to Android targets. @@ -987,7 +980,6 @@ for (abi, ANDROID_ABIS): ANDROID_EXTRA_LIBS += $$PWD/library_name_$${abi}.so \endcode - \target ANDROID_EXTRA_PLUGINS \section1 ANDROID_EXTRA_PLUGINS \note This variable applies only to Android targets. @@ -1028,7 +1020,6 @@ ANDROID_EXTRA_PLUGINS += $$top_builddir/plugins \endcode - \target ANDROID_FEATURES \section1 ANDROID_FEATURES \note This variable applies only to Android modules. @@ -1041,7 +1032,6 @@ For more information, see \l{Android: }{Android Docs}. - \target ANDROID_LIB_DEPENDENCIES \section1 ANDROID_LIB_DEPENDENCIES \note This variable applies only to Android modules. @@ -1054,7 +1044,6 @@ plugins/libplugins_platforms_qtforandroid.so \endcode - \target ANDROID_MIN_SDK_VERSION \section1 ANDROID_MIN_SDK_VERSION \note This variable applies only to Android targets. @@ -1062,7 +1051,6 @@ Specifies the minimum Android API level for the project. By default, this variable is set to API level 23. - \target ANDROID_PACKAGE_SOURCE_DIR \section1 ANDROID_PACKAGE_SOURCE_DIR \note This variable applies only to Android targets. @@ -1083,7 +1071,6 @@ instance, you can make a custom \c {AndroidManifest.xml} for your application, then place this directly into the directory specified by this variable. - \target ANDROID_PERMISSIONS \section1 ANDROID_PERMISSIONS \note This variable applies only to Android modules. @@ -1096,7 +1083,6 @@ For more information, see \l{Android: }{Android Docs}. - \target ANDROID_TARGET_SDK_VERSION \section1 ANDROID_TARGET_SDK_VERSION \note This variable applies only to Android targets. @@ -1104,7 +1090,6 @@ Specifies the target Android API level for the project. By default, this variable is set to API level 31. - \target ANDROID_VERSION_CODE \section1 ANDROID_VERSION_CODE \note This variable applies only to Android targets. @@ -1112,7 +1097,6 @@ Specifies the application's version number. For more information, see \l{Android: App Versioning}{Android App Versioning}. - \target ANDROID_VERSION_NAME \section1 ANDROID_VERSION_NAME \note This variable applies only to Android targets. @@ -1120,7 +1104,6 @@ Specifies the application's version in as a human readable string. For more information, see \l{Android: App Versioning}{Android App Versioning}. - \target CONFIG \section1 CONFIG Specifies project configuration and compiler options. The values are @@ -1280,11 +1263,11 @@ qmake to track these dependencies. When this option is enabled, qmake will create a file with the extension \c .prl which will save meta-information about the library - (see \l{LibDepend}{Library Dependencies} for more info). + (see \l{Library Dependencies} for more info). \row \li link_prl \li When this option is enabled, qmake will process all libraries linked to by the application and find their meta-information (see - \l{LibDepend}{Library Dependencies} for more info). + \l{Library Dependencies} for more info). \row \li no_install_prl \li This option disables the generation of installation rules for generated .prl files. \endtable @@ -1391,7 +1374,6 @@ \snippet code/doc_src_qmake-manual.pro 26 - \target DEFINES \section1 DEFINES qmake adds the values of this variable as @@ -1401,7 +1383,6 @@ \snippet code/doc_src_qmake-manual.pro 27 - \target DEFINES_DEBUG \section1 DEFINES_DEBUG Specifies preprocessor defines for the debug configuration. The values of @@ -1411,7 +1392,6 @@ This variable was introduced in Qt 5.13.2. - \target DEFINES_RELEASE \section1 DEFINES_RELEASE Specifies preprocessor defines for the release configuration. The values of @@ -1424,21 +1404,18 @@ This variable was introduced in Qt 5.13.2. - \target DEF_FILE \section1 DEF_FILE \note This variable is used only on Windows when using the \c app template. Specifies a \c .def file to be included in the project. - \target DEPENDPATH \section1 DEPENDPATH Specifies a list of directories for qmake to scan, to resolve dependencies. This variable is used when qmake crawls through the header files that you \c{#include} in your source code. - \target DESTDIR \section1 DESTDIR Specifies where to put the \l{#TARGET}{target} file. @@ -1451,7 +1428,6 @@ the used build tool. In particular, parentheses do not work with \c{make}. - \target DISTFILES \section1 DISTFILES Specifies a list of files to be included in the dist @@ -1461,14 +1437,12 @@ \snippet code/doc_src_qmake-manual.pro 31 - \target DLLDESTDIR \section1 DLLDESTDIR \note This variable applies only to Windows targets. Specifies where to copy the \l{#TARGET}{target} dll. - \target EXTRA_TRANSLATIONS \section1 EXTRA_TRANSLATIONS Specifies a list of translation (.ts) files that contain @@ -1486,7 +1460,6 @@ See the \l{Qt Linguist Manual} for more information about internationalization (i18n) and localization (l10n) with Qt. - \target FORMS \section1 FORMS Specifies the UI files (see \l{Qt Designer Manual}) to be processed by \c uic @@ -1497,7 +1470,6 @@ \snippet code/doc_src_qmake-manual.pro 32 - \target GUID \section1 GUID Specifies the GUID that is set inside a \c{.vcproj} file. The GUID is @@ -1507,7 +1479,6 @@ This variable is specific to \c{.vcproj} files only; it is ignored otherwise. - \target HEADERS \section1 HEADERS Defines the header files for the project. @@ -1522,20 +1493,17 @@ See also \l{#SOURCES}{SOURCES}. - \target ICON \section1 ICON This variable is used only on Mac OS to set the application icon. Please see \l{Setting the Application Icon}{the application icon documentation} for more information. - \target IDLSOURCES \section1 IDLSOURCES This variable is used only on Windows for the Visual Studio project generation to put the specified files in the Generated Files folder. - \target INCLUDEPATH \section1 INCLUDEPATH Specifies the #include directories which should be @@ -1550,7 +1518,6 @@ \snippet qmake/spaces.pro quoting include paths with spaces - \target INSTALLS \section1 INSTALLS Specifies a list of resources that will be installed when @@ -1604,28 +1571,24 @@ This variable is also used to specify which additional files will be deployed to embedded devices. - \target JAVA_HOME \section1 JAVA_HOME \note This variable is useful only to Android targets. Specifies the JDK/OpenJDK installation path used for building the project. - \target LEXIMPLS \section1 LEXIMPLS Specifies a list of Lex implementation files. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target LEXOBJECTS \section1 LEXOBJECTS Specifies the names of intermediate Lex object files. The value of this variable is typically handled by qmake and rarely needs to be modified. - \target LEXSOURCES \section1 LEXSOURCES Specifies a list of Lex source files. All @@ -1636,7 +1599,6 @@ \snippet code/doc_src_qmake-manual.pro 37 - \target LIBS \section1 LIBS Specifies a list of libraries to be linked into the project. @@ -1660,7 +1622,6 @@ \snippet code/doc_src_qmake-manual.pro 39 - \target LIBS_PRIVATE \section1 LIBS_PRIVATE Specifies a list of libraries to be linked privately into the project. @@ -1673,7 +1634,6 @@ directly, it needs to link to A explicitly. Put differently, libraries linked privately are not exposed transitively at build time. - \target LITERAL_HASH \section1 LITERAL_HASH This variable is used whenever a literal hash character (\c{#}) is needed in @@ -1687,14 +1647,12 @@ By using \c LITERAL_HASH in this way, the \c # character can be used to construct a URL for the \c message() function to print to the console. - \target MAKEFILE \section1 MAKEFILE Specifies the name of the generated Makefile. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target MAKEFILE_GENERATOR \section1 MAKEFILE_GENERATOR Specifies the name of the Makefile generator to use @@ -1702,13 +1660,11 @@ handled internally by qmake and rarely needs to be modified. - \target MSVCPROJ_* \section1 MSVCPROJ_* These variables are handled internally by qmake and should not be modified or utilized. - \target MOC_DIR \section1 MOC_DIR Specifies the directory where all intermediate moc @@ -1718,7 +1674,6 @@ \snippet code/doc_src_qmake-manual.pro 40 - \target OBJECTIVE_HEADERS \section1 OBJECTIVE_HEADERS Defines the Objective-C++ header files for the project. @@ -1732,7 +1687,6 @@ See also \l{#OBJECTIVE_SOURCES}{OBJECTIVE_SOURCES}. - \target OBJECTIVE_SOURCES \section1 OBJECTIVE_SOURCES Specifies the names of all Objective-C/C++ source files in the project. @@ -1742,14 +1696,12 @@ See also \l{#OBJECTIVE_HEADERS}{OBJECTIVE_HEADERS}. - \target OBJECTS \section1 OBJECTS This variable is automatically populated from the \l{SOURCES} variable. The extension of each source file is replaced by .o (Unix) or .obj (Win32). You can add objects to the list. - \target OBJECTS_DIR \section1 OBJECTS_DIR Specifies the directory where all intermediate @@ -1759,7 +1711,6 @@ \snippet code/doc_src_qmake-manual.pro 41 - \target POST_TARGETDEPS \section1 POST_TARGETDEPS Lists the libraries that the \l{#TARGET}{target} depends on. Some backends, @@ -1771,7 +1722,6 @@ This list is placed after all builtin (and \link #PRE_TARGETDEPS $$PRE_TARGETDEPS \endlink) dependencies. - \target PRE_TARGETDEPS \section1 PRE_TARGETDEPS Lists libraries that the \l{#TARGET}{target} depends on. Some backends, @@ -1782,7 +1732,6 @@ This list is placed before all builtin dependencies. - \target PRECOMPILED_HEADER \section1 PRECOMPILED_HEADER Indicates the header file for creating a precompiled @@ -1791,7 +1740,6 @@ (Windows - all MSVC project types, Apple - Xcode, Makefile, Unix - gcc 3.3 and up). - \target PWD \section1 PWD Specifies the full path leading to the directory @@ -1803,7 +1751,6 @@ \note Do not attempt to overwrite the value of this variable. - \target OUT_PWD \section1 OUT_PWD Specifies the full path leading to the directory where qmake places the @@ -1811,7 +1758,6 @@ \note Do not attempt to overwrite the value of this variable. - \target QM_FILES_RESOURCE_PREFIX \section1 QM_FILES_RESOURCE_PREFIX Specifies the directory in the resource system where \c .qm files will @@ -1819,14 +1765,12 @@ The default is \c{:/i18n/}. - \target QM_FILES_INSTALL_PATH \section1 QM_FILES_INSTALL_PATH Specifies the target directory \c .qm files generated by \l{CONFIG}{CONFIG += lrelease} will be installed to. Does not have any effect if \l{CONFIG}{CONFIG += embed_translations} is set. - \target QML_IMPORT_PATH \section1 QML_IMPORT_PATH This variable is only used by \l{Qt Creator Manual}{Qt Creator}. If you have @@ -1835,7 +1779,6 @@ See \l{Qt Creator: Using QML Modules with Plugins} for details. - \target QMLPATHS \section1 QMLPATHS Expects a list of import paths that point to root directories of trees of @@ -1853,17 +1796,15 @@ application. Rather, they are only used at build time. In particular, qmlimportscanner uses them to find any QML modules it may need to mark as imported by your application. - + \sa QQmlEngine::addImportPath() - \target QMAKE_systemvariable \section1 QMAKE Specifies the name of the qmake program itself and is placed in generated Makefiles. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKESPEC_systemvariable \section1 QMAKESPEC A system variable that contains the full path of the qmake configuration that is used @@ -1871,7 +1812,20 @@ \note Do not attempt to overwrite the value of this variable. - \target QMAKE_AR_CMD + \section1 QMAKE_APPLE_DEVICE_ARCHS + + \note This variable is used on \macos only. + + Specifies a list of architectures to build for. By default, a project is + built for the development machine's architecture. This variable allows to + override the default and build for a different architecture or to create + multi-architecture binaries. + + This variable is usually specified on the command line or in the project + file. + + See \l{Qt for macOS} for more information. + \section1 QMAKE_AR_CMD \note This variable is used on Unix platforms only. @@ -1879,7 +1833,6 @@ Specifies the command to execute when creating a shared library. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_BUNDLE_DATA \section1 QMAKE_BUNDLE_DATA \note This variable is used on \macos, iOS, tvOS, and watchOS only. @@ -1958,21 +1911,18 @@ adjusted by modifying the \c QMAKE_CFLAGS_DEBUG and \c QMAKE_CFLAGS_RELEASE variables, respectively. - \target QMAKE_CFLAGS_DEBUG \section1 QMAKE_CFLAGS_DEBUG Specifies the C compiler flags for debug builds. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CFLAGS_RELEASE \section1 QMAKE_CFLAGS_RELEASE Specifies the C compiler flags for release builds. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO \section1 QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO Specifies the C compiler flags for release builds where @@ -1980,7 +1930,6 @@ The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CFLAGS_SHLIB \section1 QMAKE_CFLAGS_SHLIB \note This variable is used on Unix platforms only. @@ -1990,7 +1939,6 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CFLAGS_THREAD \section1 QMAKE_CFLAGS_THREAD Specifies the compiler flags for creating a multi-threaded @@ -1998,21 +1946,18 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CFLAGS_WARN_OFF \section1 QMAKE_CFLAGS_WARN_OFF This variable is used only when the \c {warn_off} \l{#CONFIG}{CONFIG} option is set. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CFLAGS_WARN_ON \section1 QMAKE_CFLAGS_WARN_ON This variable is used only when the \c {warn_on} \l{#CONFIG}{CONFIG} option is set. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CLEAN \section1 QMAKE_CLEAN Specifies a list of generated files (by \l{moc} and \l{uic}, for example) and @@ -2034,21 +1979,18 @@ adjusted by modifying the \c QMAKE_CXXFLAGS_DEBUG and \c QMAKE_CXXFLAGS_RELEASE variables, respectively. - \target QMAKE_CXXFLAGS_DEBUG \section1 QMAKE_CXXFLAGS_DEBUG Specifies the C++ compiler flags for debug builds. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CXXFLAGS_RELEASE \section1 QMAKE_CXXFLAGS_RELEASE Specifies the C++ compiler flags for release builds. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO \section1 QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO Specifies the C++ compiler flags for release builds where @@ -2056,7 +1998,6 @@ The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CXXFLAGS_SHLIB \section1 QMAKE_CXXFLAGS_SHLIB Specifies the C++ compiler flags for creating a shared library. @@ -2064,14 +2005,12 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CXXFLAGS_THREAD \section1 QMAKE_CXXFLAGS_THREAD Specifies the C++ compiler flags for creating a multi-threaded application. The value of this variable is typically handled by qmake or \l{#QMAKESPEC} {qmake.conf} and rarely needs to be modified. - \target QMAKE_CXXFLAGS_WARN_OFF \section1 QMAKE_CXXFLAGS_WARN_OFF Specifies the C++ compiler flags for suppressing compiler @@ -2079,7 +2018,6 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_CXXFLAGS_WARN_ON \section1 QMAKE_CXXFLAGS_WARN_ON Specifies C++ compiler flags for generating compiler warnings. @@ -2087,7 +2025,6 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_DEVELOPMENT_TEAM \section1 QMAKE_DEVELOPMENT_TEAM \note This variable is used on \macos, iOS, tvOS, and watchOS only. @@ -2095,12 +2032,10 @@ The identifier of a development team to use for signing certificates and provisioning profiles. - \target QMAKE_DISTCLEAN \section1 QMAKE_DISTCLEAN Specifies a list of files to be removed by \c{make distclean}. - \target QMAKE_EXTENSION_SHLIB \section1 QMAKE_EXTENSION_SHLIB Contains the extension for shared libraries. The value of @@ -2110,7 +2045,6 @@ \note Platform-specific variables that change the extension override the contents of this variable. - \target QMAKE_EXTENSION_STATICLIB \section1 QMAKE_EXTENSION_STATICLIB Contains the extension for shared static libraries. The value of @@ -2121,51 +2055,51 @@ Contains the extension used on included moc files. - See also \l{Configuring qmake#Extensions}{File Extensions}. + See also \l{Configuring qmake#File Extensions}{File Extensions}. \section1 QMAKE_EXT_UI Contains the extension used on \QD UI files. - See also \l{Configuring qmake#Extensions}{File Extensions}. + See also \l{Configuring qmake#File Extensions}{File Extensions}. \section1 QMAKE_EXT_PRL Contains the extension used on created PRL files. - See also \l{Configuring qmake#Extensions}{File Extensions}, - \l{LibDepend}{Library Dependencies}. + See also \l{Configuring qmake#File Extensions}{File Extensions}, + \l{Library Dependencies}. \section1 QMAKE_EXT_LEX Contains the extension used on files given to Lex. - See also \l{Configuring qmake#Extensions}{File Extensions}, + See also \l{Configuring qmake#File Extensions}{File Extensions}, \l{#LEXSOURCES}{LEXSOURCES}. \section1 QMAKE_EXT_YACC Contains the extension used on files given to Yacc. - See also \l{Configuring qmake#Extensions}{File Extensions}, + See also \l{Configuring qmake#File Extensions}{File Extensions}, \l{#YACCSOURCES}{YACCSOURCES}. \section1 QMAKE_EXT_OBJ Contains the extension used on generated object files. - See also \l{Configuring qmake#Extensions}{File Extensions}. + See also \l{Configuring qmake#File Extensions}{File Extensions}. \section1 QMAKE_EXT_CPP Contains suffixes for files that should be interpreted as C++ source code. - See also \l{Configuring qmake#Extensions}{File Extensions}. + See also \l{Configuring qmake#File Extensions}{File Extensions}. \section1 QMAKE_EXT_H Contains suffixes for files which should be interpreted as C header files. - See also \l{Configuring qmake#Extensions}{File Extensions}. + See also \l{Configuring qmake#File Extensions}{File Extensions}. \section1 QMAKE_EXTRA_COMPILERS @@ -2179,7 +2113,6 @@ See also \l{Adding Custom Targets}. - \target QMAKE_FAILED_REQUIREMENTS \section1 QMAKE_FAILED_REQUIREMENTS Contains the list of failed requirements. @@ -2200,7 +2133,6 @@ See \l{Creating Frameworks} for more information about creating frameworks and library bundles. - \target QMAKE_FRAMEWORK_VERSION \section1 QMAKE_FRAMEWORK_VERSION \note This variable is used on \macos, iOS, tvOS, and watchOS only. @@ -2214,7 +2146,6 @@ See \l{Creating Frameworks} for more information about creating frameworks. - \target QMAKE_HOST \section1 QMAKE_HOST Provides information about the host machine running qmake. @@ -2233,14 +2164,12 @@ \snippet code/doc_src_qmake-manual.pro 187 - \target QMAKE_INCDIR \section1 QMAKE_INCDIR Specifies the list of system header paths that are appended to \l{INCLUDEPATH}. The value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_INCDIR_EGL \section1 QMAKE_INCDIR_EGL Specifies the location of EGL header files to be added to @@ -2249,7 +2178,6 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_INCDIR_OPENGL \section1 QMAKE_INCDIR_OPENGL Specifies the location of OpenGL header files to be added @@ -2273,7 +2201,6 @@ If the OpenGL implementation uses EGL (most OpenGL/ES systems), then QMAKE_INCDIR_EGL may also need to be set. - \target QMAKE_INCDIR_OPENVG \section1 QMAKE_INCDIR_OPENVG Specifies the location of OpenVG header files to be added @@ -2285,7 +2212,6 @@ If the OpenVG implementation uses EGL then QMAKE_INCDIR_EGL may also need to be set. - \target QMAKE_INCDIR_X11 \section1 QMAKE_INCDIR_X11 \note This variable is used on Unix platforms only. @@ -2295,7 +2221,6 @@ is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_INFO_PLIST \section1 QMAKE_INFO_PLIST \note This variable is used on \macos, iOS, tvOS, and watchOS platforms only. @@ -2389,7 +2314,6 @@ platform or type of project, use one of the specialized variables for that purpose instead of this variable. - \target QMAKE_LFLAGS_CONSOLE \section1 QMAKE_LFLAGS_CONSOLE \note This variable is used on Windows only. @@ -2657,7 +2581,6 @@ value of this variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_LRELEASE_FLAGS \section1 QMAKE_LRELEASE_FLAGS List of additional options passed to \l{Using lrelease}{lrelease} when @@ -2694,7 +2617,6 @@ files for IDEs. The default value is the target name. The value of this variable is typically handled by qmake and rarely needs to be modified. - \target QMAKE_PROVISIONING_PROFILE \section1 QMAKE_PROVISIONING_PROFILE \note This variable is used on \macos, iOS, tvOS, and watchOS only. @@ -2827,7 +2749,6 @@ variable is typically handled by qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target QMAKE_TARGET_COMPANY \section1 QMAKE_TARGET_COMPANY Windows only. Specifies the company for the project target; this is @@ -2835,7 +2756,6 @@ properties. This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_DESCRIPTION \section1 QMAKE_TARGET_DESCRIPTION Windows only. Specifies the description for the project target; this is @@ -2843,7 +2763,6 @@ properties. This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_COPYRIGHT \section1 QMAKE_TARGET_COPYRIGHT Windows only. Specifies the copyright information for the project target; @@ -2852,7 +2771,6 @@ \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_PRODUCT \section1 QMAKE_TARGET_PRODUCT Windows only. Specifies the product for the project target; this is used @@ -2860,7 +2778,6 @@ This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_ORIGINAL_FILENAME \section1 QMAKE_TARGET_ORIGINAL_FILENAME Windows only. Specifies the original file name for the project target; @@ -2869,7 +2786,6 @@ \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_INTERNALNAME \section1 QMAKE_TARGET_INTERNALNAME Windows only. Specifies the internal name for the project target; this is @@ -2877,7 +2793,6 @@ properties. This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_COMMENTS \section1 QMAKE_TARGET_COMMENTS Windows only. Specifies the comments for the project target; this is @@ -2885,7 +2800,6 @@ properties. This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_TARGET_TRADEMARKS \section1 QMAKE_TARGET_TRADEMARKS Windows only. Specifies the trademark information for the project target; @@ -2894,7 +2808,6 @@ \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target QMAKE_MANIFEST \section1 QMAKE_MANIFEST Windows only. Specifies the manifest file for the project target. @@ -2995,22 +2908,18 @@ shared/dynamic build of Qt, or when linking libraries. It may be used for deployment of dynamic plugins at a later time. - \target QT_VERSION_variable \section1 QT_VERSION Contains the current version of Qt. - \target QT_MAJOR_VERSION \section1 QT_MAJOR_VERSION Contains the current major version of Qt. - \target QT_MINOR_VERSION \section1 QT_MINOR_VERSION Contains the current minor version of Qt. - \target QT_PATCH_VERSION \section1 QT_PATCH_VERSION Contains the current patch version of Qt. @@ -3020,14 +2929,12 @@ Windows only. Specifies the name of the Windows resource file (.rc) for the target. See \l{Adding Windows Resource Files}. - \target RC_CODEPAGE \section1 RC_CODEPAGE Windows only. Specifies the codepage that should be specified in a generated .rc file. This is only utilized if the \l{VERSION} or \l{RC_ICONS} variable is set and the \l{RC_FILE} and \l{RES_FILE} variables are not set. - \target RC_DEFINES \section1 RC_DEFINES Windows only. qmake adds the values of this variable as RC preprocessor macros @@ -3035,7 +2942,6 @@ \snippet code/doc_src_qmake-manual.pro 186 - \target RC_ICONS \section1 RC_ICONS Windows only. Specifies the icons that should be included into a generated @@ -3043,7 +2949,6 @@ are not set. More details about the generation of .rc files can be found in the \l{Platform Notes}. - \target RC_LANG \section1 RC_LANG Windows only. Specifies the language that should be specified in a generated @@ -3054,7 +2959,6 @@ Specifies include paths that are passed to the Windows Resource Compiler. - \target RCC_DIR \section1 RCC_DIR Specifies the directory for Qt Resource Compiler output files. @@ -3063,7 +2967,6 @@ \snippet code/doc_src_qmake-manual.pro 48 - \target REQUIRES \section1 REQUIRES Specifies a list of values that are evaluated as conditions. If any of the conditions is false, @@ -3072,7 +2975,6 @@ \note We recommend using the \l{requires(condition)}{requires()} function instead if you want to skip projects or subprojects when building. - \target RESOURCES \section1 RESOURCES Specifies the name of the resource collection files (qrc) @@ -3088,7 +2990,6 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target SOURCES \section1 SOURCES Specifies the names of all source files in the project. @@ -3099,7 +3000,6 @@ See also \l{#HEADERS}{HEADERS}. - \target SUBDIRS \section1 SUBDIRS This variable, when used with the \c subdirs \l{#TEMPLATE}{template} @@ -3161,7 +3061,6 @@ \snippet code/doc_src_qmake-manual.pro 149 - \target TARGET \section1 TARGET Specifies the name of the target file. Contains the base name of the project @@ -3194,7 +3093,6 @@ qmake or \l{#QMAKESPEC}{qmake.conf} and rarely needs to be modified. - \target TEMPLATE \section1 TEMPLATE Specifies the name of the template to use when generating the project. The @@ -3231,7 +3129,6 @@ determine how the project is built, it is necessary to declare TEMPLATE on the command line rather than use the \c -t option. - \target TRANSLATIONS \section1 TRANSLATIONS Specifies a list of translation (.ts) files that contain @@ -3249,7 +3146,25 @@ See the \l{Qt Linguist Manual} for more information about internationalization (i18n) and localization (l10n) with Qt. - \target UI_DIR + \section1 TR_EXCLUDE + + Specifies a list of paths (source files, subdirectories, and C++ include + paths) to be excluded from handling in \c{lupdate}. The paths may contain + wildcards. Relative paths are considered to be relative to + \l{_PRO_FILE_PWD_}. + + For example, to exclude source files: + + \snippet code/doc_src_qmake-manual.pro TR_EXCLUDE sources + + To exclude subdirectories of a \c SUBDIRS project: + + \snippet code/doc_src_qmake-manual.pro TR_EXCLUDE SUBDIRS + + To speed up lupdate's C++ parser, exclude include paths: + + \snippet code/doc_src_qmake-manual.pro TR_EXCLUDE include paths + \section1 UI_DIR Specifies the directory where all intermediate files from uic @@ -3259,7 +3174,6 @@ \snippet code/doc_src_qmake-manual.pro 54 - \target VERSION \section1 VERSION Specifies the version number of the application if the \c app @@ -3310,7 +3224,6 @@ See also \l{#DEPENDPATH}{DEPENDPATH}. - \target WINDOWS_TARGET_PLATFORM_VERSION \section1 WINDOWS_TARGET_PLATFORM_VERSION Specifies the targeted Windows version; this corresponds to the tag @@ -3319,7 +3232,6 @@ On desktop Windows, the default value is the value of the environment variable \c{WindowsSDKVersion}. - \target WINDOWS_TARGET_PLATFORM_MIN_VERSION \section1 WINDOWS_TARGET_PLATFORM_MIN_VERSION Specifies the minimum version of the Windows target platform; this @@ -3327,7 +3239,6 @@ Defaults to \c{WINDOWS_TARGET_PLATFORM_VERSION}. - \target YACCSOURCES \section1 YACCSOURCES Specifies a list of Yacc source files to be included @@ -3407,7 +3318,6 @@ \snippet code/doc_src_qmake-manual.pro 59 - \target qmake-cat \section2 cat(filename[, mode]) Returns the contents of \c filename. You can specify the following options @@ -3459,7 +3369,6 @@ \snippet code/doc_src_qmake-manual.pro 173 - \target findfunction \section2 find(variablename, substr) Returns all the values in \c variablename that match the regular expression @@ -3475,7 +3384,6 @@ Expands the specified wildcard pattern and returns a list of filenames. If \c recursive is true, this function descends into subdirectories. - \target fn_first \section2 first(variablename) Returns the first value of \c variablename. @@ -3484,9 +3392,9 @@ \snippet code/doc_src_qmake-manual.pro 161 - See also \l{take_first()}, \l{fn_last}{last()}. + See also \l{take_first(variablename)}{take_first()}, + \l{last(variablename)}{last()}. - \target format_number() \section2 format_number(number[, options...]) Returns \c number in the format specified by \c options. You can specify the @@ -3537,7 +3445,6 @@ to empty strings. If you need to encode spaces in \c glue, \c before, or \c after, you must quote them. - \target fn_last \section2 last(variablename) Returns the last value of \c variablename. @@ -3546,7 +3453,8 @@ \snippet code/doc_src_qmake-manual.pro 162 - See also \l{take_last()}, \l{fn_first}{first()}. + See also \l{take_last(variablename)}{take_last()}, + \l{first(variablename)}{first()}. \section2 list(arg1 [, arg2 ..., argn]) @@ -3567,7 +3475,6 @@ See also \l{upper(arg1 [, arg2 ..., argn])}{upper()}. - \target member() \section2 member(variablename [, start [, end]]) Returns the slice of the list value of \c variablename with the @@ -3594,9 +3501,8 @@ that an empty list will be returned only when an index is invalid (which is implied by the input variable being empty). - See also \l{str_member()}. + See also \l{str_member(arg [, start [, end]])}{str_member()}. - \target num_add() \section2 num_add(arg1 [, arg2 ..., argn]) Takes an arbitrary number of numeric arguments and adds them up, @@ -3728,12 +3634,11 @@ See also \l{system_quote(arg)}{system_quote()}. - \target fn_size \section2 size(variablename) Returns the number of values of \c variablename. - See also \l{str_size()}. + See also \l{str_size(arg)}{str_size()}. \section2 sort_depends(variablename, prefix) @@ -3747,7 +3652,8 @@ in ascending ASCII order. Numerical sorting can be accomplished by zero-padding the values to - a fixed length with the help of the \l{format_number()} function. + a fixed length with the help of the + \l{format_number(number[, options...])}{format_number()} function. This function was introduced in Qt 5.8. @@ -3765,12 +3671,11 @@ Replaces %1-%9 in \c string with the arguments passed in the comma-separated list of function \c arguments and returns the processed string. - \target str_member() \section2 str_member(arg [, start [, end]]) - This function is identical to \l{member()}, except that it operates - on a string value instead of a list variable, and consequently the - indices refer to character positions. + This function is identical to \l{member(variablename [, start [, end]])} + {member()}, except that it operates on a string value instead of a list + variable, and consequently the indices refer to character positions. This function can be used to implement many common string slicing operations: @@ -3795,20 +3700,19 @@ \note In these implementations, a zero \c len argument needs to be handled separately. - See also \l{member()}, \l{num_add()}. + See also \l{member(variablename [, start [, end]])}{member()}, + \l{num_add(arg1 [, arg2 ..., argn])}{num_add()}. This function was introduced in Qt 5.8. - \target str_size() \section2 str_size(arg) Returns the number of characters in the argument. - See also \l{fn_size}{size()}. + See also \l{size(variablename)}{size()}. This function was introduced in Qt 5.8. - \target system_replace \section2 system(command[, mode[, stsvar]]) You can use this variant of the \c system function to obtain stdout from the @@ -3818,9 +3722,10 @@ \snippet code/doc_src_qmake-manual.pro 72 - Like \l {qmake-cat}{$$cat()}, the \a mode argument takes \c blob, \c lines, - \c true, and \c false as value. However, the legacy word splitting rules - (i.e. empty or \c true, and \c false) differ subtly. + Like \l {cat(filename[, mode])}{$$cat()}, the \a mode argument takes + \c blob, \c lines, \c true, and \c false as value. However, the legacy + word splitting rules (i.e. empty or \c true, and \c false) differ + subtly. If you pass \c stsvar, the command's exit status will be stored in that variable. If the command crashes, the status will be -1, otherwise a @@ -3849,7 +3754,6 @@ See also \l{shell_quote(arg)}{shell_quote()}. - \target take_first() \section2 take_first(variablename) Returns the first value of \c variablename and removes it from the @@ -3859,9 +3763,9 @@ This function was introduced in Qt 5.8. - See also \l{take_last()}, \l{fn_first}{first()}. + See also \l{take_last(variablename)}{take_last()}, + \l{first(variablename)}{first()}. - \target take_last() \section2 take_last(variablename) Returns the last value of \c variablename and removes it from the @@ -3871,9 +3775,9 @@ This function was introduced in Qt 5.8. - See also \l{take_first()}, \l{fn_last}{last()}. + See also \l{take_first(variablename)}{take_first()}, + \l{last(variablename)}{last()}. - \target unique \section2 unique(variablename) Returns the list of values in \c variablename with duplicate entries removed. @@ -3951,7 +3855,6 @@ appropriate files are added to the \l{SOURCES} and \l{HEADERS} variables. - \target countfunction \section2 count(variablename, number) Succeeds if the variable \c variablename contains a list with the @@ -4030,7 +3933,6 @@ Exports the current value of \c variablename from the local context of a function to the global context. - \target forfunction \section2 for(iterate, list) Starts a loop that iterates over all values in \c list, setting \c iterate to each @@ -4175,9 +4077,9 @@ \snippet code/doc_src_qmake-manual.pro 71 - See also the replace variant of \l{system_replace}{system()}. + See also the replace variant of \l{system(command[, mode[, stsvar]])} + {system()}. - \target touchfunction \section2 touch(filename, reference_filename) Updates the time stamp of \c filename to match the time stamp of @@ -4396,7 +4298,6 @@ \snippet code/doc_src_qmake-manual.pro 78 - \target QMAKESPEC \section1 QMAKESPEC qmake requires a platform and compiler @@ -4420,7 +4321,6 @@ \note The \c QMAKESPEC path will be automatically added to the generated Makefile after the contents of the \l{INCLUDEPATH} system variable. - \target cache \section1 Cache File The cache file is a special file qmake reads to @@ -4433,7 +4333,6 @@ If qmake finds a \c{.qmake.cache} file then it will process this file first before it processes the project file. - \target Extensions \section1 File Extensions Under normal circumstances qmake will try to @@ -4454,7 +4353,7 @@ \li \l{QMAKE_EXT_UI} modifies the extension used for \QD UI files (usually in \l{FORMS}). \li \l{QMAKE_EXT_PRL} modifies the extension placed on - \l{LibDepend}{library dependency files}. + \l{Library Dependencies}{library dependency files}. \li \l{QMAKE_EXT_LEX} changes the suffix used in Lex files (usually in \l{LEXSOURCES}). \li \l{QMAKE_EXT_YACC} changes the suffix used in Yacc files (usually in @@ -4535,8 +4434,8 @@ \snippet code/doc_src_qmake-manual.pro 92 In the above line, \c USE_MY_STUFF will only be added to the list of pre-processor - defines if it is not already defined. Note that the \l{unique}{unique()} - function can also be used to ensure that a variable only contains one + defines if it is not already defined. Note that the \l{unique(variablename)} + {unique()} function can also be used to ensure that a variable only contains one instance of each value. \section2 Replacing Values @@ -4595,7 +4494,6 @@ \snippet code/doc_src_qmake-manual.pro 101 - \target Scopes \section1 Scopes Scopes are similar to \c if statements in procedural programming languages. @@ -4722,7 +4620,6 @@ You can test for any other platform-compiler combination as long as a specification exists for it in the \c mkspecs directory. - \target UsingVariables \section1 Variables Many of the variables used in project files are special variables that @@ -4755,7 +4652,6 @@ \snippet code/doc_src_qmake-manual.pro 100 - \target UsingReplaceFunctions \section1 Replace Functions qmake provides a selection of built-in @@ -4781,7 +4677,6 @@ \snippet qmake/replacefunction.pro 0 - \target UsingTestFunctions \section1 Test Functions qmake provides built-in functions that can be @@ -5100,7 +4995,6 @@ to be linked in. \endtable - \target LibDepend \section1 Library Dependencies Often when linking against a library, qmake @@ -5154,7 +5048,6 @@ \previouspage Advanced Usage \nextpage Configuring qmake - \target Introduction Precompiled headers (PCH) are a performance feature supported by some compilers to compile a stable body of code, and store the compiled @@ -5183,7 +5076,6 @@ \endlist \endlist - \target ADD_PCH \section1 Adding Precompiled Headers to Your Project The precompiled header must contain code which is \e stable @@ -5196,7 +5088,6 @@ C++ includes, since the precompiled header file for C files may not contain C++ code. - \target PROJECT_OPTIONS \section2 Project Options To make your project use precompiled headers, you only need to define the @@ -5236,7 +5127,6 @@ To avoid potential conflicts like these, give distinctive names to header files that will be precompiled. - \target EXAMPLE_PROJECT \section1 Example Project You can find the following source code in the @@ -5550,7 +5440,6 @@ Platform-specific variables are not described here. For more information, see \l{Qt for Windows - Deployment} and \l{Qt for macOS}. - \target Application \section1 Building an Application The \c app template tells qmake to generate a @@ -5670,7 +5559,6 @@ The only primary requirement is that the test program exit with a zero exit code on success, and a non-zero exit code on failure. - \target Library \section1 Building a Library The \c lib template tells qmake to generate a Makefile that will build a @@ -5699,7 +5587,6 @@ X11, \macos, and iOS, the library name will be prefixed by \c lib. On Windows, no prefix is added to the file name. - \target Plugin \section1 Building a Plugin Plugins are built using the \c lib template, as described in the previous diff --git a/qmake/propertyprinter.cpp b/qmake/propertyprinter.cpp index 4ba56327..10c94942 100644 --- a/qmake/propertyprinter.cpp +++ b/qmake/propertyprinter.cpp @@ -5,6 +5,10 @@ #include +#include +#include +#include + QT_BEGIN_NAMESPACE void qmakePropertyPrinter(const QList> &values) @@ -22,11 +26,12 @@ void qmakePropertyPrinter(const QList> &values) void jsonPropertyPrinter(const QList> &values) { - std::cout << "{\n"; - for (const auto &val : values) { - std::cout << "\"" << qPrintable(val.first) << "\":\"" << qPrintable(val.second) << "\",\n"; - } - std::cout << "}\n"; + QJsonObject object; + for (const auto &val : values) + object.insert(val.first, val.second); + + QJsonDocument document(object); + std::cout << document.toJson().constData(); } QT_END_NAMESPACE diff --git a/qt_cmdline.cmake b/qt_cmdline.cmake index 5450b256..372e6873 100644 --- a/qt_cmdline.cmake +++ b/qt_cmdline.cmake @@ -43,6 +43,8 @@ qt_commandline_option(avx TYPE boolean) qt_commandline_option(avx2 TYPE boolean) qt_commandline_option(avx512 TYPE boolean NAME avx512f) qt_commandline_option(c++std TYPE cxxstd) +qt_commandline_option(unity-build TYPE boolean NAME unity_build) +qt_commandline_option(unity-build-batch-size TYPE string NAME unity_build_batch_size) qt_commandline_option(ccache TYPE boolean NAME ccache) qt_commandline_option(commercial TYPE void) qt_commandline_option(confirm-license TYPE void) diff --git a/src/3rdparty/double-conversion/double-conversion/bignum.cc b/src/3rdparty/double-conversion/double-conversion/bignum.cc index d6745d75..5c74d70d 100644 --- a/src/3rdparty/double-conversion/double-conversion/bignum.cc +++ b/src/3rdparty/double-conversion/double-conversion/bignum.cc @@ -147,7 +147,7 @@ void Bignum::AssignHexString(Vector value) { } if (tmp > 0) { DOUBLE_CONVERSION_ASSERT(tmp <= kBigitMask); - RawBigit(used_bigits_++) = (tmp & kBigitMask); + RawBigit(used_bigits_++) = static_cast(tmp & kBigitMask); } Clamp(); } @@ -204,7 +204,7 @@ void Bignum::AddBignum(const Bignum& other) { carry = sum >> kBigitSize; ++bigit_pos; } - used_bigits_ = (std::max)(bigit_pos, static_cast(used_bigits_)); + used_bigits_ = static_cast(std::max(bigit_pos, static_cast(used_bigits_))); DOUBLE_CONVERSION_ASSERT(IsClamped()); } @@ -240,7 +240,7 @@ void Bignum::ShiftLeft(const int shift_amount) { if (used_bigits_ == 0) { return; } - exponent_ += (shift_amount / kBigitSize); + exponent_ += static_cast(shift_amount / kBigitSize); const int local_shift = shift_amount % kBigitSize; EnsureCapacity(used_bigits_ + 1); BigitsShiftLeft(local_shift); @@ -418,7 +418,7 @@ void Bignum::Square() { DOUBLE_CONVERSION_ASSERT(accumulator == 0); // Don't forget to update the used_digits and the exponent. - used_bigits_ = product_length; + used_bigits_ = static_cast(product_length); exponent_ *= 2; Clamp(); } @@ -739,8 +739,8 @@ void Bignum::Align(const Bignum& other) { for (int i = 0; i < zero_bigits; ++i) { RawBigit(i) = 0; } - used_bigits_ += zero_bigits; - exponent_ -= zero_bigits; + used_bigits_ += static_cast(zero_bigits); + exponent_ -= static_cast(zero_bigits); DOUBLE_CONVERSION_ASSERT(used_bigits_ >= 0); DOUBLE_CONVERSION_ASSERT(exponent_ >= 0); diff --git a/src/3rdparty/double-conversion/double-conversion/double-to-string.cc b/src/3rdparty/double-conversion/double-conversion/double-to-string.cc index bb369fe8..215eaa96 100644 --- a/src/3rdparty/double-conversion/double-conversion/double-to-string.cc +++ b/src/3rdparty/double-conversion/double-conversion/double-to-string.cc @@ -79,7 +79,14 @@ void DoubleToStringConverter::CreateExponentialRepresentation( StringBuilder* result_builder) const { DOUBLE_CONVERSION_ASSERT(length != 0); result_builder->AddCharacter(decimal_digits[0]); - if (length != 1) { + if (length == 1) { + if ((flags_ & EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL) != 0) { + result_builder->AddCharacter('.'); + if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT_IN_EXPONENTIAL) != 0) { + result_builder->AddCharacter('0'); + } + } + } else { result_builder->AddCharacter('.'); result_builder->AddSubstring(&decimal_digits[1], length-1); } diff --git a/src/3rdparty/double-conversion/double-conversion/double-to-string.h b/src/3rdparty/double-conversion/double-conversion/double-to-string.h index 04a4ac38..abe60e88 100644 --- a/src/3rdparty/double-conversion/double-conversion/double-to-string.h +++ b/src/3rdparty/double-conversion/double-conversion/double-to-string.h @@ -78,7 +78,9 @@ class DoubleToStringConverter { EMIT_TRAILING_DECIMAL_POINT = 2, EMIT_TRAILING_ZERO_AFTER_POINT = 4, UNIQUE_ZERO = 8, - NO_TRAILING_ZERO = 16 + NO_TRAILING_ZERO = 16, + EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL = 32, + EMIT_TRAILING_ZERO_AFTER_POINT_IN_EXPONENTIAL = 64 }; // Flags should be a bit-or combination of the possible Flags-enum. @@ -97,6 +99,13 @@ class DoubleToStringConverter { // of the result in precision mode. Matches printf's %g. // When EMIT_TRAILING_ZERO_AFTER_POINT is also given, one trailing zero is // preserved. + // - EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL: when the input number has + // exactly one significant digit and is converted into exponent form then a + // trailing decimal point is appended to the significand in shortest mode + // or in precision mode with one requested digit. + // - EMIT_TRAILING_ZERO_AFTER_POINT_IN_EXPONENTIAL: in addition to a trailing + // decimal point emits a trailing '0'-character. This flag requires the + // EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL flag. // // Infinity symbol and nan_symbol provide the string representation for these // special values. If the string is NULL and the special value is encountered @@ -132,6 +141,22 @@ class DoubleToStringConverter { // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT. // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT. // + // When converting numbers with exactly one significant digit to exponent + // form in shortest mode or in precision mode with one requested digit, the + // EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT flags have + // no effect. Use the EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL flag to + // append a decimal point in this case and the + // EMIT_TRAILING_ZERO_AFTER_POINT_IN_EXPONENTIAL flag to also append a + // '0'-character in this case. + // Example with decimal_in_shortest_low = 0: + // ToShortest(0.0009) -> "9e-4" + // with EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL deactivated. + // ToShortest(0.0009) -> "9.e-4" + // with EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL activated. + // ToShortest(0.0009) -> "9.0e-4" + // with EMIT_TRAILING_DECIMAL_POINT_IN_EXPONENTIAL activated and + // EMIT_TRAILING_ZERO_AFTER_POINT_IN_EXPONENTIAL activated. + // // The min_exponent_width is used for exponential representations. // The converter adds leading '0's to the exponent until the exponent // is at least min_exponent_width digits long. diff --git a/src/3rdparty/double-conversion/qt_attribution.json b/src/3rdparty/double-conversion/qt_attribution.json index 21692f04..4166ccef 100644 --- a/src/3rdparty/double-conversion/qt_attribution.json +++ b/src/3rdparty/double-conversion/qt_attribution.json @@ -5,8 +5,8 @@ "QtUsage": "Used in Qt Core. Configure with -system-doubleconversion or -no-doubleconversion to avoid.", "Homepage": "https://github.com/google/double-conversion", - "Version": "3.2.1", - "DownloadLocation": "https://github.com/google/double-conversion/releases/tag/v3.2.1", + "Version": "3.3.0", + "DownloadLocation": "https://github.com/google/double-conversion/releases/tag/v3.3.0", "License": "BSD 3-clause \"New\" or \"Revised\" License", "LicenseId": "BSD-3-Clause", "LicenseFile": "LICENSE", diff --git a/src/3rdparty/freetype/README b/src/3rdparty/freetype/README index 327b94d8..cd4c1d7d 100644 --- a/src/3rdparty/freetype/README +++ b/src/3rdparty/freetype/README @@ -1,4 +1,4 @@ -FreeType 2.13.0 +FreeType 2.13.2 =============== Homepage: https://www.freetype.org @@ -32,9 +32,9 @@ sites. Go to and download one of the following files. - freetype-doc-2.13.0.tar.xz - freetype-doc-2.13.0.tar.gz - ftdoc2130.zip + freetype-doc-2.13.2.tar.xz + freetype-doc-2.13.2.tar.gz + ftdoc2132.zip To view the documentation online, go to diff --git a/src/3rdparty/freetype/docs/CHANGES b/src/3rdparty/freetype/docs/CHANGES index 3c6a8774..96cf607d 100644 --- a/src/3rdparty/freetype/docs/CHANGES +++ b/src/3rdparty/freetype/docs/CHANGES @@ -1,3 +1,57 @@ +CHANGES BETWEEN 2.13.1 and 2.13.2 (2023-Aug-25) + + I. MISCELLANEOUS + + - Better support for CFF2 variation fonts. + + - TrueType interpreter version 38 (also known as 'Infinality') has + been removed. + + - Improved OpenVMS support. + + +====================================================================== + +CHANGES BETWEEN 2.13.0 and 2.13.1 (2023-Jun-24) + + I. MISCELLANEOUS + + - New function `FT_Get_Default_Named_Instance` to get the index of + the default named instance of an OpenType Variation Font. + + - A new load flag `FT_LOAD_NO_SVG` to make FreeType ignore glyphs in + an 'SVG ' table. + + - New function `FT_GlyphSlot_AdjustWeight` to adjust the glyph + weight either horizontally or vertically. This is part of the + `ftsynth.h` header file, which is still considered to be in alpha + stage. + + - TrueType interpreter version 38 (also known as 'Infinality') has + been deactivated; the value of `TT_INTERPRETER_VERSION_38` is now + the same as `TT_INTERPRETER_VERSION_40`. + + - Updated OpenVMS support. + + - The base API documentation has been modularized for easier + handling. + + - Switching named instances on and off in Variation Fonts was buggy + if the design coordinates didn't change. + + - `ftbench` has a new command-line option `-a` to apply design + coordinates. + + - `ftview` can now flip SVG rendering on and off using the 'Z' key. + + - In `ftmulti` it is now possible to toggle the fill rule and + overlap flag used for rendering glyphs using the 'F3' and 'F4' + keys, respectively. Toggling the anti-aliased mode has been + changed to the 'TAB' key. + + +====================================================================== + CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09) I. IMPORTANT CHANGES @@ -12,7 +66,7 @@ CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09) https://learn.microsoft.com/en-us/typography/opentype/spec/colr - III. MISCELLANEOUS + II. MISCELLANEOUS - For OpenType Variable Fonts, `avar` table format 2.0 is now supported. The code was contributed by Behdad Esfahbod. @@ -75,6 +129,10 @@ CHANGES BETWEEN 2.12.1 and 2.13.0 (2023-Feb-09) af_debug_hints_ ``` + - The internal zlib library was updated to version 1.2.13. Note, + however, that FreeType is *not* affected by CVE-2022-37434 since + it doesn't use the `inflateGetHeader` function. + ====================================================================== @@ -2420,7 +2478,7 @@ CHANGES BETWEEN 2.3.8 and 2.3.7 is provided for x86 and ARM. See FT_CONFIG_OPTION_INLINE_MULFIX and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more. - - The handling of `tricky' fonts (this is, fonts which don't work + - The handling of `tricky' fonts (that is, fonts which don't work with the autohinter, needing the font format's hinting engine) has been generalized and changed slightly: @@ -2877,7 +2935,7 @@ CHANGES BETWEEN 2.2 and 2.1.10 II. IMPORTANT CHANGES - - Version 2.2 no longer exposes its internals, this is, the header + - Version 2.2 no longer exposes its internals, that is, the header files located in the `include/freetype/internal' directory of the source package are not copied anymore by the `make install' command. Consequently, a number of rogue clients which directly diff --git a/src/3rdparty/freetype/docs/DEBUG b/src/3rdparty/freetype/docs/DEBUG index 4a5ac3a4..7398df69 100644 --- a/src/3rdparty/freetype/docs/DEBUG +++ b/src/3rdparty/freetype/docs/DEBUG @@ -270,12 +270,12 @@ to access them. `FT2_DEBUG' environment variable. Use this function to override the value with `level'. Use value `NULL' to disable tracing. - FT_Trace_Set_Default_Level(): + FT_Trace_Set_Default_Level( void ) Reset the tracing levels to the default value, i.e., the value of the `FT2_DEBUG' environment variable or no tracing if not set. - FT_Set_Log_Handler( ft_custom_log_handler handler ): + FT_Set_Log_Handler( ft_custom_log_handler handler ) Use `handler' as a custom handler for formatting tracing and error messages. The `ft_custom_log_handler' typedef has the following @@ -290,7 +290,7 @@ to access them. first argument of `FT_TRACE' or `FT_ERROR', and `args' holds the remaining arguments. - FT_Set_Default_Log_Handler(): + FT_Set_Default_Log_Handler( void ) Reset the log handler to the default version. diff --git a/src/3rdparty/freetype/include/dlg/dlg.h b/src/3rdparty/freetype/include/dlg/dlg.h index 3a7abf8f..fa10730e 100644 --- a/src/3rdparty/freetype/include/dlg/dlg.h +++ b/src/3rdparty/freetype/include/dlg/dlg.h @@ -85,6 +85,13 @@ #endif #endif +// This macro is used when an assertion fails. It gets the source expression +// and can return an alternative (that must stay alive). +// Mainly useful to execute something on failed assertion. +#ifndef DLG_FAILED_ASSERTION_TEXT + #define DLG_FAILED_ASSERTION_TEXT(x) x +#endif + // - utility - // two methods needed since cplusplus does not support compound literals // and c does not support uniform initialization/initializer lists @@ -131,83 +138,12 @@ struct dlg_origin { // Type of the output handler, see dlg_set_handler. typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string, void* data); -#ifdef DLG_DISABLE +#ifndef DLG_DISABLE // Tagged/Untagged logging with variable level // Tags must always be in the format `("tag1", "tag2")` (including brackets) - #define dlg_log(level, ...) - #define dlg_logt(level, tags, ...) - - // Dynamic level assert macros in various versions for additional arguments - #define dlg_assertl(level, expr) // assert without tags/message - #define dlg_assertlt(level, tags, expr) // assert with tags - #define dlg_assertlm(level, expr, ...) // assert with message - #define dlg_assertltm(level, tags, expr, ...) // assert with tags & message - - // Sets the handler that is responsible for formatting and outputting log calls. - // This function is not thread safe and the handler is set globally. - // The handler itself must not change dlg tags or call a dlg macro (if it - // does so, the provided string or tags array in 'origin' might get invalid). - // The handler can also be used for various other things such as dealing - // with failed assertions or filtering calls based on the passed tags. - // The default handler is dlg_default_output (see its doc for more info). - // If using c++ make sure the registered handler cannot throw e.g. by - // wrapping everything into a try-catch blog. - inline void dlg_set_handler(dlg_handler handler, void* data) { - (void) handler; - (void) data; - } - - // Returns the currently active dlg handler and sets `data` to - // its user data pointer. `data` must not be NULL. - // Useful to create handler chains. - // This function is not threadsafe, i.e. retrieving the handler while - // changing it from another thread is unsafe. - // See `dlg_set_handler`. - inline dlg_handler dlg_get_handler(void** data) { - *data = NULL; - return NULL; - } - - // The default output handler. - // Only use this to reset the output handler, prefer to use - // dlg_generic_output (from output.h) which this function simply calls. - // It also flushes the stream used and correctly outputs even from multiple threads. - inline void dlg_default_output(const struct dlg_origin* o, const char* str, void* data) { - (void) o; - (void) str; - (void) data; - } - - // Adds the given tag associated with the given function to the thread specific list. - // If func is not NULL the tag will only applied to calls from the same function. - // Remove the tag again calling dlg_remove_tag (with exactly the same pointers!). - // Does not check if the tag is already present. - inline void dlg_add_tag(const char* tag, const char* func) { - (void) tag; - (void) func; - } - - // Removes a tag added with dlg_add_tag (has no effect for tags no present). - // The pointers must be exactly the same pointers that were supplied to dlg_add_tag, - // this function will not check using strcmp. When the same tag/func combination - // is added multiple times, this function remove exactly one candidate, it is - // undefined which. Returns whether a tag was found (and removed). - inline bool dlg_remove_tag(const char* tag, const char* func) { - (void) tag; - (void) func; - return true; - } - - // Returns the thread-specific buffer and its size for dlg. - // The buffer should only be used by formatting functions. - // The buffer can be reallocated and the size changed, just make sure - // to update both values correctly. - inline char** dlg_thread_buffer(size_t** size) { - (void) size; - return NULL; - } - -#else // DLG_DISABLE + // Example usages: + // dlg_log(dlg_level_warning, "test 1") + // dlg_logt(("tag1, "tag2"), dlg_level_debug, "test %d", 2) #define dlg_log(level, ...) if(level >= DLG_LOG_LEVEL) \ dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, \ DLG_FMT_FUNC(__VA_ARGS__), NULL) @@ -215,23 +151,31 @@ typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string, dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, \ DLG_FMT_FUNC(__VA_ARGS__), NULL) + // Dynamic level assert macros in various versions for additional arguments + // Example usages: + // dlg_assertl(dlg_level_warning, data != nullptr); + // dlg_assertlt(("tag1, "tag2"), dlg_level_trace, data != nullptr); + // dlg_asserttlm(("tag1), dlg_level_warning, data != nullptr, "Data must not be null"); + // dlg_assertlm(dlg_level_error, data != nullptr, "Data must not be null"); #define dlg_assertl(level, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \ - dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, NULL, #expr) + dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, NULL, \ + DLG_FAILED_ASSERTION_TEXT(#expr)) #define dlg_assertlt(level, tags, expr) if(level >= DLG_ASSERT_LEVEL && !(expr)) \ - dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, NULL, #expr) + dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, __func__, NULL, \ + DLG_FAILED_ASSERTION_TEXT(#expr)) #define dlg_assertlm(level, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \ dlg__do_log(level, DLG_CREATE_TAGS(NULL), DLG_FILE, __LINE__, __func__, \ - DLG_FMT_FUNC(__VA_ARGS__), #expr) + DLG_FMT_FUNC(__VA_ARGS__), DLG_FAILED_ASSERTION_TEXT(#expr)) #define dlg_assertltm(level, tags, expr, ...) if(level >= DLG_ASSERT_LEVEL && !(expr)) \ dlg__do_log(level, DLG_CREATE_TAGS tags, DLG_FILE, __LINE__, \ - __func__, DLG_FMT_FUNC(__VA_ARGS__), #expr) + __func__, DLG_FMT_FUNC(__VA_ARGS__), DLG_FAILED_ASSERTION_TEXT(#expr)) - DLG_API void dlg_set_handler(dlg_handler handler, void* data); - DLG_API dlg_handler dlg_get_handler(void** data); - DLG_API void dlg_default_output(const struct dlg_origin*, const char* string, void*); - DLG_API void dlg_add_tag(const char* tag, const char* func); - DLG_API bool dlg_remove_tag(const char* tag, const char* func); - DLG_API char** dlg_thread_buffer(size_t** size); + #define dlg__assert_or(level, tags, expr, code, msg) if(!(expr)) {\ + if(level >= DLG_ASSERT_LEVEL) \ + dlg__do_log(level, tags, DLG_FILE, __LINE__, __func__, msg, \ + DLG_FAILED_ASSERTION_TEXT(#expr)); \ + code; \ + } (void) NULL // - Private interface: not part of the abi/api but needed in macros - // Formats the given format string and arguments as printf would, uses the thread buffer. @@ -239,8 +183,66 @@ typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string, DLG_API void dlg__do_log(enum dlg_level lvl, const char* const*, const char*, int, const char*, const char*, const char*); DLG_API const char* dlg__strip_root_path(const char* file, const char* base); + +#else // DLG_DISABLE + + #define dlg_log(level, ...) + #define dlg_logt(level, tags, ...) + + #define dlg_assertl(level, expr) // assert without tags/message + #define dlg_assertlt(level, tags, expr) // assert with tags + #define dlg_assertlm(level, expr, ...) // assert with message + #define dlg_assertltm(level, tags, expr, ...) // assert with tags & message + + #define dlg__assert_or(level, tags, expr, code, msg) if(!(expr)) { code; } (void) NULL #endif // DLG_DISABLE +// The API below is independent from DLG_DISABLE + +// Sets the handler that is responsible for formatting and outputting log calls. +// This function is not thread safe and the handler is set globally. +// The handler itself must not change dlg tags or call a dlg macro (if it +// does so, the provided string or tags array in 'origin' might get invalid). +// The handler can also be used for various other things such as dealing +// with failed assertions or filtering calls based on the passed tags. +// The default handler is dlg_default_output (see its doc for more info). +// If using c++ make sure the registered handler cannot throw e.g. by +// wrapping everything into a try-catch blog. +DLG_API void dlg_set_handler(dlg_handler handler, void* data); + +// The default output handler. +// Only use this to reset the output handler, prefer to use +// dlg_generic_output (from output.h) which this function simply calls. +// It also flushes the stream used and correctly outputs even from multiple threads. +DLG_API void dlg_default_output(const struct dlg_origin*, const char* string, void*); + +// Returns the currently active dlg handler and sets `data` to +// its user data pointer. `data` must not be NULL. +// Useful to create handler chains. +// This function is not threadsafe, i.e. retrieving the handler while +// changing it from another thread is unsafe. +// See `dlg_set_handler`. +DLG_API dlg_handler dlg_get_handler(void** data); + +// Adds the given tag associated with the given function to the thread specific list. +// If func is not NULL the tag will only applied to calls from the same function. +// Remove the tag again calling dlg_remove_tag (with exactly the same pointers!). +// Does not check if the tag is already present. +DLG_API void dlg_add_tag(const char* tag, const char* func); + +// Removes a tag added with dlg_add_tag (has no effect for tags no present). +// The pointers must be exactly the same pointers that were supplied to dlg_add_tag, +// this function will not check using strcmp. When the same tag/func combination +// is added multiple times, this function remove exactly one candidate, it is +// undefined which. Returns whether a tag was found (and removed). +DLG_API bool dlg_remove_tag(const char* tag, const char* func); + +// Returns the thread-specific buffer and its size for dlg. +// The buffer should only be used by formatting functions. +// The buffer can be reallocated and the size changed, just make sure +// to update both values correctly. +DLG_API char** dlg_thread_buffer(size_t** size); + // Untagged leveled logging #define dlg_trace(...) dlg_log(dlg_level_trace, __VA_ARGS__) #define dlg_debug(...) dlg_log(dlg_level_debug, __VA_ARGS__) @@ -263,6 +265,24 @@ typedef void(*dlg_handler)(const struct dlg_origin* origin, const char* string, #define dlg_assertm(expr, ...) dlg_assertlm(DLG_DEFAULT_ASSERT, expr, __VA_ARGS__) #define dlg_asserttm(tags, expr, ...) dlg_assertltm(DLG_DEFAULT_ASSERT, tags, expr, __VA_ARGS__) +// If (expr) does not evaluate to true, always executes 'code' (no matter what +// DLG_ASSERT_LEVEL is or if dlg is disabled or not). +// When dlg is enabled and the level is greater or equal to DLG_ASSERT_LEVEL, +// logs the failed assertion. +// Example usages: +// dlg_assertl_or(dlg_level_warn, data != nullptr, return); +// dlg_assertlm_or(dlg_level_fatal, data != nullptr, return, "Data must not be null"); +// dlg_assert_or(data != nullptr, logError(); return false); +#define dlg_assertltm_or(level, tags, expr, code, ...) dlg__assert_or(level, \ + DLG_CREATE_TAGS tags, expr, code, DLG_FMT_FUNC(__VA_ARGS__)) +#define dlg_assertlm_or(level, expr, code, ...) dlg__assert_or(level, \ + DLG_CREATE_TAGS(NULL), expr, code, DLG_FMT_FUNC(__VA_ARGS__)) +#define dlg_assertl_or(level, expr, code) dlg__assert_or(level, \ + DLG_CREATE_TAGS(NULL), expr, code, NULL) + +#define dlg_assert_or(expr, code) dlg_assertl_or(DLG_DEFAULT_ASSERT, expr, code) +#define dlg_assertm_or(expr, code, ...) dlg_assertlm_or(DLG_DEFAULT_ASSERT, expr, code, __VA_ARGS__) + #ifdef __cplusplus } #endif diff --git a/src/3rdparty/freetype/include/freetype/config/ftoption.h b/src/3rdparty/freetype/include/freetype/config/ftoption.h index 9e03e178..1976b33a 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftoption.h +++ b/src/3rdparty/freetype/include/freetype/config/ftoption.h @@ -661,36 +661,12 @@ FT_BEGIN_HEADER * not) instructions in a certain way so that all TrueType fonts look like * they do in a Windows ClearType (DirectWrite) environment. See [1] for a * technical overview on what this means. See `ttinterp.h` for more - * details on the LEAN option. + * details on this option. * - * There are three possible values. - * - * Value 1: - * This value is associated with the 'Infinality' moniker, contributed by - * an individual nicknamed Infinality with the goal of making TrueType - * fonts render better than on Windows. A high amount of configurability - * and flexibility, down to rules for single glyphs in fonts, but also - * very slow. Its experimental and slow nature and the original - * developer losing interest meant that this option was never enabled in - * default builds. - * - * The corresponding interpreter version is v38. - * - * Value 2: - * The new default mode for the TrueType driver. The Infinality code - * base was stripped to the bare minimum and all configurability removed - * in the name of speed and simplicity. The configurability was mainly - * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. - * Legacy fonts are fonts that modify vertical stems to achieve clean - * black-and-white bitmaps. The new mode focuses on applying a minimal - * set of rules to all fonts indiscriminately so that modern and web - * fonts render well while legacy fonts render okay. - * - * The corresponding interpreter version is v40. - * - * Value 3: - * Compile both, making both v38 and v40 available (the latter is the - * default). + * The new default mode focuses on applying a minimal set of rules to all + * fonts indiscriminately so that modern and web fonts render well while + * legacy fonts render okay. The corresponding interpreter version is v40. + * The so-called Infinality mode (v38) is no longer available in FreeType. * * By undefining these, you get rendering behavior like on Windows without * ClearType, i.e., Windows XP without ClearType enabled and Win9x @@ -705,9 +681,7 @@ FT_BEGIN_HEADER * [1] * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ -#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING /************************************************************************** @@ -977,21 +951,14 @@ FT_BEGIN_HEADER /* - * The next three macros are defined if native TrueType hinting is + * The next two macros are defined if native TrueType hinting is * requested by the definitions above. Don't change this. */ #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER #define TT_USE_BYTECODE_INTERPRETER - #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING -#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 -#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY -#endif - -#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 #define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL #endif -#endif #endif diff --git a/src/3rdparty/freetype/include/freetype/config/ftstdlib.h b/src/3rdparty/freetype/include/freetype/config/ftstdlib.h index 3c9d2ae5..f65148a9 100644 --- a/src/3rdparty/freetype/include/freetype/config/ftstdlib.h +++ b/src/3rdparty/freetype/include/freetype/config/ftstdlib.h @@ -111,13 +111,13 @@ #include -#define FT_FILE FILE -#define ft_fclose fclose -#define ft_fopen fopen -#define ft_fread fread -#define ft_fseek fseek -#define ft_ftell ftell -#define ft_sprintf sprintf +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_snprintf snprintf /************************************************************************** diff --git a/src/3rdparty/freetype/include/freetype/freetype.h b/src/3rdparty/freetype/include/freetype/freetype.h index efff74fe..92acf379 100644 --- a/src/3rdparty/freetype/include/freetype/freetype.h +++ b/src/3rdparty/freetype/include/freetype/freetype.h @@ -102,61 +102,25 @@ FT_BEGIN_HEADER */ - - /*************************************************************************/ - /*************************************************************************/ - /* */ - /* B A S I C T Y P E S */ - /* */ - /*************************************************************************/ - /*************************************************************************/ - - /************************************************************************** * * @section: - * base_interface + * font_testing_macros * * @title: - * Base Interface + * Font Testing Macros * * @abstract: - * The FreeType~2 base font interface. + * Macros to test various properties of fonts. * * @description: - * This section describes the most important public high-level API - * functions of FreeType~2. + * Macros to test the most important font properties. + * + * It is recommended to use these high-level macros instead of directly + * testing the corresponding flags, which are scattered over various + * structures. * * @order: - * FT_Library - * FT_Face - * FT_Size - * FT_GlyphSlot - * FT_CharMap - * FT_Encoding - * FT_ENC_TAG - * - * FT_FaceRec - * - * FT_FACE_FLAG_SCALABLE - * FT_FACE_FLAG_FIXED_SIZES - * FT_FACE_FLAG_FIXED_WIDTH - * FT_FACE_FLAG_HORIZONTAL - * FT_FACE_FLAG_VERTICAL - * FT_FACE_FLAG_COLOR - * FT_FACE_FLAG_SFNT - * FT_FACE_FLAG_CID_KEYED - * FT_FACE_FLAG_TRICKY - * FT_FACE_FLAG_KERNING - * FT_FACE_FLAG_MULTIPLE_MASTERS - * FT_FACE_FLAG_VARIATION - * FT_FACE_FLAG_GLYPH_NAMES - * FT_FACE_FLAG_EXTERNAL_STREAM - * FT_FACE_FLAG_HINTER - * FT_FACE_FLAG_SVG - * FT_FACE_FLAG_SBIX - * FT_FACE_FLAG_SBIX_OVERLAY - * * FT_HAS_HORIZONTAL * FT_HAS_VERTICAL * FT_HAS_KERNING @@ -176,21 +140,59 @@ FT_BEGIN_HEADER * FT_IS_NAMED_INSTANCE * FT_IS_VARIATION * - * FT_STYLE_FLAG_BOLD - * FT_STYLE_FLAG_ITALIC + */ + + + /************************************************************************** * - * FT_SizeRec - * FT_Size_Metrics + * @section: + * library_setup * - * FT_GlyphSlotRec - * FT_Glyph_Metrics - * FT_SubGlyph + * @title: + * Library Setup * - * FT_Bitmap_Size + * @abstract: + * Functions to start and end the usage of the FreeType library. * + * @description: + * Functions to start and end the usage of the FreeType library. + * + * Note that @FT_Library_Version and @FREETYPE_XXX are of limited use + * because even a new release of FreeType with only documentation + * changes increases the version number. + * + * @order: + * FT_Library * FT_Init_FreeType * FT_Done_FreeType * + * FT_Library_Version + * FREETYPE_XXX + * + */ + + + /************************************************************************** + * + * @section: + * face_creation + * + * @title: + * Face Creation + * + * @abstract: + * Functions to manage fonts. + * + * @description: + * The functions and structures collected in this section operate on + * fonts globally. + * + * @order: + * FT_Face + * FT_FaceRec + * FT_FACE_FLAG_XXX + * FT_STYLE_FLAG_XXX + * * FT_New_Face * FT_Done_Face * FT_Reference_Face @@ -198,10 +200,36 @@ FT_BEGIN_HEADER * FT_Face_Properties * FT_Open_Face * FT_Open_Args + * FT_OPEN_XXX * FT_Parameter * FT_Attach_File * FT_Attach_Stream * + */ + + + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + * @title: + * Sizing and Scaling + * + * @abstract: + * Functions to manage font sizes. + * + * @description: + * The functions and structures collected in this section are related to + * selecting and manipulating the size of a font globally. + * + * @order: + * FT_Size + * FT_SizeRec + * FT_Size_Metrics + * + * FT_Bitmap_Size + * * FT_Set_Char_Size * FT_Set_Pixel_Sizes * FT_Request_Size @@ -209,44 +237,37 @@ FT_BEGIN_HEADER * FT_Size_Request_Type * FT_Size_RequestRec * FT_Size_Request + * * FT_Set_Transform * FT_Get_Transform + * + */ + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + * @title: + * Glyph Retrieval + * + * @abstract: + * Functions to manage glyphs. + * + * @description: + * The functions and structures collected in this section operate on + * single glyphs, of which @FT_Load_Glyph is most important. + * + * @order: + * FT_GlyphSlot + * FT_GlyphSlotRec + * FT_Glyph_Metrics + * * FT_Load_Glyph - * FT_Get_Char_Index - * FT_Get_First_Char - * FT_Get_Next_Char - * FT_Load_Char - * - * FT_OPEN_MEMORY - * FT_OPEN_STREAM - * FT_OPEN_PATHNAME - * FT_OPEN_DRIVER - * FT_OPEN_PARAMS - * - * FT_LOAD_DEFAULT - * FT_LOAD_RENDER - * FT_LOAD_MONOCHROME - * FT_LOAD_LINEAR_DESIGN - * FT_LOAD_NO_SCALE - * FT_LOAD_NO_HINTING - * FT_LOAD_NO_BITMAP - * FT_LOAD_SBITS_ONLY - * FT_LOAD_NO_AUTOHINT - * FT_LOAD_COLOR - * - * FT_LOAD_VERTICAL_LAYOUT - * FT_LOAD_IGNORE_TRANSFORM - * FT_LOAD_FORCE_AUTOHINT - * FT_LOAD_NO_RECURSE - * FT_LOAD_PEDANTIC - * - * FT_LOAD_TARGET_NORMAL - * FT_LOAD_TARGET_LIGHT - * FT_LOAD_TARGET_MONO - * FT_LOAD_TARGET_LCD - * FT_LOAD_TARGET_LCD_V - * + * FT_LOAD_XXX * FT_LOAD_TARGET_MODE + * FT_LOAD_TARGET_XXX * * FT_Render_Glyph * FT_Render_Mode @@ -254,34 +275,121 @@ FT_BEGIN_HEADER * FT_Kerning_Mode * FT_Get_Track_Kerning * + */ + + + /************************************************************************** + * + * @section: + * character_mapping + * + * @title: + * Character Mapping + * + * @abstract: + * Functions to manage character-to-glyph maps. + * + * @description: + * This section holds functions and structures that are related to + * mapping character input codes to glyph indices. + * + * Note that for many scripts the simplistic approach used by FreeType + * of mapping a single character to a single glyph is not valid or + * possible! In general, a higher-level library like HarfBuzz or ICU + * should be used for handling text strings. + * + * @order: + * FT_CharMap * FT_CharMapRec + * FT_Encoding + * FT_ENC_TAG + * * FT_Select_Charmap * FT_Set_Charmap * FT_Get_Charmap_Index * + * FT_Get_Char_Index + * FT_Get_First_Char + * FT_Get_Next_Char + * FT_Load_Char + * + */ + + + /************************************************************************** + * + * @section: + * information_retrieval + * + * @title: + * Information Retrieval + * + * @abstract: + * Functions to retrieve font and glyph information. + * + * @description: + * Functions to retrieve font and glyph information. Only some very + * basic data is covered; see also the chapter on the format-specific + * API for more. + * + * + * @order: * FT_Get_Name_Index * FT_Get_Glyph_Name * FT_Get_Postscript_Name * FT_Get_FSType_Flags + * FT_FSTYPE_XXX * FT_Get_SubGlyph_Info + * FT_SUBGLYPH_FLAG_XXX * + */ + + + /************************************************************************** + * + * @section: + * other_api_data + * + * @title: + * Other API Data + * + * @abstract: + * Other structures, enumerations, and macros. + * + * @description: + * Other structures, enumerations, and macros. Deprecated functions are + * also listed here. + * + * @order: * FT_Face_Internal * FT_Size_Internal * FT_Slot_Internal * - * FT_FACE_FLAG_XXX - * FT_STYLE_FLAG_XXX - * FT_OPEN_XXX - * FT_LOAD_XXX - * FT_LOAD_TARGET_XXX - * FT_SUBGLYPH_FLAG_XXX - * FT_FSTYPE_XXX + * FT_SubGlyph * * FT_HAS_FAST_GLYPHS + * FT_Face_CheckTrueTypePatents + * FT_Face_SetUnpatentedHinting * */ + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + /************************************************************************** * * @struct: @@ -349,6 +457,13 @@ FT_BEGIN_HEADER } FT_Glyph_Metrics; + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + /************************************************************************** * * @struct: @@ -409,6 +524,13 @@ FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ + /************************************************************************** + * + * @section: + * library_setup + * + */ + /************************************************************************** * * @type: @@ -483,7 +605,7 @@ FT_BEGIN_HEADER /************************************************************************** * * @section: - * base_interface + * face_creation * */ @@ -519,6 +641,13 @@ FT_BEGIN_HEADER typedef struct FT_FaceRec_* FT_Face; + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + /************************************************************************** * * @type: @@ -551,6 +680,13 @@ FT_BEGIN_HEADER typedef struct FT_SizeRec_* FT_Size; + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + /************************************************************************** * * @type: @@ -570,6 +706,13 @@ FT_BEGIN_HEADER typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + /************************************************************************** + * + * @section: + * character_mapping + * + */ + /************************************************************************** * * @type: @@ -877,6 +1020,13 @@ FT_BEGIN_HEADER /*************************************************************************/ + /************************************************************************** + * + * @section: + * other_api_data + * + */ + /************************************************************************** * * @type: @@ -892,6 +1042,13 @@ FT_BEGIN_HEADER typedef struct FT_Face_InternalRec_* FT_Face_Internal; + /************************************************************************** + * + * @section: + * face_creation + * + */ + /************************************************************************** * * @struct: @@ -918,7 +1075,7 @@ FT_BEGIN_HEADER * If we have the third named instance of face~4, say, `face_index` is * set to 0x00030004. * - * Bit 31 is always zero (this is, `face_index` is always a positive + * Bit 31 is always zero (that is, `face_index` is always a positive * value). * * [Since 2.9] Changing the design coordinates with @@ -936,7 +1093,7 @@ FT_BEGIN_HEADER * * [Since 2.6.1] Bits 16-30 hold the number of named instances * available for the current face if we have a GX or OpenType variation - * (sub)font. Bit 31 is always zero (this is, `style_flags` is always + * (sub)font. Bit 31 is always zero (that is, `style_flags` is always * a positive value). Note that a variation font has always at least * one named instance, namely the default instance. * @@ -1002,7 +1159,7 @@ FT_BEGIN_HEADER * Note that the bounding box might be off by (at least) one pixel for * hinted fonts. See @FT_Size_Metrics for further discussion. * - * Note that the bounding box does not vary in OpenType variable fonts + * Note that the bounding box does not vary in OpenType variation fonts * and should only be used in relation to the default instance. * * units_per_EM :: @@ -1090,9 +1247,9 @@ FT_BEGIN_HEADER FT_Generic generic; - /*# The following member variables (down to `underline_thickness`) */ - /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ - /*# for bitmap fonts. */ + /* The following member variables (down to `underline_thickness`) */ + /* are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /* for bitmap fonts. */ FT_BBox bbox; FT_UShort units_per_EM; @@ -1110,7 +1267,7 @@ FT_BEGIN_HEADER FT_Size size; FT_CharMap charmap; - /*@private begin */ + /* private fields, internal to FreeType */ FT_Driver driver; FT_Memory memory; @@ -1123,8 +1280,6 @@ FT_BEGIN_HEADER FT_Face_Internal internal; - /*@private end */ - } FT_FaceRec; @@ -1207,13 +1362,13 @@ FT_BEGIN_HEADER * successfully; in all other cases you get an * `FT_Err_Invalid_Argument` error. * - * Note that CID-keyed fonts that are in an SFNT wrapper (this is, all + * Note that CID-keyed fonts that are in an SFNT wrapper (that is, all * OpenType/CFF fonts) don't have this flag set since the glyphs are * accessed in the normal way (using contiguous indices); the * 'CID-ness' isn't visible to the application. * * FT_FACE_FLAG_TRICKY :: - * The face is 'tricky', this is, it always needs the font format's + * The face is 'tricky', that is, it always needs the font format's * native hinting engine to get a reasonable result. A typical example * is the old Chinese font `mingli.ttf` (but not `mingliu.ttc`) that * uses TrueType bytecode instructions to move and scale all of its @@ -1235,8 +1390,8 @@ FT_BEGIN_HEADER * FT_FACE_FLAG_VARIATION :: * [Since 2.9] Set if the current face (or named instance) has been * altered with @FT_Set_MM_Design_Coordinates, - * @FT_Set_Var_Design_Coordinates, or @FT_Set_Var_Blend_Coordinates. - * This flag is unset by a call to @FT_Set_Named_Instance. + * @FT_Set_Var_Design_Coordinates, @FT_Set_Var_Blend_Coordinates, or + * @FT_Set_MM_WeightVector to select a non-default instance. * * FT_FACE_FLAG_SVG :: * [Since 2.12] The face has an 'SVG~' OpenType table. @@ -1272,6 +1427,13 @@ FT_BEGIN_HEADER #define FT_FACE_FLAG_SBIX_OVERLAY ( 1L << 18 ) + /************************************************************************** + * + * @section: + * font_testing_macros + * + */ + /************************************************************************** * * @macro: @@ -1381,6 +1543,13 @@ FT_BEGIN_HEADER ( !!( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES ) ) + /************************************************************************** + * + * @section: + * other_api_data + * + */ + /************************************************************************** * * @macro: @@ -1393,6 +1562,13 @@ FT_BEGIN_HEADER #define FT_HAS_FAST_GLYPHS( face ) 0 + /************************************************************************** + * + * @section: + * font_testing_macros + * + */ + /************************************************************************** * * @macro: @@ -1451,8 +1627,8 @@ FT_BEGIN_HEADER * * @description: * A macro that returns true whenever a face object has been altered by - * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or - * @FT_Set_Var_Blend_Coordinates. + * @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, + * @FT_Set_Var_Blend_Coordinates, or @FT_Set_MM_WeightVector. * * @since: * 2.9 @@ -1628,6 +1804,13 @@ FT_BEGIN_HEADER ( !!( (face)->face_flags & FT_FACE_FLAG_SBIX_OVERLAY ) ) + /************************************************************************** + * + * @section: + * face_creation + * + */ + /************************************************************************** * * @enum: @@ -1654,6 +1837,13 @@ FT_BEGIN_HEADER #define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + /************************************************************************** + * + * @section: + * other_api_data + * + */ + /************************************************************************** * * @type: @@ -1666,6 +1856,13 @@ FT_BEGIN_HEADER typedef struct FT_Size_InternalRec_* FT_Size_Internal; + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + /************************************************************************** * * @struct: @@ -1817,6 +2014,13 @@ FT_BEGIN_HEADER } FT_SizeRec; + /************************************************************************** + * + * @section: + * other_api_data + * + */ + /************************************************************************** * * @struct: @@ -1848,6 +2052,13 @@ FT_BEGIN_HEADER typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + /************************************************************************** * * @struct: @@ -2092,6 +2303,13 @@ FT_BEGIN_HEADER /*************************************************************************/ + /************************************************************************** + * + * @section: + * library_setup + * + */ + /************************************************************************** * * @function: @@ -2149,6 +2367,13 @@ FT_BEGIN_HEADER FT_Done_FreeType( FT_Library library ); + /************************************************************************** + * + * @section: + * face_creation + * + */ + /************************************************************************** * * @enum: @@ -2451,7 +2676,7 @@ FT_BEGIN_HEADER * Each new face object created with this function also owns a default * @FT_Size object, accessible as `face->size`. * - * One @FT_Library instance can have multiple face objects, this is, + * One @FT_Library instance can have multiple face objects, that is, * @FT_Open_Face and its siblings can be called multiple times using the * same `library` argument. * @@ -2650,6 +2875,13 @@ FT_BEGIN_HEADER FT_Done_Face( FT_Face face ); + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + /************************************************************************** * * @function: @@ -2679,7 +2911,7 @@ FT_BEGIN_HEADER * silently uses outlines if there is no bitmap for a given glyph index. * * For GX and OpenType variation fonts, a bitmap strike makes sense only - * if the default instance is active (this is, no glyph variation takes + * if the default instance is active (that is, no glyph variation takes * place); otherwise, FreeType simply ignores bitmap strikes. The same * is true for all named instances that are different from the default * instance. @@ -2942,6 +3174,13 @@ FT_BEGIN_HEADER FT_UInt pixel_height ); + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + /************************************************************************** * * @function: @@ -2976,7 +3215,7 @@ FT_BEGIN_HEADER * glyph may be transformed. See @FT_Set_Transform for the details. * * For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument` is returned - * for invalid CID values (this is, for CID values that don't have a + * for invalid CID values (that is, for CID values that don't have a * corresponding glyph in the font). See the discussion of the * @FT_FACE_FLAG_CID_KEYED flag for more details. * @@ -2990,6 +3229,13 @@ FT_BEGIN_HEADER FT_Int32 load_flags ); + /************************************************************************** + * + * @section: + * character_mapping + * + */ + /************************************************************************** * * @function: @@ -3033,6 +3279,13 @@ FT_BEGIN_HEADER FT_Int32 load_flags ); + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + /************************************************************************** * * @enum: @@ -3172,10 +3425,11 @@ FT_BEGIN_HEADER * * [Since 2.12] If the glyph index maps to an entry in the face's * 'SVG~' table, load the associated SVG document from this table and - * set the `format` field of @FT_GlyphSlotRec to @FT_GLYPH_FORMAT_SVG. - * Note that FreeType itself can't render SVG documents; however, the - * library provides hooks to seamlessly integrate an external renderer. - * See sections @ot_svg_driver and @svg_fonts for more. + * set the `format` field of @FT_GlyphSlotRec to @FT_GLYPH_FORMAT_SVG + * ([since 2.13.1] provided @FT_LOAD_NO_SVG is not set). Note that + * FreeType itself can't render SVG documents; however, the library + * provides hooks to seamlessly integrate an external renderer. See + * sections @ot_svg_driver and @svg_fonts for more. * * [Since 2.10, experimental] If the glyph index maps to an entry in * the face's 'COLR' table with a 'CPAL' palette table (as defined in @@ -3189,6 +3443,9 @@ FT_BEGIN_HEADER * @FT_Palette_Select instead of setting @FT_LOAD_COLOR for rendering * so that the client application can handle blending by itself. * + * FT_LOAD_NO_SVG :: + * [Since 2.13.1] Ignore SVG glyph data when loading. + * * FT_LOAD_COMPUTE_METRICS :: * [Since 2.6.1] Compute glyph metrics from the glyph data, without the * use of bundled metrics tables (for example, the 'hdmx' table in @@ -3254,6 +3511,7 @@ FT_BEGIN_HEADER #define FT_LOAD_COLOR ( 1L << 20 ) #define FT_LOAD_COMPUTE_METRICS ( 1L << 21 ) #define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) +#define FT_LOAD_NO_SVG ( 1L << 24 ) /* */ @@ -3372,6 +3630,13 @@ FT_BEGIN_HEADER FT_STATIC_CAST( FT_Render_Mode, ( (x) >> 16 ) & 15 ) + /************************************************************************** + * + * @section: + * sizing_and_scaling + * + */ + /************************************************************************** * * @function: @@ -3447,6 +3712,13 @@ FT_BEGIN_HEADER FT_Vector* delta ); + /************************************************************************** + * + * @section: + * glyph_retrieval + * + */ + /************************************************************************** * * @enum: @@ -3841,6 +4113,13 @@ FT_BEGIN_HEADER FT_Fixed* akerning ); + /************************************************************************** + * + * @section: + * character_mapping + * + */ + /************************************************************************** * * @function: @@ -4057,6 +4336,13 @@ FT_BEGIN_HEADER FT_UInt *agindex ); + /************************************************************************** + * + * @section: + * face_creation + * + */ + /************************************************************************** * * @function: @@ -4155,6 +4441,13 @@ FT_BEGIN_HEADER FT_Parameter* properties ); + /************************************************************************** + * + * @section: + * information_retrieval + * + */ + /************************************************************************** * * @function: @@ -4266,9 +4559,10 @@ FT_BEGIN_HEADER * * [Since 2.9] Special PostScript names for named instances are only * returned if the named instance is set with @FT_Set_Named_Instance (and - * the font has corresponding entries in its 'fvar' table). If - * @FT_IS_VARIATION returns true, the algorithmically derived PostScript - * name is provided, not looking up special entries for named instances. + * the font has corresponding entries in its 'fvar' table or is the + * default named instance). If @FT_IS_VARIATION returns true, the + * algorithmically derived PostScript name is provided, not looking up + * special entries for named instances. */ FT_EXPORT( const char* ) FT_Get_Postscript_Name( FT_Face face ); @@ -4900,32 +5194,10 @@ FT_BEGIN_HEADER /************************************************************************** * * @section: - * version - * - * @title: - * FreeType Version - * - * @abstract: - * Functions and macros related to FreeType versions. - * - * @description: - * Note that those functions and macros are of limited use because even a - * new release of FreeType with only documentation changes increases the - * version number. - * - * @order: - * FT_Library_Version - * - * FREETYPE_MAJOR - * FREETYPE_MINOR - * FREETYPE_PATCH - * - * FT_Face_CheckTrueTypePatents - * FT_Face_SetUnpatentedHinting + * library_setup * */ - /************************************************************************** * * @enum: @@ -4950,7 +5222,7 @@ FT_BEGIN_HEADER */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 13 -#define FREETYPE_PATCH 0 +#define FREETYPE_PATCH 2 /************************************************************************** @@ -4992,6 +5264,13 @@ FT_BEGIN_HEADER FT_Int *apatch ); + /************************************************************************** + * + * @section: + * other_api_data + * + */ + /************************************************************************** * * @function: diff --git a/src/3rdparty/freetype/include/freetype/ftcache.h b/src/3rdparty/freetype/include/freetype/ftcache.h index c7686954..a2072e26 100644 --- a/src/3rdparty/freetype/include/freetype/ftcache.h +++ b/src/3rdparty/freetype/include/freetype/ftcache.h @@ -43,61 +43,61 @@ FT_BEGIN_HEADER * objects, as well as caching information like character maps and glyph * images while limiting their maximum memory usage. * - * Note that all types and functions begin with the `FTC_` prefix. + * Note that all types and functions begin with the `FTC_` prefix rather + * than the usual `FT_` prefix in the rest of FreeType. * - * The cache is highly portable and thus doesn't know anything about the - * fonts installed on your system, or how to access them. This implies - * the following scheme: + * The cache is highly portable and, thus, doesn't know anything about + * the fonts installed on your system, or how to access them. Therefore, + * it requires the following. * - * First, available or installed font faces are uniquely identified by - * @FTC_FaceID values, provided to the cache by the client. Note that - * the cache only stores and compares these values, and doesn't try to - * interpret them in any way. + * * @FTC_FaceID, an arbitrary non-zero value that uniquely identifies + * available or installed font faces, has to be provided to the + * cache by the client. Note that the cache only stores and compares + * these values and doesn't try to interpret them in any way, but they + * have to be persistent on the client side. * - * Second, the cache calls, only when needed, a client-provided function - * to convert an @FTC_FaceID into a new @FT_Face object. The latter is - * then completely managed by the cache, including its termination - * through @FT_Done_Face. To monitor termination of face objects, the - * finalizer callback in the `generic` field of the @FT_Face object can - * be used, which might also be used to store the @FTC_FaceID of the - * face. + * * @FTC_Face_Requester, a method to convert an @FTC_FaceID into a new + * @FT_Face object when necessary, has to be provided to the cache by + * the client. The @FT_Face object is completely managed by the cache, + * including its termination through @FT_Done_Face. To monitor + * termination of face objects, the finalizer callback in the `generic` + * field of the @FT_Face object can be used, which might also be used + * to store the @FTC_FaceID of the face. * - * Clients are free to map face IDs to anything else. The most simple - * usage is to associate them to a (pathname,face_index) pair that is - * used to call @FT_New_Face. However, more complex schemes are also - * possible. + * Clients are free to map face IDs to anything useful. The most simple + * usage is, for example, to associate them to a `{pathname,face_index}` + * pair that is then used by @FTC_Face_Requester to call @FT_New_Face. + * However, more complex schemes are also possible. * * Note that for the cache to work correctly, the face ID values must be * **persistent**, which means that the contents they point to should not * change at runtime, or that their value should not become invalid. - * * If this is unavoidable (e.g., when a font is uninstalled at runtime), - * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * you should call @FTC_Manager_RemoveFaceID as soon as possible to let * the cache get rid of any references to the old @FTC_FaceID it may keep * internally. Failure to do so will lead to incorrect behaviour or even - * crashes. + * crashes in @FTC_Face_Requester. * * To use the cache, start with calling @FTC_Manager_New to create a new * @FTC_Manager object, which models a single cache instance. You can * then look up @FT_Face and @FT_Size objects with - * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively, and + * use them in any FreeType work stream. You can also cache other + * FreeType objects as follows. * - * If you want to use the charmap caching, call @FTC_CMapCache_New, then - * later use @FTC_CMapCache_Lookup to perform the equivalent of - * @FT_Get_Char_Index, only much faster. + * * If you want to use the charmap caching, call @FTC_CMapCache_New, + * then later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. * - * If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New, - * then later use @FTC_ImageCache_Lookup to retrieve the corresponding - * @FT_Glyph objects from the cache. - * - * If you need lots of small bitmaps, it is much more memory efficient to - * call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This - * returns @FTC_SBitRec structures, which are used to store small bitmaps - * directly. (A small bitmap is one whose metrics and dimensions all fit - * into 8-bit integers). - * - * We hope to also provide a kerning cache in the near future. + * * If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New, + * then later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. * + * * If you need lots of small bitmaps, it is much more memory-efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). * * @order: * FTC_Manager diff --git a/src/3rdparty/freetype/include/freetype/ftchapters.h b/src/3rdparty/freetype/include/freetype/ftchapters.h index 6a9733ad..7566fbd1 100644 --- a/src/3rdparty/freetype/include/freetype/ftchapters.h +++ b/src/3rdparty/freetype/include/freetype/ftchapters.h @@ -31,9 +31,28 @@ * Core API * * @sections: - * version * basic_types - * base_interface + * library_setup + * face_creation + * font_testing_macros + * sizing_and_scaling + * glyph_retrieval + * character_mapping + * information_retrieval + * other_api_data + * + */ + + + /************************************************************************** + * + * @chapter: + * extended_api + * + * @title: + * Extended API + * + * @sections: * glyph_variants * color_management * layer_management diff --git a/src/3rdparty/freetype/include/freetype/ftdriver.h b/src/3rdparty/freetype/include/freetype/ftdriver.h index f90946fd..7af7465b 100644 --- a/src/3rdparty/freetype/include/freetype/ftdriver.h +++ b/src/3rdparty/freetype/include/freetype/ftdriver.h @@ -134,7 +134,7 @@ FT_BEGIN_HEADER * each being rounded to the nearest pixel edge, taking care of overshoot * suppression at small sizes, stem darkening, and scaling. * - * Hstems (this is, hint values defined in the font to help align + * Hstems (that is, hint values defined in the font to help align * horizontal features) that fall within a blue zone are said to be * 'captured' and are aligned to that zone. Uncaptured stems are moved * in one of four ways, top edge up or down, bottom edge up or down. @@ -446,7 +446,7 @@ FT_BEGIN_HEADER * at smaller sizes. * * For the auto-hinter, stem-darkening is experimental currently and thus - * switched off by default (this is, `no-stem-darkening` is set to TRUE + * switched off by default (that is, `no-stem-darkening` is set to TRUE * by default). Total consistency with the CFF driver is not achieved * right now because the emboldening method differs and glyphs must be * scaled down on the Y-axis to keep outline points inside their @@ -651,11 +651,8 @@ FT_BEGIN_HEADER * Windows~98; only grayscale and B/W rasterizing is supported. * * TT_INTERPRETER_VERSION_38 :: - * Version~38 corresponds to MS rasterizer v.1.9; it is roughly - * equivalent to the hinting provided by DirectWrite ClearType (as can - * be found, for example, in the Internet Explorer~9 running on - * Windows~7). It is used in FreeType to select the 'Infinality' - * subpixel hinting code. The code may be removed in a future version. + * Version~38 is the same Version~40. The original 'Infinality' code is + * no longer available. * * TT_INTERPRETER_VERSION_40 :: * Version~40 corresponds to MS rasterizer v.2.1; it is roughly diff --git a/src/3rdparty/freetype/include/freetype/ftimage.h b/src/3rdparty/freetype/include/freetype/ftimage.h index 2e8e6734..6baa8125 100644 --- a/src/3rdparty/freetype/include/freetype/ftimage.h +++ b/src/3rdparty/freetype/include/freetype/ftimage.h @@ -19,7 +19,7 @@ /************************************************************************** * * Note: A 'raster' is simply a scan-line converter, used to render - * FT_Outlines into FT_Bitmaps. + * `FT_Outline`s into `FT_Bitmap`s. * */ @@ -256,6 +256,12 @@ FT_BEGIN_HEADER * palette :: * A typeless pointer to the bitmap palette; this field is intended for * paletted pixel modes. Not used currently. + * + * @note: + * `width` and `rows` refer to the *physical* size of the bitmap, not the + * *logical* one. For example, if @FT_Pixel_Mode is set to + * `FT_PIXEL_MODE_LCD`, the logical width is a just a third of the + * physical one. */ typedef struct FT_Bitmap_ { @@ -856,7 +862,7 @@ FT_BEGIN_HEADER * @FT_SpanFunc that takes the y~coordinate of the span as a parameter. * * The anti-aliased rasterizer produces coverage values from 0 to 255, - * this is, from completely transparent to completely opaque. + * that is, from completely transparent to completely opaque. */ typedef struct FT_Span_ { diff --git a/src/3rdparty/freetype/include/freetype/ftlogging.h b/src/3rdparty/freetype/include/freetype/ftlogging.h index 2246dc83..53b8b896 100644 --- a/src/3rdparty/freetype/include/freetype/ftlogging.h +++ b/src/3rdparty/freetype/include/freetype/ftlogging.h @@ -62,7 +62,7 @@ FT_BEGIN_HEADER * component. * * ``` - * FT_Trace_Set_Level( "any:7 memory:0 ); + * FT_Trace_Set_Level( "any:7 memory:0" ); * ``` * * @note: diff --git a/src/3rdparty/freetype/include/freetype/ftmm.h b/src/3rdparty/freetype/include/freetype/ftmm.h index e381ef3d..d145128a 100644 --- a/src/3rdparty/freetype/include/freetype/ftmm.h +++ b/src/3rdparty/freetype/include/freetype/ftmm.h @@ -153,7 +153,7 @@ FT_BEGIN_HEADER * @note: * The fields `minimum`, `def`, and `maximum` are 16.16 fractional values * for TrueType GX and OpenType variation fonts. For Adobe MM fonts, the - * values are integers. + * values are whole numbers (i.e., the fractional part is zero). */ typedef struct FT_Var_Axis_ { @@ -399,8 +399,8 @@ FT_BEGIN_HEADER * * @note: * The design coordinates are 16.16 fractional values for TrueType GX and - * OpenType variation fonts. For Adobe MM fonts, the values are - * integers. + * OpenType variation fonts. For Adobe MM fonts, the values are supposed + * to be whole numbers (i.e., the fractional part is zero). * * [Since 2.8.1] To reset all axes to the default values, call the * function with `num_coords` set to zero and `coords` set to `NULL`. @@ -446,8 +446,8 @@ FT_BEGIN_HEADER * * @note: * The design coordinates are 16.16 fractional values for TrueType GX and - * OpenType variation fonts. For Adobe MM fonts, the values are - * integers. + * OpenType variation fonts. For Adobe MM fonts, the values are whole + * numbers (i.e., the fractional part is zero). * * @since: * 2.7.1 @@ -602,10 +602,12 @@ FT_BEGIN_HEADER * * @note: * Adobe Multiple Master fonts limit the number of designs, and thus the - * length of the weight vector to~16. + * length of the weight vector to 16~elements. * - * If `len` is zero and `weightvector` is `NULL`, the weight vector array - * is reset to the default values. + * If `len` is larger than zero, this function sets the + * @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags` field (i.e., + * @FT_IS_VARIATION will return true). If `len` is zero, this bit flag + * is unset and the weight vector array is reset to the default values. * * The Adobe documentation also states that the values in the * WeightVector array must total 1.0 +/-~0.001. In practice this does @@ -753,6 +755,45 @@ FT_BEGIN_HEADER FT_Set_Named_Instance( FT_Face face, FT_UInt instance_index ); + + /************************************************************************** + * + * @function: + * FT_Get_Default_Named_Instance + * + * @description: + * Retrieve the index of the default named instance, to be used with + * @FT_Set_Named_Instance. + * + * The default instance of a variation font is that instance for which + * the nth axis coordinate is equal to `axis[n].def` (as specified in the + * @FT_MM_Var structure), with~n covering all axes. + * + * FreeType synthesizes a named instance for the default instance if the + * font does not contain such an entry. + * + * @input: + * face :: + * A handle to the source face. + * + * @output: + * instance_index :: + * The index of the default named instance. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * For Adobe MM fonts (which don't have named instances) this function + * always returns zero for `instance_index`. + * + * @since: + * 2.13.1 + */ + FT_EXPORT( FT_Error ) + FT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ); + /* */ diff --git a/src/3rdparty/freetype/include/freetype/ftoutln.h b/src/3rdparty/freetype/include/freetype/ftoutln.h index 54434b25..f9329ca4 100644 --- a/src/3rdparty/freetype/include/freetype/ftoutln.h +++ b/src/3rdparty/freetype/include/freetype/ftoutln.h @@ -118,7 +118,7 @@ FT_BEGIN_HEADER * attachement. * * Similarly, the function returns success for an empty outline also - * (doing nothing, this is, not calling any emitter); if necessary, you + * (doing nothing, that is, not calling any emitter); if necessary, you * should filter this out, too. */ FT_EXPORT( FT_Error ) diff --git a/src/3rdparty/freetype/include/freetype/ftrender.h b/src/3rdparty/freetype/include/freetype/ftrender.h index a8576dab..0b6fad32 100644 --- a/src/3rdparty/freetype/include/freetype/ftrender.h +++ b/src/3rdparty/freetype/include/freetype/ftrender.h @@ -158,7 +158,7 @@ FT_BEGIN_HEADER FT_Renderer_GetCBoxFunc get_glyph_cbox; FT_Renderer_SetModeFunc set_mode; - FT_Raster_Funcs* raster_class; + const FT_Raster_Funcs* raster_class; } FT_Renderer_Class; diff --git a/src/3rdparty/freetype/include/freetype/ftsynth.h b/src/3rdparty/freetype/include/freetype/ftsynth.h index 5d196976..af90967d 100644 --- a/src/3rdparty/freetype/include/freetype/ftsynth.h +++ b/src/3rdparty/freetype/include/freetype/ftsynth.h @@ -68,6 +68,18 @@ FT_BEGIN_HEADER FT_EXPORT( void ) FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + /* Precisely adjust the glyph weight either horizontally or vertically. */ + /* The `xdelta` and `ydelta` values are fractions of the face Em size */ + /* (in fixed-point format). Considering that a regular face would have */ + /* stem widths on the order of 0.1 Em, a delta of 0.05 (0x0CCC) should */ + /* be very noticeable. To increase or decrease the weight, use positive */ + /* or negative values, respectively. */ + FT_EXPORT( void ) + FT_GlyphSlot_AdjustWeight( FT_GlyphSlot slot, + FT_Fixed xdelta, + FT_Fixed ydelta ); + + /* Slant an outline glyph to the right by about 12 degrees. */ FT_EXPORT( void ) FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); diff --git a/src/3rdparty/freetype/include/freetype/ftsystem.h b/src/3rdparty/freetype/include/freetype/ftsystem.h index a995b078..3a08f491 100644 --- a/src/3rdparty/freetype/include/freetype/ftsystem.h +++ b/src/3rdparty/freetype/include/freetype/ftsystem.h @@ -229,8 +229,7 @@ FT_BEGIN_HEADER * A handle to the source stream. * * offset :: - * The offset from the start of the stream to seek to if this is a seek - * operation (see note). + * The offset from the start of the stream to seek to. * * buffer :: * The address of the read buffer. @@ -239,16 +238,9 @@ FT_BEGIN_HEADER * The number of bytes to read from the stream. * * @return: - * The number of bytes effectively read by the stream. - * - * @note: - * This function performs a seek *or* a read operation depending on the - * argument values. If `count` is zero, the operation is a seek to - * `offset` bytes. If `count` is >~0, the operation is a read of `count` - * bytes from the current position in the stream, and the `offset` value - * should be ignored. - * - * For seek operations, a non-zero return value indicates an error. + * If count >~0, return the number of bytes effectively read by the + * stream (after seeking to `offset`). If count ==~0, return the status + * of the seek operation (non-zero indicates an error). * */ typedef unsigned long diff --git a/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h b/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h index 7883317f..6f676509 100644 --- a/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h +++ b/src/3rdparty/freetype/include/freetype/internal/compiler-macros.h @@ -41,8 +41,11 @@ FT_BEGIN_HEADER # if ( defined( __STDC_VERSION__ ) && __STDC_VERSION__ > 201710L ) || \ ( defined( __cplusplus ) && __cplusplus > 201402L ) # define FALL_THROUGH [[__fallthrough__]] -# elif ( defined( __GNUC__ ) && __GNUC__ >= 7 ) || \ - ( defined( __clang__ ) && __clang_major__ >= 10 ) +# elif ( defined( __GNUC__ ) && __GNUC__ >= 7 ) || \ + ( defined( __clang__ ) && \ + ( defined( __apple_build_version__ ) \ + ? __apple_build_version__ >= 12000000 \ + : __clang_major__ >= 10 ) ) # define FALL_THROUGH __attribute__(( __fallthrough__ )) # else # define FALL_THROUGH ( (void)0 ) diff --git a/src/3rdparty/freetype/include/freetype/internal/ftcalc.h b/src/3rdparty/freetype/include/freetype/internal/ftcalc.h index d1baa392..d9aea236 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftcalc.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftcalc.h @@ -332,9 +332,9 @@ FT_BEGIN_HEADER * Based on geometric considerations we use the following inequality to * identify a degenerate matrix. * - * 50 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2 + * 32 * abs(xx*yy - xy*yx) < xx^2 + xy^2 + yx^2 + yy^2 * - * Value 50 is heuristic. + * Value 32 is heuristic. */ FT_BASE( FT_Bool ) FT_Matrix_Check( const FT_Matrix* matrix ); diff --git a/src/3rdparty/freetype/include/freetype/internal/ftdrv.h b/src/3rdparty/freetype/include/freetype/internal/ftdrv.h index f78912ca..9001c07a 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftdrv.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftdrv.h @@ -157,6 +157,7 @@ FT_BEGIN_HEADER * A handle to a function used to select a new fixed size. It is used * only if @FT_FACE_FLAG_FIXED_SIZES is set. Can be set to 0 if the * scaling done in the base layer suffices. + * * @note: * Most function pointers, with the exception of `load_glyph`, can be set * to 0 to indicate a default behaviour. diff --git a/src/3rdparty/freetype/include/freetype/internal/ftmmtypes.h b/src/3rdparty/freetype/include/freetype/internal/ftmmtypes.h index b7c66c35..c4b21d61 100644 --- a/src/3rdparty/freetype/include/freetype/internal/ftmmtypes.h +++ b/src/3rdparty/freetype/include/freetype/internal/ftmmtypes.h @@ -28,13 +28,19 @@ FT_BEGIN_HEADER typedef struct GX_ItemVarDataRec_ { - FT_UInt itemCount; /* number of delta sets per item */ - FT_UInt regionIdxCount; /* number of region indices */ - FT_UInt* regionIndices; /* array of `regionCount' indices; */ - /* these index `varRegionList' */ - FT_ItemVarDelta* deltaSet; /* array of `itemCount' deltas */ - /* use `innerIndex' for this array */ - + FT_UInt itemCount; /* Number of delta sets per item. */ + FT_UInt regionIdxCount; /* Number of region indices. */ + FT_UInt* regionIndices; /* Array of `regionCount` indices; */ + /* these index `varRegionList`. */ + FT_Byte* deltaSet; /* Array of `itemCount` deltas; */ + /* use `innerIndex` for this array. */ + FT_UShort wordDeltaCount; /* Number of the first 32-bit ints */ + /* or 16-bit ints of `deltaSet` */ + /* depending on `longWords`. */ + FT_Bool longWords; /* If true, `deltaSet` is a 32-bit */ + /* array followed by a 16-bit */ + /* array, otherwise a 16-bit array */ + /* followed by an 8-bit array. */ } GX_ItemVarDataRec, *GX_ItemVarData; diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h b/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h index e588ea48..167617eb 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svmetric.h @@ -77,6 +77,9 @@ FT_BEGIN_HEADER typedef void (*FT_Metrics_Adjust_Func)( FT_Face face ); + typedef FT_Error + (*FT_Size_Reset_Func)( FT_Size size ); + FT_DEFINE_SERVICE( MetricsVariations ) { @@ -90,6 +93,7 @@ FT_BEGIN_HEADER FT_VOrg_Adjust_Func vorg_adjust; FT_Metrics_Adjust_Func metrics_adjust; + FT_Size_Reset_Func size_reset; }; @@ -101,7 +105,8 @@ FT_BEGIN_HEADER tsb_adjust_, \ bsb_adjust_, \ vorg_adjust_, \ - metrics_adjust_ ) \ + metrics_adjust_, \ + size_reset_ ) \ static const FT_Service_MetricsVariationsRec class_ = \ { \ hadvance_adjust_, \ @@ -111,7 +116,8 @@ FT_BEGIN_HEADER tsb_adjust_, \ bsb_adjust_, \ vorg_adjust_, \ - metrics_adjust_ \ + metrics_adjust_, \ + size_reset_ \ }; /* */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svmm.h b/src/3rdparty/freetype/include/freetype/internal/services/svmm.h index d9420423..7e76ab83 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svmm.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svmm.h @@ -60,9 +60,9 @@ FT_BEGIN_HEADER /* use return value -1 to indicate that the new coordinates */ /* are equal to the current ones; no changes are thus needed */ typedef FT_Error - (*FT_Set_MM_Blend_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); typedef FT_Error (*FT_Get_Var_Design_Func)( FT_Face face, @@ -70,13 +70,17 @@ FT_BEGIN_HEADER FT_Fixed* coords ); typedef FT_Error - (*FT_Set_Instance_Func)( FT_Face face, - FT_UInt instance_index ); + (*FT_Set_Named_Instance_Func)( FT_Face face, + FT_UInt instance_index ); typedef FT_Error - (*FT_Get_MM_Blend_Func)( FT_Face face, - FT_UInt num_coords, - FT_Long* coords ); + (*FT_Get_Default_Named_Instance_Func)( FT_Face face, + FT_UInt *instance_index ); + + typedef FT_Error + (*FT_Get_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); typedef FT_Error (*FT_Get_Var_Blend_Func)( FT_Face face, @@ -86,7 +90,7 @@ FT_BEGIN_HEADER FT_MM_Var* *mm_var ); typedef void - (*FT_Done_Blend_Func)( FT_Face ); + (*FT_Done_Blend_Func)( FT_Face face ); typedef FT_Error (*FT_Set_MM_WeightVector_Func)( FT_Face face, @@ -98,6 +102,9 @@ FT_BEGIN_HEADER FT_UInt* len, FT_Fixed* weight_vector ); + typedef void + (*FT_Construct_PS_Name_Func)( FT_Face face ); + typedef FT_Error (*FT_Var_Load_Delta_Set_Idx_Map_Func)( FT_Face face, FT_ULong offset, @@ -134,11 +141,13 @@ FT_BEGIN_HEADER FT_Get_MM_Var_Func get_mm_var; FT_Set_Var_Design_Func set_var_design; FT_Get_Var_Design_Func get_var_design; - FT_Set_Instance_Func set_instance; + FT_Set_Named_Instance_Func set_named_instance; + FT_Get_Default_Named_Instance_Func get_default_named_instance; FT_Set_MM_WeightVector_Func set_mm_weightvector; FT_Get_MM_WeightVector_Func get_mm_weightvector; /* for internal use; only needed for code sharing between modules */ + FT_Construct_PS_Name_Func construct_ps_name; FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map; FT_Var_Load_Item_Var_Store_Func load_item_var_store; FT_Var_Get_Item_Delta_Func get_item_delta; @@ -149,43 +158,49 @@ FT_BEGIN_HEADER }; -#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ - get_mm_, \ - set_mm_design_, \ - set_mm_blend_, \ - get_mm_blend_, \ - get_mm_var_, \ - set_var_design_, \ - get_var_design_, \ - set_instance_, \ - set_weightvector_, \ - get_weightvector_, \ - load_delta_set_idx_map_, \ - load_item_var_store_, \ - get_item_delta_, \ - done_item_var_store_, \ - done_delta_set_idx_map_, \ - get_var_blend_, \ - done_blend_ ) \ - static const FT_Service_MultiMastersRec class_ = \ - { \ - get_mm_, \ - set_mm_design_, \ - set_mm_blend_, \ - get_mm_blend_, \ - get_mm_var_, \ - set_var_design_, \ - get_var_design_, \ - set_instance_, \ - set_weightvector_, \ - get_weightvector_, \ - load_delta_set_idx_map_, \ - load_item_var_store_, \ - get_item_delta_, \ - done_item_var_store_, \ - done_delta_set_idx_map_, \ - get_var_blend_, \ - done_blend_ \ +#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_named_instance_, \ + get_default_named_instance_, \ + set_mm_weightvector_, \ + get_mm_weightvector_, \ + \ + construct_ps_name_, \ + load_delta_set_idx_map_, \ + load_item_var_store_, \ + get_item_delta_, \ + done_item_var_store_, \ + done_delta_set_idx_map_, \ + get_var_blend_, \ + done_blend_ ) \ + static const FT_Service_MultiMastersRec class_ = \ + { \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_named_instance_, \ + get_default_named_instance_, \ + set_mm_weightvector_, \ + get_mm_weightvector_, \ + \ + construct_ps_name_, \ + load_delta_set_idx_map_, \ + load_item_var_store_, \ + get_item_delta_, \ + done_item_var_store_, \ + done_delta_set_idx_map_, \ + get_var_blend_, \ + done_blend_ \ }; /* */ diff --git a/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h b/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h index fd99d857..6e599f3a 100644 --- a/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h +++ b/src/3rdparty/freetype/include/freetype/internal/services/svpscmap.h @@ -97,7 +97,7 @@ FT_BEGIN_HEADER (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, FT_UInt32 unicode ); - typedef FT_UInt32 + typedef FT_UInt (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, FT_UInt32 *unicode ); diff --git a/src/3rdparty/freetype/include/freetype/internal/t1types.h b/src/3rdparty/freetype/include/freetype/internal/t1types.h index 5a105c58..b9c94398 100644 --- a/src/3rdparty/freetype/include/freetype/internal/t1types.h +++ b/src/3rdparty/freetype/include/freetype/internal/t1types.h @@ -201,30 +201,30 @@ FT_BEGIN_HEADER typedef struct T1_FaceRec_ { - FT_FaceRec root; - T1_FontRec type1; - const void* psnames; - const void* psaux; - const void* afm_data; - FT_CharMapRec charmaprecs[2]; - FT_CharMap charmaps[2]; + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; /* support for Multiple Masters fonts */ - PS_Blend blend; + PS_Blend blend; /* undocumented, optional: indices of subroutines that express */ /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ /* respectively, as Type 2 charstrings; -1 if keywords not present */ - FT_Int ndv_idx; - FT_Int cdv_idx; + FT_Int ndv_idx; + FT_Int cdv_idx; /* undocumented, optional: has the same meaning as len_buildchar */ /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ - FT_UInt len_buildchar; - FT_Long* buildchar; + FT_UInt len_buildchar; + FT_Long* buildchar; /* since version 2.1 - interface to PostScript hinter */ - const void* pshinter; + const void* pshinter; } T1_FaceRec; diff --git a/src/3rdparty/freetype/include/freetype/internal/tttypes.h b/src/3rdparty/freetype/include/freetype/internal/tttypes.h index 3b521924..b9788c78 100644 --- a/src/3rdparty/freetype/include/freetype/internal/tttypes.h +++ b/src/3rdparty/freetype/include/freetype/internal/tttypes.h @@ -779,13 +779,15 @@ FT_BEGIN_HEADER /************************************************************************** * * @struct: - * TT_Post_20Rec + * TT_Post_NamesRec * * @description: - * Postscript names sub-table, format 2.0. Stores the PS name of each - * glyph in the font face. + * Postscript names table, either format 2.0 or 2.5. * * @fields: + * loaded :: + * A flag to indicate whether the PS names are loaded. + * * num_glyphs :: * The number of named glyphs in the table. * @@ -798,68 +800,13 @@ FT_BEGIN_HEADER * glyph_names :: * The PS names not in Mac Encoding. */ - typedef struct TT_Post_20Rec_ + typedef struct TT_Post_NamesRec_ { + FT_Bool loaded; FT_UShort num_glyphs; FT_UShort num_names; FT_UShort* glyph_indices; - FT_Char** glyph_names; - - } TT_Post_20Rec, *TT_Post_20; - - - /************************************************************************** - * - * @struct: - * TT_Post_25Rec - * - * @description: - * Postscript names sub-table, format 2.5. Stores the PS name of each - * glyph in the font face. - * - * @fields: - * num_glyphs :: - * The number of glyphs in the table. - * - * offsets :: - * An array of signed offsets in a normal Mac Postscript name encoding. - */ - typedef struct TT_Post_25_ - { - FT_UShort num_glyphs; - FT_Char* offsets; - - } TT_Post_25Rec, *TT_Post_25; - - - /************************************************************************** - * - * @struct: - * TT_Post_NamesRec - * - * @description: - * Postscript names table, either format 2.0 or 2.5. - * - * @fields: - * loaded :: - * A flag to indicate whether the PS names are loaded. - * - * format_20 :: - * The sub-table used for format 2.0. - * - * format_25 :: - * The sub-table used for format 2.5. - */ - typedef struct TT_Post_NamesRec_ - { - FT_Bool loaded; - - union - { - TT_Post_20Rec format_20; - TT_Post_25Rec format_25; - - } names; + FT_Byte** glyph_names; } TT_Post_NamesRec, *TT_Post_Names; @@ -1253,12 +1200,16 @@ FT_BEGIN_HEADER * mm :: * A pointer to the Multiple Masters service. * - * var :: - * A pointer to the Metrics Variations service. + * tt_var :: + * A pointer to the Metrics Variations service for the "truetype" + * driver. * - * hdmx :: - * The face's horizontal device metrics ('hdmx' table). This table is - * optional in TrueType/OpenType fonts. + * face_var :: + * A pointer to the Metrics Variations service for this `TT_Face`'s + * driver. + * + * psaux :: + * A pointer to the PostScript Auxiliary service. * * gasp :: * The grid-fitting and scaling properties table ('gasp'). This table @@ -1364,6 +1315,12 @@ FT_BEGIN_HEADER * var_postscript_prefix_len :: * The length of the `var_postscript_prefix` string. * + * var_default_named_instance :: + * The index of the default named instance. + * + * non_var_style_name :: + * The non-variation style name, used as a backup. + * * horz_metrics_size :: * The size of the 'hmtx' table. * @@ -1410,14 +1367,6 @@ FT_BEGIN_HEADER * A mapping between the strike indices exposed by the API and the * indices used in the font's sbit table. * - * cpal :: - * A pointer to data related to the 'CPAL' table. `NULL` if the table - * is not available. - * - * colr :: - * A pointer to data related to the 'COLR' table. `NULL` if the table - * is not available. - * * kern_table :: * A pointer to the 'kern' table. * @@ -1445,19 +1394,23 @@ FT_BEGIN_HEADER * vert_metrics_offset :: * The file offset of the 'vmtx' table. * - * sph_found_func_flags :: - * Flags identifying special bytecode functions (used by the v38 - * implementation of the bytecode interpreter). - * - * sph_compatibility_mode :: - * This flag is set if we are in ClearType backward compatibility mode - * (used by the v38 implementation of the bytecode interpreter). - * * ebdt_start :: * The file offset of the sbit data table (CBDT, bdat, etc.). * * ebdt_size :: * The size of the sbit data table. + * + * cpal :: + * A pointer to data related to the 'CPAL' table. `NULL` if the table + * is not available. + * + * colr :: + * A pointer to data related to the 'COLR' table. `NULL` if the table + * is not available. + * + * svg :: + * A pointer to data related to the 'SVG' table. `NULL` if the table + * is not available. */ typedef struct TT_FaceRec_ { @@ -1508,8 +1461,14 @@ FT_BEGIN_HEADER void* mm; /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ - /* used to handle the HVAR, VVAR, and MVAR OpenType tables */ - void* var; + /* used to handle the HVAR, VVAR, and MVAR OpenType tables by the */ + /* "truetype" driver */ + void* tt_var; + + /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ + /* used to handle the HVAR, VVAR, and MVAR OpenType tables by this */ + /* TT_Face's driver */ + void* face_var; /* since 2.13.1 */ #endif /* a typeless pointer to the PostScript Aux service */ @@ -1591,6 +1550,9 @@ FT_BEGIN_HEADER const char* var_postscript_prefix; /* since 2.7.2 */ FT_UInt var_postscript_prefix_len; /* since 2.7.2 */ + FT_UInt var_default_named_instance; /* since 2.13.1 */ + + const char* non_var_style_name; /* since 2.13.1 */ #endif /* since version 2.2 */ @@ -1627,13 +1589,6 @@ FT_BEGIN_HEADER FT_ULong horz_metrics_offset; FT_ULong vert_metrics_offset; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* since 2.4.12 */ - FT_ULong sph_found_func_flags; /* special functions found */ - /* for this face */ - FT_Bool sph_compatibility_mode; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS /* since 2.7 */ FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */ diff --git a/src/3rdparty/freetype/qt_attribution.json b/src/3rdparty/freetype/qt_attribution.json index 407cdd3b..4b1c6a76 100644 --- a/src/3rdparty/freetype/qt_attribution.json +++ b/src/3rdparty/freetype/qt_attribution.json @@ -8,11 +8,11 @@ "Description": "FreeType is a freely available software library to render fonts.", "Homepage": "http://www.freetype.org", - "Version": "2.13.0", - "DownloadLocation": "https://download.savannah.gnu.org/releases/freetype/freetype-2.13.0.tar.gz", + "Version": "2.13.2", + "DownloadLocation": "https://download.savannah.gnu.org/releases/freetype/freetype-2.13.2.tar.gz", "License": "Freetype Project License or GNU General Public License v2.0 only", - "LicenseId": "FTL OR GPL-2.0", + "LicenseId": "FTL OR GPL-2.0-only", "LicenseFile": "LICENSE.txt", "Copyright": "Copyright (c) 2007-2014 Adobe Systems Incorporated Copyright (c) 2004-2023 Albert Chin-A-Young diff --git a/src/3rdparty/freetype/src/autofit/afblue.dat b/src/3rdparty/freetype/src/autofit/afblue.dat index b7efe8be..8299baa2 100644 --- a/src/3rdparty/freetype/src/autofit/afblue.dat +++ b/src/3rdparty/freetype/src/autofit/afblue.dat @@ -89,7 +89,7 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: "ت ث ط ظ ك" // We don't necessarily have access to medial forms via Unicode in case // Arabic presentational forms are missing. The only character that is - // guaranteed to have the same vertical position with joining (this is, + // guaranteed to have the same vertical position with joining (that is, // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both // round and flat curves. AF_BLUE_STRING_ARABIC_JOIN diff --git a/src/3rdparty/freetype/src/autofit/afcjk.c b/src/3rdparty/freetype/src/autofit/afcjk.c index 5daefff3..f414289a 100644 --- a/src/3rdparty/freetype/src/autofit/afcjk.c +++ b/src/3rdparty/freetype/src/autofit/afcjk.c @@ -417,16 +417,14 @@ { FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; + FT_Int pp, first, last; - for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) + last = -1; + for ( nn = 0; nn < outline.n_contours; nn++ ) { - FT_Int pp; - - - last = outline.contours[nn]; + first = last + 1; + last = outline.contours[nn]; /* Avoid single-point contours since they are never rasterized. */ /* In some fonts, they correspond to mark attachment points */ @@ -569,8 +567,8 @@ af_cjk_metrics_check_digits( AF_CJKMetrics metrics, FT_Face face ) { - FT_Bool started = 0, same_width = 1; - FT_Fixed advance = 0, old_advance = 0; + FT_Bool started = 0, same_width = 1; + FT_Long advance = 0, old_advance = 0; /* If HarfBuzz is not available, we need a pointer to a single */ /* unsigned long value. */ @@ -635,10 +633,11 @@ /* Initialize global metrics. */ FT_LOCAL_DEF( FT_Error ) - af_cjk_metrics_init( AF_CJKMetrics metrics, - FT_Face face ) + af_cjk_metrics_init( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Face face ) { - FT_CharMap oldmap = face->charmap; + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + FT_CharMap oldmap = face->charmap; metrics->units_per_em = face->units_per_EM; @@ -756,9 +755,12 @@ /* Scale global values in both directions. */ FT_LOCAL_DEF( void ) - af_cjk_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ) + af_cjk_metrics_scale( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + AF_Scaler scaler ) { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + /* we copy the whole structure since the x and y scaling values */ /* are not modified, contrary to e.g. the `latin' auto-hinter */ metrics->root.scaler = *scaler; @@ -771,11 +773,14 @@ /* Extract standard_width from writing system/script specific */ /* metrics class. */ - FT_LOCAL_DEF( void ) - af_cjk_get_standard_widths( AF_CJKMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ) + FT_CALLBACK_DEF( void ) + af_cjk_get_standard_widths( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Pos* stdHW, + FT_Pos* stdVW ) { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + if ( stdHW ) *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; @@ -1376,9 +1381,10 @@ /* Initalize hinting engine. */ FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics_ ) /* AF_CJKMetrics */ { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; FT_Render_Mode mode; FT_UInt32 scaler_flags, other_flags; @@ -1628,7 +1634,7 @@ stem_edge->pos = base_edge->pos + fitted_width; - FT_TRACE5(( " CJKLINK: edge %ld @%d (opos=%.2f) linked to %.2f," + FT_TRACE5(( " CJKLINK: edge %td @%d (opos=%.2f) linked to %.2f," " dist was %.2f, now %.2f\n", stem_edge - hints->axis[dim].edges, stem_edge->fpos, (double)stem_edge->opos / 64, @@ -1852,7 +1858,7 @@ continue; #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " CJKBLUE: edge %ld @%d (opos=%.2f) snapped to %.2f," + FT_TRACE5(( " CJKBLUE: edge %td @%d (opos=%.2f) snapped to %.2f," " was %.2f\n", edge1 - edges, edge1->fpos, (double)edge1->opos / 64, (double)blue->fit / 64, (double)edge1->pos / 64 )); @@ -1916,7 +1922,7 @@ /* this should not happen, but it's better to be safe */ if ( edge2->blue_edge ) { - FT_TRACE5(( "ASSERTION FAILED for edge %ld\n", edge2-edges )); + FT_TRACE5(( "ASSERTION FAILED for edge %td\n", edge2 - edges )); af_cjk_align_linked_edge( hints, dim, edge2, edge ); edge->flags |= AF_EDGE_DONE; @@ -2268,11 +2274,13 @@ /* Apply the complete hinting algorithm to a CJK glyph. */ FT_LOCAL_DEF( FT_Error ) - af_cjk_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ) + af_cjk_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics_ ) /* AF_CJKMetrics */ { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + FT_Error error; int dim; diff --git a/src/3rdparty/freetype/src/autofit/afcjk.h b/src/3rdparty/freetype/src/autofit/afcjk.h index bd7b81b3..f380ef6e 100644 --- a/src/3rdparty/freetype/src/autofit/afcjk.h +++ b/src/3rdparty/freetype/src/autofit/afcjk.h @@ -103,22 +103,22 @@ FT_BEGIN_HEADER #ifdef AF_CONFIG_OPTION_CJK FT_LOCAL( FT_Error ) - af_cjk_metrics_init( AF_CJKMetrics metrics, - FT_Face face ); + af_cjk_metrics_init( AF_StyleMetrics metrics, + FT_Face face ); FT_LOCAL( void ) - af_cjk_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ); + af_cjk_metrics_scale( AF_StyleMetrics metrics, + AF_Scaler scaler ); FT_LOCAL( FT_Error ) - af_cjk_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ); + af_cjk_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics ); FT_LOCAL( FT_Error ) - af_cjk_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ); + af_cjk_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ); /* shared; called from afindic.c */ FT_LOCAL( void ) diff --git a/src/3rdparty/freetype/src/autofit/afglobal.c b/src/3rdparty/freetype/src/autofit/afglobal.c index ede27eb1..b1957570 100644 --- a/src/3rdparty/freetype/src/autofit/afglobal.c +++ b/src/3rdparty/freetype/src/autofit/afglobal.c @@ -376,8 +376,11 @@ FT_LOCAL_DEF( void ) - af_face_globals_free( AF_FaceGlobals globals ) + af_face_globals_free( void* globals_ ) { + AF_FaceGlobals globals = (AF_FaceGlobals)globals_; + + if ( globals ) { FT_Memory memory = globals->face->memory; diff --git a/src/3rdparty/freetype/src/autofit/afglobal.h b/src/3rdparty/freetype/src/autofit/afglobal.h index 83a7c2ff..66170e41 100644 --- a/src/3rdparty/freetype/src/autofit/afglobal.h +++ b/src/3rdparty/freetype/src/autofit/afglobal.h @@ -156,7 +156,7 @@ FT_BEGIN_HEADER AF_StyleMetrics *ametrics ); FT_LOCAL( void ) - af_face_globals_free( AF_FaceGlobals globals ); + af_face_globals_free( void* globals ); FT_LOCAL( FT_Bool ) af_face_globals_is_digit( AF_FaceGlobals globals, diff --git a/src/3rdparty/freetype/src/autofit/afhints.c b/src/3rdparty/freetype/src/autofit/afhints.c index 6515af9f..e4a378fb 100644 --- a/src/3rdparty/freetype/src/autofit/afhints.c +++ b/src/3rdparty/freetype/src/autofit/afhints.c @@ -320,8 +320,9 @@ static char* - af_print_idx( char* p, - int idx ) + af_print_idx( char* p, + size_t n, + int idx ) { if ( idx == -1 ) { @@ -330,7 +331,7 @@ p[2] = '\0'; } else - ft_sprintf( p, "%d", idx ); + ft_snprintf( p, n, "%d", idx ); return p; } @@ -457,12 +458,12 @@ " %5d %5d %7.2f %7.2f %7.2f %7.2f" " %5s %5s %5s %5s\n", point_idx, - af_print_idx( buf1, + af_print_idx( buf1, 16, af_get_edge_index( hints, segment_idx_1, 1 ) ), - af_print_idx( buf2, segment_idx_1 ), - af_print_idx( buf3, + af_print_idx( buf2, 16, segment_idx_1 ), + af_print_idx( buf3, 16, af_get_edge_index( hints, segment_idx_0, 0 ) ), - af_print_idx( buf4, segment_idx_0 ), + af_print_idx( buf4, 16, segment_idx_0 ), ( point->flags & AF_FLAG_NEAR ) ? " near " : ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) @@ -476,18 +477,22 @@ (double)point->x / 64, (double)point->y / 64, - af_print_idx( buf5, af_get_strong_edge_index( hints, - point->before, - 1 ) ), - af_print_idx( buf6, af_get_strong_edge_index( hints, - point->after, - 1 ) ), - af_print_idx( buf7, af_get_strong_edge_index( hints, - point->before, - 0 ) ), - af_print_idx( buf8, af_get_strong_edge_index( hints, - point->after, - 0 ) ) )); + af_print_idx( buf5, 16, + af_get_strong_edge_index( hints, + point->before, + 1 ) ), + af_print_idx( buf6, 16, + af_get_strong_edge_index( hints, + point->after, + 1 ) ), + af_print_idx( buf7, 16, + af_get_strong_edge_index( hints, + point->before, + 0 ) ), + af_print_idx( buf8, 16, + af_get_strong_edge_index( hints, + point->after, + 0 ) ) )); } AF_DUMP(( "\n" )); } @@ -574,9 +579,12 @@ AF_INDEX_NUM( seg->first, points ), AF_INDEX_NUM( seg->last, points ), - af_print_idx( buf1, AF_INDEX_NUM( seg->link, segments ) ), - af_print_idx( buf2, AF_INDEX_NUM( seg->serif, segments ) ), - af_print_idx( buf3, AF_INDEX_NUM( seg->edge, edges ) ), + af_print_idx( buf1, 16, + AF_INDEX_NUM( seg->link, segments ) ), + af_print_idx( buf2, 16, + AF_INDEX_NUM( seg->serif, segments ) ), + af_print_idx( buf3, 16, + AF_INDEX_NUM( seg->edge, edges ) ), seg->height, seg->height - ( seg->max_coord - seg->min_coord ), @@ -716,8 +724,10 @@ AF_INDEX_NUM( edge, edges ), (double)(int)edge->opos / 64, af_dir_str( (AF_Direction)edge->dir ), - af_print_idx( buf1, AF_INDEX_NUM( edge->link, edges ) ), - af_print_idx( buf2, AF_INDEX_NUM( edge->serif, edges ) ), + af_print_idx( buf1, 16, + AF_INDEX_NUM( edge->link, edges ) ), + af_print_idx( buf2, 16, + AF_INDEX_NUM( edge->serif, edges ) ), edge->blue_edge ? 'y' : 'n', (double)edge->opos / 64, diff --git a/src/3rdparty/freetype/src/autofit/afindic.c b/src/3rdparty/freetype/src/autofit/afindic.c index 289a09d7..7fb12c63 100644 --- a/src/3rdparty/freetype/src/autofit/afindic.c +++ b/src/3rdparty/freetype/src/autofit/afindic.c @@ -28,9 +28,12 @@ static FT_Error - af_indic_metrics_init( AF_CJKMetrics metrics, - FT_Face face ) + af_indic_metrics_init( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Face face ) { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + /* skip blue zone init in CJK routines */ FT_CharMap oldmap = face->charmap; @@ -55,8 +58,8 @@ static void - af_indic_metrics_scale( AF_CJKMetrics metrics, - AF_Scaler scaler ) + af_indic_metrics_scale( AF_StyleMetrics metrics, + AF_Scaler scaler ) { /* use CJK routines */ af_cjk_metrics_scale( metrics, scaler ); @@ -64,8 +67,8 @@ static FT_Error - af_indic_hints_init( AF_GlyphHints hints, - AF_CJKMetrics metrics ) + af_indic_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics ) { /* use CJK routines */ return af_cjk_hints_init( hints, metrics ); @@ -73,10 +76,10 @@ static FT_Error - af_indic_hints_apply( FT_UInt glyph_index, - AF_GlyphHints hints, - FT_Outline* outline, - AF_CJKMetrics metrics ) + af_indic_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ) { /* use CJK routines */ return af_cjk_hints_apply( glyph_index, hints, outline, metrics ); @@ -87,10 +90,13 @@ /* metrics class. */ static void - af_indic_get_standard_widths( AF_CJKMetrics metrics, - FT_Pos* stdHW, - FT_Pos* stdVW ) + af_indic_get_standard_widths( AF_StyleMetrics metrics_, /* AF_CJKMetrics */ + FT_Pos* stdHW, + FT_Pos* stdVW ) { + AF_CJKMetrics metrics = (AF_CJKMetrics)metrics_; + + if ( stdHW ) *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; diff --git a/src/3rdparty/freetype/src/autofit/aflatin.c b/src/3rdparty/freetype/src/autofit/aflatin.c index 4b3c59b3..b86367aa 100644 --- a/src/3rdparty/freetype/src/autofit/aflatin.c +++ b/src/3rdparty/freetype/src/autofit/aflatin.c @@ -496,23 +496,20 @@ /* now compute min or max point indices and coordinates */ points = outline.points; best_point = -1; + best_contour_first = -1; + best_contour_last = -1; best_y = 0; /* make compiler happy */ - best_contour_first = 0; /* ditto */ - best_contour_last = 0; /* ditto */ { FT_Int nn; - FT_Int first = 0; - FT_Int last = -1; + FT_Int pp, first, last; - for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) + last = -1; + for ( nn = 0; nn < outline.n_contours; nn++ ) { - FT_Int old_best_point = best_point; - FT_Int pp; - - - last = outline.contours[nn]; + first = last + 1; + last = outline.contours[nn]; /* Avoid single-point contours since they are never */ /* rasterized. In some fonts, they correspond to mark */ @@ -551,7 +548,7 @@ } } - if ( best_point != old_best_point ) + if ( best_point > best_contour_last ) { best_contour_first = first; best_contour_last = last; @@ -1025,7 +1022,7 @@ { *a = *b; FT_TRACE5(( "blue zone overlap:" - " adjusting %s %ld to %ld\n", + " adjusting %s %td to %ld\n", a_is_top ? "overshoot" : "reference", blue_sorted[i] - axis->blues, *a )); @@ -1068,8 +1065,8 @@ af_latin_metrics_check_digits( AF_LatinMetrics metrics, FT_Face face ) { - FT_Bool started = 0, same_width = 1; - FT_Fixed advance = 0, old_advance = 0; + FT_Bool started = 0, same_width = 1; + FT_Long advance = 0, old_advance = 0; /* If HarfBuzz is not available, we need a pointer to a single */ /* unsigned long value. */ @@ -1134,9 +1131,11 @@ /* Initialize global metrics. */ FT_LOCAL_DEF( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, + af_latin_metrics_init( AF_StyleMetrics metrics_, /* AF_LatinMetrics */ FT_Face face ) { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + FT_Error error = FT_Err_Ok; FT_CharMap oldmap = face->charmap; @@ -1489,9 +1488,12 @@ /* Scale global values in both directions. */ FT_LOCAL_DEF( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, + af_latin_metrics_scale( AF_StyleMetrics metrics_, /* AF_LatinMetrics */ AF_Scaler scaler ) { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + metrics->root.scaler.render_mode = scaler->render_mode; metrics->root.scaler.face = scaler->face; metrics->root.scaler.flags = scaler->flags; @@ -1504,11 +1506,14 @@ /* Extract standard_width from writing system/script specific */ /* metrics class. */ - FT_LOCAL_DEF( void ) - af_latin_get_standard_widths( AF_LatinMetrics metrics, + FT_CALLBACK_DEF( void ) + af_latin_get_standard_widths( AF_StyleMetrics metrics_, /* AF_LatinMetrics */ FT_Pos* stdHW, FT_Pos* stdVW ) { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + + if ( stdHW ) *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; @@ -2041,7 +2046,7 @@ max = seg2->max_coord; /* compute maximum coordinate difference of the two segments */ - /* (this is, how much they overlap) */ + /* (that is, how much they overlap) */ len = max - min; if ( len >= len_threshold ) { @@ -2610,8 +2615,10 @@ static FT_Error af_latin_hints_init( AF_GlyphHints hints, - AF_LatinMetrics metrics ) + AF_StyleMetrics metrics_ ) /* AF_LatinMetrics */ { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + FT_Render_Mode mode; FT_UInt32 scaler_flags, other_flags; FT_Face face = metrics->root.scaler.face; @@ -2953,7 +2960,7 @@ stem_edge->pos = base_edge->pos + fitted_width; - FT_TRACE5(( " LINK: edge %ld (opos=%.2f) linked to %.2f," + FT_TRACE5(( " LINK: edge %td (opos=%.2f) linked to %.2f," " dist was %.2f, now %.2f\n", stem_edge - hints->axis[dim].edges, (double)stem_edge->opos / 64, (double)stem_edge->pos / 64, @@ -3078,13 +3085,13 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( !anchor ) - FT_TRACE5(( " BLUE_ANCHOR: edge %ld (opos=%.2f) snapped to %.2f," - " was %.2f (anchor=edge %ld)\n", + FT_TRACE5(( " BLUE_ANCHOR: edge %td (opos=%.2f) snapped to %.2f," + " was %.2f (anchor=edge %td)\n", edge1 - edges, (double)edge1->opos / 64, (double)blue->fit / 64, (double)edge1->pos / 64, edge - edges )); else - FT_TRACE5(( " BLUE: edge %ld (opos=%.2f) snapped to %.2f," + FT_TRACE5(( " BLUE: edge %td (opos=%.2f) snapped to %.2f," " was %.2f\n", edge1 - edges, (double)edge1->opos / 64, (double)blue->fit / 64, @@ -3134,7 +3141,7 @@ /* this should not happen, but it's better to be safe */ if ( edge2->blue_edge ) { - FT_TRACE5(( " ASSERTION FAILED for edge %ld\n", edge2 - edges )); + FT_TRACE5(( " ASSERTION FAILED for edge %td\n", edge2 - edges )); af_latin_align_linked_edge( hints, dim, edge2, edge ); edge->flags |= AF_EDGE_DONE; @@ -3202,7 +3209,7 @@ anchor = edge; edge->flags |= AF_EDGE_DONE; - FT_TRACE5(( " ANCHOR: edge %ld (opos=%.2f) and %ld (opos=%.2f)" + FT_TRACE5(( " ANCHOR: edge %td (opos=%.2f) and %td (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, (double)edge->opos / 64, edge2 - edges, (double)edge2->opos / 64, @@ -3231,7 +3238,7 @@ if ( edge2->flags & AF_EDGE_DONE ) { - FT_TRACE5(( " ADJUST: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " ADJUST: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)( edge2->pos - cur_len ) / 64 )); @@ -3272,7 +3279,7 @@ edge->pos = cur_pos1 - cur_len / 2; edge2->pos = cur_pos1 + cur_len / 2; - FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)" + FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, (double)edge->opos / 64, edge2 - edges, (double)edge2->opos / 64, @@ -3303,7 +3310,7 @@ edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; edge2->pos = edge->pos + cur_len; - FT_TRACE5(( " STEM: edge %ld (opos=%.2f) linked to %ld (opos=%.2f)" + FT_TRACE5(( " STEM: edge %td (opos=%.2f) linked to %td (opos=%.2f)" " snapped to %.2f and %.2f\n", edge - edges, (double)edge->opos / 64, edge2 - edges, (double)edge2->opos / 64, @@ -3326,7 +3333,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)edge[-1].pos / 64 )); @@ -3428,7 +3435,7 @@ if ( delta < 64 + 16 ) { af_latin_align_serif_edge( hints, edge->serif, edge ); - FT_TRACE5(( " SERIF: edge %ld (opos=%.2f) serif to %ld (opos=%.2f)" + FT_TRACE5(( " SERIF: edge %td (opos=%.2f) serif to %td (opos=%.2f)" " aligned to %.2f\n", edge - edges, (double)edge->opos / 64, edge->serif - edges, (double)edge->serif->opos / 64, @@ -3438,9 +3445,9 @@ { edge->pos = FT_PIX_ROUND( edge->opos ); anchor = edge; - FT_TRACE5(( " SERIF_ANCHOR: edge %ld (opos=%.2f)" + FT_TRACE5(( " SERIF_ANCHOR: edge %td (opos=%.2f)" " snapped to %.2f\n", - edge-edges, + edge - edges, (double)edge->opos / 64, (double)edge->pos / 64 )); } else @@ -3467,8 +3474,8 @@ after->pos - before->pos, after->opos - before->opos ); - FT_TRACE5(( " SERIF_LINK1: edge %ld (opos=%.2f) snapped to %.2f" - " from %ld (opos=%.2f)\n", + FT_TRACE5(( " SERIF_LINK1: edge %td (opos=%.2f) snapped to %.2f" + " from %td (opos=%.2f)\n", edge - edges, (double)edge->opos / 64, (double)edge->pos / 64, before - edges, (double)before->opos / 64 )); @@ -3477,7 +3484,7 @@ { edge->pos = anchor->pos + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); - FT_TRACE5(( " SERIF_LINK2: edge %ld (opos=%.2f)" + FT_TRACE5(( " SERIF_LINK2: edge %td (opos=%.2f)" " snapped to %.2f\n", edge - edges, (double)edge->opos / 64, (double)edge->pos / 64 )); @@ -3498,7 +3505,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)edge[-1].pos / 64 )); @@ -3519,7 +3526,7 @@ if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) { #ifdef FT_DEBUG_LEVEL_TRACE - FT_TRACE5(( " BOUND: edge %ld (pos=%.2f) moved to %.2f\n", + FT_TRACE5(( " BOUND: edge %td (pos=%.2f) moved to %.2f\n", edge - edges, (double)edge->pos / 64, (double)edge[1].pos / 64 )); @@ -3547,8 +3554,10 @@ af_latin_hints_apply( FT_UInt glyph_index, AF_GlyphHints hints, FT_Outline* outline, - AF_LatinMetrics metrics ) + AF_StyleMetrics metrics_ ) /* AF_LatinMetrics */ { + AF_LatinMetrics metrics = (AF_LatinMetrics)metrics_; + FT_Error error; int dim; diff --git a/src/3rdparty/freetype/src/autofit/aflatin.h b/src/3rdparty/freetype/src/autofit/aflatin.h index 3c6a7ee4..31aa91d3 100644 --- a/src/3rdparty/freetype/src/autofit/aflatin.h +++ b/src/3rdparty/freetype/src/autofit/aflatin.h @@ -116,11 +116,11 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) - af_latin_metrics_init( AF_LatinMetrics metrics, + af_latin_metrics_init( AF_StyleMetrics metrics, FT_Face face ); FT_LOCAL( void ) - af_latin_metrics_scale( AF_LatinMetrics metrics, + af_latin_metrics_scale( AF_StyleMetrics metrics, AF_Scaler scaler ); FT_LOCAL( void ) diff --git a/src/3rdparty/freetype/src/autofit/afloader.c b/src/3rdparty/freetype/src/autofit/afloader.c index c8082796..7c47d562 100644 --- a/src/3rdparty/freetype/src/autofit/afloader.c +++ b/src/3rdparty/freetype/src/autofit/afloader.c @@ -55,10 +55,8 @@ error = af_face_globals_new( face, &loader->globals, module ); if ( !error ) { - face->autohint.data = - (FT_Pointer)loader->globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; + face->autohint.data = (FT_Pointer)loader->globals; + face->autohint.finalizer = af_face_globals_free; } } diff --git a/src/3rdparty/freetype/src/autofit/afmodule.c b/src/3rdparty/freetype/src/autofit/afmodule.c index 92e5156a..20a6b96b 100644 --- a/src/3rdparty/freetype/src/autofit/afmodule.c +++ b/src/3rdparty/freetype/src/autofit/afmodule.c @@ -89,10 +89,8 @@ error = af_face_globals_new( face, &globals, module ); if ( !error ) { - face->autohint.data = - (FT_Pointer)globals; - face->autohint.finalizer = - (FT_Generic_Finalizer)af_face_globals_free; + face->autohint.data = (FT_Pointer)globals; + face->autohint.finalizer = af_face_globals_free; } } @@ -374,8 +372,9 @@ FT_DEFINE_SERVICE_PROPERTIESREC( af_service_properties, - (FT_Properties_SetFunc)af_property_set, /* set_property */ - (FT_Properties_GetFunc)af_property_get ) /* get_property */ + af_property_set, /* FT_Properties_SetFunc set_property */ + af_property_get /* FT_Properties_GetFunc get_property */ + ) FT_DEFINE_SERVICEDESCREC1( @@ -430,12 +429,14 @@ FT_CALLBACK_DEF( FT_Error ) - af_autofitter_load_glyph( AF_Module module, - FT_GlyphSlot slot, - FT_Size size, - FT_UInt glyph_index, - FT_Int32 load_flags ) + af_autofitter_load_glyph( FT_AutoHinter module_, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) { + AF_Module module = (AF_Module)module_; + FT_Error error = FT_Err_Ok; FT_Memory memory = module->root.library->memory; @@ -499,10 +500,10 @@ FT_DEFINE_AUTOHINTER_INTERFACE( af_autofitter_interface, - NULL, /* reset_face */ - NULL, /* get_global_hints */ - NULL, /* done_global_hints */ - (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph /* load_glyph */ + NULL, /* FT_AutoHinter_GlobalResetFunc reset_face */ + NULL, /* FT_AutoHinter_GlobalGetFunc get_global_hints */ + NULL, /* FT_AutoHinter_GlobalDoneFunc done_global_hints */ + af_autofitter_load_glyph /* FT_AutoHinter_GlyphLoadFunc load_glyph */ ) FT_DEFINE_MODULE( @@ -517,9 +518,9 @@ (const void*)&af_autofitter_interface, - (FT_Module_Constructor)af_autofitter_init, /* module_init */ - (FT_Module_Destructor) af_autofitter_done, /* module_done */ - (FT_Module_Requester) af_get_interface /* get_interface */ + af_autofitter_init, /* FT_Module_Constructor module_init */ + af_autofitter_done, /* FT_Module_Destructor module_done */ + af_get_interface /* FT_Module_Requester get_interface */ ) diff --git a/src/3rdparty/freetype/src/autofit/afshaper.c b/src/3rdparty/freetype/src/autofit/afshaper.c index 1b8b870e..abc6f1d2 100644 --- a/src/3rdparty/freetype/src/autofit/afshaper.c +++ b/src/3rdparty/freetype/src/autofit/afshaper.c @@ -258,7 +258,7 @@ /* * We now check whether we can construct blue zones, using glyphs * covered by the feature only. In case there is not a single zone - * (this is, not a single character is covered), we skip this coverage. + * (that is, not a single character is covered), we skip this coverage. * */ if ( style_class->coverage != AF_COVERAGE_DEFAULT ) @@ -313,9 +313,9 @@ * hinted and usually rendered glyph. * * Consider the superscript feature of font `pala.ttf': Some of the - * glyphs are `real', this is, they have a zero vertical offset, but + * glyphs are `real', that is, they have a zero vertical offset, but * most of them are small caps glyphs shifted up to the superscript - * position (this is, the `sups' feature is present in both the GSUB and + * position (that is, the `sups' feature is present in both the GSUB and * GPOS tables). The code for blue zones computation actually uses a * feature's y offset so that the `real' glyphs get correct hints. But * later on it is impossible to decide whether a glyph index belongs to, diff --git a/src/3rdparty/freetype/src/autofit/ft-hb.c b/src/3rdparty/freetype/src/autofit/ft-hb.c index 09a8401c..71aee045 100644 --- a/src/3rdparty/freetype/src/autofit/ft-hb.c +++ b/src/3rdparty/freetype/src/autofit/ft-hb.c @@ -108,7 +108,7 @@ hb_ft_font_create_ (FT_Face ft_face, #else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ /* ANSI C doesn't like empty source files */ -typedef int _ft_hb_dummy; +typedef int ft_hb_dummy_; #endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ diff --git a/src/3rdparty/freetype/src/base/ftbbox.c b/src/3rdparty/freetype/src/base/ftbbox.c index 7dd71882..385fea40 100644 --- a/src/3rdparty/freetype/src/base/ftbbox.c +++ b/src/3rdparty/freetype/src/base/ftbbox.c @@ -82,10 +82,13 @@ * @Return: * Always 0. Needed for the interface only. */ - static int - BBox_Move_To( FT_Vector* to, - TBBox_Rec* user ) + FT_CALLBACK_DEF( int ) + BBox_Move_To( const FT_Vector* to, + void* user_ ) { + TBBox_Rec* user = (TBBox_Rec*)user_; + + FT_UPDATE_BBOX( to, user->bbox ); user->last = *to; @@ -116,10 +119,13 @@ * @Return: * Always 0. Needed for the interface only. */ - static int - BBox_Line_To( FT_Vector* to, - TBBox_Rec* user ) + FT_CALLBACK_DEF( int ) + BBox_Line_To( const FT_Vector* to, + void* user_ ) { + TBBox_Rec* user = (TBBox_Rec*)user_; + + user->last = *to; return 0; @@ -205,11 +211,14 @@ * In the case of a non-monotonous arc, we compute directly the * extremum coordinates, as it is sufficiently fast. */ - static int - BBox_Conic_To( FT_Vector* control, - FT_Vector* to, - TBBox_Rec* user ) + FT_CALLBACK_DEF( int ) + BBox_Conic_To( const FT_Vector* control, + const FT_Vector* to, + void* user_ ) { + TBBox_Rec* user = (TBBox_Rec*)user_; + + /* in case `to' is implicit and not included in bbox yet */ FT_UPDATE_BBOX( to, user->bbox ); @@ -410,12 +419,15 @@ * In the case of a non-monotonous arc, we don't compute directly * extremum coordinates, we subdivide instead. */ - static int - BBox_Cubic_To( FT_Vector* control1, - FT_Vector* control2, - FT_Vector* to, - TBBox_Rec* user ) + FT_CALLBACK_DEF( int ) + BBox_Cubic_To( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user_ ) { + TBBox_Rec* user = (TBBox_Rec*)user_; + + /* We don't need to check `to' since it is always an on-point, */ /* thus within the bbox. Only segments with an off-point outside */ /* the bbox can possibly reach new extreme values. */ diff --git a/src/3rdparty/freetype/src/base/ftcalc.c b/src/3rdparty/freetype/src/base/ftcalc.c index 13e74f33..c5bc7e3b 100644 --- a/src/3rdparty/freetype/src/base/ftcalc.c +++ b/src/3rdparty/freetype/src/base/ftcalc.c @@ -749,65 +749,43 @@ FT_BASE_DEF( FT_Bool ) FT_Matrix_Check( const FT_Matrix* matrix ) { - FT_Matrix m; - FT_Fixed val[4]; - FT_Fixed nonzero_minval, maxval; - FT_Fixed temp1, temp2; - FT_UInt i; + FT_Fixed xx, xy, yx, yy; + FT_Fixed val; + FT_Int shift; + FT_ULong temp1, temp2; if ( !matrix ) return 0; - val[0] = FT_ABS( matrix->xx ); - val[1] = FT_ABS( matrix->xy ); - val[2] = FT_ABS( matrix->yx ); - val[3] = FT_ABS( matrix->yy ); + xx = matrix->xx; + xy = matrix->xy; + yx = matrix->yx; + yy = matrix->yy; + val = FT_ABS( xx ) | FT_ABS( xy ) | FT_ABS( yx ) | FT_ABS( yy ); - /* - * To avoid overflow, we ensure that each value is not larger than - * - * int(sqrt(2^31 / 4)) = 23170 ; - * - * we also check that no value becomes zero if we have to scale. - */ - - maxval = 0; - nonzero_minval = FT_LONG_MAX; - - for ( i = 0; i < 4; i++ ) - { - if ( val[i] > maxval ) - maxval = val[i]; - if ( val[i] && val[i] < nonzero_minval ) - nonzero_minval = val[i]; - } - - /* we only handle 32bit values */ - if ( maxval > 0x7FFFFFFFL ) + /* we only handle non-zero 32-bit values */ + if ( !val || val > 0x7FFFFFFFL ) return 0; - if ( maxval > 23170 ) + /* Scale matrix to avoid the temp1 overflow, which is */ + /* more stringent than avoiding the temp2 overflow. */ + + shift = FT_MSB( val ) - 12; + + if ( shift > 0 ) { - FT_Fixed scale = FT_DivFix( maxval, 23170 ); - - - if ( !FT_DivFix( nonzero_minval, scale ) ) - return 0; /* value range too large */ - - m.xx = FT_DivFix( matrix->xx, scale ); - m.xy = FT_DivFix( matrix->xy, scale ); - m.yx = FT_DivFix( matrix->yx, scale ); - m.yy = FT_DivFix( matrix->yy, scale ); + xx >>= shift; + xy >>= shift; + yx >>= shift; + yy >>= shift; } - else - m = *matrix; - temp1 = FT_ABS( m.xx * m.yy - m.xy * m.yx ); - temp2 = m.xx * m.xx + m.xy * m.xy + m.yx * m.yx + m.yy * m.yy; + temp1 = 32U * (FT_ULong)FT_ABS( xx * yy - xy * yx ); + temp2 = (FT_ULong)( xx * xx ) + (FT_ULong)( xy * xy ) + + (FT_ULong)( yx * yx ) + (FT_ULong)( yy * yy ); - if ( temp1 == 0 || - temp2 / temp1 > 50 ) + if ( temp1 <= temp2 ) return 0; return 1; @@ -1061,7 +1039,7 @@ /* */ /* This approach has the advantage that the angle between */ /* `in' and `out' is not checked. In case one of the two */ - /* vectors is `dominant', this is, much larger than the */ + /* vectors is `dominant', that is, much larger than the */ /* other vector, we thus always have a flat corner. */ /* */ /* hypotenuse */ @@ -1092,9 +1070,6 @@ { FT_UInt i; FT_Int64 temp; -#ifndef FT_INT64 - FT_Int64 halfUnit; -#endif #ifdef FT_INT64 @@ -1103,7 +1078,7 @@ for ( i = 0; i < count; ++i ) temp += (FT_Int64)s[i] * f[i]; - return ( temp + 0x8000 ) >> 16; + return (FT_Int32)( ( temp + 0x8000 ) >> 16 ); #else temp.hi = 0; temp.lo = 0; @@ -1139,13 +1114,10 @@ FT_Add64( &temp, &multResult, &temp ); } - /* Round value. */ - halfUnit.hi = 0; - halfUnit.lo = 0x8000; - FT_Add64( &temp, &halfUnit, &temp ); + /* Shift and round value. */ + return (FT_Int32)( ( ( temp.hi << 16 ) | ( temp.lo >> 16 ) ) + + ( 1 & ( temp.lo >> 15 ) ) ); - return (FT_Int32)( ( (FT_Int32)( temp.hi & 0xFFFF ) << 16 ) | - ( temp.lo >> 16 ) ); #endif /* !FT_INT64 */ diff --git a/src/3rdparty/freetype/src/base/ftdbgmem.c b/src/3rdparty/freetype/src/base/ftdbgmem.c index 6730c4c8..8fab50dd 100644 --- a/src/3rdparty/freetype/src/base/ftdbgmem.c +++ b/src/3rdparty/freetype/src/base/ftdbgmem.c @@ -963,7 +963,7 @@ #else /* !FT_DEBUG_MEMORY */ /* ANSI C doesn't like empty source files */ - typedef int _debug_mem_dummy; + typedef int debug_mem_dummy_; #endif /* !FT_DEBUG_MEMORY */ diff --git a/src/3rdparty/freetype/src/base/ftmac.c b/src/3rdparty/freetype/src/base/ftmac.c index de34e834..492d0553 100644 --- a/src/3rdparty/freetype/src/base/ftmac.c +++ b/src/3rdparty/freetype/src/base/ftmac.c @@ -1082,7 +1082,7 @@ #else /* !FT_MACINTOSH */ /* ANSI C doesn't like empty source files */ - typedef int _ft_mac_dummy; + typedef int ft_mac_dummy_; #endif /* !FT_MACINTOSH */ diff --git a/src/3rdparty/freetype/src/base/ftmm.c b/src/3rdparty/freetype/src/base/ftmm.c index a2b4bd03..9e2dd7ee 100644 --- a/src/3rdparty/freetype/src/base/ftmm.c +++ b/src/3rdparty/freetype/src/base/ftmm.c @@ -185,6 +185,14 @@ error = FT_ERR( Invalid_Argument ); if ( service->set_mm_design ) error = service->set_mm_design( face, num_coords, coords ); + + if ( !error ) + { + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + } } /* enforce recomputation of auto-hinting data */ @@ -220,6 +228,14 @@ error = FT_ERR( Invalid_Argument ); if ( service->set_mm_weightvector ) error = service->set_mm_weightvector( face, len, weightvector ); + + if ( !error ) + { + if ( len ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + } } /* enforce recomputation of auto-hinting data */ @@ -283,6 +299,30 @@ if ( service_mm->set_var_design ) error = service_mm->set_var_design( face, num_coords, coords ); + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + /* internal error code -1 means `no change'; we can exit immediately */ if ( error == -1 ) return FT_Err_Ok; @@ -359,6 +399,30 @@ if ( service_mm->set_mm_blend ) error = service_mm->set_mm_blend( face, num_coords, coords ); + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + /* internal error code -1 means `no change'; we can exit immediately */ if ( error == -1 ) return FT_Err_Ok; @@ -410,6 +474,30 @@ if ( service_mm->set_mm_blend ) error = service_mm->set_mm_blend( face, num_coords, coords ); + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + if ( num_coords ) + face->face_flags |= FT_FACE_FLAG_VARIATION; + else + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + /* internal error code -1 means `no change'; we can exit immediately */ if ( error == -1 ) return FT_Err_Ok; @@ -535,8 +623,35 @@ if ( !error ) { error = FT_ERR( Invalid_Argument ); - if ( service_mm->set_instance ) - error = service_mm->set_instance( face, instance_index ); + if ( service_mm->set_named_instance ) + error = service_mm->set_named_instance( face, instance_index ); + + if ( !error || error == -1 ) + { + FT_Bool is_variation_old = FT_IS_VARIATION( face ); + + + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + face->face_index = ( instance_index << 16 ) | + ( face->face_index & 0xFFFFL ); + + if ( service_mm->construct_ps_name ) + { + if ( error == -1 ) + { + /* The PS name of a named instance and a non-named instance */ + /* usually differs, even if the axis values are identical. */ + if ( is_variation_old != FT_IS_VARIATION( face ) ) + service_mm->construct_ps_name( face ); + } + else + service_mm->construct_ps_name( face ); + } + } + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; } if ( !error ) @@ -554,11 +669,32 @@ face->autohint.data = NULL; } + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ) + { + FT_Error error; + + FT_Service_MultiMasters service_mm = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + error = ft_face_get_mm_service( face, &service_mm ); if ( !error ) { - face->face_index = ( instance_index << 16 ) | - ( face->face_index & 0xFFFFL ); - face->face_flags &= ~FT_FACE_FLAG_VARIATION; + /* no error if `get_default_named_instance` is not available */ + if ( service_mm->get_default_named_instance ) + error = service_mm->get_default_named_instance( face, + instance_index ); + else + error = FT_Err_Ok; } return error; diff --git a/src/3rdparty/freetype/src/base/ftobjs.c b/src/3rdparty/freetype/src/base/ftobjs.c index ad6ef0ae..89a25bc7 100644 --- a/src/3rdparty/freetype/src/base/ftobjs.c +++ b/src/3rdparty/freetype/src/base/ftobjs.c @@ -1019,7 +1019,8 @@ /* elegant. */ /* try to load SVG documents if available */ - if ( FT_HAS_SVG( face ) ) + if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 && + FT_HAS_SVG( face ) ) { error = driver->clazz->load_glyph( slot, face->size, glyph_index, @@ -1245,9 +1246,13 @@ /* destructor for sizes list */ static void destroy_size( FT_Memory memory, - FT_Size size, - FT_Driver driver ) + void* size_, + void* driver_ ) { + FT_Size size = (FT_Size)size_; + FT_Driver driver = (FT_Driver)driver_; + + /* finalize client-specific data */ if ( size->generic.finalizer ) size->generic.finalizer( size ); @@ -1293,10 +1298,12 @@ /* destructor for faces list */ static void destroy_face( FT_Memory memory, - FT_Face face, - FT_Driver driver ) + void* face_, + void* driver_ ) { - FT_Driver_Class clazz = driver->clazz; + FT_Face face = (FT_Face)face_; + FT_Driver driver = (FT_Driver)driver_; + FT_Driver_Class clazz = driver->clazz; /* discard auto-hinting data */ @@ -1310,7 +1317,7 @@ /* discard all sizes for this face */ FT_List_Finalize( &face->sizes_list, - (FT_List_Destructor)destroy_size, + destroy_size, memory, driver ); face->size = NULL; @@ -1346,7 +1353,7 @@ Destroy_Driver( FT_Driver driver ) { FT_List_Finalize( &driver->faces_list, - (FT_List_Destructor)destroy_face, + destroy_face, driver->root.memory, driver ); } @@ -1740,7 +1747,8 @@ FT_Memory memory = library->memory; - args.flags = 0; + args.driver = NULL; + args.flags = 0; if ( driver_name ) { diff --git a/src/3rdparty/freetype/src/base/ftoutln.c b/src/3rdparty/freetype/src/base/ftoutln.c index 30ff21ff..134f39d2 100644 --- a/src/3rdparty/freetype/src/base/ftoutln.c +++ b/src/3rdparty/freetype/src/base/ftoutln.c @@ -58,7 +58,9 @@ FT_Error error; FT_Int n; /* index of contour in outline */ - FT_UInt first; /* index of first point in contour */ + FT_Int first; /* index of first point in contour */ + FT_Int last; /* index of last point in contour */ + FT_Int tag; /* current point's state */ FT_Int shift; @@ -73,18 +75,17 @@ shift = func_interface->shift; delta = func_interface->delta; - first = 0; + last = -1; for ( n = 0; n < outline->n_contours; n++ ) { - FT_Int last; /* index of last point in contour */ + FT_TRACE5(( "FT_Outline_Decompose: Contour %d\n", n )); - - FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); - - last = outline->contours[n]; - if ( last < 0 ) + first = last + 1; + last = outline->contours[n]; + if ( last < first ) goto Invalid_Outline; + limit = outline->points + last; v_start = outline->points[first]; @@ -282,8 +283,6 @@ Close: if ( error ) goto Exit; - - first = (FT_UInt)last + 1; } FT_TRACE5(( "FT_Outline_Decompose: Done\n" )); @@ -368,7 +367,7 @@ if ( n_points <= 0 || n_contours <= 0 ) goto Bad; - end0 = end = -1; + end0 = -1; for ( n = 0; n < n_contours; n++ ) { end = outline->contours[n]; @@ -380,7 +379,7 @@ end0 = end; } - if ( end != n_points - 1 ) + if ( end0 != n_points - 1 ) goto Bad; /* XXX: check the tags array */ @@ -388,7 +387,7 @@ } Bad: - return FT_THROW( Invalid_Argument ); + return FT_THROW( Invalid_Outline ); } @@ -550,10 +549,12 @@ if ( !outline ) return; - first = 0; - + last = -1; for ( n = 0; n < outline->n_contours; n++ ) { + /* keep the first contour point as is and swap points around it */ + /* to guarantee that the cubic arches stay valid after reverse */ + first = last + 2; last = outline->contours[n]; /* reverse point table */ @@ -591,8 +592,6 @@ q--; } } - - first = last + 1; } outline->flags ^= FT_OUTLINE_REVERSE_FILL; @@ -941,7 +940,7 @@ points = outline->points; - first = 0; + last = -1; for ( c = 0; c < outline->n_contours; c++ ) { FT_Vector in, out, anchor, shift; @@ -949,8 +948,9 @@ FT_Int i, j, k; - l_in = 0; - last = outline->contours[c]; + first = last + 1; + last = outline->contours[c]; + l_in = 0; /* pacify compiler */ in.x = in.y = anchor.x = anchor.y = 0; @@ -1037,8 +1037,6 @@ in = out; l_in = l_out; } - - first = last + 1; } return FT_Err_Ok; @@ -1054,7 +1052,7 @@ FT_Int xshift, yshift; FT_Vector* points; FT_Vector v_prev, v_cur; - FT_Int c, n, first; + FT_Int c, n, first, last; FT_Pos area = 0; @@ -1086,11 +1084,11 @@ points = outline->points; - first = 0; + last = -1; for ( c = 0; c < outline->n_contours; c++ ) { - FT_Int last = outline->contours[c]; - + first = last + 1; + last = outline->contours[c]; v_prev.x = points[last].x >> xshift; v_prev.y = points[last].y >> yshift; @@ -1106,8 +1104,6 @@ v_prev = v_cur; } - - first = last + 1; } if ( area > 0 ) diff --git a/src/3rdparty/freetype/src/base/ftstream.c b/src/3rdparty/freetype/src/base/ftstream.c index 05c56375..64826ace 100644 --- a/src/3rdparty/freetype/src/base/ftstream.c +++ b/src/3rdparty/freetype/src/base/ftstream.c @@ -141,7 +141,9 @@ if ( read_bytes > count ) read_bytes = count; - FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + /* Allow "reading" zero bytes without UB even if buffer is NULL */ + if ( count ) + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); } stream->pos = pos + read_bytes; @@ -178,7 +180,9 @@ if ( read_bytes > count ) read_bytes = count; - FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + /* Allow "reading" zero bytes without UB even if buffer is NULL */ + if ( count ) + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); } stream->pos += read_bytes; diff --git a/src/3rdparty/freetype/src/base/ftstroke.c b/src/3rdparty/freetype/src/base/ftstroke.c index db358e77..92f1e430 100644 --- a/src/3rdparty/freetype/src/base/ftstroke.c +++ b/src/3rdparty/freetype/src/base/ftstroke.c @@ -2055,7 +2055,9 @@ FT_Error error; FT_Int n; /* index of contour in outline */ - FT_UInt first; /* index of first point in contour */ + FT_Int first; /* index of first point in contour */ + FT_Int last; /* index of last point in contour */ + FT_Int tag; /* current point's state */ @@ -2067,22 +2069,17 @@ FT_Stroker_Rewind( stroker ); - first = 0; - + last = -1; for ( n = 0; n < outline->n_contours; n++ ) { - FT_UInt last; /* index of last point in contour */ - - - last = (FT_UInt)outline->contours[n]; - limit = outline->points + last; + first = last + 1; + last = outline->contours[n]; /* skip empty points; we don't stroke these */ if ( last <= first ) - { - first = last + 1; continue; - } + + limit = outline->points + last; v_start = outline->points[first]; v_last = outline->points[last]; @@ -2231,8 +2228,6 @@ if ( error ) goto Exit; } - - first = last + 1; } return FT_Err_Ok; diff --git a/src/3rdparty/freetype/src/base/ftsynth.c b/src/3rdparty/freetype/src/base/ftsynth.c index 6ec25e13..f32edd33 100644 --- a/src/3rdparty/freetype/src/base/ftsynth.c +++ b/src/3rdparty/freetype/src/base/ftsynth.c @@ -97,9 +97,18 @@ FT_EXPORT_DEF( void ) FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_GlyphSlot_AdjustWeight( slot, 0x0AAA, 0x0AAA ); + } + + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_AdjustWeight( FT_GlyphSlot slot, + FT_Fixed xdelta, + FT_Fixed ydelta ) { FT_Library library; - FT_Face face; + FT_Size size; FT_Error error; FT_Pos xstr, ystr; @@ -108,16 +117,15 @@ return; library = slot->library; - face = slot->face; + size = slot->face->size; if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && slot->format != FT_GLYPH_FORMAT_BITMAP ) return; - /* some reasonable strength */ - xstr = FT_MulFix( face->units_per_EM, - face->size->metrics.y_scale ) / 24; - ystr = xstr; + /* express deltas in pixels in 26.6 format */ + xstr = (FT_Pos)size->metrics.x_ppem * xdelta / 1024; + ystr = (FT_Pos)size->metrics.y_ppem * ydelta / 1024; if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) FT_Outline_EmboldenXY( &slot->outline, xstr, ystr ); diff --git a/src/3rdparty/freetype/src/base/ftsystem.c b/src/3rdparty/freetype/src/base/ftsystem.c index fcd289d1..61c99e36 100644 --- a/src/3rdparty/freetype/src/base/ftsystem.c +++ b/src/3rdparty/freetype/src/base/ftsystem.c @@ -206,7 +206,7 @@ * The number of bytes to read from the stream. * * @Return: - * The number of bytes actually read. If `count' is zero (this is, + * The number of bytes actually read. If `count' is zero (that is, * the function is used for seeking), a non-zero return value * indicates an error. */ @@ -219,7 +219,7 @@ FT_FILE* file; - if ( !count && offset > stream->size ) + if ( offset > stream->size && !count ) return 1; file = STREAM_FILE( stream ); @@ -227,6 +227,11 @@ if ( stream->pos != offset ) ft_fseek( file, (long)offset, SEEK_SET ); + /* Avoid calling `fread` with `buffer=NULL` and `count=0`, */ + /* which is undefined behaviour. */ + if ( !count ) + return 0; + return (unsigned long)ft_fread( buffer, 1, count, file ); } diff --git a/src/3rdparty/freetype/src/base/ftver.rc b/src/3rdparty/freetype/src/base/ftver.rc index f113cb89..137a6334 100644 --- a/src/3rdparty/freetype/src/base/ftver.rc +++ b/src/3rdparty/freetype/src/base/ftver.rc @@ -18,8 +18,8 @@ #include -#define FT_VERSION 2,13,0,0 -#define FT_VERSION_STR "2.13.0" +#define FT_VERSION 2,13,2,0 +#define FT_VERSION_STR "2.13.2" VS_VERSION_INFO VERSIONINFO FILEVERSION FT_VERSION diff --git a/src/3rdparty/freetype/src/bdf/bdf.h b/src/3rdparty/freetype/src/bdf/bdf.h index 5acbd5f2..e2cb52c1 100644 --- a/src/3rdparty/freetype/src/bdf/bdf.h +++ b/src/3rdparty/freetype/src/bdf/bdf.h @@ -239,10 +239,6 @@ FT_BEGIN_HEADER FT_LOCAL( void ) bdf_free_font( bdf_font_t* font ); - FT_LOCAL( bdf_property_t * ) - bdf_get_property( char* name, - bdf_font_t* font ); - FT_LOCAL( bdf_property_t * ) bdf_get_font_property( bdf_font_t* font, const char* name ); diff --git a/src/3rdparty/freetype/src/bdf/bdfdrivr.c b/src/3rdparty/freetype/src/bdf/bdfdrivr.c index d7e8e0ef..e02a1609 100644 --- a/src/3rdparty/freetype/src/bdf/bdfdrivr.c +++ b/src/3rdparty/freetype/src/bdf/bdfdrivr.c @@ -311,9 +311,9 @@ THE SOFTWARE. FT_CALLBACK_DEF( void ) - BDF_Face_Done( FT_Face bdfface ) /* BDF_Face */ + BDF_Face_Done( FT_Face face ) /* BDF_Face */ { - BDF_Face face = (BDF_Face)bdfface; + BDF_Face bdfface = (BDF_Face)face; FT_Memory memory; @@ -322,31 +322,31 @@ THE SOFTWARE. memory = FT_FACE_MEMORY( face ); - bdf_free_font( face->bdffont ); + bdf_free_font( bdfface->bdffont ); - FT_FREE( face->en_table ); + FT_FREE( bdfface->en_table ); - FT_FREE( face->charset_encoding ); - FT_FREE( face->charset_registry ); - FT_FREE( bdfface->family_name ); - FT_FREE( bdfface->style_name ); + FT_FREE( bdfface->charset_encoding ); + FT_FREE( bdfface->charset_registry ); + FT_FREE( face->family_name ); + FT_FREE( face->style_name ); - FT_FREE( bdfface->available_sizes ); + FT_FREE( face->available_sizes ); - FT_FREE( face->bdffont ); + FT_FREE( bdfface->bdffont ); } FT_CALLBACK_DEF( FT_Error ) BDF_Face_Init( FT_Stream stream, - FT_Face bdfface, /* BDF_Face */ + FT_Face face, /* BDF_Face */ FT_Int face_index, FT_Int num_params, FT_Parameter* params ) { - FT_Error error = FT_Err_Ok; - BDF_Face face = (BDF_Face)bdfface; - FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error = FT_Err_Ok; + BDF_Face bdfface = (BDF_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); bdf_font_t* font = NULL; bdf_options_t options; @@ -375,7 +375,7 @@ THE SOFTWARE. goto Exit; /* we have a bdf font: let's construct the face object */ - face->bdffont = font; + bdfface->bdffont = font; /* BDF cannot have multiple faces in a single font file. * XXX: non-zero face_index is already invalid argument, but @@ -386,7 +386,7 @@ THE SOFTWARE. if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 ) { FT_ERROR(( "BDF_Face_Init: invalid face index\n" )); - BDF_Face_Done( bdfface ); + BDF_Face_Done( face ); return FT_THROW( Invalid_Argument ); } @@ -401,18 +401,18 @@ THE SOFTWARE. font->unencoded_size, font->unencoded_used )); - bdfface->num_faces = 1; - bdfface->face_index = 0; + face->num_faces = 1; + face->face_index = 0; - bdfface->face_flags |= FT_FACE_FLAG_FIXED_SIZES | - FT_FACE_FLAG_HORIZONTAL; + face->face_flags |= FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; prop = bdf_get_font_property( font, "SPACING" ); if ( prop && prop->format == BDF_ATOM && prop->value.atom && ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) - bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + face->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ /* FZ XXX: I need a font to implement this */ @@ -420,26 +420,27 @@ THE SOFTWARE. prop = bdf_get_font_property( font, "FAMILY_NAME" ); if ( prop && prop->value.atom ) { - if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) ) + if ( FT_STRDUP( face->family_name, prop->value.atom ) ) goto Exit; } else - bdfface->family_name = NULL; + face->family_name = NULL; - if ( FT_SET_ERROR( bdf_interpret_style( face ) ) ) + if ( FT_SET_ERROR( bdf_interpret_style( bdfface ) ) ) goto Exit; /* the number of glyphs (with one slot for the undefined glyph */ /* at position 0 and all unencoded glyphs) */ - bdfface->num_glyphs = (FT_Long)( font->glyphs_size + 1 ); + face->num_glyphs = (FT_Long)( font->glyphs_size + 1 ); - bdfface->num_fixed_sizes = 1; - if ( FT_NEW( bdfface->available_sizes ) ) + face->num_fixed_sizes = 1; + if ( FT_NEW( face->available_sizes ) ) goto Exit; { - FT_Bitmap_Size* bsize = bdfface->available_sizes; - FT_Short resolution_x = 0, resolution_y = 0; + FT_Bitmap_Size* bsize = face->available_sizes; + FT_Short resolution_x = 0; + FT_Short resolution_y = 0; long value; @@ -598,20 +599,20 @@ THE SOFTWARE. unsigned long n; - if ( FT_QNEW_ARRAY( face->en_table, font->glyphs_size ) ) + if ( FT_QNEW_ARRAY( bdfface->en_table, font->glyphs_size ) ) goto Exit; - face->default_glyph = 0; + bdfface->default_glyph = 0; for ( n = 0; n < font->glyphs_size; n++ ) { - (face->en_table[n]).enc = cur[n].encoding; + (bdfface->en_table[n]).enc = cur[n].encoding; FT_TRACE4(( " idx %ld, val 0x%lX\n", n, cur[n].encoding )); - (face->en_table[n]).glyph = (FT_UShort)n; + (bdfface->en_table[n]).glyph = (FT_UShort)n; if ( cur[n].encoding == font->default_char ) { if ( n < FT_UINT_MAX ) - face->default_glyph = (FT_UInt)n; + bdfface->default_glyph = (FT_UInt)n; else FT_TRACE1(( "BDF_Face_Init:" " idx %ld is too large for this system\n", n )); @@ -639,27 +640,27 @@ THE SOFTWARE. const char* s; - if ( FT_STRDUP( face->charset_encoding, + if ( FT_STRDUP( bdfface->charset_encoding, charset_encoding->value.atom ) || - FT_STRDUP( face->charset_registry, + FT_STRDUP( bdfface->charset_registry, charset_registry->value.atom ) ) goto Exit; /* Uh, oh, compare first letters manually to avoid dependency */ /* on locales. */ - s = face->charset_registry; + s = bdfface->charset_registry; if ( ( s[0] == 'i' || s[0] == 'I' ) && ( s[1] == 's' || s[1] == 'S' ) && ( s[2] == 'o' || s[2] == 'O' ) ) { s += 3; - if ( !ft_strcmp( s, "10646" ) || - ( !ft_strcmp( s, "8859" ) && - !ft_strcmp( face->charset_encoding, "1" ) ) ) + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( bdfface->charset_encoding, "1" ) ) ) unicode_charmap = 1; /* another name for ASCII */ - else if ( !ft_strcmp( s, "646.1991" ) && - !ft_strcmp( face->charset_encoding, "IRV" ) ) + else if ( !ft_strcmp( s, "646.1991" ) && + !ft_strcmp( bdfface->charset_encoding, "IRV" ) ) unicode_charmap = 1; } @@ -667,7 +668,7 @@ THE SOFTWARE. FT_CharMapRec charmap; - charmap.face = FT_FACE( face ); + charmap.face = face; charmap.encoding = FT_ENCODING_NONE; /* initial platform/encoding should indicate unset status? */ charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; @@ -693,7 +694,7 @@ THE SOFTWARE. FT_CharMapRec charmap; - charmap.face = FT_FACE( face ); + charmap.face = face; charmap.encoding = FT_ENCODING_ADOBE_STANDARD; charmap.platform_id = TT_PLATFORM_ADOBE; charmap.encoding_id = TT_ADOBE_ID_STANDARD; @@ -701,8 +702,8 @@ THE SOFTWARE. error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); /* Select default charmap */ - if ( bdfface->num_charmaps ) - bdfface->charmap = bdfface->charmaps[0]; + if ( face->num_charmaps ) + face->charmap = face->charmaps[0]; } } } @@ -711,7 +712,7 @@ THE SOFTWARE. return error; Fail: - BDF_Face_Done( bdfface ); + BDF_Face_Done( face ); return FT_THROW( Unknown_File_Format ); } @@ -868,17 +869,18 @@ THE SOFTWARE. * */ - static FT_Error - bdf_get_bdf_property( BDF_Face face, + FT_CALLBACK_DEF( FT_Error ) + bdf_get_bdf_property( FT_Face face, /* BDF_Face */ const char* prop_name, BDF_PropertyRec *aproperty ) { + BDF_Face bdfface = (BDF_Face)face; bdf_property_t* prop; - FT_ASSERT( face && face->bdffont ); + FT_ASSERT( bdfface && bdfface->bdffont ); - prop = bdf_get_font_property( face->bdffont, prop_name ); + prop = bdf_get_font_property( bdfface->bdffont, prop_name ); if ( prop ) { switch ( prop->format ) @@ -921,13 +923,16 @@ THE SOFTWARE. } - static FT_Error - bdf_get_charset_id( BDF_Face face, + FT_CALLBACK_DEF( FT_Error ) + bdf_get_charset_id( FT_Face face, /* BDF_Face */ const char* *acharset_encoding, const char* *acharset_registry ) { - *acharset_encoding = face->charset_encoding; - *acharset_registry = face->charset_registry; + BDF_Face bdfface = (BDF_Face)face; + + + *acharset_encoding = bdfface->charset_encoding; + *acharset_registry = bdfface->charset_registry; return 0; } @@ -964,7 +969,6 @@ THE SOFTWARE. } - FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec bdf_driver_class = { diff --git a/src/3rdparty/freetype/src/bdf/bdflib.c b/src/3rdparty/freetype/src/bdf/bdflib.c index 2224698f..0fa7e0a8 100644 --- a/src/3rdparty/freetype/src/bdf/bdflib.c +++ b/src/3rdparty/freetype/src/bdf/bdflib.c @@ -51,6 +51,9 @@ #define FT_COMPONENT bdflib +#define BUFSIZE 128 + + /************************************************************************** * * Default BDF font options. @@ -378,7 +381,7 @@ *alen = 0; if ( list == NULL || list->used == 0 ) - return 0; + return NULL; dp = list->field[0]; for ( i = j = 0; i < list->used; i++ ) @@ -887,18 +890,18 @@ } - FT_LOCAL_DEF( bdf_property_t* ) - bdf_get_property( char* name, + static bdf_property_t* + bdf_get_property( const char* name, bdf_font_t* font ) { size_t* propid; if ( name == NULL || *name == 0 ) - return 0; + return NULL; if ( ( propid = ft_hash_str_lookup( name, &(font->proptbl) ) ) == NULL ) - return 0; + return NULL; if ( *propid >= num_bdf_properties_ ) return font->user_props + ( *propid - num_bdf_properties_ ); @@ -944,7 +947,7 @@ static FT_Error bdf_add_comment_( bdf_font_t* font, - char* comment, + const char* comment, unsigned long len ) { char* cp; @@ -1053,27 +1056,24 @@ bdf_property_t* p; - *name = sp = ep = line; + sp = ep = line; while ( *ep && *ep != ' ' && *ep != '\t' ) ep++; - hold = -1; - if ( *ep ) - { - hold = *ep; - *ep = 0; - } + hold = *ep; + *ep = '\0'; p = bdf_get_property( sp, font ); - /* Restore the character that was saved before any return can happen. */ - if ( hold != -1 ) - *ep = (char)hold; - /* If the property exists and is not an atom, just return here. */ if ( p && p->format != BDF_ATOM ) + { + *ep = (char)hold; /* Undo NUL-termination. */ return 0; + } + + *name = sp; /* The property is an atom. Trim all leading and trailing whitespace */ /* and double quotes for the atom value. */ @@ -1081,25 +1081,26 @@ ep = line + linelen; /* Trim the leading whitespace if it exists. */ - if ( *sp ) - *sp++ = 0; - while ( *sp && - ( *sp == ' ' || *sp == '\t' ) ) - sp++; + if ( sp < ep ) + do + sp++; + while ( *sp == ' ' || *sp == '\t' ); /* Trim the leading double quote if it exists. */ if ( *sp == '"' ) sp++; + *value = sp; /* Trim the trailing whitespace if it exists. */ - while ( ep > sp && - ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) ) - *--ep = 0; + if ( sp < ep ) + do + *ep-- = '\0'; + while ( *ep == ' ' || *ep == '\t' ); /* Trim the trailing double quote if it exists. */ - if ( ep > sp && *( ep - 1 ) == '"' ) - *--ep = 0; + if ( *ep == '"' ) + *ep = '\0'; return 1; } @@ -1775,7 +1776,7 @@ bdf_parse_t_* p; char* name; char* value; - char nbuf[128]; + char nbuf[BUFSIZE]; FT_Error error = FT_Err_Ok; FT_UNUSED( lineno ); @@ -1796,7 +1797,7 @@ if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 ) { p->font->font_ascent = p->font->bbx.ascent; - ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent ); error = bdf_add_property_( p->font, "FONT_ASCENT", nbuf, lineno ); if ( error ) @@ -1808,7 +1809,7 @@ if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 ) { p->font->font_descent = p->font->bbx.descent; - ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent ); error = bdf_add_property_( p->font, "FONT_DESCENT", nbuf, lineno ); if ( error ) @@ -2116,7 +2117,7 @@ /* Check for the CHARS field -- font properties are optional */ if ( _bdf_strncmp( line, "CHARS", 5 ) == 0 ) { - char nbuf[128]; + char nbuf[BUFSIZE]; if ( !( p->flags & BDF_FONT_BBX_ ) ) @@ -2130,7 +2131,7 @@ /* Add the two standard X11 properties which are required */ /* for compiling fonts. */ p->font->font_ascent = p->font->bbx.ascent; - ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.ascent ); error = bdf_add_property_( p->font, "FONT_ASCENT", nbuf, lineno ); if ( error ) @@ -2138,7 +2139,7 @@ FT_TRACE2(( "bdf_parse_properties_: " ACMSG1, p->font->bbx.ascent )); p->font->font_descent = p->font->bbx.descent; - ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); + ft_snprintf( nbuf, BUFSIZE, "%hd", p->font->bbx.descent ); error = bdf_add_property_( p->font, "FONT_DESCENT", nbuf, lineno ); if ( error ) diff --git a/src/3rdparty/freetype/src/bzip2/ftbzip2.c b/src/3rdparty/freetype/src/bzip2/ftbzip2.c index 6cf10678..ad342bd0 100644 --- a/src/3rdparty/freetype/src/bzip2/ftbzip2.c +++ b/src/3rdparty/freetype/src/bzip2/ftbzip2.c @@ -62,10 +62,12 @@ static void* - ft_bzip2_alloc( FT_Memory memory, - int items, - int size ) + ft_bzip2_alloc( void* memory_, /* FT_Memory */ + int items, + int size ) { + FT_Memory memory = (FT_Memory)memory_; + FT_ULong sz = (FT_ULong)size * (FT_ULong)items; FT_Error error; FT_Pointer p = NULL; @@ -77,9 +79,12 @@ static void - ft_bzip2_free( FT_Memory memory, - void* address ) + ft_bzip2_free( void* memory_, /* FT_Memory */ + void* address ) { + FT_Memory memory = (FT_Memory)memory_; + + FT_MEM_FREE( address ); } @@ -170,8 +175,8 @@ } /* initialize bzlib */ - bzstream->bzalloc = (alloc_func)ft_bzip2_alloc; - bzstream->bzfree = (free_func) ft_bzip2_free; + bzstream->bzalloc = ft_bzip2_alloc; + bzstream->bzfree = ft_bzip2_free; bzstream->opaque = zip->memory; bzstream->avail_in = 0; diff --git a/src/3rdparty/freetype/src/cache/ftcbasic.c b/src/3rdparty/freetype/src/cache/ftcbasic.c index 4c6d41b2..24a56c8d 100644 --- a/src/3rdparty/freetype/src/cache/ftcbasic.c +++ b/src/3rdparty/freetype/src/cache/ftcbasic.c @@ -337,7 +337,7 @@ #if 1 /* inlining is about 50% faster! */ FTC_GCACHE_LOOKUP_CMP( cache, ftc_basic_family_compare, - FTC_GNode_Compare, + ftc_gnode_compare, hash, gindex, &query, node, @@ -411,7 +411,7 @@ FTC_GCACHE_LOOKUP_CMP( cache, ftc_basic_family_compare, - FTC_GNode_Compare, + ftc_gnode_compare, hash, gindex, &query, node, @@ -537,7 +537,7 @@ #if 1 /* inlining is about 50% faster! */ FTC_GCACHE_LOOKUP_CMP( cache, ftc_basic_family_compare, - FTC_SNode_Compare, + ftc_snode_compare, hash, gindex, &query, node, @@ -613,7 +613,7 @@ FTC_GCACHE_LOOKUP_CMP( cache, ftc_basic_family_compare, - FTC_SNode_Compare, + ftc_snode_compare, hash, gindex, &query, node, diff --git a/src/3rdparty/freetype/src/cache/ftccache.c b/src/3rdparty/freetype/src/cache/ftccache.c index d54e68ca..e0698557 100644 --- a/src/3rdparty/freetype/src/cache/ftccache.c +++ b/src/3rdparty/freetype/src/cache/ftccache.c @@ -94,8 +94,8 @@ idx = hash & cache->mask; - if ( idx < cache->p ) - idx = hash & ( 2 * cache->mask + 1 ); + if ( idx >= cache->p ) + idx = hash & ( cache->mask >> 1 ); return cache->buckets + idx; } @@ -113,9 +113,9 @@ for (;;) { FTC_Node node, *pnode; - FT_UFast p = cache->p; - FT_UFast mask = cache->mask; - FT_UFast count = mask + p + 1; /* number of buckets */ + FT_UFast p = cache->p; + FT_UFast size = cache->mask + 1; /* available size */ + FT_UFast half = size >> 1; /* do we need to expand the buckets array? */ @@ -127,20 +127,22 @@ /* try to expand the buckets array _before_ splitting * the bucket lists */ - if ( p >= mask ) + if ( p == size ) { FT_Memory memory = cache->memory; FT_Error error; /* if we can't expand the array, leave immediately */ - if ( FT_RENEW_ARRAY( cache->buckets, - ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) ) + if ( FT_QRENEW_ARRAY( cache->buckets, size, size * 2 ) ) break; + + cache->mask = 2 * size - 1; + half = size; } - /* split a single bucket */ - pnode = cache->buckets + p; + /* the bucket to split */ + pnode = cache->buckets + p - half; for (;;) { @@ -148,7 +150,7 @@ if ( !node ) break; - if ( node->hash & ( mask + 1 ) ) + if ( node->hash & half ) { *pnode = node->link; node->link = new_list; @@ -158,56 +160,50 @@ pnode = &node->link; } - cache->buckets[p + mask + 1] = new_list; + cache->buckets[p] = new_list; cache->slack += FTC_HASH_MAX_LOAD; + cache->p = p + 1; - if ( p >= mask ) - { - cache->mask = 2 * mask + 1; - cache->p = 0; - } - else - cache->p = p + 1; + FT_TRACE2(( "ftc_cache_resize: cache %u increased to %u hashes\n", + cache->index, cache->p )); } /* do we need to shrink the buckets array? */ - else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD ) + else if ( cache->slack > (FT_Long)p * FTC_HASH_SUB_LOAD ) { - FT_UFast old_index = p + mask; - FTC_Node* pold; + FTC_Node old_list = cache->buckets[--p]; - if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) + if ( p < FTC_HASH_INITIAL_SIZE ) break; - if ( p == 0 ) + if ( p == half ) { FT_Memory memory = cache->memory; FT_Error error; /* if we can't shrink the array, leave immediately */ - if ( FT_QRENEW_ARRAY( cache->buckets, - ( mask + 1 ) * 2, mask + 1 ) ) + if ( FT_QRENEW_ARRAY( cache->buckets, size, half ) ) break; - cache->mask >>= 1; - p = cache->mask; + cache->mask = half - 1; } - else - p--; - pnode = cache->buckets + p; + /* the bucket to merge */ + pnode = cache->buckets + p - half; + while ( *pnode ) pnode = &(*pnode)->link; - pold = cache->buckets + old_index; - *pnode = *pold; - *pold = NULL; + *pnode = old_list; cache->slack -= FTC_HASH_MAX_LOAD; cache->p = p; + + FT_TRACE2(( "ftc_cache_resize: cache %u decreased to %u hashes\n", + cache->index, cache->p )); } /* otherwise, the hash table is balanced */ @@ -239,7 +235,7 @@ if ( node == node0 ) break; - pnode = &(*pnode)->link; + pnode = &node->link; } *pnode = node0->link; @@ -322,13 +318,6 @@ /*************************************************************************/ - FT_LOCAL_DEF( FT_Error ) - FTC_Cache_Init( FTC_Cache cache ) - { - return ftc_cache_init( cache ); - } - - FT_LOCAL_DEF( FT_Error ) ftc_cache_init( FTC_Cache cache ) { @@ -336,27 +325,35 @@ FT_Error error; - cache->p = 0; + cache->p = FTC_HASH_INITIAL_SIZE; cache->mask = FTC_HASH_INITIAL_SIZE - 1; cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; - FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ); + FT_MEM_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE ); return error; } - static void - FTC_Cache_Clear( FTC_Cache cache ) + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ) { - if ( cache && cache->buckets ) + return ftc_cache_init( cache ); + } + + + FT_LOCAL_DEF( void ) + ftc_cache_done( FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + + + if ( cache->buckets ) { FTC_Manager manager = cache->manager; + FT_UFast count = cache->p; FT_UFast i; - FT_UFast count; - count = cache->p + cache->mask + 1; - for ( i = 0; i < count; i++ ) { FTC_Node node = cache->buckets[i], next; @@ -376,30 +373,14 @@ cache->clazz.node_free( node, cache ); node = next; } - cache->buckets[i] = NULL; } - ftc_cache_resize( cache ); } - } + FT_FREE( cache->buckets ); - FT_LOCAL_DEF( void ) - ftc_cache_done( FTC_Cache cache ) - { - if ( cache->memory ) - { - FT_Memory memory = cache->memory; - - - FTC_Cache_Clear( cache ); - - FT_FREE( cache->buckets ); - cache->mask = 0; - cache->p = 0; - cache->slack = 0; - - cache->memory = NULL; - } + cache->p = 0; + cache->mask = 0; + cache->slack = 0; } @@ -562,12 +543,12 @@ FTC_Cache_RemoveFaceID( FTC_Cache cache, FTC_FaceID face_id ) { - FT_UFast i, count; FTC_Manager manager = cache->manager; FTC_Node frees = NULL; + FT_UFast count = cache->p; + FT_UFast i; - count = cache->p + cache->mask + 1; for ( i = 0; i < count; i++ ) { FTC_Node* pnode = cache->buckets + i; diff --git a/src/3rdparty/freetype/src/cache/ftccache.h b/src/3rdparty/freetype/src/cache/ftccache.h index 23bcb658..850d2554 100644 --- a/src/3rdparty/freetype/src/cache/ftccache.h +++ b/src/3rdparty/freetype/src/cache/ftccache.h @@ -72,11 +72,12 @@ FT_BEGIN_HEADER #define FTC_NODE_NEXT( x ) FTC_NODE( (x)->mru.next ) #define FTC_NODE_PREV( x ) FTC_NODE( (x)->mru.prev ) + /* address the hash table entries */ #ifdef FTC_INLINE -#define FTC_NODE_TOP_FOR_HASH( cache, hash ) \ - ( ( cache )->buckets + \ - ( ( ( ( hash ) & ( cache )->mask ) < ( cache )->p ) \ - ? ( ( hash ) & ( ( cache )->mask * 2 + 1 ) ) \ +#define FTC_NODE_TOP_FOR_HASH( cache, hash ) \ + ( ( cache )->buckets + \ + ( ( ( ( hash ) & ( cache )->mask ) >= ( cache )->p ) \ + ? ( ( hash ) & ( ( cache )->mask >> 1 ) ) \ : ( ( hash ) & ( cache )->mask ) ) ) #else FT_LOCAL( FTC_Node* ) @@ -139,11 +140,13 @@ FT_BEGIN_HEADER } FTC_CacheClassRec; - /* each cache really implements a dynamic hash table to manage its nodes */ + /* each cache really implements a hash table to manage its nodes */ + /* the number of the table entries (buckets) can change dynamically */ + /* each bucket contains a linked lists of nodes for a given hash */ typedef struct FTC_CacheRec_ { - FT_UFast p; - FT_UFast mask; + FT_UFast p; /* hash table counter */ + FT_UFast mask; /* hash table index range */ FT_Long slack; FTC_Node* buckets; diff --git a/src/3rdparty/freetype/src/cache/ftcglyph.c b/src/3rdparty/freetype/src/cache/ftcglyph.c index b3fb2f21..d344733f 100644 --- a/src/3rdparty/freetype/src/cache/ftcglyph.c +++ b/src/3rdparty/freetype/src/cache/ftcglyph.c @@ -79,20 +79,6 @@ } -#ifdef FTC_INLINE - - FT_LOCAL_DEF( FT_Bool ) - FTC_GNode_Compare( FTC_GNode gnode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - return ftc_gnode_compare( FTC_NODE( gnode ), gquery, - cache, list_changed ); - } - -#endif - /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -115,22 +101,22 @@ FT_LOCAL_DEF( FT_Error ) - ftc_gcache_init( FTC_Cache ftccache ) + ftc_gcache_init( FTC_Cache cache ) { - FTC_GCache cache = (FTC_GCache)ftccache; + FTC_GCache gcache = (FTC_GCache)cache; FT_Error error; - error = FTC_Cache_Init( FTC_CACHE( cache ) ); + error = FTC_Cache_Init( cache ); if ( !error ) { - FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; + FTC_GCacheClass clazz = (FTC_GCacheClass)cache->org_class; - FTC_MruList_Init( &cache->families, + FTC_MruList_Init( &gcache->families, clazz->family_class, 0, /* no maximum here! */ cache, - FTC_CACHE( cache )->memory ); + cache->memory ); } return error; @@ -140,31 +126,31 @@ #if 0 FT_LOCAL_DEF( FT_Error ) - FTC_GCache_Init( FTC_GCache cache ) + FTC_GCache_Init( FTC_GCache gcache ) { - return ftc_gcache_init( FTC_CACHE( cache ) ); + return ftc_gcache_init( FTC_CACHE( gcache ) ); } #endif /* 0 */ FT_LOCAL_DEF( void ) - ftc_gcache_done( FTC_Cache ftccache ) + ftc_gcache_done( FTC_Cache cache ) { - FTC_GCache cache = (FTC_GCache)ftccache; + FTC_GCache gcache = (FTC_GCache)cache; - FTC_Cache_Done( (FTC_Cache)cache ); - FTC_MruList_Done( &cache->families ); + FTC_Cache_Done( cache ); + FTC_MruList_Done( &gcache->families ); } #if 0 FT_LOCAL_DEF( void ) - FTC_GCache_Done( FTC_GCache cache ) + FTC_GCache_Done( FTC_GCache gcache ) { - ftc_gcache_done( FTC_CACHE( cache ) ); + ftc_gcache_done( FTC_CACHE( gcache ) ); } #endif /* 0 */ @@ -183,7 +169,7 @@ #ifndef FTC_INLINE FT_LOCAL_DEF( FT_Error ) - FTC_GCache_Lookup( FTC_GCache cache, + FTC_GCache_Lookup( FTC_GCache gcache, FT_Offset hash, FT_UInt gindex, FTC_GQuery query, @@ -204,7 +190,7 @@ /* out-of-memory condition occurs during glyph node initialization. */ family->num_nodes++; - error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); + error = FTC_Cache_Lookup( FTC_CACHE( gcache ), hash, query, anode ); if ( --family->num_nodes == 0 ) FTC_FAMILY_FREE( family, cache ); diff --git a/src/3rdparty/freetype/src/cache/ftcglyph.h b/src/3rdparty/freetype/src/cache/ftcglyph.h index 728d4db1..0181e981 100644 --- a/src/3rdparty/freetype/src/cache/ftcglyph.h +++ b/src/3rdparty/freetype/src/cache/ftcglyph.h @@ -58,7 +58,7 @@ * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: * my_node_new (must call FTC_GNode_Init) * my_node_free (must call FTC_GNode_Done) - * my_node_compare (must call FTC_GNode_Compare) + * my_node_compare (must call ftc_gnode_compare) * my_node_remove_faceid (must call ftc_gnode_unselect in case * of match) * @@ -179,19 +179,6 @@ FT_BEGIN_HEADER FT_UInt gindex, /* glyph index for node */ FTC_Family family ); -#ifdef FTC_INLINE - - /* returns TRUE iff the query's glyph index correspond to the node; */ - /* this assumes that the `family' and `hash' fields of the query are */ - /* already correctly set */ - FT_LOCAL( FT_Bool ) - FTC_GNode_Compare( FTC_GNode gnode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed ); - -#endif - /* call this function to clear a node's family -- this is necessary */ /* to implement the `node_remove_faceid' cache method correctly */ FT_LOCAL( void ) diff --git a/src/3rdparty/freetype/src/cache/ftcmanag.c b/src/3rdparty/freetype/src/cache/ftcmanag.c index 6c843391..94f8469c 100644 --- a/src/3rdparty/freetype/src/cache/ftcmanag.c +++ b/src/3rdparty/freetype/src/cache/ftcmanag.c @@ -426,7 +426,7 @@ memory = manager->memory; /* now discard all caches */ - for (idx = manager->num_caches; idx-- > 0; ) + for ( idx = manager->num_caches; idx-- > 0; ) { FTC_Cache cache = manager->caches[idx]; @@ -537,7 +537,7 @@ FT_LOCAL_DEF( void ) FTC_Manager_Compress( FTC_Manager manager ) { - FTC_Node node, first; + FTC_Node node, prev, first; if ( !manager ) @@ -557,20 +557,16 @@ return; /* go to last node -- it's a circular list */ - node = FTC_NODE_PREV( first ); + prev = FTC_NODE_PREV( first ); do { - FTC_Node prev; - - - prev = ( node == first ) ? NULL : FTC_NODE_PREV( node ); + node = prev; + prev = FTC_NODE_PREV( node ); if ( node->ref_count <= 0 ) ftc_node_destroy( node, manager ); - node = prev; - - } while ( node && manager->cur_weight > manager->max_weight ); + } while ( node != first && manager->cur_weight > manager->max_weight ); } @@ -633,20 +629,20 @@ FT_UInt count ) { FTC_Node first = manager->nodes_list; - FTC_Node node; - FT_UInt result; + FTC_Node prev, node; + FT_UInt result = 0; /* try to remove `count' nodes from the list */ - if ( !first ) /* empty list! */ - return 0; + if ( !first || !count ) + return result; - /* go to last node - it's a circular list */ - node = FTC_NODE_PREV(first); - for ( result = 0; result < count; ) + /* go to last node -- it's a circular list */ + prev = FTC_NODE_PREV( first ); + do { - FTC_Node prev = FTC_NODE_PREV( node ); - + node = prev; + prev = FTC_NODE_PREV( node ); /* don't touch locked nodes */ if ( node->ref_count <= 0 ) @@ -654,13 +650,9 @@ ftc_node_destroy( node, manager ); result++; } + } while ( node != first && result < count ); - if ( node == first ) - break; - - node = prev; - } - return result; + return result; } diff --git a/src/3rdparty/freetype/src/cache/ftcmru.c b/src/3rdparty/freetype/src/cache/ftcmru.c index 67227033..ad10a06b 100644 --- a/src/3rdparty/freetype/src/cache/ftcmru.c +++ b/src/3rdparty/freetype/src/cache/ftcmru.c @@ -329,29 +329,23 @@ FTC_MruNode_CompareFunc selection, FT_Pointer key ) { - FTC_MruNode first, node, next; + FTC_MruNode first = list->nodes; + FTC_MruNode prev, node; - first = list->nodes; - while ( first && ( !selection || selection( first, key ) ) ) + if ( !first || !selection ) + return; + + prev = first->prev; + do { - FTC_MruList_Remove( list, first ); - first = list->nodes; - } + node = prev; + prev = node->prev; - if ( first ) - { - node = first->next; - while ( node != first ) - { - next = node->next; + if ( selection( node, key ) ) + FTC_MruList_Remove( list, node ); - if ( selection( node, key ) ) - FTC_MruList_Remove( list, node ); - - node = next; - } - } + } while ( node != first ); } diff --git a/src/3rdparty/freetype/src/cache/ftcsbits.c b/src/3rdparty/freetype/src/cache/ftcsbits.c index ee9dab26..9929a0bc 100644 --- a/src/3rdparty/freetype/src/cache/ftcsbits.c +++ b/src/3rdparty/freetype/src/cache/ftcsbits.c @@ -342,7 +342,7 @@ FT_Bool result; - if (list_changed) + if ( list_changed ) *list_changed = FALSE; result = FT_BOOL( gnode->family == gquery->family && gindex - gnode->gindex < snode->count ); @@ -411,19 +411,4 @@ return result; } - -#ifdef FTC_INLINE - - FT_LOCAL_DEF( FT_Bool ) - FTC_SNode_Compare( FTC_SNode snode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed ) - { - return ftc_snode_compare( FTC_NODE( snode ), gquery, - cache, list_changed ); - } - -#endif - /* END */ diff --git a/src/3rdparty/freetype/src/cache/ftcsbits.h b/src/3rdparty/freetype/src/cache/ftcsbits.h index 3473923f..e833cb5c 100644 --- a/src/3rdparty/freetype/src/cache/ftcsbits.h +++ b/src/3rdparty/freetype/src/cache/ftcsbits.h @@ -81,17 +81,6 @@ FT_BEGIN_HEADER FTC_SNode_Weight( FTC_SNode inode ); #endif - -#ifdef FTC_INLINE - - FT_LOCAL( FT_Bool ) - FTC_SNode_Compare( FTC_SNode snode, - FTC_GQuery gquery, - FTC_Cache cache, - FT_Bool* list_changed); - -#endif - /* */ FT_END_HEADER diff --git a/src/3rdparty/freetype/src/cff/cffcmap.c b/src/3rdparty/freetype/src/cff/cffcmap.c index 6ed31432..10d287bc 100644 --- a/src/3rdparty/freetype/src/cff/cffcmap.c +++ b/src/3rdparty/freetype/src/cff/cffcmap.c @@ -32,9 +32,10 @@ /*************************************************************************/ FT_CALLBACK_DEF( FT_Error ) - cff_cmap_encoding_init( CFF_CMapStd cmap, - FT_Pointer pointer ) + cff_cmap_encoding_init( FT_CMap cmap, + FT_Pointer pointer ) { + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); CFF_Font cff = (CFF_Font)face->extra.data; CFF_Encoding encoding = &cff->encoding; @@ -42,63 +43,56 @@ FT_UNUSED( pointer ); - cmap->gids = encoding->codes; + cffcmap->gids = encoding->codes; return 0; } FT_CALLBACK_DEF( void ) - cff_cmap_encoding_done( CFF_CMapStd cmap ) + cff_cmap_encoding_done( FT_CMap cmap ) { - cmap->gids = NULL; + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + + + cffcmap->gids = NULL; } FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_encoding_char_index( CFF_CMapStd cmap, - FT_UInt32 char_code ) + cff_cmap_encoding_char_index( FT_CMap cmap, + FT_UInt32 char_code ) { - FT_UInt result = 0; + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + FT_UInt result = 0; if ( char_code < 256 ) - result = cmap->gids[char_code]; + result = cffcmap->gids[char_code]; return result; } - FT_CALLBACK_DEF( FT_UInt32 ) - cff_cmap_encoding_char_next( CFF_CMapStd cmap, - FT_UInt32 *pchar_code ) + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_next( FT_CMap cmap, + FT_UInt32 *pchar_code ) { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code; + CFF_CMapStd cffcmap = (CFF_CMapStd)cmap; + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; - *pchar_code = 0; - - if ( char_code < 255 ) + while ( char_code < 255 ) { - FT_UInt code = (FT_UInt)( char_code + 1 ); - - - for (;;) + result = cffcmap->gids[++char_code]; + if ( result ) { - if ( code >= 256 ) - break; - - result = cmap->gids[code]; - if ( result != 0 ) - { - *pchar_code = code; - break; - } - - code++; + *pchar_code = char_code; + break; } } + return result; } @@ -130,9 +124,10 @@ /*************************************************************************/ FT_CALLBACK_DEF( const char* ) - cff_sid_to_glyph_name( TT_Face face, + cff_sid_to_glyph_name( void* face_, /* TT_Face */ FT_UInt idx ) { + TT_Face face = (TT_Face)face_; CFF_Font cff = (CFF_Font)face->extra.data; CFF_Charset charset = &cff->charset; FT_UInt sid = charset->sids[idx]; @@ -143,14 +138,15 @@ FT_CALLBACK_DEF( FT_Error ) - cff_cmap_unicode_init( PS_Unicodes unicodes, + cff_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ FT_Pointer pointer ) { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - CFF_Font cff = (CFF_Font)face->extra.data; - CFF_Charset charset = &cff->charset; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; FT_UNUSED( pointer ); @@ -166,17 +162,18 @@ return psnames->unicodes_init( memory, unicodes, cff->num_glyphs, - (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, + &cff_sid_to_glyph_name, (PS_FreeGlyphNameFunc)NULL, (FT_Pointer)face ); } FT_CALLBACK_DEF( void ) - cff_cmap_unicode_done( PS_Unicodes unicodes ) + cff_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); + PS_Unicodes unicodes = (PS_Unicodes)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); FT_FREE( unicodes->maps ); @@ -185,25 +182,27 @@ FT_CALLBACK_DEF( FT_UInt ) - cff_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) + cff_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 char_code ) { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; return psnames->unicodes_char_index( unicodes, char_code ); } - FT_CALLBACK_DEF( FT_UInt32 ) - cff_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 *pchar_code ) { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; return psnames->unicodes_char_next( unicodes, pchar_code ); diff --git a/src/3rdparty/freetype/src/cff/cffdrivr.c b/src/3rdparty/freetype/src/cff/cffdrivr.c index 4e2e0e00..9898d625 100644 --- a/src/3rdparty/freetype/src/cff/cffdrivr.c +++ b/src/3rdparty/freetype/src/cff/cffdrivr.c @@ -108,20 +108,20 @@ * They can be implemented by format-specific interfaces. */ FT_CALLBACK_DEF( FT_Error ) - cff_get_kerning( FT_Face ttface, /* TT_Face */ + cff_get_kerning( FT_Face face, /* CFF_Face */ FT_UInt left_glyph, FT_UInt right_glyph, FT_Vector* kerning ) { - TT_Face face = (TT_Face)ttface; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + CFF_Face cffface = (CFF_Face)face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; kerning->x = 0; kerning->y = 0; if ( sfnt ) - kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + kerning->x = sfnt->get_kerning( cffface, left_glyph, right_glyph ); return FT_Err_Ok; } @@ -158,23 +158,23 @@ * FreeType error code. 0 means success. */ FT_CALLBACK_DEF( FT_Error ) - cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ - FT_Size cffsize, /* CFF_Size */ + cff_glyph_load( FT_GlyphSlot slot, /* CFF_GlyphSlot */ + FT_Size size, /* CFF_Size */ FT_UInt glyph_index, FT_Int32 load_flags ) { FT_Error error; - CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; - CFF_Size size = (CFF_Size)cffsize; + CFF_GlyphSlot cffslot = (CFF_GlyphSlot)slot; + CFF_Size cffsize = (CFF_Size)size; - if ( !slot ) + if ( !cffslot ) return FT_THROW( Invalid_Slot_Handle ); FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index )); /* check whether we want a scaled outline or bitmap */ - if ( !size ) + if ( !cffsize ) load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; /* reset the size object if necessary */ @@ -184,12 +184,12 @@ if ( size ) { /* these two objects must have the same parent */ - if ( cffsize->face != cffslot->face ) + if ( size->face != slot->face ) return FT_THROW( Invalid_Face_Handle ); } /* now load the glyph outline if necessary */ - error = cff_slot_load( slot, size, glyph_index, load_flags ); + error = cff_slot_load( cffslot, cffsize, glyph_index, load_flags ); /* force drop-out mode to 2 - irrelevant now */ /* slot->outline.dropout_mode = 2; */ @@ -216,7 +216,7 @@ /* it is no longer necessary that those values are identical to */ /* the values in the `CFF' table */ - TT_Face ttface = (TT_Face)face; + CFF_Face cffface = (CFF_Face)face; FT_Short dummy; @@ -225,7 +225,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT /* no fast retrieval for blended MM fonts without VVAR table */ if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && - !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + !( cffface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) return FT_THROW( Unimplemented_Feature ); #endif @@ -233,7 +233,7 @@ /* otherwise we extract the info from the CFF glyphstrings */ /* (instead of synthesizing a global value using the `OS/2' */ /* table) */ - if ( !ttface->vertical_info ) + if ( !cffface->vertical_info ) goto Missing_Table; for ( nn = 0; nn < count; nn++ ) @@ -241,11 +241,11 @@ FT_UShort ah; - ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, - 1, - start + nn, - &dummy, - &ah ); + ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface, + 1, + start + nn, + &dummy, + &ah ); FT_TRACE5(( " idx %d: advance height %d font unit%s\n", start + nn, @@ -259,12 +259,12 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT /* no fast retrieval for blended MM fonts without HVAR table */ if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && - !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + !( cffface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) return FT_THROW( Unimplemented_Feature ); #endif /* check whether we have data from the `hmtx' table at all */ - if ( !ttface->horizontal.number_Of_HMetrics ) + if ( !cffface->horizontal.number_Of_HMetrics ) goto Missing_Table; for ( nn = 0; nn < count; nn++ ) @@ -272,11 +272,11 @@ FT_UShort aw; - ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, - 0, - start + nn, - &dummy, - &aw ); + ( (SFNT_Service)cffface->sfnt )->get_metrics( cffface, + 0, + start + nn, + &dummy, + &aw ); FT_TRACE5(( " idx %d: advance width %d font unit%s\n", start + nn, @@ -312,13 +312,14 @@ * */ - static FT_Error - cff_get_glyph_name( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_glyph_name( FT_Face face, /* CFF_Face */ FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ) { - CFF_Font font = (CFF_Font)face->extra.data; + CFF_Face cffface = (CFF_Face)face; + CFF_Font font = (CFF_Font)cffface->extra.data; FT_String* gname; FT_UShort sid; FT_Error error; @@ -338,10 +339,7 @@ if ( service && service->get_name ) - return service->get_name( FT_FACE( face ), - glyph_index, - buffer, - buffer_max ); + return service->get_name( face, glyph_index, buffer, buffer_max ); else { FT_ERROR(( "cff_get_glyph_name:" @@ -366,7 +364,7 @@ /* first, locate the sid in the charset table */ sid = font->charset.sids[glyph_index]; - /* now, lookup the name itself */ + /* now, look up the name itself */ gname = cff_index_get_sid_string( font, sid ); if ( gname ) @@ -379,21 +377,19 @@ } - static FT_UInt - cff_get_name_index( CFF_Face face, + FT_CALLBACK_DEF( FT_UInt ) + cff_get_name_index( FT_Face face, /* CFF_Face */ const FT_String* glyph_name ) { - CFF_Font cff; - CFF_Charset charset; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + CFF_Charset charset = &cff->charset; FT_Service_PsCMaps psnames; FT_String* name; FT_UShort sid; FT_UInt i; - cff = (CFF_FontRec *)face->extra.data; - charset = &cff->charset; - /* CFF2 table does not have glyph names; */ /* we need to use `post' table method */ if ( cff->version_major == 2 ) @@ -408,7 +404,7 @@ if ( service && service->name_index ) - return service->name_index( FT_FACE( face ), glyph_name ); + return service->name_index( face, glyph_name ); else { FT_ERROR(( "cff_get_name_index:" @@ -446,8 +442,8 @@ FT_DEFINE_SERVICE_GLYPHDICTREC( cff_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, /* get_name */ - (FT_GlyphDict_NameIndexFunc)cff_get_name_index /* name_index */ + cff_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */ + cff_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */ ) @@ -456,25 +452,32 @@ * */ - static FT_Int + FT_CALLBACK_DEF( FT_Int ) cff_ps_has_glyph_names( FT_Face face ) { return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; } - static FT_Error - cff_ps_get_font_info( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_ps_get_font_info( FT_Face face, /* CFF_Face */ PS_FontInfoRec* afont_info ) { - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + FT_Error error = FT_Err_Ok; + if ( cffface->is_cff2 ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + if ( cff && !cff->font_info ) { CFF_FontRecDict dict = &cff->top_font.font_dict; - FT_Memory memory = face->root.memory; + FT_Memory memory = FT_FACE_MEMORY( face ); PS_FontInfoRec* font_info = NULL; @@ -507,18 +510,19 @@ } - static FT_Error - cff_ps_get_font_extra( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_ps_get_font_extra( FT_Face face, /* CFF_Face */ PS_FontExtraRec* afont_extra ) { - CFF_Font cff = (CFF_Font)face->extra.data; - FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + FT_Error error = FT_Err_Ok; if ( cff && !cff->font_extra ) { CFF_FontRecDict dict = &cff->top_font.font_dict; - FT_Memory memory = face->root.memory; + FT_Memory memory = FT_FACE_MEMORY( face ); PS_FontExtraRec* font_extra = NULL; FT_String* embedded_postscript; @@ -588,13 +592,13 @@ FT_DEFINE_SERVICE_PSINFOREC( cff_service_ps_info, - (PS_GetFontInfoFunc) cff_ps_get_font_info, /* ps_get_font_info */ - (PS_GetFontExtraFunc) cff_ps_get_font_extra, /* ps_get_font_extra */ - (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, /* ps_has_glyph_names */ + cff_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */ + cff_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */ + cff_ps_has_glyph_names, /* PS_HasGlyphNamesFunc ps_has_glyph_names */ /* unsupported with CFF fonts */ - (PS_GetFontPrivateFunc)NULL, /* ps_get_font_private */ + NULL, /* PS_GetFontPrivateFunc ps_get_font_private */ /* not implemented */ - (PS_GetFontValueFunc) NULL /* ps_get_font_value */ + NULL /* PS_GetFontValueFunc ps_get_font_value */ ) @@ -603,17 +607,18 @@ * */ - static const char* - cff_get_ps_name( CFF_Face face ) + FT_CALLBACK_DEF( const char* ) + cff_get_ps_name( FT_Face face ) /* CFF_Face */ { - CFF_Font cff = (CFF_Font)face->extra.data; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; /* following the OpenType specification 1.7, we return the name stored */ /* in the `name' table for a CFF wrapped into an SFNT container */ - if ( FT_IS_SFNT( FT_FACE( face ) ) && sfnt ) + if ( FT_IS_SFNT( face ) && sfnt ) { FT_Library library = FT_FACE_LIBRARY( face ); FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); @@ -625,17 +630,17 @@ if ( service && service->get_ps_font_name ) - return service->get_ps_font_name( FT_FACE( face ) ); + return service->get_ps_font_name( face ); } - return (const char*)cff->font_name; + return cff ? (const char*)cff->font_name : NULL; } FT_DEFINE_SERVICE_PSFONTNAMEREC( cff_service_ps_name, - (FT_PsName_GetFunc)cff_get_ps_name /* get_ps_font_name */ + cff_get_ps_name /* FT_PsName_GetFunc get_ps_font_name */ ) @@ -649,7 +654,7 @@ * Otherwise call the service function in the sfnt module. * */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) cff_get_cmap_info( FT_CharMap charmap, TT_CMapInfo *cmap_info ) { @@ -683,7 +688,7 @@ FT_DEFINE_SERVICE_TTCMAPSREC( cff_service_get_cmap_info, - (TT_CMap_Info_GetFunc)cff_get_cmap_info /* get_cmap_info */ + cff_get_cmap_info /* TT_CMap_Info_GetFunc get_cmap_info */ ) @@ -691,14 +696,15 @@ * CID INFO SERVICE * */ - static FT_Error - cff_get_ros( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_ros( FT_Face face, /* FT_Face */ const char* *registry, const char* *ordering, FT_Int *supplement ) { - FT_Error error = FT_Err_Ok; - CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; if ( cff ) @@ -748,12 +754,13 @@ } - static FT_Error - cff_get_is_cid( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_is_cid( FT_Face face, /* CFF_Face */ FT_Bool *is_cid ) { - FT_Error error = FT_Err_Ok; - CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; *is_cid = 0; @@ -771,17 +778,16 @@ } - static FT_Error - cff_get_cid_from_glyph_index( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_cid_from_glyph_index( FT_Face face, /* CFF_Face */ FT_UInt glyph_index, FT_UInt *cid ) { - FT_Error error = FT_Err_Ok; - CFF_Font cff; + FT_Error error = FT_Err_Ok; + CFF_Face cffface = (CFF_Face)face; + CFF_Font cff = (CFF_Font)cffface->extra.data; - cff = (CFF_Font)face->extra.data; - if ( cff ) { FT_UInt c; @@ -814,12 +820,12 @@ FT_DEFINE_SERVICE_CIDREC( cff_service_cid_info, - (FT_CID_GetRegistryOrderingSupplementFunc) - cff_get_ros, /* get_ros */ - (FT_CID_GetIsInternallyCIDKeyedFunc) - cff_get_is_cid, /* get_is_cid */ - (FT_CID_GetCIDFromGlyphIndexFunc) - cff_get_cid_from_glyph_index /* get_cid_from_glyph_index */ + cff_get_ros, + /* FT_CID_GetRegistryOrderingSupplementFunc get_ros */ + cff_get_is_cid, + /* FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid */ + cff_get_cid_from_glyph_index + /* FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index */ ) @@ -831,9 +837,9 @@ FT_DEFINE_SERVICE_PROPERTIESREC( cff_service_properties, - (FT_Properties_SetFunc)ps_property_set, /* set_property */ - (FT_Properties_GetFunc)ps_property_get ) /* get_property */ - + ps_property_set, /* FT_Properties_SetFunc set_property */ + ps_property_get /* FT_Properties_GetFunc get_property */ + ) #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT @@ -842,160 +848,195 @@ * */ - static FT_Error - cff_set_mm_blend( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_set_mm_blend( FT_Face face, /* CFF_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->set_mm_blend( FT_FACE( face ), num_coords, coords ); + return mm->set_mm_blend( face, num_coords, coords ); } - static FT_Error - cff_get_mm_blend( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_mm_blend( FT_Face face, /* CFF_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->get_mm_blend( FT_FACE( face ), num_coords, coords ); + return mm->get_mm_blend( face, num_coords, coords ); } - static FT_Error - cff_set_mm_weightvector( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_set_mm_weightvector( FT_Face face, /* CFF_Face */ FT_UInt len, FT_Fixed* weightvector ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->set_mm_weightvector( FT_FACE( face ), len, weightvector ); + return mm->set_mm_weightvector( face, len, weightvector ); } - static FT_Error - cff_get_mm_weightvector( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_mm_weightvector( FT_Face face, /* CFF_Face */ FT_UInt* len, FT_Fixed* weightvector ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->get_mm_weightvector( FT_FACE( face ), len, weightvector ); + return mm->get_mm_weightvector( face, len, weightvector ); } - static FT_Error - cff_get_mm_var( CFF_Face face, + FT_CALLBACK_DEF( void ) + cff_construct_ps_name( FT_Face face ) /* CFF_Face */ + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + mm->construct_ps_name( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_mm_var( FT_Face face, /* CFF_Face */ FT_MM_Var* *master ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->get_mm_var( FT_FACE( face ), master ); + return mm->get_mm_var( face, master ); } - static FT_Error - cff_set_var_design( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_set_var_design( FT_Face face, /* CFF_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->set_var_design( FT_FACE( face ), num_coords, coords ); + return mm->set_var_design( face, num_coords, coords ); } - static FT_Error - cff_get_var_design( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_var_design( FT_Face face, /* CFF_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->get_var_design( FT_FACE( face ), num_coords, coords ); + return mm->get_var_design( face, num_coords, coords ); } - static FT_Error - cff_set_instance( CFF_Face face, - FT_UInt instance_index ) + FT_CALLBACK_DEF( FT_Error ) + cff_set_named_instance( FT_Face face, /* CFF_Face */ + FT_UInt instance_index ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->set_instance( FT_FACE( face ), instance_index ); + return mm->set_named_instance( face, instance_index ); } - static FT_Error - cff_load_item_variation_store( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_get_default_named_instance( FT_Face face, /* CFF_Face */ + FT_UInt *instance_index ) + { + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; + + + return mm->get_default_named_instance( face, instance_index ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_load_item_variation_store( FT_Face face, /* CFF_Face */ FT_ULong offset, GX_ItemVarStore itemStore ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->load_item_var_store( FT_FACE(face), offset, itemStore ); + return mm->load_item_var_store( face, offset, itemStore ); } - static FT_Error - cff_load_delta_set_index_mapping( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_load_delta_set_index_mapping( FT_Face face, /* CFF_Face */ FT_ULong offset, GX_DeltaSetIdxMap map, GX_ItemVarStore itemStore, FT_ULong table_len ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->load_delta_set_idx_map( FT_FACE( face ), offset, map, + return mm->load_delta_set_idx_map( face, offset, map, itemStore, table_len ); } - static FT_Int - cff_get_item_delta( CFF_Face face, + FT_CALLBACK_DEF( FT_Int ) + cff_get_item_delta( FT_Face face, /* CFF_Face */ GX_ItemVarStore itemStore, FT_UInt outerIndex, FT_UInt innerIndex ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->get_item_delta( FT_FACE( face ), itemStore, - outerIndex, innerIndex ); + return mm->get_item_delta( face, itemStore, outerIndex, innerIndex ); } - static void - cff_done_item_variation_store( CFF_Face face, + FT_CALLBACK_DEF( void ) + cff_done_item_variation_store( FT_Face face, /* CFF_Face */ GX_ItemVarStore itemStore ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - mm->done_item_var_store( FT_FACE( face ), itemStore ); + mm->done_item_var_store( face, itemStore ); } - static void - cff_done_delta_set_index_map( CFF_Face face, + FT_CALLBACK_DEF( void ) + cff_done_delta_set_index_map( FT_Face face, /* CFF_Face */ GX_DeltaSetIdxMap deltaSetIdxMap ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - mm->done_delta_set_idx_map( FT_FACE ( face ), deltaSetIdxMap ); + mm->done_delta_set_idx_map( face, deltaSetIdxMap ); } @@ -1003,36 +1044,35 @@ FT_DEFINE_SERVICE_MULTIMASTERSREC( cff_service_multi_masters, - (FT_Get_MM_Func) NULL, /* get_mm */ - (FT_Set_MM_Design_Func) NULL, /* set_mm_design */ - (FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */ - (FT_Get_MM_Blend_Func) cff_get_mm_blend, /* get_mm_blend */ - (FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */ - (FT_Set_Var_Design_Func)cff_set_var_design, /* set_var_design */ - (FT_Get_Var_Design_Func)cff_get_var_design, /* get_var_design */ - (FT_Set_Instance_Func) cff_set_instance, /* set_instance */ - (FT_Set_MM_WeightVector_Func) - cff_set_mm_weightvector, - /* set_mm_weightvector */ - (FT_Get_MM_WeightVector_Func) - cff_get_mm_weightvector, - /* get_mm_weightvector */ - (FT_Var_Load_Delta_Set_Idx_Map_Func) - cff_load_delta_set_index_mapping, - /* load_delta_set_idx_map */ - (FT_Var_Load_Item_Var_Store_Func) - cff_load_item_variation_store, - /* load_item_variation_store */ - (FT_Var_Get_Item_Delta_Func) - cff_get_item_delta, /* get_item_delta */ - (FT_Var_Done_Item_Var_Store_Func) - cff_done_item_variation_store, - /* done_item_variation_store */ - (FT_Var_Done_Delta_Set_Idx_Map_Func) - cff_done_delta_set_index_map, - /* done_delta_set_index_map */ - (FT_Get_Var_Blend_Func) cff_get_var_blend, /* get_var_blend */ - (FT_Done_Blend_Func) cff_done_blend /* done_blend */ + NULL, /* FT_Get_MM_Func get_mm */ + NULL, /* FT_Set_MM_Design_Func set_mm_design */ + cff_set_mm_blend, /* FT_Set_MM_Blend_Func set_mm_blend */ + cff_get_mm_blend, /* FT_Get_MM_Blend_Func get_mm_blend */ + cff_get_mm_var, /* FT_Get_MM_Var_Func get_mm_var */ + cff_set_var_design, /* FT_Set_Var_Design_Func set_var_design */ + cff_get_var_design, /* FT_Get_Var_Design_Func get_var_design */ + cff_set_named_instance, + /* FT_Set_Named_Instance_Func set_named_instance */ + cff_get_default_named_instance, + /* FT_Get_Default_Named_Instance_Func get_default_named_instance */ + cff_set_mm_weightvector, + /* FT_Set_MM_WeightVector_Func set_mm_weightvector */ + cff_get_mm_weightvector, + /* FT_Get_MM_WeightVector_Func get_mm_weightvector */ + cff_construct_ps_name, + /* FT_Construct_PS_Name_Func construct_ps_name */ + cff_load_delta_set_index_mapping, + /* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */ + cff_load_item_variation_store, + /* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */ + cff_get_item_delta, + /* FT_Var_Get_Item_Delta_Func get_item_delta */ + cff_done_item_variation_store, + /* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */ + cff_done_delta_set_index_map, + /* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */ + cff_get_var_blend, /* FT_Get_Var_Blend_Func get_var_blend */ + cff_done_blend /* FT_Done_Blend_Func done_blend */ ) @@ -1041,41 +1081,46 @@ * */ - static FT_Error - cff_hadvance_adjust( CFF_Face face, + FT_CALLBACK_DEF( FT_Error ) + cff_hadvance_adjust( FT_Face face, /* CFF_Face */ FT_UInt gindex, FT_Int *avalue ) { - FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MetricsVariations + var = (FT_Service_MetricsVariations)cffface->tt_var; - return var->hadvance_adjust( FT_FACE( face ), gindex, avalue ); + return var->hadvance_adjust( face, gindex, avalue ); } - static void - cff_metrics_adjust( CFF_Face face ) + FT_CALLBACK_DEF( void ) + cff_metrics_adjust( FT_Face face ) /* CFF_Face */ { - FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MetricsVariations + var = (FT_Service_MetricsVariations)cffface->tt_var; - var->metrics_adjust( FT_FACE( face ) ); + var->metrics_adjust( face ); } FT_DEFINE_SERVICE_METRICSVARIATIONSREC( cff_service_metrics_variations, - (FT_HAdvance_Adjust_Func)cff_hadvance_adjust, /* hadvance_adjust */ - (FT_LSB_Adjust_Func) NULL, /* lsb_adjust */ - (FT_RSB_Adjust_Func) NULL, /* rsb_adjust */ + cff_hadvance_adjust, /* FT_HAdvance_Adjust_Func hadvance_adjust */ + NULL, /* FT_LSB_Adjust_Func lsb_adjust */ + NULL, /* FT_RSB_Adjust_Func rsb_adjust */ - (FT_VAdvance_Adjust_Func)NULL, /* vadvance_adjust */ - (FT_TSB_Adjust_Func) NULL, /* tsb_adjust */ - (FT_BSB_Adjust_Func) NULL, /* bsb_adjust */ - (FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */ + NULL, /* FT_VAdvance_Adjust_Func vadvance_adjust */ + NULL, /* FT_TSB_Adjust_Func tsb_adjust */ + NULL, /* FT_BSB_Adjust_Func bsb_adjust */ + NULL, /* FT_VOrg_Adjust_Func vorg_adjust */ - (FT_Metrics_Adjust_Func) cff_metrics_adjust /* metrics_adjust */ + cff_metrics_adjust, /* FT_Metrics_Adjust_Func metrics_adjust */ + NULL /* FT_Size_Reset_Func size_reset */ ) #endif @@ -1088,11 +1133,11 @@ FT_DEFINE_SERVICE_CFFLOADREC( cff_service_cff_load, - (FT_Get_Standard_Encoding_Func)cff_get_standard_encoding, - (FT_Load_Private_Dict_Func) cff_load_private_dict, - (FT_FD_Select_Get_Func) cff_fd_select_get, - (FT_Blend_Check_Vector_Func) cff_blend_check_vector, - (FT_Blend_Build_Vector_Func) cff_blend_build_vector + cff_get_standard_encoding, /* FT_Get_Standard_Encoding_Func get_standard_encoding */ + cff_load_private_dict, /* FT_Load_Private_Dict_Func load_private_dict */ + cff_fd_select_get, /* FT_FD_Select_Get_Func fd_select_get */ + cff_blend_check_vector, /* FT_Blend_Check_Vector_Func blend_check_vector */ + cff_blend_build_vector /* FT_Blend_Build_Vector_Func blend_build_vector */ ) diff --git a/src/3rdparty/freetype/src/cff/cffgload.c b/src/3rdparty/freetype/src/cff/cffgload.c index cfa0aaf2..c483d1d1 100644 --- a/src/3rdparty/freetype/src/cff/cffgload.c +++ b/src/3rdparty/freetype/src/cff/cffgload.c @@ -356,14 +356,16 @@ #ifdef FT_CONFIG_OPTION_SVG /* check for OT-SVG */ - if ( ( load_flags & FT_LOAD_COLOR ) && face->svg ) + if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 && + ( load_flags & FT_LOAD_COLOR ) && + face->svg ) { /* * We load the SVG document and try to grab the advances from the * table. For the bearings we rely on the presetting hook to do that. */ - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; if ( size && (size->root.metrics.x_ppem < 1 || diff --git a/src/3rdparty/freetype/src/cff/cffload.c b/src/3rdparty/freetype/src/cff/cffload.c index 4b8c6e16..af79082e 100644 --- a/src/3rdparty/freetype/src/cff/cffload.c +++ b/src/3rdparty/freetype/src/cff/cffload.c @@ -400,7 +400,7 @@ /* Allocate a table containing pointers to an index's elements. */ /* The `pool' argument makes this function convert the index */ - /* entries to C-style strings (this is, null-terminated). */ + /* entries to C-style strings (that is, null-terminated). */ static FT_Error cff_index_get_pointers( CFF_Index idx, FT_Byte*** table, @@ -1361,14 +1361,15 @@ for ( i = 0; i < numBlends; i++ ) { const FT_Int32* weight = &blend->BV[1]; - FT_UInt32 sum; + FT_Fixed sum; - /* convert inputs to 16.16 fixed-point */ - sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000; + /* convert inputs to 16.16 fixed point */ + sum = cff_parse_fixed( parser, &parser->stack[i + base] ); for ( j = 1; j < blend->lenBV; j++ ) - sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++; + sum += FT_MulFix( cff_parse_fixed( parser, &parser->stack[delta++] ), + *weight++ ); /* point parser stack to new value on blend_stack */ parser->stack[i + base] = subFont->blend_top; @@ -1589,16 +1590,17 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_LOCAL_DEF( FT_Error ) - cff_get_var_blend( CFF_Face face, + cff_get_var_blend( FT_Face face, /* CFF_Face */ FT_UInt *num_coords, FT_Fixed* *coords, FT_Fixed* *normalizedcoords, FT_MM_Var* *mm_var ) { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - return mm->get_var_blend( FT_FACE( face ), + return mm->get_var_blend( face, num_coords, coords, normalizedcoords, @@ -1607,13 +1609,14 @@ FT_LOCAL_DEF( void ) - cff_done_blend( CFF_Face face ) + cff_done_blend( FT_Face face ) /* CFF_Face */ { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + CFF_Face cffface = (CFF_Face)face; + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)cffface->mm; - if (mm) - mm->done_blend( FT_FACE( face ) ); + if ( mm ) + mm->done_blend( face ); } #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ @@ -1650,13 +1653,6 @@ goto Exit; } - /* Zero out the code to gid/sid mappings. */ - for ( j = 0; j < 256; j++ ) - { - encoding->sids [j] = 0; - encoding->codes[j] = 0; - } - /* Note: The encoding table in a CFF font is indexed by glyph index; */ /* the first encoded glyph index is 1. Hence, we read the character */ /* code (`glyph_code') at index j and make the assignment: */ @@ -1671,6 +1667,10 @@ if ( offset > 1 ) { + /* Zero out the code to gid/sid mappings. */ + FT_ARRAY_ZERO( encoding->sids, 256 ); + FT_ARRAY_ZERO( encoding->codes, 256 ); + encoding->offset = base_offset + offset; /* we need to parse the table to determine its size */ @@ -2012,7 +2012,7 @@ /* Top and Font DICTs are not allowed to have blend operators. */ error = cff_parser_init( &parser, code, - &subfont->font_dict, + top, font->library, stackSize, 0, diff --git a/src/3rdparty/freetype/src/cff/cffload.h b/src/3rdparty/freetype/src/cff/cffload.h index 5a41cdeb..b5286b0c 100644 --- a/src/3rdparty/freetype/src/cff/cffload.h +++ b/src/3rdparty/freetype/src/cff/cffload.h @@ -105,14 +105,14 @@ FT_BEGIN_HEADER #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_LOCAL( FT_Error ) - cff_get_var_blend( CFF_Face face, + cff_get_var_blend( FT_Face face, FT_UInt *num_coords, FT_Fixed* *coords, FT_Fixed* *normalizedcoords, FT_MM_Var* *mm_var ); FT_LOCAL( void ) - cff_done_blend( CFF_Face face ); + cff_done_blend( FT_Face face ); #endif diff --git a/src/3rdparty/freetype/src/cff/cffobjs.c b/src/3rdparty/freetype/src/cff/cffobjs.c index 40cd9bf9..6d08620c 100644 --- a/src/3rdparty/freetype/src/cff/cffobjs.c +++ b/src/3rdparty/freetype/src/cff/cffobjs.c @@ -69,8 +69,8 @@ FT_Module module; - module = FT_Get_Module( size->root.face->driver->root.library, - "pshinter" ); + module = FT_Get_Module( font->library, "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) ? pshinter->get_globals_funcs( module ) : 0; @@ -182,8 +182,7 @@ goto Exit; cff_make_private_dict( &font->top_font, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->topfont ); + error = funcs->create( memory, &priv, &internal->topfont ); if ( error ) goto Exit; @@ -193,8 +192,7 @@ cff_make_private_dict( sub, &priv ); - error = funcs->create( cffsize->face->memory, &priv, - &internal->subfonts[i - 1] ); + error = funcs->create( memory, &priv, &internal->subfonts[i - 1] ); if ( error ) goto Exit; } @@ -381,8 +379,7 @@ FT_Module module; - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); + module = FT_Get_Module( slot->library, "pshinter" ); if ( module ) { T2_Hints_Funcs funcs; @@ -722,22 +719,15 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT { - FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; - FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; - FT_UInt instance_index = (FT_UInt)face_index >> 16; if ( FT_HAS_MULTIPLE_MASTERS( cffface ) && - mm && instance_index > 0 ) { - error = mm->set_instance( cffface, instance_index ); + error = FT_Set_Named_Instance( cffface, instance_index ); if ( error ) goto Exit; - - if ( var ) - var->metrics_adjust( cffface ); } } #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ @@ -1160,7 +1150,7 @@ } #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - cff_done_blend( face ); + cff_done_blend( cffface ); face->blend = NULL; #endif } diff --git a/src/3rdparty/freetype/src/cff/cffparse.c b/src/3rdparty/freetype/src/cff/cffparse.c index e16206fd..3b076704 100644 --- a/src/3rdparty/freetype/src/cff/cffparse.c +++ b/src/3rdparty/freetype/src/cff/cffparse.c @@ -63,10 +63,7 @@ /* allocate the stack buffer */ if ( FT_QNEW_ARRAY( parser->stack, stackSize ) ) - { - FT_FREE( parser->stack ); goto Exit; - } parser->stackSize = stackSize; parser->top = parser->stack; /* empty stack */ @@ -76,23 +73,6 @@ } -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - static void - finalize_t2_strings( FT_Memory memory, - void* data, - void* user ) - { - CFF_T2_String t2 = (CFF_T2_String)data; - - - FT_UNUSED( user ); - - memory->free( memory, t2->start ); - memory->free( memory, data ); - } -#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ - - FT_LOCAL_DEF( void ) cff_parser_done( CFF_Parser parser ) { @@ -102,63 +82,19 @@ FT_FREE( parser->stack ); #ifdef CFF_CONFIG_OPTION_OLD_ENGINE - FT_List_Finalize( &parser->t2_strings, - finalize_t2_strings, - memory, - NULL ); + FT_List_Finalize( &parser->t2_strings, NULL, memory, NULL ); #endif } - /* Assuming `first >= last'. */ - - static FT_Error - cff_parser_within_limits( CFF_Parser parser, - FT_Byte* first, - FT_Byte* last ) - { -#ifndef CFF_CONFIG_OPTION_OLD_ENGINE - - /* Fast path for regular FreeType builds with the "new" engine; */ - /* `first >= parser->start' can be assumed. */ - - FT_UNUSED( first ); - - return last < parser->limit ? FT_Err_Ok : FT_THROW( Invalid_Argument ); - -#else /* CFF_CONFIG_OPTION_OLD_ENGINE */ - - FT_ListNode node; - - - if ( first >= parser->start && - last < parser->limit ) - return FT_Err_Ok; - - node = parser->t2_strings.head; - - while ( node ) - { - CFF_T2_String t2 = (CFF_T2_String)node->data; - - - if ( first >= t2->start && - last < t2->limit ) - return FT_Err_Ok; - - node = node->next; - } - - return FT_THROW( Invalid_Argument ); - -#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ - } - + /* The parser limit checks in the next two functions are supposed */ + /* to detect the immediate crossing of the stream boundary. They */ + /* shall not be triggered from the distant t2_strings buffers. */ /* read an integer */ static FT_Long - cff_parse_integer( CFF_Parser parser, - FT_Byte* start ) + cff_parse_integer( FT_Byte* start, + FT_Byte* limit ) { FT_Byte* p = start; FT_Int v = *p++; @@ -167,14 +103,14 @@ if ( v == 28 ) { - if ( cff_parser_within_limits( parser, p, p + 1 ) ) + if ( p + 2 > limit && limit >= p ) goto Bad; val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); } else if ( v == 29 ) { - if ( cff_parser_within_limits( parser, p, p + 3 ) ) + if ( p + 4 > limit && limit >= p ) goto Bad; val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | @@ -188,14 +124,14 @@ } else if ( v < 251 ) { - if ( cff_parser_within_limits( parser, p, p ) ) + if ( p + 1 > limit && limit >= p ) goto Bad; val = ( v - 247 ) * 256 + p[0] + 108; } else { - if ( cff_parser_within_limits( parser, p, p ) ) + if ( p + 1 > limit && limit >= p ) goto Bad; val = -( v - 251 ) * 256 - p[0] - 108; @@ -244,10 +180,10 @@ /* read a real */ static FT_Fixed - cff_parse_real( CFF_Parser parser, - FT_Byte* start, - FT_Long power_ten, - FT_Long* scaling ) + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Long power_ten, + FT_Long* scaling ) { FT_Byte* p = start; FT_Int nib; @@ -282,7 +218,7 @@ p++; /* Make sure we don't read past the end. */ - if ( cff_parser_within_limits( parser, p, p ) ) + if ( p + 1 > limit && limit >= p ) goto Bad; } @@ -319,7 +255,7 @@ p++; /* Make sure we don't read past the end. */ - if ( cff_parser_within_limits( parser, p, p ) ) + if ( p + 1 > limit && limit >= p ) goto Bad; } @@ -358,7 +294,7 @@ p++; /* Make sure we don't read past the end. */ - if ( cff_parser_within_limits( parser, p, p ) ) + if ( p + 1 > limit && limit >= p ) goto Bad; } @@ -525,7 +461,7 @@ if ( **d == 30 ) { /* binary-coded decimal is truncated to integer */ - return cff_parse_real( parser, *d, 0, NULL ) >> 16; + return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; } else if ( **d == 255 ) @@ -551,7 +487,7 @@ } else - return cff_parse_integer( parser, *d ); + return cff_parse_integer( *d, parser->limit ); } @@ -562,15 +498,33 @@ FT_Long scaling ) { if ( **d == 30 ) - return cff_parse_real( parser, *d, scaling, NULL ); - else + return cff_parse_real( *d, parser->limit, scaling, NULL ); + else if ( **d == 255 ) { - FT_Long val = cff_parse_integer( parser, *d ); - + FT_Fixed val = ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | + (FT_UInt32)*( d[0] + 4 ) ) ); if ( scaling ) { if ( FT_ABS( val ) > power_ten_limits[scaling] ) + { + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + return val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; + } + val *= power_tens[scaling]; + } + return val; + } + else + { + FT_Long val = cff_parse_integer( *d, parser->limit ); + + + if ( scaling ) + { + if ( ( FT_ABS( val ) << 16 ) > power_ten_limits[scaling] ) { val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; goto Overflow; @@ -600,7 +554,7 @@ /* read a floating point number, either integer or real */ - static FT_Fixed + FT_LOCAL_DEF( FT_Fixed ) cff_parse_fixed( CFF_Parser parser, FT_Byte** d ) { @@ -630,14 +584,14 @@ FT_ASSERT( scaling ); if ( **d == 30 ) - return cff_parse_real( parser, *d, 0, scaling ); + return cff_parse_real( *d, parser->limit, 0, scaling ); else { FT_Long number; FT_Int integer_length; - number = cff_parse_integer( parser, d[0] ); + number = cff_parse_integer( *d, parser->limit ); if ( number > 0x7FFFL ) { @@ -686,7 +640,7 @@ dict->has_font_matrix = TRUE; - /* We expect a well-formed font matrix, this is, the matrix elements */ + /* We expect a well-formed font matrix, that is, the matrix elements */ /* `xx' and `yy' are of approximately the same magnitude. To avoid */ /* loss of precision, we use the magnitude of the largest matrix */ /* element to scale all other elements. The scaling factor is then */ @@ -1264,11 +1218,8 @@ FT_Byte* charstring_base; FT_ULong charstring_len; - FT_Fixed* stack; - FT_ListNode node; - CFF_T2_String t2; - FT_Fixed t2_size; - FT_Byte* q; + FT_Fixed* stack; + FT_Byte* q = NULL; charstring_base = ++p; @@ -1309,39 +1260,18 @@ /* Now copy the stack data in the temporary decoder object, */ /* converting it back to charstring number representations */ /* (this is ugly, I know). */ + /* The maximum required size is 5 bytes per stack element. */ + if ( FT_QALLOC( q, (FT_Long)( 2 * sizeof ( FT_ListNode ) ) + + 5 * ( decoder.top - decoder.stack ) ) ) + goto Exit; - node = (FT_ListNode)memory->alloc( memory, - sizeof ( FT_ListNodeRec ) ); - if ( !node ) - goto Out_Of_Memory_Error; + FT_List_Add( &parser->t2_strings, (FT_ListNode)q ); - FT_List_Add( &parser->t2_strings, node ); + q += 2 * sizeof ( FT_ListNode ); - t2 = (CFF_T2_String)memory->alloc( memory, - sizeof ( CFF_T2_StringRec ) ); - if ( !t2 ) - goto Out_Of_Memory_Error; - - node->data = t2; - - /* `5' is the conservative upper bound of required bytes per stack */ - /* element. */ - - t2_size = 5 * ( decoder.top - decoder.stack ); - - q = (FT_Byte*)memory->alloc( memory, t2_size ); - if ( !q ) - goto Out_Of_Memory_Error; - - t2->start = q; - t2->limit = q + t2_size; - - stack = decoder.stack; - - while ( stack < decoder.top ) + for ( stack = decoder.stack; stack < decoder.top; stack++ ) { - FT_ULong num; - FT_Bool neg; + FT_Long num = *stack; if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) @@ -1349,69 +1279,37 @@ *parser->top++ = q; - if ( *stack < 0 ) - { - num = (FT_ULong)NEG_LONG( *stack ); - neg = 1; - } - else - { - num = (FT_ULong)*stack; - neg = 0; - } - if ( num & 0xFFFFU ) { - if ( neg ) - num = (FT_ULong)-num; - *q++ = 255; - *q++ = ( num & 0xFF000000U ) >> 24; - *q++ = ( num & 0x00FF0000U ) >> 16; - *q++ = ( num & 0x0000FF00U ) >> 8; - *q++ = num & 0x000000FFU; + *q++ = (FT_Byte)( ( num >> 24 ) & 0xFF ); + *q++ = (FT_Byte)( ( num >> 16 ) & 0xFF ); + *q++ = (FT_Byte)( ( num >> 8 ) & 0xFF ); + *q++ = (FT_Byte)( ( num ) & 0xFF ); } else { num >>= 16; - if ( neg ) + if ( -107 <= num && num <= 107 ) + *q++ = (FT_Byte)( num + 139 ); + else if ( 108 <= num && num <= 1131 ) { - if ( num <= 107 ) - *q++ = (FT_Byte)( 139 - num ); - else if ( num <= 1131 ) - { - *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 ); - *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); - } - else - { - num = (FT_ULong)-num; - - *q++ = 28; - *q++ = (FT_Byte)( num >> 8 ); - *q++ = (FT_Byte)( num & 0xFF ); - } + *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 ); + *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); + } + else if ( -1131 <= num && num <= -108 ) + { + *q++ = (FT_Byte)( ( ( -num - 108 ) >> 8 ) + 251 ); + *q++ = (FT_Byte)( ( -num - 108) & 0xFF ); } else { - if ( num <= 107 ) - *q++ = (FT_Byte)( num + 139 ); - else if ( num <= 1131 ) - { - *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 ); - *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); - } - else - { - *q++ = 28; - *q++ = (FT_Byte)( num >> 8 ); - *q++ = (FT_Byte)( num & 0xFF ); - } + *q++ = 28; + *q++ = (FT_Byte)( num >> 8 ); + *q++ = (FT_Byte)( num & 0xFF ); } } - - stack++; } } #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ @@ -1598,12 +1496,6 @@ Exit: return error; -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - Out_Of_Memory_Error: - error = FT_THROW( Out_Of_Memory ); - goto Exit; -#endif - Stack_Overflow: error = FT_THROW( Invalid_Argument ); goto Exit; diff --git a/src/3rdparty/freetype/src/cff/cffparse.h b/src/3rdparty/freetype/src/cff/cffparse.h index 58d59fa4..418caacc 100644 --- a/src/3rdparty/freetype/src/cff/cffparse.h +++ b/src/3rdparty/freetype/src/cff/cffparse.h @@ -76,6 +76,10 @@ FT_BEGIN_HEADER cff_parse_num( CFF_Parser parser, FT_Byte** d ); + FT_LOCAL( FT_Fixed ) + cff_parse_fixed( CFF_Parser parser, + FT_Byte** d ); + FT_LOCAL( FT_Error ) cff_parser_init( CFF_Parser parser, FT_UInt code, @@ -133,15 +137,6 @@ FT_BEGIN_HEADER FT_END_HEADER -#ifdef CFF_CONFIG_OPTION_OLD_ENGINE - typedef struct CFF_T2_String_ - { - FT_Byte* start; - FT_Byte* limit; - - } CFF_T2_StringRec, *CFF_T2_String; -#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ - #endif /* CFFPARSE_H_ */ diff --git a/src/3rdparty/freetype/src/cid/cidgload.c b/src/3rdparty/freetype/src/cid/cidgload.c index ba4b7565..eaca765a 100644 --- a/src/3rdparty/freetype/src/cid/cidgload.c +++ b/src/3rdparty/freetype/src/cid/cidgload.c @@ -40,6 +40,117 @@ #define FT_COMPONENT cidgload + /* + * A helper function to compute FD number (`fd_select`), the offset to the + * head of the glyph data (`off1`), and the offset to the and of the glyph + * data (`off2`). + * + * The number how many times `cid_get_offset` is invoked can be controlled + * by the number of non-NULL arguments. If `fd_select` is non-NULL but + * `off1` and `off2` are NULL, `cid_get_offset` is invoked only for + * `fd_select`; `off1` and `off2` are not validated. + * + */ + FT_LOCAL_DEF( FT_Error ) + cid_compute_fd_and_offsets( CID_Face face, + FT_UInt glyph_index, + FT_ULong* fd_select_p, + FT_ULong* off1_p, + FT_ULong* off2_p ) + { + FT_Error error = FT_Err_Ok; + + CID_FaceInfo cid = &face->cid; + FT_Stream stream = face->cid_stream; + FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; + + FT_Byte* p; + FT_Bool need_frame_exit = 0; + FT_ULong fd_select, off1, off2; + + + /* For ordinary fonts, read the CID font dictionary index */ + /* and charstring offset from the CIDMap. */ + + if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + + glyph_index * entry_len ) || + FT_FRAME_ENTER( 2 * entry_len ) ) + goto Exit; + + need_frame_exit = 1; + + p = (FT_Byte*)stream->cursor; + fd_select = cid_get_offset( &p, cid->fd_bytes ); + off1 = cid_get_offset( &p, cid->gd_bytes ); + + p += cid->fd_bytes; + off2 = cid_get_offset( &p, cid->gd_bytes ); + + if ( fd_select_p ) + *fd_select_p = fd_select; + if ( off1_p ) + *off1_p = off1; + if ( off2_p ) + *off2_p = off2; + + if ( fd_select >= cid->num_dicts ) + { + /* + * fd_select == 0xFF is often used to indicate that the CID + * has no charstring to be rendered, similar to GID = 0xFFFF + * in TrueType fonts. + */ + if ( ( cid->fd_bytes == 1 && fd_select == 0xFFU ) || + ( cid->fd_bytes == 2 && fd_select == 0xFFFFU ) ) + { + FT_TRACE1(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE1(( " FD number %ld is the maximum\n", + fd_select )); + FT_TRACE1(( " integer fitting into %d byte%s\n", + cid->fd_bytes, cid->fd_bytes == 1 ? "" : "s" )); + } + else + { + FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE0(( " FD number %ld is larger\n", + fd_select )); + FT_TRACE0(( " than number of dictionaries (%d)\n", + cid->num_dicts )); + } + + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + else if ( off2 > stream->size ) + { + FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE0(( " end of the glyph data\n" )); + FT_TRACE0(( " is beyond the data stream\n" )); + + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + else if ( off1 > off2 ) + { + FT_TRACE0(( "cid_load_glyph: fail for glyph index %d:\n", + glyph_index )); + FT_TRACE0(( " the end position of glyph data\n" )); + FT_TRACE0(( " is set before the start position\n" )); + + error = FT_THROW( Invalid_Offset ); + } + + Exit: + if ( need_frame_exit ) + FT_FRAME_EXIT(); + + return error; + } + + FT_CALLBACK_DEF( FT_Error ) cid_load_glyph( T1_Decoder decoder, FT_UInt glyph_index ) @@ -97,35 +208,15 @@ else #endif /* FT_CONFIG_OPTION_INCREMENTAL */ - - /* For ordinary fonts read the CID font dictionary index */ - /* and charstring offset from the CIDMap. */ { - FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; FT_ULong off1, off2; - if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + - glyph_index * entry_len ) || - FT_FRAME_ENTER( 2 * entry_len ) ) + error = cid_compute_fd_and_offsets( face, glyph_index, + &fd_select, &off1, &off2 ); + if ( error ) goto Exit; - p = (FT_Byte*)stream->cursor; - fd_select = cid_get_offset( &p, cid->fd_bytes ); - off1 = cid_get_offset( &p, cid->gd_bytes ); - p += cid->fd_bytes; - off2 = cid_get_offset( &p, cid->gd_bytes ); - FT_FRAME_EXIT(); - - if ( fd_select >= cid->num_dicts || - off2 > stream->size || - off1 > off2 ) - { - FT_TRACE0(( "cid_load_glyph: invalid glyph stream offsets\n" )); - error = FT_THROW( Invalid_Offset ); - goto Exit; - } - glyph_length = off2 - off1; if ( glyph_length == 0 || @@ -161,7 +252,9 @@ cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0; if ( cs_offset > glyph_length ) { - FT_TRACE0(( "cid_load_glyph: invalid glyph stream offsets\n" )); + FT_TRACE0(( "cid_load_glyph: fail for glyph_index=%d, " + "offset to the charstring is beyond glyph length\n", + glyph_index )); error = FT_THROW( Invalid_Offset ); goto Exit; } diff --git a/src/3rdparty/freetype/src/cid/cidgload.h b/src/3rdparty/freetype/src/cid/cidgload.h index 97954d41..edd62292 100644 --- a/src/3rdparty/freetype/src/cid/cidgload.h +++ b/src/3rdparty/freetype/src/cid/cidgload.h @@ -42,6 +42,14 @@ FT_BEGIN_HEADER FT_Int32 load_flags ); + FT_LOCAL( FT_Error ) + cid_compute_fd_and_offsets( CID_Face face, + FT_UInt glyph_index, + FT_ULong* fd_select_p, + FT_ULong* off1_p, + FT_ULong* off2_p ); + + FT_END_HEADER #endif /* CIDGLOAD_H_ */ diff --git a/src/3rdparty/freetype/src/cid/cidload.c b/src/3rdparty/freetype/src/cid/cidload.c index 26daa5da..a7da8ea3 100644 --- a/src/3rdparty/freetype/src/cid/cidload.c +++ b/src/3rdparty/freetype/src/cid/cidload.c @@ -155,23 +155,24 @@ FT_CALLBACK_DEF( void ) - cid_parse_font_matrix( CID_Face face, - CID_Parser* parser ) + cid_parse_font_matrix( FT_Face face, /* CID_Face */ + void* parser_ ) { + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; CID_FaceDict dict; - FT_Face root = (FT_Face)&face->root; FT_Fixed temp[6]; FT_Fixed temp_scale; - if ( parser->num_dict < face->cid.num_dicts ) + if ( parser->num_dict < cidface->cid.num_dicts ) { FT_Matrix* matrix; FT_Vector* offset; FT_Int result; - dict = face->cid.font_dicts + parser->num_dict; + dict = cidface->cid.font_dicts + parser->num_dict; matrix = &dict->font_matrix; offset = &dict->font_offset; @@ -204,7 +205,7 @@ if ( temp_scale != 0x10000L ) { /* set units per EM based on FontMatrix values */ - root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); + face->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); temp[0] = FT_DivFix( temp[0], temp_scale ); temp[1] = FT_DivFix( temp[1], temp_scale ); @@ -237,13 +238,15 @@ FT_CALLBACK_DEF( void ) - parse_fd_array( CID_Face face, - CID_Parser* parser ) + parse_fd_array( FT_Face face, /* CID_Face */ + void* parser_ ) { - CID_FaceInfo cid = &face->cid; - FT_Memory memory = face->root.memory; - FT_Stream stream = parser->stream; - FT_Error error = FT_Err_Ok; + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; + CID_FaceInfo cid = &cidface->cid; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Stream stream = parser->stream; + FT_Error error = FT_Err_Ok; FT_Long num_dicts, max_dicts; @@ -313,18 +316,20 @@ /* By mistake, `expansion_factor' appears both in PS_PrivateRec */ /* and CID_FaceDictRec (both are public header files and can't */ - /* changed). We simply copy the value. */ + /* be thus changed). We simply copy the value. */ FT_CALLBACK_DEF( void ) - parse_expansion_factor( CID_Face face, - CID_Parser* parser ) + parse_expansion_factor( FT_Face face, /* CID_Face */ + void* parser_ ) { + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; CID_FaceDict dict; - if ( parser->num_dict < face->cid.num_dicts ) + if ( parser->num_dict < cidface->cid.num_dicts ) { - dict = face->cid.font_dicts + parser->num_dict; + dict = cidface->cid.font_dicts + parser->num_dict; dict->expansion_factor = cid_parser_to_fixed( parser, 0 ); dict->private_dict.expansion_factor = dict->expansion_factor; @@ -341,11 +346,15 @@ /* to catch it for producing better trace output. */ FT_CALLBACK_DEF( void ) - parse_font_name( CID_Face face, - CID_Parser* parser ) + parse_font_name( FT_Face face, /* CID_Face */ + void* parser_ ) { #ifdef FT_DEBUG_LEVEL_TRACE - if ( parser->num_dict < face->cid.num_dicts ) + CID_Face cidface = (CID_Face)face; + CID_Parser* parser = (CID_Parser*)parser_; + + + if ( parser->num_dict < cidface->cid.num_dicts ) { T1_TokenRec token; FT_UInt len; @@ -361,7 +370,7 @@ } #else FT_UNUSED( face ); - FT_UNUSED( parser ); + FT_UNUSED( parser_ ); #endif return; diff --git a/src/3rdparty/freetype/src/cid/cidobjs.c b/src/3rdparty/freetype/src/cid/cidobjs.c index 06b2139a..f698a419 100644 --- a/src/3rdparty/freetype/src/cid/cidobjs.c +++ b/src/3rdparty/freetype/src/cid/cidobjs.c @@ -69,8 +69,7 @@ FT_Module module; - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); + module = FT_Get_Module( slot->library, "pshinter" ); if ( module ) { T1_Hints_Funcs funcs; @@ -268,7 +267,8 @@ * * @Input: * stream :: - * The source font stream. + * Dummy argument for compatibility with the `FT_Face_InitFunc` API. + * Ignored. The stream should be passed through `face->root.stream`. * * face_index :: * The index of the font face in the resource. @@ -375,6 +375,14 @@ if ( info->is_fixed_pitch ) cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + /* + * For the sfnt-wrapped CID fonts for MacOS, currently, + * its `cmap' tables are ignored, and the content in + * its `CID ' table is treated the same as naked CID-keyed + * font. See ft_lookup_PS_in_sfnt_stream(). + */ + cidface->face_flags |= FT_FACE_FLAG_CID_KEYED; + /* XXX: TODO: add kerning with .afm support */ /* get style name -- be careful, some broken fonts only */ diff --git a/src/3rdparty/freetype/src/cid/cidparse.c b/src/3rdparty/freetype/src/cid/cidparse.c index 16889db9..171a8862 100644 --- a/src/3rdparty/freetype/src/cid/cidparse.c +++ b/src/3rdparty/freetype/src/cid/cidparse.c @@ -214,18 +214,24 @@ cur <= limit - STARTDATA_LEN && ft_strncmp( (char*)cur, STARTDATA, STARTDATA_LEN ) == 0 ) { - if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) + T1_TokenRec type_token; + FT_Long binary_length; + + + parser->root.cursor = arg1; + cid_parser_to_token( parser, &type_token ); + if ( type_token.limit - type_token.start == 5 && + ft_memcmp( (char*)type_token.start, "(Hex)", 5 ) == 0 ) { - FT_Long tmp = ft_strtol( (const char *)arg2, NULL, 10 ); - - - if ( tmp < 0 ) + parser->root.cursor = arg2; + binary_length = cid_parser_to_int( parser ); + if ( binary_length < 0 ) { FT_ERROR(( "cid_parser_new: invalid length of hex data\n" )); error = FT_THROW( Invalid_File_Format ); } else - parser->binary_length = (FT_ULong)tmp; + parser->binary_length = (FT_ULong)binary_length; } goto Exit; diff --git a/src/3rdparty/freetype/src/cid/cidriver.c b/src/3rdparty/freetype/src/cid/cidriver.c index f7499237..99e7b118 100644 --- a/src/3rdparty/freetype/src/cid/cidriver.c +++ b/src/3rdparty/freetype/src/cid/cidriver.c @@ -48,10 +48,11 @@ * */ - static const char* - cid_get_postscript_name( CID_Face face ) + FT_CALLBACK_DEF( const char* ) + cid_get_postscript_name( FT_Face face ) /* CID_Face */ { - const char* result = face->cid.cid_font_name; + CID_Face cidface = (CID_Face)face; + const char* result = cidface->cid.cid_font_name; if ( result && result[0] == '/' ) @@ -72,34 +73,36 @@ * */ - static FT_Error - cid_ps_get_font_info( FT_Face face, + FT_CALLBACK_DEF( FT_Error ) + cid_ps_get_font_info( FT_Face face, /* CID_Face */ PS_FontInfoRec* afont_info ) { - *afont_info = ((CID_Face)face)->cid.font_info; + *afont_info = ( (CID_Face)face )->cid.font_info; return FT_Err_Ok; } - static FT_Error - cid_ps_get_font_extra( FT_Face face, - PS_FontExtraRec* afont_extra ) + + FT_CALLBACK_DEF( FT_Error ) + cid_ps_get_font_extra( FT_Face face, /* CID_Face */ + PS_FontExtraRec* afont_extra ) { - *afont_extra = ((CID_Face)face)->font_extra; + *afont_extra = ( (CID_Face)face )->font_extra; return FT_Err_Ok; } + static const FT_Service_PsInfoRec cid_service_ps_info = { - (PS_GetFontInfoFunc) cid_ps_get_font_info, /* ps_get_font_info */ - (PS_GetFontExtraFunc) cid_ps_get_font_extra, /* ps_get_font_extra */ + cid_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */ + cid_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */ /* unsupported with CID fonts */ - (PS_HasGlyphNamesFunc) NULL, /* ps_has_glyph_names */ + NULL, /* PS_HasGlyphNamesFunc ps_has_glyph_names */ /* unsupported */ - (PS_GetFontPrivateFunc)NULL, /* ps_get_font_private */ + NULL, /* PS_GetFontPrivateFunc ps_get_font_private */ /* not implemented */ - (PS_GetFontValueFunc) NULL /* ps_get_font_value */ + NULL /* PS_GetFontValueFunc ps_get_font_value */ }; @@ -107,13 +110,14 @@ * CID INFO SERVICE * */ - static FT_Error - cid_get_ros( CID_Face face, + FT_CALLBACK_DEF( FT_Error ) + cid_get_ros( FT_Face face, /* CID_Face */ const char* *registry, const char* *ordering, FT_Int *supplement ) { - CID_FaceInfo cid = &face->cid; + CID_Face cidface = (CID_Face)face; + CID_FaceInfo cid = &cidface->cid; if ( registry ) @@ -129,32 +133,48 @@ } - static FT_Error - cid_get_is_cid( CID_Face face, + FT_CALLBACK_DEF( FT_Error ) + cid_get_is_cid( FT_Face face, /* CID_Face */ FT_Bool *is_cid ) { FT_Error error = FT_Err_Ok; FT_UNUSED( face ); + /* + * XXX: If the ROS is Adobe-Identity-H or -V, + * the font has no reliable information about + * its glyph collection. Should we not set + * *is_cid in such cases? + */ if ( is_cid ) - *is_cid = 1; /* cid driver is only used for CID keyed fonts */ + *is_cid = 1; return error; } - static FT_Error - cid_get_cid_from_glyph_index( CID_Face face, + FT_CALLBACK_DEF( FT_Error ) + cid_get_cid_from_glyph_index( FT_Face face, /* CID_Face */ FT_UInt glyph_index, FT_UInt *cid ) { - FT_Error error = FT_Err_Ok; - FT_UNUSED( face ); + FT_Error error = FT_Err_Ok; + CID_Face cidface = (CID_Face)face; - if ( cid ) - *cid = glyph_index; /* identity mapping */ + /* + * Currently, FreeType does not support incrementally-defined, CID-keyed + * fonts that store the glyph description data in a `/GlyphDirectory` + * array or dictionary. Fonts loaded by the incremental loading feature + * are thus not handled here. + */ + error = cid_compute_fd_and_offsets( cidface, glyph_index, + NULL, NULL, NULL ); + if ( error ) + *cid = 0; + else + *cid = glyph_index; return error; } @@ -162,12 +182,12 @@ static const FT_Service_CIDRec cid_service_cid_info = { - (FT_CID_GetRegistryOrderingSupplementFunc) - cid_get_ros, /* get_ros */ - (FT_CID_GetIsInternallyCIDKeyedFunc) - cid_get_is_cid, /* get_is_cid */ - (FT_CID_GetCIDFromGlyphIndexFunc) - cid_get_cid_from_glyph_index /* get_cid_from_glyph_index */ + cid_get_ros, + /* FT_CID_GetRegistryOrderingSupplementFunc get_ros */ + cid_get_is_cid, + /* FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid */ + cid_get_cid_from_glyph_index + /* FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index */ }; @@ -179,9 +199,9 @@ FT_DEFINE_SERVICE_PROPERTIESREC( cid_service_properties, - (FT_Properties_SetFunc)ps_property_set, /* set_property */ - (FT_Properties_GetFunc)ps_property_get ) /* get_property */ - + ps_property_set, /* FT_Properties_SetFunc set_property */ + ps_property_get /* FT_Properties_GetFunc get_property */ + ) /* * SERVICE LIST @@ -209,7 +229,6 @@ } - FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec t1cid_driver_class = { diff --git a/src/3rdparty/freetype/src/dlg/dlgwrap.c b/src/3rdparty/freetype/src/dlg/dlgwrap.c index 271241f0..e9dc3410 100644 --- a/src/3rdparty/freetype/src/dlg/dlgwrap.c +++ b/src/3rdparty/freetype/src/dlg/dlgwrap.c @@ -25,7 +25,7 @@ #include "dlg.c" #else /* ANSI C doesn't like empty source files */ - typedef int _dlg_dummy; + typedef int dlg_dummy_; #endif diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfgen.c b/src/3rdparty/freetype/src/gxvalid/gxvfgen.c index 11535422..cf98bb36 100644 --- a/src/3rdparty/freetype/src/gxvalid/gxvfgen.c +++ b/src/3rdparty/freetype/src/gxvalid/gxvfgen.c @@ -97,7 +97,8 @@ #define EMPTYFEAT {0, 0, {NULL}} - static GX_Feature_RegistryRec featreg_table[] = { + static GX_Feature_RegistryRec featreg_table[] = + { { /* 0 */ "All Typographic Features", 0, diff --git a/src/3rdparty/freetype/src/gzip/README.freetype b/src/3rdparty/freetype/src/gzip/README.freetype index e0c8ced1..76298b06 100644 --- a/src/3rdparty/freetype/src/gzip/README.freetype +++ b/src/3rdparty/freetype/src/gzip/README.freetype @@ -1,7 +1,7 @@ Name: zlib Short Name: zlib URL: http://zlib.net/ -Version: 1.2.12 +Version: 1.2.13 License: see `zlib.h` Description: diff --git a/src/3rdparty/freetype/src/gzip/ftgzip.c b/src/3rdparty/freetype/src/gzip/ftgzip.c index 48da6ff9..ca6a2aab 100644 --- a/src/3rdparty/freetype/src/gzip/ftgzip.c +++ b/src/3rdparty/freetype/src/gzip/ftgzip.c @@ -70,10 +70,9 @@ /* so that configuration with `FT_CONFIG_OPTION_SYSTEM_ZLIB' might */ /* include the wrong `zconf.h' file, leading to errors. */ -#if defined( __GNUC__ ) || defined( __clang__ ) #define ZEXPORT -#define ZEXTERN static -#endif + /* prevent zlib functions from being visible outside their object files */ +#define ZEXTERN static #define HAVE_MEMCPY 1 #define Z_SOLO 1 diff --git a/src/3rdparty/freetype/src/gzip/infback.c b/src/3rdparty/freetype/src/gzip/infback.c deleted file mode 100644 index 264c14e0..00000000 --- a/src/3rdparty/freetype/src/gzip/infback.c +++ /dev/null @@ -1,644 +0,0 @@ -/* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2022 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - This code is largely copied from inflate.c. Normally either infback.o or - inflate.o would be linked into an application--not both. The interface - with inffast.c is retained so that optimized assembler-coded versions of - inflate_fast() can be used with either inflate.c or infback.c. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); - -/* - strm provides memory allocation functions in zalloc and zfree, or - Z_NULL to use the library memory allocation functions. - - windowBits is in the range 8..15, and window is a user-supplied - window and output buffer that is 2**windowBits bytes. - */ -int ZEXPORT inflateBackInit_( - z_streamp strm, - int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size) -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL || window == Z_NULL || - windowBits < 8 || windowBits > 15) - return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - state = (struct inflate_state FAR *)ZALLOC(strm, 1, - sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->dmax = 32768U; - state->wbits = (uInt)windowBits; - state->wsize = 1U << windowBits; - state->window = window; - state->wnext = 0; - state->whave = 0; - state->sane = 1; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables( - struct inflate_state FAR *state) -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -/* Macros for inflateBack(): */ - -/* Load returned state from inflate_fast() */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Set state from registers for inflate_fast() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Assure that some input is available. If input is requested, but denied, - then return a Z_BUF_ERROR from inflateBack(). */ -#define PULL() \ - do { \ - if (have == 0) { \ - have = in(in_desc, &next); \ - if (have == 0) { \ - next = Z_NULL; \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflateBack() - with an error if there is no input available. */ -#define PULLBYTE() \ - do { \ - PULL(); \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflateBack() with - an error. */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Assure that some output space is available, by writing out the window - if it's full. If the write fails, return from inflateBack() with a - Z_BUF_ERROR. */ -#define ROOM() \ - do { \ - if (left == 0) { \ - put = state->window; \ - left = state->wsize; \ - state->whave = left; \ - if (out(out_desc, put, left)) { \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* - strm provides the memory allocation functions and window buffer on input, - and provides information on the unused input on return. For Z_DATA_ERROR - returns, strm will also provide an error message. - - in() and out() are the call-back input and output functions. When - inflateBack() needs more input, it calls in(). When inflateBack() has - filled the window with output, or when it completes with data in the - window, it calls out() to write out the data. The application must not - change the provided input until in() is called again or inflateBack() - returns. The application must not change the window/output buffer until - inflateBack() returns. - - in() and out() are called with a descriptor parameter provided in the - inflateBack() call. This parameter can be a structure that provides the - information required to do the read or write, as well as accumulated - information on the input and output such as totals and check values. - - in() should return zero on failure. out() should return non-zero on - failure. If either in() or out() fails, than inflateBack() returns a - Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it - was in() or out() that caused in the error. Otherwise, inflateBack() - returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format - error, or Z_MEM_ERROR if it could not allocate memory for the state. - inflateBack() can also return Z_STREAM_ERROR if the input parameters - are not correct, i.e. strm is Z_NULL or the state was not initialized. - */ -int ZEXPORT inflateBack( - z_streamp strm, - in_func in, - void FAR *in_desc, - out_func out, - void FAR *out_desc) -{ - struct inflate_state FAR *state; - z_const unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - /* Check that the strm exists and that the state was initialized */ - if (strm == Z_NULL || strm->state == Z_NULL) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* Reset the state */ - strm->msg = Z_NULL; - state->mode = TYPE; - state->last = 0; - state->whave = 0; - next = strm->next_in; - have = next != Z_NULL ? strm->avail_in : 0; - hold = 0; - bits = 0; - put = state->window; - left = state->wsize; - - /* Inflate until end of block marked as last */ - for (;;) - switch (state->mode) { - case TYPE: - /* determine and dispatch block type */ - if (state->last) { - BYTEBITS(); - state->mode = DONE; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - - case STORED: - /* get and verify stored block length */ - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - - /* copy stored block from input to output */ - while (state->length != 0) { - copy = state->length; - PULL(); - ROOM(); - if (copy > have) copy = have; - if (copy > left) copy = left; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - - case TABLE: - /* get dynamic table entries descriptor */ - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - - /* get code length code lengths (not a typo) */ - state->have = 0; - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - - /* get length and distance code code lengths */ - state->have = 0; - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } - else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = (unsigned)(state->lens[state->have - 1]); - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - /* fallthrough */ - - case LEN: - /* use inflate_fast() if we have enough input and output */ - if (have >= 6 && left >= 258) { - RESTORE(); - if (state->whave < state->wsize) - state->whave = state->wsize - left; - inflate_fast(strm, state->wsize); - LOAD(); - break; - } - - /* get a literal, length, or end-of-block code */ - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(here.bits); - state->length = (unsigned)here.val; - - /* process literal */ - if (here.op == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - ROOM(); - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - } - - /* process end of block */ - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - - /* invalid code */ - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - - /* length code -- get extra bits, if any */ - state->extra = (unsigned)(here.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - - /* get distance code */ - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(here.bits); - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - - /* get distance extra bits, if any */ - state->extra = (unsigned)(here.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } - if (state->offset > state->wsize - (state->whave < state->wsize ? - left : 0)) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - - /* copy match from window to output */ - do { - ROOM(); - copy = state->wsize - state->offset; - if (copy < left) { - from = put + copy; - copy = left - copy; - } - else { - from = put - state->offset; - copy = left; - } - if (copy > state->length) copy = state->length; - state->length -= copy; - left -= copy; - do { - *put++ = *from++; - } while (--copy); - } while (state->length != 0); - break; - - case DONE: - /* inflate stream terminated properly */ - ret = Z_STREAM_END; - goto inf_leave; - - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - - default: - /* can't happen, but makes compilers happy */ - ret = Z_STREAM_ERROR; - goto inf_leave; - } - - /* Write leftover output and return unused input */ - inf_leave: - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left) && - ret == Z_STREAM_END) - ret = Z_BUF_ERROR; - } - strm->next_in = next; - strm->avail_in = have; - return ret; -} - -int ZEXPORT inflateBackEnd( - z_streamp strm) -{ - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} diff --git a/src/3rdparty/freetype/src/gzip/rules.mk b/src/3rdparty/freetype/src/gzip/rules.mk index 6feb6f51..c76eacb1 100644 --- a/src/3rdparty/freetype/src/gzip/rules.mk +++ b/src/3rdparty/freetype/src/gzip/rules.mk @@ -36,25 +36,23 @@ endif # # All source and header files get loaded by `ftgzip.c' only if SYSTEM_ZLIB # is not defined (regardless whether we have a `single' or a `multi' build). -# However, it doesn't harm if we add everything as a dependency -# unconditionally. # -GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c \ - $(GZIP_DIR)/crc32.c \ - $(GZIP_DIR)/crc32.h \ - $(GZIP_DIR)/ftzconf.h \ - $(GZIP_DIR)/infback.c \ - $(GZIP_DIR)/inffast.c \ - $(GZIP_DIR)/inffast.h \ - $(GZIP_DIR)/inffixed.h \ - $(GZIP_DIR)/inflate.c \ - $(GZIP_DIR)/inflate.h \ - $(GZIP_DIR)/inftrees.c \ - $(GZIP_DIR)/inftrees.h \ - $(GZIP_DIR)/zlib.h \ - $(GZIP_DIR)/zutil.c \ - $(GZIP_DIR)/zutil.h - +ifeq ($(SYSTEM_ZLIB),) + GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c \ + $(GZIP_DIR)/crc32.c \ + $(GZIP_DIR)/crc32.h \ + $(GZIP_DIR)/ftzconf.h \ + $(GZIP_DIR)/inffast.c \ + $(GZIP_DIR)/inffast.h \ + $(GZIP_DIR)/inffixed.h \ + $(GZIP_DIR)/inflate.c \ + $(GZIP_DIR)/inflate.h \ + $(GZIP_DIR)/inftrees.c \ + $(GZIP_DIR)/inftrees.h \ + $(GZIP_DIR)/zlib.h \ + $(GZIP_DIR)/zutil.c \ + $(GZIP_DIR)/zutil.h +endif # gzip driver object(s) # diff --git a/src/3rdparty/freetype/src/pcf/pcfdrivr.c b/src/3rdparty/freetype/src/pcf/pcfdrivr.c index bfa6eacc..f1dba024 100644 --- a/src/3rdparty/freetype/src/pcf/pcfdrivr.c +++ b/src/3rdparty/freetype/src/pcf/pcfdrivr.c @@ -75,36 +75,36 @@ THE SOFTWARE. FT_CALLBACK_DEF( FT_Error ) - pcf_cmap_init( FT_CMap pcfcmap, /* PCF_CMap */ + pcf_cmap_init( FT_CMap cmap, /* PCF_CMap */ FT_Pointer init_data ) { - PCF_CMap cmap = (PCF_CMap)pcfcmap; - PCF_Face face = (PCF_Face)FT_CMAP_FACE( pcfcmap ); + PCF_CMap pcfcmap = (PCF_CMap)cmap; + PCF_Face face = (PCF_Face)FT_CMAP_FACE( cmap ); FT_UNUSED( init_data ); - cmap->enc = &face->enc; + pcfcmap->enc = &face->enc; return FT_Err_Ok; } FT_CALLBACK_DEF( void ) - pcf_cmap_done( FT_CMap pcfcmap ) /* PCF_CMap */ + pcf_cmap_done( FT_CMap cmap ) /* PCF_CMap */ { - PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_CMap pcfcmap = (PCF_CMap)cmap; - cmap->enc = NULL; + pcfcmap->enc = NULL; } FT_CALLBACK_DEF( FT_UInt ) - pcf_cmap_char_index( FT_CMap pcfcmap, /* PCF_CMap */ + pcf_cmap_char_index( FT_CMap cmap, /* PCF_CMap */ FT_UInt32 charcode ) { - PCF_Enc enc = ( (PCF_CMap)pcfcmap )->enc; + PCF_Enc enc = ( (PCF_CMap)cmap )->enc; FT_UInt32 i = ( charcode >> 8 ) - enc->firstRow; FT_UInt32 j = ( charcode & 0xFF ) - enc->firstCol; @@ -121,10 +121,10 @@ THE SOFTWARE. FT_CALLBACK_DEF( FT_UInt ) - pcf_cmap_char_next( FT_CMap pcfcmap, /* PCF_CMap */ + pcf_cmap_char_next( FT_CMap cmap, /* PCF_CMap */ FT_UInt32 *acharcode ) { - PCF_Enc enc = ( (PCF_CMap)pcfcmap )->enc; + PCF_Enc enc = ( (PCF_CMap)cmap )->enc; FT_UInt32 charcode = *acharcode + 1; FT_UInt32 i = ( charcode >> 8 ) - enc->firstRow; @@ -170,9 +170,9 @@ THE SOFTWARE. FT_CALLBACK_DEF( void ) - PCF_Face_Done( FT_Face pcfface ) /* PCF_Face */ + PCF_Face_Done( FT_Face face ) /* PCF_Face */ { - PCF_Face face = (PCF_Face)pcfface; + PCF_Face pcfface = (PCF_Face)face; FT_Memory memory; @@ -181,18 +181,18 @@ THE SOFTWARE. memory = FT_FACE_MEMORY( face ); - FT_FREE( face->metrics ); - FT_FREE( face->enc.offset ); + FT_FREE( pcfface->metrics ); + FT_FREE( pcfface->enc.offset ); /* free properties */ - if ( face->properties ) + if ( pcfface->properties ) { FT_Int i; - for ( i = 0; i < face->nprops; i++ ) + for ( i = 0; i < pcfface->nprops; i++ ) { - PCF_Property prop = &face->properties[i]; + PCF_Property prop = &pcfface->properties[i]; if ( prop ) @@ -203,33 +203,33 @@ THE SOFTWARE. } } - FT_FREE( face->properties ); + FT_FREE( pcfface->properties ); } - FT_FREE( face->toc.tables ); - FT_FREE( pcfface->family_name ); - FT_FREE( pcfface->style_name ); - FT_FREE( pcfface->available_sizes ); - FT_FREE( face->charset_encoding ); - FT_FREE( face->charset_registry ); + FT_FREE( pcfface->toc.tables ); + FT_FREE( face->family_name ); + FT_FREE( face->style_name ); + FT_FREE( face->available_sizes ); + FT_FREE( pcfface->charset_encoding ); + FT_FREE( pcfface->charset_registry ); /* close compressed stream if any */ - if ( pcfface->stream == &face->comp_stream ) + if ( face->stream == &pcfface->comp_stream ) { - FT_Stream_Close( &face->comp_stream ); - pcfface->stream = face->comp_source; + FT_Stream_Close( &pcfface->comp_stream ); + face->stream = pcfface->comp_source; } } FT_CALLBACK_DEF( FT_Error ) PCF_Face_Init( FT_Stream stream, - FT_Face pcfface, /* PCF_Face */ + FT_Face face, /* PCF_Face */ FT_Int face_index, FT_Int num_params, FT_Parameter* params ) { - PCF_Face face = (PCF_Face)pcfface; + PCF_Face pcfface = (PCF_Face)face; FT_Error error; FT_UNUSED( num_params ); @@ -238,10 +238,10 @@ THE SOFTWARE. FT_TRACE2(( "PCF driver\n" )); - error = pcf_load_font( stream, face, face_index ); + error = pcf_load_font( stream, pcfface, face_index ); if ( error ) { - PCF_Face_Done( pcfface ); + PCF_Face_Done( face ); #if defined( FT_CONFIG_OPTION_USE_ZLIB ) || \ defined( FT_CONFIG_OPTION_USE_LZW ) || \ @@ -254,7 +254,7 @@ THE SOFTWARE. /* this didn't work, try gzip support! */ FT_TRACE2(( " ... try gzip stream\n" )); - error2 = FT_Stream_OpenGzip( &face->comp_stream, stream ); + error2 = FT_Stream_OpenGzip( &pcfface->comp_stream, stream ); if ( FT_ERR_EQ( error2, Unimplemented_Feature ) ) goto Fail; @@ -270,7 +270,7 @@ THE SOFTWARE. /* this didn't work, try LZW support! */ FT_TRACE2(( " ... try LZW stream\n" )); - error3 = FT_Stream_OpenLZW( &face->comp_stream, stream ); + error3 = FT_Stream_OpenLZW( &pcfface->comp_stream, stream ); if ( FT_ERR_EQ( error3, Unimplemented_Feature ) ) goto Fail; @@ -286,7 +286,7 @@ THE SOFTWARE. /* this didn't work, try Bzip2 support! */ FT_TRACE2(( " ... try Bzip2 stream\n" )); - error4 = FT_Stream_OpenBzip2( &face->comp_stream, stream ); + error4 = FT_Stream_OpenBzip2( &pcfface->comp_stream, stream ); if ( FT_ERR_EQ( error4, Unimplemented_Feature ) ) goto Fail; @@ -297,12 +297,12 @@ THE SOFTWARE. if ( error ) goto Fail; - face->comp_source = stream; - pcfface->stream = &face->comp_stream; + pcfface->comp_source = stream; + face->stream = &pcfface->comp_stream; - stream = pcfface->stream; + stream = face->stream; - error = pcf_load_font( stream, face, face_index ); + error = pcf_load_font( stream, pcfface, face_index ); if ( error ) goto Fail; @@ -326,14 +326,14 @@ THE SOFTWARE. else if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 ) { FT_ERROR(( "PCF_Face_Init: invalid face index\n" )); - PCF_Face_Done( pcfface ); + PCF_Face_Done( face ); return FT_THROW( Invalid_Argument ); } /* set up charmap */ { - FT_String *charset_registry = face->charset_registry; - FT_String *charset_encoding = face->charset_encoding; + FT_String *charset_registry = pcfface->charset_registry; + FT_String *charset_encoding = pcfface->charset_encoding; FT_Bool unicode_charmap = 0; @@ -349,13 +349,13 @@ THE SOFTWARE. ( s[2] == 'o' || s[2] == 'O' ) ) { s += 3; - if ( !ft_strcmp( s, "10646" ) || - ( !ft_strcmp( s, "8859" ) && - !ft_strcmp( face->charset_encoding, "1" ) ) ) + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( pcfface->charset_encoding, "1" ) ) ) unicode_charmap = 1; /* another name for ASCII */ - else if ( !ft_strcmp( s, "646.1991" ) && - !ft_strcmp( face->charset_encoding, "IRV" ) ) + else if ( !ft_strcmp( s, "646.1991" ) && + !ft_strcmp( pcfface->charset_encoding, "IRV" ) ) unicode_charmap = 1; } } @@ -364,7 +364,7 @@ THE SOFTWARE. FT_CharMapRec charmap; - charmap.face = FT_FACE( face ); + charmap.face = face; charmap.encoding = FT_ENCODING_NONE; /* initial platform/encoding should indicate unset status? */ charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; @@ -386,7 +386,7 @@ THE SOFTWARE. Fail: FT_TRACE2(( " not a PCF file\n" )); - PCF_Face_Done( pcfface ); + PCF_Face_Done( face ); error = FT_THROW( Unknown_File_Format ); /* error */ goto Exit; } @@ -569,15 +569,16 @@ THE SOFTWARE. * */ - static FT_Error - pcf_get_bdf_property( PCF_Face face, + FT_CALLBACK_DEF( FT_Error ) + pcf_get_bdf_property( FT_Face face, /* PCF_Face */ const char* prop_name, BDF_PropertyRec *aproperty ) { + PCF_Face pcfface = (PCF_Face)face; PCF_Property prop; - prop = pcf_find_property( face, prop_name ); + prop = pcf_find_property( pcfface, prop_name ); if ( prop ) { if ( prop->isString ) @@ -611,13 +612,16 @@ THE SOFTWARE. } - static FT_Error - pcf_get_charset_id( PCF_Face face, + FT_CALLBACK_DEF( FT_Error ) + pcf_get_charset_id( FT_Face face, /* PCF_Face */ const char* *acharset_encoding, const char* *acharset_registry ) { - *acharset_encoding = face->charset_encoding; - *acharset_registry = face->charset_registry; + PCF_Face pcfface = (PCF_Face)face; + + + *acharset_encoding = pcfface->charset_encoding; + *acharset_registry = pcfface->charset_registry; return FT_Err_Ok; } @@ -634,7 +638,7 @@ THE SOFTWARE. * PROPERTY SERVICE * */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) pcf_property_set( FT_Module module, /* PCF_Driver */ const char* property_name, const void* value, @@ -695,10 +699,10 @@ THE SOFTWARE. } - static FT_Error + FT_CALLBACK_DEF( FT_Error ) pcf_property_get( FT_Module module, /* PCF_Driver */ const char* property_name, - const void* value ) + void* value ) { #ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES diff --git a/src/3rdparty/freetype/src/pfr/pfrcmap.c b/src/3rdparty/freetype/src/pfr/pfrcmap.c index 312a9ffe..08fe41d5 100644 --- a/src/3rdparty/freetype/src/pfr/pfrcmap.c +++ b/src/3rdparty/freetype/src/pfr/pfrcmap.c @@ -24,17 +24,18 @@ FT_CALLBACK_DEF( FT_Error ) - pfr_cmap_init( PFR_CMap cmap, + pfr_cmap_init( FT_CMap cmap, /* PFR_CMap */ FT_Pointer pointer ) { - FT_Error error = FT_Err_Ok; - PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); + PFR_CMap pfrcmap = (PFR_CMap)cmap; + FT_Error error = FT_Err_Ok; + PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); FT_UNUSED( pointer ); - cmap->num_chars = face->phy_font.num_chars; - cmap->chars = face->phy_font.chars; + pfrcmap->num_chars = face->phy_font.num_chars; + pfrcmap->chars = face->phy_font.chars; /* just for safety, check that the character entries are correctly */ /* sorted in increasing character code order */ @@ -42,9 +43,9 @@ FT_UInt n; - for ( n = 1; n < cmap->num_chars; n++ ) + for ( n = 1; n < pfrcmap->num_chars; n++ ) { - if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code ) + if ( pfrcmap->chars[n - 1].char_code >= pfrcmap->chars[n].char_code ) { error = FT_THROW( Invalid_Table ); goto Exit; @@ -58,26 +59,30 @@ FT_CALLBACK_DEF( void ) - pfr_cmap_done( PFR_CMap cmap ) + pfr_cmap_done( FT_CMap cmap ) /* PFR_CMap */ { - cmap->chars = NULL; - cmap->num_chars = 0; + PFR_CMap pfrcmap = (PFR_CMap)cmap; + + + pfrcmap->chars = NULL; + pfrcmap->num_chars = 0; } FT_CALLBACK_DEF( FT_UInt ) - pfr_cmap_char_index( PFR_CMap cmap, + pfr_cmap_char_index( FT_CMap cmap, /* PFR_CMap */ FT_UInt32 char_code ) { - FT_UInt min = 0; - FT_UInt max = cmap->num_chars; - FT_UInt mid = min + ( max - min ) / 2; + PFR_CMap pfrcmap = (PFR_CMap)cmap; + FT_UInt min = 0; + FT_UInt max = pfrcmap->num_chars; + FT_UInt mid = min + ( max - min ) / 2; PFR_Char gchar; while ( min < max ) { - gchar = cmap->chars + mid; + gchar = pfrcmap->chars + mid; if ( gchar->char_code == char_code ) return mid + 1; @@ -96,10 +101,11 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - pfr_cmap_char_next( PFR_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + pfr_cmap_char_next( FT_CMap cmap, /* PFR_CMap */ FT_UInt32 *pchar_code ) { + PFR_CMap pfrcmap = (PFR_CMap)cmap; FT_UInt result = 0; FT_UInt32 char_code = *pchar_code + 1; @@ -107,14 +113,14 @@ Restart: { FT_UInt min = 0; - FT_UInt max = cmap->num_chars; + FT_UInt max = pfrcmap->num_chars; FT_UInt mid = min + ( max - min ) / 2; PFR_Char gchar; while ( min < max ) { - gchar = cmap->chars + mid; + gchar = pfrcmap->chars + mid; if ( gchar->char_code == char_code ) { @@ -143,9 +149,9 @@ /* we didn't find it, but we have a pair just above it */ char_code = 0; - if ( min < cmap->num_chars ) + if ( min < pfrcmap->num_chars ) { - gchar = cmap->chars + min; + gchar = pfrcmap->chars + min; result = min; if ( result != 0 ) { diff --git a/src/3rdparty/freetype/src/pfr/pfrdrivr.c b/src/3rdparty/freetype/src/pfr/pfrdrivr.c index 78c6c688..0048f524 100644 --- a/src/3rdparty/freetype/src/pfr/pfrdrivr.c +++ b/src/3rdparty/freetype/src/pfr/pfrdrivr.c @@ -27,16 +27,16 @@ FT_CALLBACK_DEF( FT_Error ) - pfr_get_kerning( FT_Face pfrface, /* PFR_Face */ + pfr_get_kerning( FT_Face face, /* PFR_Face */ FT_UInt left, FT_UInt right, FT_Vector *avector ) { - PFR_Face face = (PFR_Face)pfrface; - PFR_PhyFont phys = &face->phy_font; + PFR_Face pfrface = (PFR_Face)face; + PFR_PhyFont phys = &pfrface->phy_font; - (void)pfr_face_get_kerning( pfrface, left, right, avector ); + (void)pfr_face_get_kerning( face, left, right, avector ); /* convert from metrics to outline units when necessary */ if ( phys->outline_resolution != phys->metrics_resolution ) @@ -62,12 +62,12 @@ */ FT_CALLBACK_DEF( FT_Error ) - pfr_get_advance( FT_Face pfrface, /* PFR_Face */ + pfr_get_advance( FT_Face face, /* PFR_Face */ FT_UInt gindex, FT_Pos *anadvance ) { - PFR_Face face = (PFR_Face)pfrface; - FT_Error error = FT_ERR( Invalid_Argument ); + PFR_Face pfrface = (PFR_Face)face; + FT_Error error = FT_ERR( Invalid_Argument ); *anadvance = 0; @@ -77,9 +77,9 @@ gindex--; - if ( face ) + if ( pfrface ) { - PFR_PhyFont phys = &face->phy_font; + PFR_PhyFont phys = &pfrface->phy_font; if ( gindex < phys->num_chars ) @@ -95,16 +95,16 @@ FT_CALLBACK_DEF( FT_Error ) - pfr_get_metrics( FT_Face pfrface, /* PFR_Face */ + pfr_get_metrics( FT_Face face, /* PFR_Face */ FT_UInt *anoutline_resolution, FT_UInt *ametrics_resolution, FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ) { - PFR_Face face = (PFR_Face)pfrface; - PFR_PhyFont phys = &face->phy_font; + PFR_Face pfrface = (PFR_Face)face; + PFR_PhyFont phys = &pfrface->phy_font; FT_Fixed x_scale, y_scale; - FT_Size size = face->root.size; + FT_Size size = pfrface->root.size; if ( anoutline_resolution ) diff --git a/src/3rdparty/freetype/src/pfr/pfrgload.c b/src/3rdparty/freetype/src/pfr/pfrgload.c index 14f2ec37..48cf27ec 100644 --- a/src/3rdparty/freetype/src/pfr/pfrgload.c +++ b/src/3rdparty/freetype/src/pfr/pfrgload.c @@ -560,8 +560,7 @@ FT_Byte* limit ) { FT_Error error = FT_Err_Ok; - FT_GlyphLoader loader = glyph->loader; - FT_Memory memory = loader->memory; + FT_Memory memory = glyph->loader->memory; PFR_SubGlyph subglyph; FT_UInt flags, i, count, org_count; FT_Int x_pos, y_pos; diff --git a/src/3rdparty/freetype/src/pfr/pfrload.c b/src/3rdparty/freetype/src/pfr/pfrload.c index de85ee6a..856a5942 100644 --- a/src/3rdparty/freetype/src/pfr/pfrload.c +++ b/src/3rdparty/freetype/src/pfr/pfrload.c @@ -449,15 +449,16 @@ /* load bitmap strikes lists */ FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_bitmap_info( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) + pfr_extra_item_load_bitmap_info( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) { - FT_Memory memory = phy_font->memory; - PFR_Strike strike; - FT_UInt flags0; - FT_UInt n, count, size1; - FT_Error error = FT_Err_Ok; + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + FT_Memory memory = phy_font->memory; + PFR_Strike strike; + FT_UInt flags0; + FT_UInt n, count, size1; + FT_Error error = FT_Err_Ok; PFR_CHECK( 5 ); @@ -549,13 +550,14 @@ * family. */ FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_font_id( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) + pfr_extra_item_load_font_id( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) { - FT_Error error = FT_Err_Ok; - FT_Memory memory = phy_font->memory; - FT_UInt len = (FT_UInt)( limit - p ); + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + FT_Error error = FT_Err_Ok; + FT_Memory memory = phy_font->memory; + FT_UInt len = (FT_UInt)( limit - p ); if ( phy_font->font_id ) @@ -575,14 +577,15 @@ /* load stem snap tables */ FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_stem_snaps( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) + pfr_extra_item_load_stem_snaps( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) { - FT_UInt count, num_vert, num_horz; - FT_Int* snaps = NULL; - FT_Error error = FT_Err_Ok; - FT_Memory memory = phy_font->memory; + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; + FT_UInt count, num_vert, num_horz; + FT_Int* snaps = NULL; + FT_Error error = FT_Err_Ok; + FT_Memory memory = phy_font->memory; if ( phy_font->vertical.stem_snaps ) @@ -619,10 +622,11 @@ /* load kerning pair data */ FT_CALLBACK_DEF( FT_Error ) - pfr_extra_item_load_kerning_pairs( FT_Byte* p, - FT_Byte* limit, - PFR_PhyFont phy_font ) + pfr_extra_item_load_kerning_pairs( FT_Byte* p, + FT_Byte* limit, + void* phy_font_ ) { + PFR_PhyFont phy_font = (PFR_PhyFont)phy_font_; PFR_KernItem item = NULL; FT_Error error = FT_Err_Ok; FT_Memory memory = phy_font->memory; @@ -715,10 +719,10 @@ static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = { - { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, - { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, - { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, - { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, + { 1, pfr_extra_item_load_bitmap_info }, + { 2, pfr_extra_item_load_font_id }, + { 3, pfr_extra_item_load_stem_snaps }, + { 4, pfr_extra_item_load_kerning_pairs }, { 0, NULL } }; diff --git a/src/3rdparty/freetype/src/pfr/pfrobjs.c b/src/3rdparty/freetype/src/pfr/pfrobjs.c index 3db8f0a0..8ef17c66 100644 --- a/src/3rdparty/freetype/src/pfr/pfrobjs.c +++ b/src/3rdparty/freetype/src/pfr/pfrobjs.c @@ -50,14 +50,14 @@ if ( !face ) return; - memory = pfrface->driver->root.memory; + memory = pfrface->memory; /* we don't want dangling pointers */ pfrface->family_name = NULL; pfrface->style_name = NULL; /* finalize the physical font record */ - pfr_phy_font_done( &face->phy_font, FT_FACE_MEMORY( face ) ); + pfr_phy_font_done( &face->phy_font, memory ); /* no need to finalize the logical font or the header */ FT_FREE( pfrface->available_sizes ); @@ -214,7 +214,7 @@ FT_UInt n, count = phy_font->num_strikes; FT_Bitmap_Size* size; PFR_Strike strike; - FT_Memory memory = pfrface->stream->memory; + FT_Memory memory = pfrface->memory; if ( FT_QNEW_ARRAY( pfrface->available_sizes, count ) ) diff --git a/src/3rdparty/freetype/src/psaux/afmparse.c b/src/3rdparty/freetype/src/psaux/afmparse.c index 68f95698..db08941d 100644 --- a/src/3rdparty/freetype/src/psaux/afmparse.c +++ b/src/3rdparty/freetype/src/psaux/afmparse.c @@ -1086,7 +1086,7 @@ #else /* T1_CONFIG_OPTION_NO_AFM */ /* ANSI C doesn't like empty source files */ - typedef int _afm_parse_dummy; + typedef int afm_parse_dummy_; #endif /* T1_CONFIG_OPTION_NO_AFM */ diff --git a/src/3rdparty/freetype/src/psaux/cffdecode.c b/src/3rdparty/freetype/src/psaux/cffdecode.c index 2cd91c96..562d17d2 100644 --- a/src/3rdparty/freetype/src/psaux/cffdecode.c +++ b/src/3rdparty/freetype/src/psaux/cffdecode.c @@ -2153,7 +2153,7 @@ decoder->locals_bias ); - FT_TRACE4(( " callsubr (idx %d, entering level %ld)\n", + FT_TRACE4(( " callsubr (idx %d, entering level %td)\n", idx, zone - decoder->zones + 1 )); @@ -2197,7 +2197,7 @@ decoder->globals_bias ); - FT_TRACE4(( " callgsubr (idx %d, entering level %ld)\n", + FT_TRACE4(( " callgsubr (idx %d, entering level %td)\n", idx, zone - decoder->zones + 1 )); @@ -2236,7 +2236,7 @@ break; case cff_op_return: - FT_TRACE4(( " return (leaving level %ld)\n", + FT_TRACE4(( " return (leaving level %td)\n", decoder->zone - decoder->zones )); if ( decoder->zone <= decoder->zones ) diff --git a/src/3rdparty/freetype/src/psaux/pshints.c b/src/3rdparty/freetype/src/psaux/pshints.c index 6f44d0ad..7bd08a9c 100644 --- a/src/3rdparty/freetype/src/psaux/pshints.c +++ b/src/3rdparty/freetype/src/psaux/pshints.c @@ -310,7 +310,7 @@ CF2_Hint hint = &hintmap->edge[i]; - FT_TRACE6(( " %3ld %7.2f %7.2f %5d %s%s%s%s\n", + FT_TRACE6(( " %3zu %7.2f %7.2f %5d %s%s%s%s\n", hint->index, hint->csCoord / 65536.0, hint->dsCoord / ( hint->scale * 1.0 ), diff --git a/src/3rdparty/freetype/src/psaux/t1cmap.c b/src/3rdparty/freetype/src/psaux/t1cmap.c index bf0a393b..c4bcf599 100644 --- a/src/3rdparty/freetype/src/psaux/t1cmap.c +++ b/src/3rdparty/freetype/src/psaux/t1cmap.c @@ -50,8 +50,11 @@ FT_CALLBACK_DEF( void ) - t1_cmap_std_done( T1_CMapStd cmap ) + t1_cmap_std_done( FT_CMap cmap_ ) /* T1_CMapStd */ { + T1_CMapStd cmap = (T1_CMapStd)cmap_; + + cmap->num_glyphs = 0; cmap->glyph_names = NULL; cmap->sid_to_string = NULL; @@ -60,10 +63,11 @@ FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_std_char_index( T1_CMapStd cmap, - FT_UInt32 char_code ) + t1_cmap_std_char_index( FT_CMap cmap, /* T1_CMapStd */ + FT_UInt32 char_code ) { - FT_UInt result = 0; + T1_CMapStd t1cmap = (T1_CMapStd)cmap; + FT_UInt result = 0; if ( char_code < 256 ) @@ -73,13 +77,13 @@ /* convert character code to Adobe SID string */ - code = cmap->code_to_sid[char_code]; - glyph_name = cmap->sid_to_string( code ); + code = t1cmap->code_to_sid[char_code]; + glyph_name = t1cmap->sid_to_string( code ); /* look for the corresponding glyph name */ - for ( n = 0; n < cmap->num_glyphs; n++ ) + for ( n = 0; n < t1cmap->num_glyphs; n++ ) { - const char* gname = cmap->glyph_names[n]; + const char* gname = t1cmap->glyph_names[n]; if ( gname && gname[0] == glyph_name[0] && @@ -95,9 +99,9 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_std_char_next( T1_CMapStd cmap, - FT_UInt32 *pchar_code ) + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_next( FT_CMap cmap, + FT_UInt32 *pchar_code ) { FT_UInt result = 0; FT_UInt32 char_code = *pchar_code + 1; @@ -120,13 +124,14 @@ FT_CALLBACK_DEF( FT_Error ) - t1_cmap_standard_init( T1_CMapStd cmap, + t1_cmap_standard_init( FT_CMap cmap, /* T1_CMapStd */ FT_Pointer pointer ) { + T1_CMapStd t1cmap = (T1_CMapStd)cmap; FT_UNUSED( pointer ); - t1_cmap_std_init( cmap, 0 ); + t1_cmap_std_init( t1cmap, 0 ); return 0; } @@ -150,13 +155,14 @@ FT_CALLBACK_DEF( FT_Error ) - t1_cmap_expert_init( T1_CMapStd cmap, + t1_cmap_expert_init( FT_CMap cmap, /* T1_CMapStd */ FT_Pointer pointer ) { + T1_CMapStd t1cmap = (T1_CMapStd)cmap; FT_UNUSED( pointer ); - t1_cmap_std_init( cmap, 1 ); + t1_cmap_std_init( t1cmap, 1 ); return 0; } @@ -188,20 +194,21 @@ FT_CALLBACK_DEF( FT_Error ) - t1_cmap_custom_init( T1_CMapCustom cmap, - FT_Pointer pointer ) + t1_cmap_custom_init( FT_CMap cmap, /* T1_CMapCustom */ + FT_Pointer pointer ) { - T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); - T1_Encoding encoding = &face->type1.encoding; + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + T1_Encoding encoding = &face->type1.encoding; FT_UNUSED( pointer ); - cmap->first = (FT_UInt)encoding->code_first; - cmap->count = (FT_UInt)encoding->code_last - cmap->first; - cmap->indices = encoding->char_index; + t1cmap->first = (FT_UInt)encoding->code_first; + t1cmap->count = (FT_UInt)encoding->code_last - t1cmap->first; + t1cmap->indices = encoding->char_index; - FT_ASSERT( cmap->indices ); + FT_ASSERT( t1cmap->indices ); FT_ASSERT( encoding->code_first <= encoding->code_last ); return 0; @@ -209,45 +216,50 @@ FT_CALLBACK_DEF( void ) - t1_cmap_custom_done( T1_CMapCustom cmap ) + t1_cmap_custom_done( FT_CMap cmap ) /* T1_CMapCustom */ { - cmap->indices = NULL; - cmap->first = 0; - cmap->count = 0; + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + + + t1cmap->indices = NULL; + t1cmap->first = 0; + t1cmap->count = 0; } FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_custom_char_index( T1_CMapCustom cmap, - FT_UInt32 char_code ) + t1_cmap_custom_char_index( FT_CMap cmap, /* T1_CMapCustom */ + FT_UInt32 char_code ) { - FT_UInt result = 0; + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + FT_UInt result = 0; - if ( ( char_code >= cmap->first ) && - ( char_code < ( cmap->first + cmap->count ) ) ) - result = cmap->indices[char_code]; + if ( char_code >= t1cmap->first && + char_code < ( t1cmap->first + t1cmap->count ) ) + result = t1cmap->indices[char_code]; return result; } - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_custom_char_next( T1_CMapCustom cmap, - FT_UInt32 *pchar_code ) + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_next( FT_CMap cmap, /* T1_CMapCustom */ + FT_UInt32 *pchar_code ) { - FT_UInt result = 0; - FT_UInt32 char_code = *pchar_code; + T1_CMapCustom t1cmap = (T1_CMapCustom)cmap; + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; char_code++; - if ( char_code < cmap->first ) - char_code = cmap->first; + if ( char_code < t1cmap->first ) + char_code = t1cmap->first; - for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) + for ( ; char_code < ( t1cmap->first + t1cmap->count ); char_code++ ) { - result = cmap->indices[char_code]; + result = t1cmap->indices[char_code]; if ( result != 0 ) goto Exit; } @@ -287,20 +299,24 @@ /*************************************************************************/ FT_CALLBACK_DEF( const char * ) - psaux_get_glyph_name( T1_Face face, + psaux_get_glyph_name( void* face_, FT_UInt idx ) { + T1_Face face = (T1_Face)face_; + + return face->type1.glyph_names[idx]; } FT_CALLBACK_DEF( FT_Error ) - t1_cmap_unicode_init( PS_Unicodes unicodes, - FT_Pointer pointer ) + t1_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ + FT_Pointer pointer ) { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; FT_UNUSED( pointer ); @@ -311,17 +327,18 @@ return psnames->unicodes_init( memory, unicodes, (FT_UInt)face->type1.num_glyphs, - (PS_GetGlyphNameFunc)&psaux_get_glyph_name, + &psaux_get_glyph_name, (PS_FreeGlyphNameFunc)NULL, (FT_Pointer)face ); } FT_CALLBACK_DEF( void ) - t1_cmap_unicode_done( PS_Unicodes unicodes ) + t1_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); + PS_Unicodes unicodes = (PS_Unicodes)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); FT_FREE( unicodes->maps ); @@ -330,23 +347,25 @@ FT_CALLBACK_DEF( FT_UInt ) - t1_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) + t1_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 char_code ) { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; return psnames->unicodes_char_index( unicodes, char_code ); } - FT_CALLBACK_DEF( FT_UInt32 ) - t1_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 *pchar_code ) { - T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; return psnames->unicodes_char_next( unicodes, pchar_code ); diff --git a/src/3rdparty/freetype/src/psaux/t1decode.c b/src/3rdparty/freetype/src/psaux/t1decode.c index bfed45b5..4b6b969b 100644 --- a/src/3rdparty/freetype/src/psaux/t1decode.c +++ b/src/3rdparty/freetype/src/psaux/t1decode.c @@ -520,7 +520,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( bol ) { - FT_TRACE5(( " (%ld)", decoder->top - decoder->stack )); + FT_TRACE5(( " (%td)", decoder->top - decoder->stack )); bol = FALSE; } #endif @@ -1165,7 +1165,7 @@ if ( top - decoder->stack != num_args ) FT_TRACE0(( "t1_decoder_parse_charstrings:" " too much operands on the stack" - " (seen %ld, expected %d)\n", + " (seen %td, expected %d)\n", top - decoder->stack, num_args )); break; } diff --git a/src/3rdparty/freetype/src/pshinter/pshalgo.c b/src/3rdparty/freetype/src/pshinter/pshalgo.c index a7f32129..4f622e1e 100644 --- a/src/3rdparty/freetype/src/pshinter/pshalgo.c +++ b/src/3rdparty/freetype/src/pshinter/pshalgo.c @@ -516,7 +516,7 @@ if ( !psh_hint_is_fitted( parent ) ) psh_hint_align( parent, globals, dimension, glyph ); - /* keep original relation between hints, this is, use the */ + /* keep original relation between hints, that is, use the */ /* scaled distance between the centers of the hints to */ /* compute the new position */ par_org_center = parent->org_pos + ( parent->org_len >> 1 ); diff --git a/src/3rdparty/freetype/src/pshinter/pshmod.c b/src/3rdparty/freetype/src/pshinter/pshmod.c index a12e4856..974a99e0 100644 --- a/src/3rdparty/freetype/src/pshinter/pshmod.c +++ b/src/3rdparty/freetype/src/pshinter/pshmod.c @@ -37,8 +37,11 @@ /* finalize module */ FT_CALLBACK_DEF( void ) - ps_hinter_done( PS_Hinter_Module module ) + ps_hinter_done( FT_Module module_ ) /* PS_Hinter_Module */ { + PS_Hinter_Module module = (PS_Hinter_Module)module_; + + module->t1_funcs.hints = NULL; module->t2_funcs.hints = NULL; @@ -48,8 +51,10 @@ /* initialize module, create hints recorder and the interface */ FT_CALLBACK_DEF( FT_Error ) - ps_hinter_init( PS_Hinter_Module module ) + ps_hinter_init( FT_Module module_ ) /* PS_Hinter_Module */ { + PS_Hinter_Module module = (PS_Hinter_Module)module_; + FT_Memory memory = module->root.memory; void* ph = &module->ps_hints; diff --git a/src/3rdparty/freetype/src/pshinter/pshrec.c b/src/3rdparty/freetype/src/pshinter/pshrec.c index 58c8cf1b..680e6d01 100644 --- a/src/3rdparty/freetype/src/pshinter/pshrec.c +++ b/src/3rdparty/freetype/src/pshinter/pshrec.c @@ -851,10 +851,11 @@ /* add one Type1 counter stem to the current hints table */ static void - ps_hints_t1stem3( PS_Hints hints, + ps_hints_t1stem3( T1_Hints hints_, /* PS_Hints */ FT_UInt dimension, FT_Fixed* stems ) { + PS_Hints hints = (PS_Hints)hints_; FT_Error error = FT_Err_Ok; @@ -914,9 +915,10 @@ /* reset hints (only with Type 1 hints) */ static void - ps_hints_t1reset( PS_Hints hints, + ps_hints_t1reset( T1_Hints hints_, /* PS_Hints */ FT_UInt end_point ) { + PS_Hints hints = (PS_Hints)hints_; FT_Error error = FT_Err_Ok; @@ -953,11 +955,12 @@ /* Type2 "hintmask" operator, add a new hintmask to each direction */ static void - ps_hints_t2mask( PS_Hints hints, + ps_hints_t2mask( T2_Hints hints_, /* PS_Hints */ FT_UInt end_point, FT_UInt bit_count, const FT_Byte* bytes ) { + PS_Hints hints = (PS_Hints)hints_; FT_Error error; @@ -999,10 +1002,11 @@ static void - ps_hints_t2counter( PS_Hints hints, + ps_hints_t2counter( T2_Hints hints_, /* PS_Hints */ FT_UInt bit_count, const FT_Byte* bytes ) { + PS_Hints hints = (PS_Hints)hints_; FT_Error error; @@ -1087,6 +1091,13 @@ ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); } + static FT_Error + t1_hints_close( T1_Hints hints, + FT_UInt end_point ) + { + return ps_hints_close( (PS_Hints)hints, end_point ); + } + static void t1_hints_stem( T1_Hints hints, FT_UInt dimension, @@ -1102,17 +1113,27 @@ } + static FT_Error + t1_hints_apply( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + return ps_hints_apply( (PS_Hints)hints, outline, globals, hint_mode ); + } + + FT_LOCAL_DEF( void ) t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) { FT_ZERO( funcs ); funcs->open = (T1_Hints_OpenFunc) t1_hints_open; - funcs->close = (T1_Hints_CloseFunc) ps_hints_close; + funcs->close = (T1_Hints_CloseFunc) t1_hints_close; funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; - funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; + funcs->apply = (T1_Hints_ApplyFunc) t1_hints_apply; } @@ -1131,6 +1152,14 @@ } + static FT_Error + t2_hints_close( T2_Hints hints, + FT_UInt end_point ) + { + return ps_hints_close( (PS_Hints)hints, end_point ); + } + + static void t2_hints_stems( T2_Hints hints, FT_UInt dimension, @@ -1168,17 +1197,27 @@ } + static FT_Error + t2_hints_apply( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + return ps_hints_apply( (PS_Hints)hints, outline, globals, hint_mode ); + } + + FT_LOCAL_DEF( void ) t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) { FT_ZERO( funcs ); - funcs->open = (T2_Hints_OpenFunc) t2_hints_open; - funcs->close = (T2_Hints_CloseFunc) ps_hints_close; - funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; - funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; - funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; - funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) t2_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask = (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) t2_hints_apply; } diff --git a/src/3rdparty/freetype/src/psnames/psmodule.c b/src/3rdparty/freetype/src/psnames/psmodule.c index db454e55..8203a046 100644 --- a/src/3rdparty/freetype/src/psnames/psmodule.c +++ b/src/3rdparty/freetype/src/psnames/psmodule.c @@ -57,7 +57,7 @@ /* the name, as in `A.swash' or `e.final'; in this case, the */ /* VARIANT_BIT is set in the return value. */ /* */ - static FT_UInt32 + FT_CALLBACK_DEF( FT_UInt32 ) ps_unicode_value( const char* glyph_name ) { /* If the name begins with `uni', then the glyph name may be a */ @@ -309,7 +309,7 @@ /* Build a table that maps Unicode values to glyph indices. */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) ps_unicodes_init( FT_Memory memory, PS_Unicodes table, FT_UInt num_glyphs, @@ -408,7 +408,7 @@ } - static FT_UInt + FT_CALLBACK_DEF( FT_UInt ) ps_unicodes_char_index( PS_Unicodes table, FT_UInt32 unicode ) { @@ -453,7 +453,7 @@ } - static FT_UInt32 + FT_CALLBACK_DEF( FT_UInt ) ps_unicodes_char_next( PS_Unicodes table, FT_UInt32 *unicode ) { @@ -518,7 +518,7 @@ #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ - static const char* + FT_CALLBACK_DEF( const char* ) ps_get_macintosh_name( FT_UInt name_index ) { if ( name_index >= FT_NUM_MAC_NAMES ) @@ -528,7 +528,7 @@ } - static const char* + FT_CALLBACK_DEF( const char* ) ps_get_standard_strings( FT_UInt sid ) { if ( sid >= FT_NUM_SID_NAMES ) @@ -543,13 +543,13 @@ FT_DEFINE_SERVICE_PSCMAPSREC( pscmaps_interface, - (PS_Unicode_ValueFunc) ps_unicode_value, /* unicode_value */ - (PS_Unicodes_InitFunc) ps_unicodes_init, /* unicodes_init */ - (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, /* unicodes_char_index */ - (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, /* unicodes_char_next */ + ps_unicode_value, /* PS_Unicode_ValueFunc unicode_value */ + ps_unicodes_init, /* PS_Unicodes_InitFunc unicodes_init */ + ps_unicodes_char_index, /* PS_Unicodes_CharIndexFunc unicodes_char_index */ + ps_unicodes_char_next, /* PS_Unicodes_CharNextFunc unicodes_char_next */ - (PS_Macintosh_NameFunc) ps_get_macintosh_name, /* macintosh_name */ - (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */ + ps_get_macintosh_name, /* PS_Macintosh_NameFunc macintosh_name */ + ps_get_standard_strings, /* PS_Adobe_Std_StringsFunc adobe_std_strings */ t1_standard_encoding, /* adobe_std_encoding */ t1_expert_encoding /* adobe_expert_encoding */ @@ -560,13 +560,13 @@ FT_DEFINE_SERVICE_PSCMAPSREC( pscmaps_interface, - NULL, /* unicode_value */ - NULL, /* unicodes_init */ - NULL, /* unicodes_char_index */ - NULL, /* unicodes_char_next */ + NULL, /* PS_Unicode_ValueFunc unicode_value */ + NULL, /* PS_Unicodes_InitFunc unicodes_init */ + NULL, /* PS_Unicodes_CharIndexFunc unicodes_char_index */ + NULL, /* PS_Unicodes_CharNextFunc unicodes_char_next */ - (PS_Macintosh_NameFunc) ps_get_macintosh_name, /* macintosh_name */ - (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */ + ps_get_macintosh_name, /* PS_Macintosh_NameFunc macintosh_name */ + ps_get_standard_strings, /* PS_Adobe_Std_StringsFunc adobe_std_strings */ t1_standard_encoding, /* adobe_std_encoding */ t1_expert_encoding /* adobe_expert_encoding */ @@ -612,9 +612,9 @@ PUT_PS_NAMES_SERVICE( (void*)&pscmaps_interface ), /* module specific interface */ - (FT_Module_Constructor)NULL, /* module_init */ - (FT_Module_Destructor) NULL, /* module_done */ - (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) /* get_interface */ + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + PUT_PS_NAMES_SERVICE( psnames_get_service ) /* FT_Module_Requester get_interface */ ) diff --git a/src/3rdparty/freetype/src/raster/ftraster.c b/src/3rdparty/freetype/src/raster/ftraster.c index 67cbfd5d..192ca070 100644 --- a/src/3rdparty/freetype/src/raster/ftraster.c +++ b/src/3rdparty/freetype/src/raster/ftraster.c @@ -1742,9 +1742,9 @@ * SUCCESS on success, FAILURE on error. */ static Bool - Decompose_Curve( RAS_ARGS UShort first, - UShort last, - Int flipped ) + Decompose_Curve( RAS_ARGS Int first, + Int last, + Int flipped ) { FT_Vector v_last; FT_Vector v_control; @@ -1969,8 +1969,8 @@ static Bool Convert_Glyph( RAS_ARGS Int flipped ) { - Int i; - UInt start; + Int i; + Int first, last; ras.fProfile = NULL; @@ -1985,8 +1985,7 @@ ras.cProfile->offset = ras.top; ras.num_Profs = 0; - start = 0; - + last = -1; for ( i = 0; i < ras.outline.n_contours; i++ ) { PProfile lastProfile; @@ -1996,12 +1995,11 @@ ras.state = Unknown_State; ras.gProfile = NULL; - if ( Decompose_Curve( RAS_VARS (UShort)start, - (UShort)ras.outline.contours[i], - flipped ) ) - return FAILURE; + first = last + 1; + last = ras.outline.contours[i]; - start = (UShort)ras.outline.contours[i] + 1; + if ( Decompose_Curve( RAS_VARS first, last, flipped ) ) + return FAILURE; /* we must now check whether the extreme arcs join or not */ if ( FRAC( ras.lastY ) == 0 && @@ -3167,9 +3165,12 @@ static int - ft_black_new( FT_Memory memory, - black_PRaster *araster ) + ft_black_new( void* memory_, /* FT_Memory */ + FT_Raster *araster_ ) /* black_PRaster */ { + FT_Memory memory = (FT_Memory)memory_; + black_PRaster *araster = (black_PRaster*)araster_; + FT_Error error; black_PRaster raster = NULL; @@ -3184,9 +3185,10 @@ static void - ft_black_done( black_PRaster raster ) + ft_black_done( FT_Raster raster_ ) /* black_PRaster */ { - FT_Memory memory = (FT_Memory)raster->memory; + black_PRaster raster = (black_PRaster)raster_; + FT_Memory memory = (FT_Memory)raster->memory; FT_FREE( raster ); @@ -3281,11 +3283,11 @@ FT_GLYPH_FORMAT_OUTLINE, - (FT_Raster_New_Func) ft_black_new, /* raster_new */ - (FT_Raster_Reset_Func) ft_black_reset, /* raster_reset */ - (FT_Raster_Set_Mode_Func)ft_black_set_mode, /* raster_set_mode */ - (FT_Raster_Render_Func) ft_black_render, /* raster_render */ - (FT_Raster_Done_Func) ft_black_done /* raster_done */ + ft_black_new, /* FT_Raster_New_Func raster_new */ + ft_black_reset, /* FT_Raster_Reset_Func raster_reset */ + ft_black_set_mode, /* FT_Raster_Set_Mode_Func raster_set_mode */ + ft_black_render, /* FT_Raster_Render_Func raster_render */ + ft_black_done /* FT_Raster_Done_Func raster_done */ ) diff --git a/src/3rdparty/freetype/src/raster/ftrend1.c b/src/3rdparty/freetype/src/raster/ftrend1.c index 0b5d8671..6d442b1f 100644 --- a/src/3rdparty/freetype/src/raster/ftrend1.c +++ b/src/3rdparty/freetype/src/raster/ftrend1.c @@ -27,8 +27,11 @@ /* initialize renderer -- init its raster */ static FT_Error - ft_raster1_init( FT_Renderer render ) + ft_raster1_init( FT_Module module ) /* FT_Renderer */ { + FT_Renderer render = (FT_Renderer)module; + + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); return FT_Err_Ok; @@ -188,18 +191,18 @@ NULL, /* module specific interface */ - (FT_Module_Constructor)ft_raster1_init, /* module_init */ - (FT_Module_Destructor) NULL, /* module_done */ - (FT_Module_Requester) NULL, /* get_interface */ + ft_raster1_init, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + NULL, /* FT_Module_Requester get_interface */ FT_GLYPH_FORMAT_OUTLINE, - (FT_Renderer_RenderFunc) ft_raster1_render, /* render_glyph */ - (FT_Renderer_TransformFunc)ft_raster1_transform, /* transform_glyph */ - (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, /* get_glyph_cbox */ - (FT_Renderer_SetModeFunc) ft_raster1_set_mode, /* set_mode */ + ft_raster1_render, /* FT_Renderer_RenderFunc render_glyph */ + ft_raster1_transform, /* FT_Renderer_TransformFunc transform_glyph */ + ft_raster1_get_cbox, /* FT_Renderer_GetCBoxFunc get_glyph_cbox */ + ft_raster1_set_mode, /* FT_Renderer_SetModeFunc set_mode */ - (FT_Raster_Funcs*)&ft_standard_raster /* raster_class */ + &ft_standard_raster /* FT_Raster_Funcs* raster_class */ ) diff --git a/src/3rdparty/freetype/src/sdf/ftbsdf.c b/src/3rdparty/freetype/src/sdf/ftbsdf.c index 901d8b74..e4727383 100644 --- a/src/3rdparty/freetype/src/sdf/ftbsdf.c +++ b/src/3rdparty/freetype/src/sdf/ftbsdf.c @@ -1173,9 +1173,12 @@ /* called when adding a new module through @FT_Add_Module */ static FT_Error - bsdf_raster_new( FT_Memory memory, - BSDF_PRaster* araster ) + bsdf_raster_new( void* memory_, /* FT_Memory */ + FT_Raster* araster_ ) /* BSDF_PRaster* */ { + FT_Memory memory = (FT_Memory)memory_; + BSDF_PRaster* araster = (BSDF_PRaster*)araster_; + FT_Error error; BSDF_PRaster raster = NULL; diff --git a/src/3rdparty/freetype/src/sdf/ftsdf.c b/src/3rdparty/freetype/src/sdf/ftsdf.c index 26a6d00e..bc4625d9 100644 --- a/src/3rdparty/freetype/src/sdf/ftsdf.c +++ b/src/3rdparty/freetype/src/sdf/ftsdf.c @@ -2371,11 +2371,11 @@ * ``` * * (6) Our task is to find a value of `t` such that the above equation - * `Q(t)` becomes zero, this is, the point-to-curve vector makes + * `Q(t)` becomes zero, that is, the point-to-curve vector makes * 90~degrees with the curve. We solve this with the Newton-Raphson * method. * - * (7) We first assume an arbitary value of factor `t`, which we then + * (7) We first assume an arbitrary value of factor `t`, which we then * improve. * * ``` @@ -2684,11 +2684,11 @@ * ``` * * (6) Our task is to find a value of `t` such that the above equation - * `Q(t)` becomes zero, this is, the point-to-curve vector makes + * `Q(t)` becomes zero, that is, the point-to-curve vector makes * 90~degree with curve. We solve this with the Newton-Raphson * method. * - * (7) We first assume an arbitary value of factor `t`, which we then + * (7) We first assume an arbitrary value of factor `t`, which we then * improve. * * ``` @@ -2718,8 +2718,9 @@ FT_Error error = FT_Err_Ok; - FT_26D6_Vec aA, bB, cC, dD; /* A, B, C in the above comment */ - FT_16D16_Vec nearest_point; /* point on curve nearest to `point` */ + FT_26D6_Vec aA, bB, cC, dD; /* A, B, C, D in the above comment */ + FT_16D16_Vec nearest_point = { 0, 0 }; + /* point on curve nearest to `point` */ FT_16D16_Vec direction; /* direction of curve at `nearest_point` */ FT_26D6_Vec p0, p1, p2, p3; /* control points of a cubic curve */ @@ -3761,9 +3762,13 @@ */ static FT_Error - sdf_raster_new( FT_Memory memory, - SDF_PRaster* araster ) + sdf_raster_new( void* memory_, /* FT_Memory */ + FT_Raster* araster_ ) /* SDF_PRaster* */ { + FT_Memory memory = (FT_Memory)memory_; + SDF_PRaster* araster = (SDF_PRaster*)araster_; + + FT_Error error; SDF_PRaster raster = NULL; diff --git a/src/3rdparty/freetype/src/sdf/ftsdfrend.c b/src/3rdparty/freetype/src/sdf/ftsdfrend.c index 9ac7d6f6..5610c119 100644 --- a/src/3rdparty/freetype/src/sdf/ftsdfrend.c +++ b/src/3rdparty/freetype/src/sdf/ftsdfrend.c @@ -197,10 +197,10 @@ static FT_Module_Interface - ft_sdf_requester( FT_Renderer render, + ft_sdf_requester( FT_Module module, const char* module_interface ) { - FT_UNUSED( render ); + FT_UNUSED( module ); return ft_service_list_lookup( sdf_services, module_interface ); } @@ -221,9 +221,9 @@ */ static FT_Error - ft_sdf_init( FT_Renderer render ) + ft_sdf_init( FT_Module module ) /* SDF_Renderer */ { - SDF_Renderer sdf_render = SDF_RENDERER( render ); + SDF_Renderer sdf_render = SDF_RENDERER( module ); sdf_render->spread = DEFAULT_SPREAD; @@ -236,9 +236,9 @@ static void - ft_sdf_done( FT_Renderer render ) + ft_sdf_done( FT_Module module ) { - FT_UNUSED( render ); + FT_UNUSED( module ); } @@ -300,7 +300,7 @@ /* nothing to render */ if ( !bitmap->rows || !bitmap->pitch ) - return FT_Err_Ok; + goto Exit; /* the padding will simply be equal to the `spread' */ x_pad = sdf_module->spread; @@ -508,6 +508,10 @@ goto Exit; } + /* nothing to render */ + if ( !bitmap->rows || !bitmap->pitch ) + goto Exit; + /* Do not generate SDF if the bitmap is not owned by the */ /* glyph: it might be that the source buffer is already freed. */ if ( !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) @@ -519,10 +523,6 @@ goto Exit; } - /* nothing to render */ - if ( !bitmap->rows || !bitmap->pitch ) - return FT_Err_Ok; - FT_Bitmap_New( &target ); /* padding will simply be equal to `spread` */ @@ -557,15 +557,14 @@ { /* the glyph is successfully converted to a SDF */ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) - { FT_FREE( bitmap->buffer ); - slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; - } - slot->bitmap = target; - slot->bitmap_top += y_pad; - slot->bitmap_left -= x_pad; - slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + slot->bitmap = target; + slot->bitmap_top += y_pad; + slot->bitmap_left -= x_pad; + + if ( target.buffer ) + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; } else if ( target.buffer ) FT_FREE( target.buffer ); diff --git a/src/3rdparty/freetype/src/sfnt/pngshim.c b/src/3rdparty/freetype/src/sfnt/pngshim.c index 423b07b0..33712162 100644 --- a/src/3rdparty/freetype/src/sfnt/pngshim.c +++ b/src/3rdparty/freetype/src/sfnt/pngshim.c @@ -406,10 +406,7 @@ switch ( color_type ) { - default: - /* Shouldn't happen, but ... */ - FALL_THROUGH; - + default: /* Shouldn't happen, but ... */ case PNG_COLOR_TYPE_RGB_ALPHA: png_set_read_user_transform_fn( png, premultiply_data ); break; @@ -457,7 +454,7 @@ #else /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ /* ANSI C doesn't like empty source files */ - typedef int _pngshim_dummy; + typedef int pngshim_dummy_; #endif /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ diff --git a/src/3rdparty/freetype/src/sfnt/sfdriver.c b/src/3rdparty/freetype/src/sfnt/sfdriver.c index 762883db..0925940b 100644 --- a/src/3rdparty/freetype/src/sfnt/sfdriver.c +++ b/src/3rdparty/freetype/src/sfnt/sfdriver.c @@ -79,41 +79,57 @@ * */ - static void* - get_sfnt_table( TT_Face face, + FT_CALLBACK_DEF( FT_Error ) + sfnt_load_table( FT_Face face, /* TT_Face */ + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + TT_Face ttface = (TT_Face)face; + + + return tt_face_load_any( ttface, tag, offset, buffer, length ); + } + + + FT_CALLBACK_DEF( void* ) + get_sfnt_table( FT_Face face, /* TT_Face */ FT_Sfnt_Tag tag ) { + TT_Face ttface = (TT_Face)face; + void* table; switch ( tag ) { case FT_SFNT_HEAD: - table = &face->header; + table = &ttface->header; break; case FT_SFNT_HHEA: - table = &face->horizontal; + table = &ttface->horizontal; break; case FT_SFNT_VHEA: - table = face->vertical_info ? &face->vertical : NULL; + table = ttface->vertical_info ? &ttface->vertical : NULL; break; case FT_SFNT_OS2: - table = ( face->os2.version == 0xFFFFU ) ? NULL : &face->os2; + table = ( ttface->os2.version == 0xFFFFU ) ? NULL : &ttface->os2; break; case FT_SFNT_POST: - table = &face->postscript; + table = &ttface->postscript; break; case FT_SFNT_MAXP: - table = &face->max_profile; + table = &ttface->max_profile; break; case FT_SFNT_PCLT: - table = face->pclt.Version ? &face->pclt : NULL; + table = ttface->pclt.Version ? &ttface->pclt : NULL; break; default: @@ -124,26 +140,29 @@ } - static FT_Error - sfnt_table_info( TT_Face face, + FT_CALLBACK_DEF( FT_Error ) + sfnt_table_info( FT_Face face, /* TT_Face */ FT_UInt idx, FT_ULong *tag, FT_ULong *offset, FT_ULong *length ) { + TT_Face ttface = (TT_Face)face; + + if ( !offset || !length ) return FT_THROW( Invalid_Argument ); if ( !tag ) - *length = face->num_tables; + *length = ttface->num_tables; else { - if ( idx >= face->num_tables ) + if ( idx >= ttface->num_tables ) return FT_THROW( Table_Missing ); - *tag = face->dir_tables[idx].Tag; - *offset = face->dir_tables[idx].Offset; - *length = face->dir_tables[idx].Length; + *tag = ttface->dir_tables[idx].Tag; + *offset = ttface->dir_tables[idx].Offset; + *length = ttface->dir_tables[idx].Length; } return FT_Err_Ok; @@ -153,9 +172,9 @@ FT_DEFINE_SERVICE_SFNT_TABLEREC( sfnt_service_sfnt_table, - (FT_SFNT_TableLoadFunc)tt_face_load_any, /* load_table */ - (FT_SFNT_TableGetFunc) get_sfnt_table, /* get_table */ - (FT_SFNT_TableInfoFunc)sfnt_table_info /* table_info */ + sfnt_load_table, /* FT_SFNT_TableLoadFunc load_table */ + get_sfnt_table, /* FT_SFNT_TableGetFunc get_table */ + sfnt_table_info /* FT_SFNT_TableInfoFunc table_info */ ) @@ -166,7 +185,7 @@ * */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) sfnt_get_glyph_name( FT_Face face, FT_UInt glyph_index, FT_Pointer buffer, @@ -184,7 +203,7 @@ } - static FT_UInt + FT_CALLBACK_DEF( FT_UInt ) sfnt_get_name_index( FT_Face face, const FT_String* glyph_name ) { @@ -221,8 +240,8 @@ FT_DEFINE_SERVICE_GLYPHDICTREC( sfnt_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, /* get_name */ - (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index /* name_index */ + sfnt_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */ + sfnt_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */ ) #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ @@ -523,15 +542,14 @@ FT_TRACE0(( "get_win_string:" " Character 0x%X invalid in PS name string\n", ((unsigned)p[0])*256 + (unsigned)p[1] )); - break; + continue; } } - if ( !len ) - *r = '\0'; + *r = '\0'; FT_FRAME_EXIT(); - if ( !len ) + if ( r != result ) return result; get_win_string_error: @@ -580,15 +598,14 @@ FT_TRACE0(( "get_apple_string:" " Character `%c' (0x%X) invalid in PS name string\n", *p, *p )); - break; + continue; } } - if ( !len ) - *r = '\0'; + *r = '\0'; FT_FRAME_EXIT(); - if ( !len ) + if ( r != result ) return result; get_apple_string_error: @@ -602,7 +619,7 @@ } - static FT_Bool + FT_CALLBACK_DEF( FT_Bool ) sfnt_get_name_id( TT_Face face, FT_UShort id, FT_Int *win, @@ -819,9 +836,9 @@ if ( !found ) { - /* as a last resort we try the family name; note that this is */ - /* not in the Adobe TechNote, but GX fonts (which predate the */ - /* TechNote) benefit from this behaviour */ + /* according to the 'name' documentation in the OpenType */ + /* specification the font family name is to be used if the */ + /* typographic family name is missing, so let's do that */ found = sfnt_get_name_id( face, TT_NAME_ID_FONT_FAMILY, &win, @@ -853,6 +870,10 @@ { FT_TRACE0(( "sfnt_get_var_ps_name:" " No valid PS name prefix for font instances found\n" )); + /* XXX It probably makes sense to never let this fail */ + /* since an arbitrary prefix should work, too. */ + /* On the other hand, it is very unlikely that */ + /* we ever reach this code at all. */ return NULL; } @@ -1041,47 +1062,49 @@ #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ - static const char* - sfnt_get_ps_name( TT_Face face ) + FT_CALLBACK_DEF( const char* ) + sfnt_get_ps_name( FT_Face face ) /* TT_Face */ { + TT_Face ttface = (TT_Face)face; + FT_Int found, win, apple; const char* result = NULL; - if ( face->postscript_name ) - return face->postscript_name; + if ( ttface->postscript_name ) + return ttface->postscript_name; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( face->blend && - ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) || - FT_IS_VARIATION( FT_FACE( face ) ) ) ) + if ( ttface->blend && + ( FT_IS_NAMED_INSTANCE( face ) || + FT_IS_VARIATION( face ) ) ) { - face->postscript_name = sfnt_get_var_ps_name( face ); - return face->postscript_name; + ttface->postscript_name = sfnt_get_var_ps_name( ttface ); + return ttface->postscript_name; } #endif /* scan the name table to see whether we have a Postscript name here, */ /* either in Macintosh or Windows platform encodings */ - found = sfnt_get_name_id( face, TT_NAME_ID_PS_NAME, &win, &apple ); + found = sfnt_get_name_id( ttface, TT_NAME_ID_PS_NAME, &win, &apple ); if ( !found ) return NULL; /* prefer Windows entries over Apple */ if ( win != -1 ) - result = get_win_string( face->root.memory, - face->name_table.stream, - face->name_table.names + win, + result = get_win_string( FT_FACE_MEMORY( face ), + ttface->name_table.stream, + ttface->name_table.names + win, sfnt_is_postscript, 1 ); if ( !result && apple != -1 ) - result = get_apple_string( face->root.memory, - face->name_table.stream, - face->name_table.names + apple, + result = get_apple_string( FT_FACE_MEMORY( face ), + ttface->name_table.stream, + ttface->name_table.names + apple, sfnt_is_postscript, 1 ); - face->postscript_name = result; + ttface->postscript_name = result; return result; } @@ -1090,7 +1113,7 @@ FT_DEFINE_SERVICE_PSFONTNAMEREC( sfnt_service_ps_name, - (FT_PsName_GetFunc)sfnt_get_ps_name /* get_ps_font_name */ + sfnt_get_ps_name /* FT_PsName_GetFunc get_ps_font_name */ ) @@ -1100,14 +1123,14 @@ FT_DEFINE_SERVICE_TTCMAPSREC( tt_service_get_cmap_info, - (TT_CMap_Info_GetFunc)tt_get_cmap_info /* get_cmap_info */ + tt_get_cmap_info /* TT_CMap_Info_GetFunc get_cmap_info */ ) #ifdef TT_CONFIG_OPTION_BDF static FT_Error - sfnt_get_charset_id( TT_Face face, + sfnt_get_charset_id( FT_Face face, const char* *acharset_encoding, const char* *acharset_registry ) { @@ -1145,8 +1168,8 @@ FT_DEFINE_SERVICE_BDFRec( sfnt_service_bdf, - (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id, /* get_charset_id */ - (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop /* get_property */ + sfnt_get_charset_id, /* FT_BDF_GetCharsetIdFunc get_charset_id */ + tt_face_find_bdf_prop /* FT_BDF_GetPropertyFunc get_property */ ) @@ -1337,9 +1360,9 @@ (const void*)&sfnt_interface, /* module specific interface */ - (FT_Module_Constructor)NULL, /* module_init */ - (FT_Module_Destructor) NULL, /* module_done */ - (FT_Module_Requester) sfnt_get_interface /* get_interface */ + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ + sfnt_get_interface /* FT_Module_Requester get_interface */ ) diff --git a/src/3rdparty/freetype/src/sfnt/sfobjs.c b/src/3rdparty/freetype/src/sfnt/sfobjs.c index e018934c..f5d66ef8 100644 --- a/src/3rdparty/freetype/src/sfnt/sfobjs.c +++ b/src/3rdparty/freetype/src/sfnt/sfobjs.c @@ -534,17 +534,23 @@ 0 ); } - if ( !face->var ) + if ( !face->tt_var ) { /* we want the metrics variations interface */ /* from the `truetype' module only */ FT_Module tt_module = FT_Get_Module( library, "truetype" ); - face->var = ft_module_get_service( tt_module, - FT_SERVICE_ID_METRICS_VARIATIONS, - 0 ); + face->tt_var = ft_module_get_service( tt_module, + FT_SERVICE_ID_METRICS_VARIATIONS, + 0 ); } + + if ( !face->face_var ) + face->face_var = ft_module_get_service( + &face->root.driver->root, + FT_SERVICE_ID_METRICS_VARIATIONS, + 0 ); #endif FT_TRACE2(( "SFNT driver\n" )); @@ -692,6 +698,9 @@ instance_offset += instance_size; } + /* named instance indices start with value 1 */ + face->var_default_named_instance = i + 1; + if ( i == num_instances ) { /* no default instance in named instance table; */ @@ -1054,6 +1063,16 @@ GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); } +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Memory memory = face->root.memory; + + + if ( FT_STRDUP( face->non_var_style_name, face->root.style_name ) ) + goto Exit; + } +#endif + /* now set up root fields */ { FT_Face root = &face->root; @@ -1221,7 +1240,7 @@ if ( count > 0 ) { - FT_Memory memory = face->root.stream->memory; + FT_Memory memory = face->root.memory; FT_UShort em_size = face->header.Units_Per_EM; FT_Short avgwidth = face->os2.xAvgCharWidth; FT_Size_Metrics metrics; @@ -1500,6 +1519,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_FREE( face->var_postscript_prefix ); + FT_FREE( face->non_var_style_name ); #endif /* freeing glyph color palette data */ diff --git a/src/3rdparty/freetype/src/sfnt/sfwoff.c b/src/3rdparty/freetype/src/sfnt/sfwoff.c index 9559bf34..7c0ce220 100644 --- a/src/3rdparty/freetype/src/sfnt/sfwoff.c +++ b/src/3rdparty/freetype/src/sfnt/sfwoff.c @@ -426,7 +426,7 @@ #else /* !FT_CONFIG_OPTION_USE_ZLIB */ /* ANSI C doesn't like empty source files */ - typedef int _sfwoff_dummy; + typedef int sfwoff_dummy_; #endif /* !FT_CONFIG_OPTION_USE_ZLIB */ diff --git a/src/3rdparty/freetype/src/sfnt/sfwoff2.c b/src/3rdparty/freetype/src/sfnt/sfwoff2.c index 7a01977f..2be44a34 100644 --- a/src/3rdparty/freetype/src/sfnt/sfwoff2.c +++ b/src/3rdparty/freetype/src/sfnt/sfwoff2.c @@ -36,6 +36,8 @@ #undef FT_COMPONENT #define FT_COMPONENT sfwoff2 + /* An arbitrary, heuristic size limit (67MByte) for expanded WOFF2 data. */ +#define MAX_SFNT_SIZE ( 1 << 26 ) #define READ_255USHORT( var ) FT_SET_ERROR( Read255UShort( stream, &var ) ) @@ -2180,9 +2182,8 @@ else sfnt_size = woff2.totalSfntSize; - /* Value 1<<26 = 67108864 is heuristic. */ - if (sfnt_size >= (1 << 26)) - sfnt_size = 1 << 26; + if ( sfnt_size >= MAX_SFNT_SIZE ) + sfnt_size = MAX_SFNT_SIZE; #ifdef FT_DEBUG_LEVEL_TRACE if ( sfnt_size != woff2.totalSfntSize ) @@ -2257,10 +2258,15 @@ goto Exit; } - if ( woff2.uncompressed_size > sfnt_size ) + /* We must not blindly trust `uncompressed_size` since its */ + /* value might be corrupted. If it is too large, reject the */ + /* font. In other words, we don't accept a WOFF2 font that */ + /* expands to something larger than MAX_SFNT_SIZE. If ever */ + /* necessary, this limit can be easily adjusted. */ + if ( woff2.uncompressed_size > MAX_SFNT_SIZE ) { - FT_ERROR(( "woff2_open_font: SFNT table lengths are too large.\n" )); - error = FT_THROW( Invalid_Table ); + FT_ERROR(( "Uncompressed font too large.\n" )); + error = FT_THROW( Array_Too_Large ); goto Exit; } @@ -2378,7 +2384,7 @@ #else /* !FT_CONFIG_OPTION_USE_BROTLI */ /* ANSI C doesn't like empty source files */ - typedef int _sfwoff2_dummy; + typedef int sfwoff2_dummy_; #endif /* !FT_CONFIG_OPTION_USE_BROTLI */ diff --git a/src/3rdparty/freetype/src/sfnt/ttbdf.c b/src/3rdparty/freetype/src/sfnt/ttbdf.c index 118f475e..536fa746 100644 --- a/src/3rdparty/freetype/src/sfnt/ttbdf.c +++ b/src/3rdparty/freetype/src/sfnt/ttbdf.c @@ -136,13 +136,14 @@ FT_LOCAL_DEF( FT_Error ) - tt_face_find_bdf_prop( TT_Face face, + tt_face_find_bdf_prop( FT_Face face, /* TT_Face */ const char* property_name, BDF_PropertyRec *aprop ) { - TT_BDF bdf = &face->bdf; - FT_Size size = FT_FACE( face )->size; - FT_Error error = FT_Err_Ok; + TT_Face ttface = (TT_Face)face; + TT_BDF bdf = &ttface->bdf; + FT_Size size = FT_FACE_SIZE( face ); + FT_Error error = FT_Err_Ok; FT_Byte* p; FT_UInt count; FT_Byte* strike; @@ -153,7 +154,7 @@ if ( bdf->loaded == 0 ) { - error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); + error = tt_face_load_bdf_props( ttface, FT_FACE_STREAM( face ) ); if ( error ) goto Exit; } @@ -248,7 +249,7 @@ #else /* !TT_CONFIG_OPTION_BDF */ /* ANSI C doesn't like empty source files */ - typedef int _tt_bdf_dummy; + typedef int tt_bdf_dummy_; #endif /* !TT_CONFIG_OPTION_BDF */ diff --git a/src/3rdparty/freetype/src/sfnt/ttbdf.h b/src/3rdparty/freetype/src/sfnt/ttbdf.h index 595aeb76..0d7a0ace 100644 --- a/src/3rdparty/freetype/src/sfnt/ttbdf.h +++ b/src/3rdparty/freetype/src/sfnt/ttbdf.h @@ -34,7 +34,7 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) - tt_face_find_bdf_prop( TT_Face face, + tt_face_find_bdf_prop( FT_Face face, const char* property_name, BDF_PropertyRec *aprop ); diff --git a/src/3rdparty/freetype/src/sfnt/ttcmap.c b/src/3rdparty/freetype/src/sfnt/ttcmap.c index 820cd08e..9ba25dcb 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcmap.c +++ b/src/3rdparty/freetype/src/sfnt/ttcmap.c @@ -59,10 +59,14 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap_init( TT_CMap cmap, - FT_Byte* table ) + tt_cmap_init( FT_CMap cmap, /* TT_CMap */ + void* table_ ) { - cmap->data = table; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = (FT_Byte*)table_; + + + ttcmap->data = table; return FT_Err_Ok; } @@ -128,21 +132,23 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap0_char_index( TT_CMap cmap, + tt_cmap0_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; return char_code < 256 ? table[6 + char_code] : 0; } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap0_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_next( FT_CMap cmap, /* TT_CMap */ FT_UInt32 *pchar_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt32 charcode = *pchar_code; FT_UInt32 result = 0; FT_UInt gindex = 0; @@ -165,10 +171,11 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap0_get_info( TT_CMap cmap, + tt_cmap0_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 4; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; cmap_info->format = 0; @@ -453,10 +460,11 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap2_char_index( TT_CMap cmap, + tt_cmap2_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt result = 0; FT_Byte* subheader; @@ -491,11 +499,12 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap2_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_next( FT_CMap cmap, /* TT_CMap */ FT_UInt32 *pcharcode ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt gindex = 0; FT_UInt32 result = 0; FT_UInt32 charcode = *pcharcode + 1; @@ -579,10 +588,11 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap2_get_info( TT_CMap cmap, + tt_cmap2_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 4; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; cmap_info->format = 2; @@ -706,18 +716,20 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_init( TT_CMap4 cmap, - FT_Byte* table ) + tt_cmap4_init( FT_CMap cmap, /* TT_CMap4 */ + void* table_ ) { + TT_CMap4 ttcmap = (TT_CMap4)cmap; + FT_Byte* table = (FT_Byte*)table_; FT_Byte* p; - cmap->cmap.data = table; + ttcmap->cmap.data = table; - p = table + 6; - cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; - cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; - cmap->cur_gindex = 0; + p = table + 6; + ttcmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; + ttcmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + ttcmap->cur_gindex = 0; return FT_Err_Ok; } @@ -755,7 +767,7 @@ cmap->cur_start == 0xFFFFU && cmap->cur_end == 0xFFFFU ) { - TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); FT_Byte* limit = face->cmap_table + face->cmap_size; @@ -788,15 +800,12 @@ static void tt_cmap4_next( TT_CMap4 cmap ) { - TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); FT_Byte* limit = face->cmap_table + face->cmap_size; FT_UInt charcode; - if ( cmap->cur_charcode >= 0xFFFFUL ) - goto Fail; - charcode = (FT_UInt)cmap->cur_charcode + 1; if ( charcode < cmap->cur_start ) @@ -882,7 +891,6 @@ charcode = cmap->cur_start; } - Fail: cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; cmap->cur_gindex = 0; } @@ -1097,32 +1105,26 @@ FT_UInt32* pcharcode, FT_Bool next ) { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); FT_Byte* limit = face->cmap_table + face->cmap_size; FT_UInt num_segs2, start, end, offset; FT_Int delta; FT_UInt i, num_segs; - FT_UInt32 charcode = *pcharcode; + FT_UInt32 charcode = *pcharcode + next; FT_UInt gindex = 0; FT_Byte* p; FT_Byte* q; p = cmap->data + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); - - num_segs = num_segs2 >> 1; + num_segs = TT_PEEK_USHORT( p ) >> 1; if ( !num_segs ) return 0; - if ( next ) - charcode++; - - if ( charcode > 0xFFFFU ) - return 0; + num_segs2 = num_segs << 1; /* linear search */ p = cmap->data + 14; /* ends table */ @@ -1232,37 +1234,30 @@ FT_UInt32* pcharcode, FT_Bool next ) { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); FT_Byte* limit = face->cmap_table + face->cmap_size; FT_UInt num_segs2, start, end, offset; FT_Int delta; FT_UInt max, min, mid, num_segs; - FT_UInt charcode = (FT_UInt)*pcharcode; + FT_UInt charcode = (FT_UInt)*pcharcode + next; FT_UInt gindex = 0; FT_Byte* p; p = cmap->data + 6; - num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + num_segs = TT_PEEK_USHORT( p ) >> 1; - if ( !num_segs2 ) + if ( !num_segs ) return 0; - num_segs = num_segs2 >> 1; - - /* make compiler happy */ - mid = num_segs; - end = 0xFFFFU; - - if ( next ) - charcode++; + num_segs2 = num_segs << 1; min = 0; max = num_segs; /* binary search */ - while ( min < max ) + do { mid = ( min + max ) >> 1; p = cmap->data + 14 + mid * 2; @@ -1445,6 +1440,7 @@ break; } } + while ( min < max ); if ( next ) { @@ -1454,12 +1450,8 @@ /* if `charcode' is not in any segment, then `mid' is */ /* the segment nearest to `charcode' */ - if ( charcode > end ) - { - mid++; - if ( mid == num_segs ) - return 0; - } + if ( charcode > end && ++mid == num_segs ) + return 0; if ( tt_cmap4_set_range( cmap4, mid ) ) { @@ -1474,7 +1466,6 @@ cmap4->cur_gindex = gindex; else { - cmap4->cur_charcode = charcode; tt_cmap4_next( cmap4 ); gindex = cmap4->cur_gindex; } @@ -1489,31 +1480,35 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap4_char_index( TT_CMap cmap, + tt_cmap4_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { + TT_CMap ttcmap = (TT_CMap)cmap; + + if ( char_code >= 0x10000UL ) return 0; - if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) - return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); + if ( ttcmap->flags & TT_CMAP_FLAG_UNSORTED ) + return tt_cmap4_char_map_linear( ttcmap, &char_code, 0 ); else - return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); + return tt_cmap4_char_map_binary( ttcmap, &char_code, 0 ); } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap4_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_next( FT_CMap cmap, /* TT_CMap */ FT_UInt32 *pchar_code ) { + TT_CMap ttcmap = (TT_CMap)cmap; FT_UInt gindex; if ( *pchar_code >= 0xFFFFU ) return 0; - if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) - gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); + if ( ttcmap->flags & TT_CMAP_FLAG_UNSORTED ) + gindex = tt_cmap4_char_map_linear( ttcmap, pchar_code, 1 ); else { TT_CMap4 cmap4 = (TT_CMap4)cmap; @@ -1528,7 +1523,7 @@ *pchar_code = cmap4->cur_charcode; } else - gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); + gindex = tt_cmap4_char_map_binary( ttcmap, pchar_code, 1 ); } return gindex; @@ -1536,10 +1531,11 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap4_get_info( TT_CMap cmap, + tt_cmap4_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 4; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; cmap_info->format = 4; @@ -1640,10 +1636,11 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap6_char_index( TT_CMap cmap, + tt_cmap6_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt result = 0; FT_Byte* p = table + 6; FT_UInt start = TT_NEXT_USHORT( p ); @@ -1661,11 +1658,12 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap6_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_next( FT_CMap cmap, /* TT_CMap */ FT_UInt32 *pchar_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt32 result = 0; FT_UInt32 char_code = *pchar_code + 1; FT_UInt gindex = 0; @@ -1706,10 +1704,11 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap6_get_info( TT_CMap cmap, + tt_cmap6_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 4; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 4; cmap_info->format = 6; @@ -1900,10 +1899,11 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap8_char_index( TT_CMap cmap, + tt_cmap8_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt result = 0; FT_Byte* p = table + 8204; FT_UInt32 num_groups = TT_NEXT_ULONG( p ); @@ -1932,15 +1932,16 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap8_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_next( FT_CMap cmap, /* TT_CMap */ FT_UInt32 *pchar_code ) { - FT_Face face = cmap->cmap.charmap.face; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); FT_UInt32 result = 0; FT_UInt32 char_code; FT_UInt gindex = 0; - FT_Byte* table = cmap->data; + FT_Byte* table = ttcmap->data; FT_Byte* p = table + 8204; FT_UInt32 num_groups = TT_NEXT_ULONG( p ); FT_UInt32 start, end, start_id; @@ -2000,10 +2001,11 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap8_get_info( TT_CMap cmap, + tt_cmap8_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 8; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; cmap_info->format = 8; @@ -2104,10 +2106,11 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap10_char_index( TT_CMap cmap, + tt_cmap10_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt result = 0; FT_Byte* p = table + 12; FT_UInt32 start = TT_NEXT_ULONG( p ); @@ -2130,11 +2133,12 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap10_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_next( FT_CMap cmap, /* TT_CMap */ FT_UInt32 *pchar_code ) { - FT_Byte* table = cmap->data; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* table = ttcmap->data; FT_UInt32 char_code; FT_UInt gindex = 0; FT_Byte* p = table + 12; @@ -2172,10 +2176,11 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap10_get_info( TT_CMap cmap, + tt_cmap10_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 8; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; cmap_info->format = 10; @@ -2253,15 +2258,19 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_init( TT_CMap12 cmap, - FT_Byte* table ) + tt_cmap12_init( FT_CMap cmap, /* TT_CMap12 */ + void* table_ ) { - cmap->cmap.data = table; + TT_CMap12 ttcmap = (TT_CMap12)cmap; + FT_Byte* table = (FT_Byte*)table_; - table += 12; - cmap->num_groups = FT_PEEK_ULONG( table ); - cmap->valid = 0; + ttcmap->cmap.data = table; + + table += 12; + ttcmap->num_groups = FT_PEEK_ULONG( table ); + + ttcmap->valid = 0; return FT_Err_Ok; } @@ -2331,23 +2340,21 @@ /* cmap->cur_group should be set up properly by caller */ /* */ static void - tt_cmap12_next( TT_CMap12 cmap ) + tt_cmap12_next( FT_CMap cmap ) /* TT_CMap12 */ { - FT_Face face = cmap->cmap.cmap.charmap.face; - FT_Byte* p; - FT_ULong start, end, start_id, char_code; - FT_ULong n; - FT_UInt gindex; + TT_CMap12 ttcmap = (TT_CMap12)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Byte* p; + FT_ULong start, end, start_id, char_code; + FT_ULong n; + FT_UInt gindex; - if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) - goto Fail; + char_code = ttcmap->cur_charcode + 1; - char_code = cmap->cur_charcode + 1; - - for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + for ( n = ttcmap->cur_group; n < ttcmap->num_groups; n++ ) { - p = cmap->cmap.data + 16 + 12 * n; + p = ttcmap->cmap.data + 16 + 12 * n; start = TT_NEXT_ULONG( p ); end = TT_NEXT_ULONG( p ); start_id = TT_PEEK_ULONG( p ); @@ -2379,16 +2386,16 @@ if ( gindex >= (FT_UInt)face->num_glyphs ) continue; - cmap->cur_charcode = char_code; - cmap->cur_gindex = gindex; - cmap->cur_group = n; + ttcmap->cur_charcode = char_code; + ttcmap->cur_gindex = gindex; + ttcmap->cur_group = n; return; } } Fail: - cmap->valid = 0; + ttcmap->valid = 0; } @@ -2400,7 +2407,7 @@ FT_UInt gindex = 0; FT_Byte* p = cmap->data + 12; FT_UInt32 num_groups = TT_PEEK_ULONG( p ); - FT_UInt32 char_code = *pchar_code; + FT_UInt32 char_code = *pchar_code + next; FT_UInt32 start, end, start_id; FT_UInt32 max, min, mid; @@ -2408,23 +2415,11 @@ if ( !num_groups ) return 0; - /* make compiler happy */ - mid = num_groups; - end = 0xFFFFFFFFUL; - - if ( next ) - { - if ( char_code >= 0xFFFFFFFFUL ) - return 0; - - char_code++; - } - min = 0; max = num_groups; /* binary search */ - while ( min < max ) + do { mid = ( min + max ) >> 1; p = cmap->data + 16 + 12 * mid; @@ -2448,22 +2443,19 @@ break; } } + while ( min < max ); if ( next ) { - FT_Face face = cmap->cmap.charmap.face; + FT_Face face = FT_CMAP_FACE( cmap ); TT_CMap12 cmap12 = (TT_CMap12)cmap; /* if `char_code' is not in any group, then `mid' is */ /* the group nearest to `char_code' */ - if ( char_code > end ) - { - mid++; - if ( mid == num_groups ) - return 0; - } + if ( char_code > end && ++mid == num_groups ) + return 0; cmap12->valid = 1; cmap12->cur_charcode = char_code; @@ -2474,7 +2466,7 @@ if ( !gindex ) { - tt_cmap12_next( cmap12 ); + tt_cmap12_next( FT_CMAP( cmap12 ) ); if ( cmap12->valid ) gindex = cmap12->cur_gindex; @@ -2490,25 +2482,28 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap12_char_index( TT_CMap cmap, + tt_cmap12_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); + return tt_cmap12_char_map_binary( (TT_CMap)cmap, &char_code, 0 ); } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap12_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_next( FT_CMap cmap, /* TT_CMap12 */ FT_UInt32 *pchar_code ) { TT_CMap12 cmap12 = (TT_CMap12)cmap; FT_UInt gindex; + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + /* no need to search */ if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) { - tt_cmap12_next( cmap12 ); + tt_cmap12_next( FT_CMAP( cmap12 ) ); if ( cmap12->valid ) { gindex = cmap12->cur_gindex; @@ -2518,17 +2513,18 @@ gindex = 0; } else - gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); + gindex = tt_cmap12_char_map_binary( (TT_CMap)cmap, pchar_code, 1 ); return gindex; } FT_CALLBACK_DEF( FT_Error ) - tt_cmap12_get_info( TT_CMap cmap, + tt_cmap12_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 8; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; cmap_info->format = 12; @@ -2606,15 +2602,19 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_init( TT_CMap13 cmap, - FT_Byte* table ) + tt_cmap13_init( FT_CMap cmap, /* TT_CMap13 */ + void* table_ ) { - cmap->cmap.data = table; + TT_CMap13 ttcmap = (TT_CMap13)cmap; + FT_Byte* table = (FT_Byte*)table_; - table += 12; - cmap->num_groups = FT_PEEK_ULONG( table ); - cmap->valid = 0; + ttcmap->cmap.data = table; + + table += 12; + ttcmap->num_groups = FT_PEEK_ULONG( table ); + + ttcmap->valid = 0; return FT_Err_Ok; } @@ -2679,23 +2679,21 @@ /* cmap->cur_group should be set up properly by caller */ /* */ static void - tt_cmap13_next( TT_CMap13 cmap ) + tt_cmap13_next( FT_CMap cmap ) /* TT_CMap13 */ { - FT_Face face = cmap->cmap.cmap.charmap.face; - FT_Byte* p; - FT_ULong start, end, glyph_id, char_code; - FT_ULong n; - FT_UInt gindex; + TT_CMap13 ttcmap = (TT_CMap13)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Byte* p; + FT_ULong start, end, glyph_id, char_code; + FT_ULong n; + FT_UInt gindex; - if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) - goto Fail; + char_code = ttcmap->cur_charcode + 1; - char_code = cmap->cur_charcode + 1; - - for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + for ( n = ttcmap->cur_group; n < ttcmap->num_groups; n++ ) { - p = cmap->cmap.data + 16 + 12 * n; + p = ttcmap->cmap.data + 16 + 12 * n; start = TT_NEXT_ULONG( p ); end = TT_NEXT_ULONG( p ); glyph_id = TT_PEEK_ULONG( p ); @@ -2709,17 +2707,16 @@ if ( gindex && gindex < (FT_UInt)face->num_glyphs ) { - cmap->cur_charcode = char_code; - cmap->cur_gindex = gindex; - cmap->cur_group = n; + ttcmap->cur_charcode = char_code; + ttcmap->cur_gindex = gindex; + ttcmap->cur_group = n; return; } } } - Fail: - cmap->valid = 0; + ttcmap->valid = 0; } @@ -2731,7 +2728,7 @@ FT_UInt gindex = 0; FT_Byte* p = cmap->data + 12; FT_UInt32 num_groups = TT_PEEK_ULONG( p ); - FT_UInt32 char_code = *pchar_code; + FT_UInt32 char_code = *pchar_code + next; FT_UInt32 start, end; FT_UInt32 max, min, mid; @@ -2739,23 +2736,11 @@ if ( !num_groups ) return 0; - /* make compiler happy */ - mid = num_groups; - end = 0xFFFFFFFFUL; - - if ( next ) - { - if ( char_code >= 0xFFFFFFFFUL ) - return 0; - - char_code++; - } - min = 0; max = num_groups; /* binary search */ - while ( min < max ) + do { mid = ( min + max ) >> 1; p = cmap->data + 16 + 12 * mid; @@ -2774,6 +2759,7 @@ break; } } + while ( min < max ); if ( next ) { @@ -2784,12 +2770,8 @@ /* if `char_code' is not in any group, then `mid' is */ /* the group nearest to `char_code' */ - if ( char_code > end ) - { - mid++; - if ( mid == num_groups ) - return 0; - } + if ( char_code > end && ++mid == num_groups ) + return 0; cmap13->valid = 1; cmap13->cur_charcode = char_code; @@ -2800,7 +2782,7 @@ if ( !gindex ) { - tt_cmap13_next( cmap13 ); + tt_cmap13_next( FT_CMAP( cmap13 ) ); if ( cmap13->valid ) gindex = cmap13->cur_gindex; @@ -2816,25 +2798,28 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap13_char_index( TT_CMap cmap, + tt_cmap13_char_index( FT_CMap cmap, /* TT_CMap */ FT_UInt32 char_code ) { - return tt_cmap13_char_map_binary( cmap, &char_code, 0 ); + return tt_cmap13_char_map_binary( (TT_CMap)cmap, &char_code, 0 ); } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap13_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap13_char_next( FT_CMap cmap, /* TT_CMap13 */ FT_UInt32 *pchar_code ) { TT_CMap13 cmap13 = (TT_CMap13)cmap; FT_UInt gindex; + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + /* no need to search */ if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) { - tt_cmap13_next( cmap13 ); + tt_cmap13_next( FT_CMAP( cmap13 ) ); if ( cmap13->valid ) { gindex = cmap13->cur_gindex; @@ -2844,17 +2829,18 @@ gindex = 0; } else - gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 ); + gindex = tt_cmap13_char_map_binary( (TT_CMap)cmap, pchar_code, 1 ); return gindex; } FT_CALLBACK_DEF( FT_Error ) - tt_cmap13_get_info( TT_CMap cmap, + tt_cmap13_get_info( FT_CharMap cmap, /* TT_CMap */ TT_CMapInfo *cmap_info ) { - FT_Byte* p = cmap->data + 8; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = ttcmap->data + 8; cmap_info->format = 13; @@ -2969,14 +2955,15 @@ FT_CALLBACK_DEF( void ) - tt_cmap14_done( TT_CMap14 cmap ) + tt_cmap14_done( FT_CMap cmap ) /* TT_CMap14 */ { - FT_Memory memory = cmap->memory; + TT_CMap14 ttcmap = (TT_CMap14)cmap; + FT_Memory memory = ttcmap->memory; - cmap->max_results = 0; - if ( memory && cmap->results ) - FT_FREE( cmap->results ); + ttcmap->max_results = 0; + if ( memory && ttcmap->results ) + FT_FREE( ttcmap->results ); } @@ -3004,15 +2991,19 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_init( TT_CMap14 cmap, - FT_Byte* table ) + tt_cmap14_init( FT_CMap cmap, /* TT_CMap14 */ + void* table_ ) { - cmap->cmap.data = table; + TT_CMap14 ttcmap = (TT_CMap14)cmap; + FT_Byte* table = (FT_Byte*)table_; - table += 6; - cmap->num_selectors = FT_PEEK_ULONG( table ); - cmap->max_results = 0; - cmap->results = NULL; + + ttcmap->cmap.data = table; + + table += 6; + ttcmap->num_selectors = FT_PEEK_ULONG( table ); + ttcmap->max_results = 0; + ttcmap->results = NULL; return FT_Err_Ok; } @@ -3142,7 +3133,7 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap14_char_index( TT_CMap cmap, + tt_cmap14_char_index( FT_CMap cmap, FT_UInt32 char_code ) { FT_UNUSED( cmap ); @@ -3153,8 +3144,8 @@ } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap14_char_next( TT_CMap cmap, + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_next( FT_CMap cmap, FT_UInt32 *pchar_code ) { FT_UNUSED( cmap ); @@ -3166,7 +3157,7 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap14_get_info( TT_CMap cmap, + tt_cmap14_get_info( FT_CharMap cmap, TT_CMapInfo *cmap_info ) { FT_UNUSED( cmap ); @@ -3280,12 +3271,16 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap14_char_var_index( TT_CMap cmap, - TT_CMap ucmap, + tt_cmap14_char_var_index( FT_CMap cmap, /* TT_CMap */ + FT_CMap ucmap, /* TT_CMap */ FT_UInt32 charcode, FT_UInt32 variantSelector ) { - FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + TT_CMap ttcmap = (TT_CMap)cmap; + TT_CMap ttucmap = (TT_CMap)ucmap; + + FT_Byte* p = tt_cmap14_find_variant( ttcmap->data + 6, + variantSelector ); FT_ULong defOff; FT_ULong nondefOff; @@ -3296,16 +3291,16 @@ defOff = TT_NEXT_ULONG( p ); nondefOff = TT_PEEK_ULONG( p ); - if ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( ttcmap->data + defOff, charcode ) ) { /* This is the default variant of this charcode. GID not stored */ /* here; stored in the normal Unicode charmap instead. */ - return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); + return ttucmap->cmap.clazz->char_index( &ttucmap->cmap, charcode ); } if ( nondefOff != 0 ) - return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + return tt_cmap14_char_map_nondef_binary( ttcmap->data + nondefOff, charcode ); return 0; @@ -3313,11 +3308,13 @@ FT_CALLBACK_DEF( FT_Int ) - tt_cmap14_char_var_isdefault( TT_CMap cmap, + tt_cmap14_char_var_isdefault( FT_CMap cmap, /* TT_CMap */ FT_UInt32 charcode, FT_UInt32 variantSelector ) { - FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte* p = tt_cmap14_find_variant( ttcmap->data + 6, + variantSelector ); FT_ULong defOff; FT_ULong nondefOff; @@ -3328,13 +3325,13 @@ defOff = TT_NEXT_ULONG( p ); nondefOff = TT_NEXT_ULONG( p ); - if ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( ttcmap->data + defOff, charcode ) ) return 1; - if ( nondefOff != 0 && - tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charcode ) != 0 ) + if ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( ttcmap->data + nondefOff, + charcode ) != 0 ) return 0; return -1; @@ -3342,12 +3339,13 @@ FT_CALLBACK_DEF( FT_UInt32* ) - tt_cmap14_variants( TT_CMap cmap, + tt_cmap14_variants( FT_CMap cmap, /* TT_CMap14 */ FT_Memory memory ) { + TT_CMap ttcmap = (TT_CMap)cmap; TT_CMap14 cmap14 = (TT_CMap14)cmap; FT_UInt32 count = cmap14->num_selectors; - FT_Byte* p = cmap->data + 10; + FT_Byte* p = ttcmap->data + 10; FT_UInt32* result; FT_UInt32 i; @@ -3368,13 +3366,14 @@ FT_CALLBACK_DEF( FT_UInt32 * ) - tt_cmap14_char_variants( TT_CMap cmap, + tt_cmap14_char_variants( FT_CMap cmap, /* TT_CMap14 */ FT_Memory memory, FT_UInt32 charCode ) { - TT_CMap14 cmap14 = (TT_CMap14) cmap; + TT_CMap ttcmap = (TT_CMap)cmap; + TT_CMap14 cmap14 = (TT_CMap14)cmap; FT_UInt32 count = cmap14->num_selectors; - FT_Byte* p = cmap->data + 10; + FT_Byte* p = ttcmap->data + 10; FT_UInt32* q; @@ -3388,12 +3387,12 @@ FT_ULong nondefOff = TT_NEXT_ULONG( p ); - if ( ( defOff != 0 && - tt_cmap14_char_map_def_binary( cmap->data + defOff, - charCode ) ) || - ( nondefOff != 0 && - tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, - charCode ) != 0 ) ) + if ( ( defOff != 0 && + tt_cmap14_char_map_def_binary( ttcmap->data + defOff, + charCode ) ) || + ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( ttcmap->data + nondefOff, + charCode ) != 0 ) ) { q[0] = varSel; q++; @@ -3489,15 +3488,16 @@ FT_CALLBACK_DEF( FT_UInt32 * ) - tt_cmap14_variant_chars( TT_CMap cmap, + tt_cmap14_variant_chars( FT_CMap cmap, /* TT_CMap */ FT_Memory memory, FT_UInt32 variantSelector ) { - FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, - variantSelector ); - FT_Int i; - FT_ULong defOff; - FT_ULong nondefOff; + TT_CMap ttcmap = (TT_CMap)cmap; + FT_Byte *p = tt_cmap14_find_variant( ttcmap->data + 6, + variantSelector ); + FT_Int i; + FT_ULong defOff; + FT_ULong nondefOff; if ( !p ) @@ -3510,16 +3510,16 @@ return NULL; if ( defOff == 0 ) - return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + return tt_cmap14_get_nondef_chars( ttcmap, ttcmap->data + nondefOff, memory ); else if ( nondefOff == 0 ) - return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + return tt_cmap14_get_def_chars( ttcmap, ttcmap->data + defOff, memory ); else { /* Both a default and a non-default glyph set? That's probably not */ /* good font design, but the spec allows for it... */ - TT_CMap14 cmap14 = (TT_CMap14) cmap; + TT_CMap14 cmap14 = (TT_CMap14)cmap; FT_UInt32 numRanges; FT_UInt32 numMappings; FT_UInt32 duni; @@ -3531,18 +3531,18 @@ FT_UInt32 *ret; - p = cmap->data + nondefOff; - dp = cmap->data + defOff; + p = ttcmap->data + nondefOff; + dp = ttcmap->data + defOff; numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); dcnt = tt_cmap14_def_char_count( dp ); numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); if ( numMappings == 0 ) - return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + return tt_cmap14_get_def_chars( ttcmap, ttcmap->data + defOff, memory ); if ( dcnt == 0 ) - return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + return tt_cmap14_get_nondef_chars( ttcmap, ttcmap->data + nondefOff, memory ); if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) @@ -3664,9 +3664,10 @@ #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES FT_CALLBACK_DEF( const char * ) - tt_get_glyph_name( TT_Face face, + tt_get_glyph_name( void* face_, /* TT_Face */ FT_UInt idx ) { + TT_Face face = (TT_Face)face_; FT_String* PSname = NULL; @@ -3677,12 +3678,13 @@ FT_CALLBACK_DEF( FT_Error ) - tt_cmap_unicode_init( PS_Unicodes unicodes, - FT_Pointer pointer ) + tt_cmap_unicode_init( FT_CMap cmap, /* PS_Unicodes */ + FT_Pointer pointer ) { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; FT_UNUSED( pointer ); @@ -3693,17 +3695,18 @@ return psnames->unicodes_init( memory, unicodes, face->root.num_glyphs, - (PS_GetGlyphNameFunc)&tt_get_glyph_name, + &tt_get_glyph_name, (PS_FreeGlyphNameFunc)NULL, (FT_Pointer)face ); } FT_CALLBACK_DEF( void ) - tt_cmap_unicode_done( PS_Unicodes unicodes ) + tt_cmap_unicode_done( FT_CMap cmap ) /* PS_Unicodes */ { - FT_Face face = FT_CMAP_FACE( unicodes ); - FT_Memory memory = FT_FACE_MEMORY( face ); + PS_Unicodes unicodes = (PS_Unicodes)cmap; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); FT_FREE( unicodes->maps ); @@ -3712,23 +3715,25 @@ FT_CALLBACK_DEF( FT_UInt ) - tt_cmap_unicode_char_index( PS_Unicodes unicodes, - FT_UInt32 char_code ) + tt_cmap_unicode_char_index( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 char_code ) { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; return psnames->unicodes_char_index( unicodes, char_code ); } - FT_CALLBACK_DEF( FT_UInt32 ) - tt_cmap_unicode_char_next( PS_Unicodes unicodes, - FT_UInt32 *pchar_code ) + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap_unicode_char_next( FT_CMap cmap, /* PS_Unicodes */ + FT_UInt32 *pchar_code ) { - TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); - FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + PS_Unicodes unicodes = (PS_Unicodes)cmap; + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; return psnames->unicodes_char_next( unicodes, pchar_code ); @@ -3883,7 +3888,7 @@ tt_get_cmap_info( FT_CharMap charmap, TT_CMapInfo *cmap_info ) { - FT_CMap cmap = (FT_CMap)charmap; + FT_CMap cmap = FT_CMAP( charmap ); TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; diff --git a/src/3rdparty/freetype/src/sfnt/ttcolr.c b/src/3rdparty/freetype/src/sfnt/ttcolr.c index 5d98dcab..281e7135 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcolr.c +++ b/src/3rdparty/freetype/src/sfnt/ttcolr.c @@ -229,7 +229,7 @@ base_glyphs_offset_v1 = FT_NEXT_ULONG( p ); - if ( base_glyphs_offset_v1 + 4 >= table_size ) + if ( base_glyphs_offset_v1 >= table_size - 4 ) goto InvalidTable; p1 = (FT_Byte*)( table + base_glyphs_offset_v1 ); @@ -249,7 +249,7 @@ if ( layer_offset_v1 ) { - if ( layer_offset_v1 + 4 >= table_size ) + if ( layer_offset_v1 >= table_size - 4 ) goto InvalidTable; p1 = (FT_Byte*)( table + layer_offset_v1 ); @@ -699,7 +699,7 @@ item_deltas ) ) return 0; - apaint->u.solid.color.alpha += item_deltas[0]; + apaint->u.solid.color.alpha += (FT_F2Dot14)item_deltas[0]; } #endif @@ -1646,7 +1646,7 @@ return 0; color_stop->stop_offset += F2DOT14_TO_FIXED( item_deltas[0] ); - color_stop->color.alpha += item_deltas[1]; + color_stop->color.alpha += (FT_F2Dot14)item_deltas[1]; } #else FT_UNUSED( var_index_base ); @@ -1914,7 +1914,7 @@ #else /* !TT_CONFIG_OPTION_COLOR_LAYERS */ /* ANSI C doesn't like empty source files */ - typedef int _tt_colr_dummy; + typedef int tt_colr_dummy_; #endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */ diff --git a/src/3rdparty/freetype/src/sfnt/ttcpal.c b/src/3rdparty/freetype/src/sfnt/ttcpal.c index 4279bc0b..46ae0859 100644 --- a/src/3rdparty/freetype/src/sfnt/ttcpal.c +++ b/src/3rdparty/freetype/src/sfnt/ttcpal.c @@ -303,7 +303,7 @@ #else /* !TT_CONFIG_OPTION_COLOR_LAYERS */ /* ANSI C doesn't like empty source files */ - typedef int _tt_cpal_dummy; + typedef int tt_cpal_dummy_; #endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */ diff --git a/src/3rdparty/freetype/src/sfnt/ttload.c b/src/3rdparty/freetype/src/sfnt/ttload.c index 14f625c8..7b44e9cd 100644 --- a/src/3rdparty/freetype/src/sfnt/ttload.c +++ b/src/3rdparty/freetype/src/sfnt/ttload.c @@ -504,6 +504,13 @@ FT_FRAME_EXIT(); + if ( !valid_entries ) + { + FT_TRACE2(( "tt_face_load_font_dir: no valid tables found\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + FT_TRACE2(( "table directory loaded\n" )); FT_TRACE2(( "\n" )); diff --git a/src/3rdparty/freetype/src/sfnt/ttmtx.c b/src/3rdparty/freetype/src/sfnt/ttmtx.c index 5e53e6dd..38ee9ae7 100644 --- a/src/3rdparty/freetype/src/sfnt/ttmtx.c +++ b/src/3rdparty/freetype/src/sfnt/ttmtx.c @@ -239,7 +239,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_Service_MetricsVariations var = - (FT_Service_MetricsVariations)face->var; + (FT_Service_MetricsVariations)face->tt_var; #endif diff --git a/src/3rdparty/freetype/src/sfnt/ttpost.c b/src/3rdparty/freetype/src/sfnt/ttpost.c index 0e17c6f3..1dfad429 100644 --- a/src/3rdparty/freetype/src/sfnt/ttpost.c +++ b/src/3rdparty/freetype/src/sfnt/ttpost.c @@ -156,86 +156,66 @@ static FT_Error - load_format_20( TT_Face face, - FT_Stream stream, - FT_ULong post_len ) + load_format_20( TT_Post_Names names, + FT_Stream stream, + FT_UShort num_glyphs, + FT_ULong post_len ) { FT_Memory memory = stream->memory; FT_Error error; - FT_Int num_glyphs; - FT_UShort num_names; + FT_UShort n; + FT_UShort num_names = 0; FT_UShort* glyph_indices = NULL; - FT_Char** name_strings = NULL; - FT_Byte* strings = NULL; + FT_Byte** name_strings = NULL; + FT_Byte* q; - if ( FT_READ_USHORT( num_glyphs ) ) - goto Exit; - - /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ - /* than the value in the maxp table (cf. cyberbit.ttf). */ - - /* There already exist fonts which have more than 32768 glyph names */ - /* in this table, so the test for this threshold has been dropped. */ - - if ( num_glyphs > face->max_profile.numGlyphs || - (FT_ULong)num_glyphs * 2UL > post_len - 2 ) + if ( (FT_ULong)num_glyphs * 2 > post_len ) { error = FT_THROW( Invalid_File_Format ); goto Exit; } - /* load the indices */ + /* load the indices and note their maximum */ + if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * 2 ) ) + goto Fail; + + q = (FT_Byte*)stream->cursor; + + for ( n = 0; n < num_glyphs; n++ ) { - FT_Int n; + FT_UShort idx = FT_NEXT_USHORT( q ); - if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) || - FT_FRAME_ENTER( num_glyphs * 2L ) ) - goto Fail; + if ( idx > num_names ) + num_names = idx; - for ( n = 0; n < num_glyphs; n++ ) - glyph_indices[n] = FT_GET_USHORT(); - - FT_FRAME_EXIT(); + glyph_indices[n] = idx; } - /* compute number of names stored in table */ - { - FT_Int n; + FT_FRAME_EXIT(); - - num_names = 0; - - for ( n = 0; n < num_glyphs; n++ ) - { - FT_Int idx; - - - idx = glyph_indices[n]; - if ( idx >= 258 ) - { - idx -= 257; - if ( idx > num_names ) - num_names = (FT_UShort)idx; - } - } - } + /* compute number of names stored in the table */ + num_names = num_names > 257 ? num_names - 257 : 0; /* now load the name strings */ if ( num_names ) { - FT_UShort n; FT_ULong p; + FT_Byte* strings; - post_len -= (FT_ULong)num_glyphs * 2UL + 2; + post_len -= (FT_ULong)num_glyphs * 2; - if ( FT_QALLOC( strings, post_len + 1 ) || - FT_STREAM_READ( strings, post_len ) || - FT_QNEW_ARRAY( name_strings, num_names ) ) + if ( FT_QALLOC( name_strings, num_names * sizeof ( FT_Byte* ) + + post_len + 1 ) ) + goto Fail; + + strings = (FT_Byte*)( name_strings + num_names ); + if ( FT_STREAM_READ( strings, post_len ) ) goto Fail; /* convert from Pascal- to C-strings and set pointers */ @@ -251,7 +231,7 @@ } strings[p] = 0; - name_strings[n] = (FT_Char*)strings + p + 1; + name_strings[n] = strings + p + 1; p += len + 1; } strings[post_len] = 0; @@ -259,40 +239,24 @@ /* deal with missing or insufficient string data */ if ( n < num_names ) { - if ( post_len == 0 ) - { - /* fake empty string */ - if ( FT_QREALLOC( strings, 1, 2 ) ) - goto Fail; + FT_TRACE4(( "load_format_20: %hu PostScript names are truncated\n", + num_names - n )); - post_len = 1; - strings[post_len] = 0; - } - - FT_ERROR(( "load_format_20:" - " all entries in post table are already parsed," - " using NULL names for gid %d - %d\n", - n, num_names - 1 )); for ( ; n < num_names; n++ ) - name_strings[n] = (FT_Char*)strings + post_len; + name_strings[n] = strings + post_len; } } /* all right, set table fields and exit successfully */ - { - TT_Post_20 table = &face->postscript_names.names.format_20; + names->num_glyphs = num_glyphs; + names->num_names = num_names; + names->glyph_indices = glyph_indices; + names->glyph_names = name_strings; - - table->num_glyphs = (FT_UShort)num_glyphs; - table->num_names = (FT_UShort)num_names; - table->glyph_indices = glyph_indices; - table->glyph_names = name_strings; - } return FT_Err_Ok; Fail: FT_FREE( name_strings ); - FT_FREE( strings ); FT_FREE( glyph_indices ); Exit: @@ -301,66 +265,55 @@ static FT_Error - load_format_25( TT_Face face, - FT_Stream stream, - FT_ULong post_len ) + load_format_25( TT_Post_Names names, + FT_Stream stream, + FT_UShort num_glyphs, + FT_ULong post_len ) { FT_Memory memory = stream->memory; FT_Error error; - FT_Int num_glyphs; - FT_Char* offset_table = NULL; - - FT_UNUSED( post_len ); + FT_UShort n; + FT_UShort* glyph_indices = NULL; + FT_Byte* q; - if ( FT_READ_USHORT( num_glyphs ) ) - goto Exit; - - /* check the number of glyphs */ - if ( num_glyphs > face->max_profile.numGlyphs || - num_glyphs > 258 || - num_glyphs < 1 ) + /* check the number of glyphs, including the theoretical limit */ + if ( num_glyphs > post_len || + num_glyphs > 258 + 128 ) { error = FT_THROW( Invalid_File_Format ); goto Exit; } - if ( FT_QNEW_ARRAY( offset_table, num_glyphs ) || - FT_STREAM_READ( offset_table, num_glyphs ) ) + /* load the indices and check their Mac range */ + if ( FT_QNEW_ARRAY( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs ) ) goto Fail; - /* now check the offset table */ + q = (FT_Byte*)stream->cursor; + + for ( n = 0; n < num_glyphs; n++ ) { - FT_Int n; + FT_Int idx = n + FT_NEXT_CHAR( q ); - for ( n = 0; n < num_glyphs; n++ ) - { - FT_Long idx = (FT_Long)n + offset_table[n]; + if ( idx < 0 || idx > 257 ) + idx = 0; - - if ( idx < 0 || idx > num_glyphs ) - { - error = FT_THROW( Invalid_File_Format ); - goto Fail; - } - } + glyph_indices[n] = (FT_UShort)idx; } + FT_FRAME_EXIT(); + /* OK, set table fields and exit successfully */ - { - TT_Post_25 table = &face->postscript_names.names.format_25; - - - table->num_glyphs = (FT_UShort)num_glyphs; - table->offsets = offset_table; - } + names->num_glyphs = num_glyphs; + names->glyph_indices = glyph_indices; return FT_Err_Ok; Fail: - FT_FREE( offset_table ); + FT_FREE( glyph_indices ); Exit: return error; @@ -370,37 +323,37 @@ static FT_Error load_post_names( TT_Face face ) { - FT_Stream stream; - FT_Error error; - FT_Fixed format; + FT_Error error = FT_Err_Ok; + FT_Stream stream = face->root.stream; + FT_Fixed format = face->postscript.FormatType; FT_ULong post_len; + FT_UShort num_glyphs; - /* get a stream for the face's resource */ - stream = face->root.stream; - /* seek to the beginning of the PS names table */ error = face->goto_table( face, TTAG_post, stream, &post_len ); if ( error ) goto Exit; - format = face->postscript.FormatType; - - /* go to beginning of subtable */ - if ( FT_STREAM_SKIP( 32 ) ) + /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ + /* than the value in the maxp table (cf. cyberbit.ttf). */ + if ( post_len < 34 || + FT_STREAM_SKIP( 32 ) || + FT_READ_USHORT( num_glyphs ) || + num_glyphs > face->max_profile.numGlyphs || + num_glyphs == 0 ) goto Exit; - /* now read postscript table */ - if ( format == 0x00020000L && post_len >= 34 ) - error = load_format_20( face, stream, post_len - 32 ); - else if ( format == 0x00025000L && post_len >= 34 ) - error = load_format_25( face, stream, post_len - 32 ); - else - error = FT_THROW( Invalid_File_Format ); - - face->postscript_names.loaded = 1; + /* now read postscript names data */ + if ( format == 0x00020000L ) + error = load_format_20( &face->postscript_names, stream, + num_glyphs, post_len - 34 ); + else if ( format == 0x00025000L ) + error = load_format_25( &face->postscript_names, stream, + num_glyphs, post_len - 34 ); Exit: + face->postscript_names.loaded = 1; /* even if failed */ return error; } @@ -410,39 +363,20 @@ { FT_Memory memory = face->root.memory; TT_Post_Names names = &face->postscript_names; - FT_Fixed format; - if ( names->loaded ) + if ( names->num_glyphs ) { - format = face->postscript.FormatType; - - if ( format == 0x00020000L ) - { - TT_Post_20 table = &names->names.format_20; - - - FT_FREE( table->glyph_indices ); - table->num_glyphs = 0; - - if ( table->num_names ) - { - table->glyph_names[0]--; - FT_FREE( table->glyph_names[0] ); - - FT_FREE( table->glyph_names ); - table->num_names = 0; - } - } - else if ( format == 0x00025000L ) - { - TT_Post_25 table = &names->names.format_25; - - - FT_FREE( table->offsets ); - table->num_glyphs = 0; - } + FT_FREE( names->glyph_indices ); + names->num_glyphs = 0; } + + if ( names->num_names ) + { + FT_FREE( names->glyph_names ); + names->num_names = 0; + } + names->loaded = 0; } @@ -478,7 +412,6 @@ FT_String** PSname ) { FT_Error error; - TT_Post_Names names; FT_Fixed format; #ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES @@ -498,8 +431,6 @@ return FT_THROW( Unimplemented_Feature ); #endif - names = &face->postscript_names; - /* `.notdef' by default */ *PSname = MAC_NAME( 0 ); @@ -510,9 +441,10 @@ if ( idx < 258 ) /* paranoid checking */ *PSname = MAC_NAME( idx ); } - else if ( format == 0x00020000L ) + else if ( format == 0x00020000L || + format == 0x00025000L ) { - TT_Post_20 table = &names->names.format_20; + TT_Post_Names names = &face->postscript_names; if ( !names->loaded ) @@ -522,43 +454,29 @@ goto End; } - if ( idx < (FT_UInt)table->num_glyphs ) + if ( idx < (FT_UInt)names->num_glyphs ) { - FT_UShort name_index = table->glyph_indices[idx]; + FT_UShort name_index = names->glyph_indices[idx]; if ( name_index < 258 ) *PSname = MAC_NAME( name_index ); - else - *PSname = (FT_String*)table->glyph_names[name_index - 258]; + else /* only for version 2.0 */ + *PSname = (FT_String*)names->glyph_names[name_index - 258]; } } - else if ( format == 0x00025000L ) - { - TT_Post_25 table = &names->names.format_25; - - - if ( !names->loaded ) - { - error = load_post_names( face ); - if ( error ) - goto End; - } - - if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ - *PSname = MAC_NAME( (FT_Int)idx + table->offsets[idx] ); - } /* nothing to do for format == 0x00030000L */ End: + /* post format errors ignored */ return FT_Err_Ok; } #else /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ /* ANSI C doesn't like empty source files */ - typedef int _tt_post_dummy; + typedef int tt_post_dummy_; #endif /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ diff --git a/src/3rdparty/freetype/src/sfnt/ttsbit.c b/src/3rdparty/freetype/src/sfnt/ttsbit.c index 3c069551..03f90a62 100644 --- a/src/3rdparty/freetype/src/sfnt/ttsbit.c +++ b/src/3rdparty/freetype/src/sfnt/ttsbit.c @@ -1677,7 +1677,7 @@ #else /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ /* ANSI C doesn't like empty source files */ - typedef int _tt_sbit_dummy; + typedef int tt_sbit_dummy_; #endif /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ diff --git a/src/3rdparty/freetype/src/sfnt/ttsvg.c b/src/3rdparty/freetype/src/sfnt/ttsvg.c index c1bbb66b..4461d483 100644 --- a/src/3rdparty/freetype/src/sfnt/ttsvg.c +++ b/src/3rdparty/freetype/src/sfnt/ttsvg.c @@ -405,7 +405,7 @@ #else /* !FT_CONFIG_OPTION_SVG */ /* ANSI C doesn't like empty source files */ - typedef int _tt_svg_dummy; + typedef int tt_svg_dummy_; #endif /* !FT_CONFIG_OPTION_SVG */ diff --git a/src/3rdparty/freetype/src/sfnt/woff2tags.c b/src/3rdparty/freetype/src/sfnt/woff2tags.c index 7a0a351f..eeedd990 100644 --- a/src/3rdparty/freetype/src/sfnt/woff2tags.c +++ b/src/3rdparty/freetype/src/sfnt/woff2tags.c @@ -111,7 +111,7 @@ #else /* !FT_CONFIG_OPTION_USE_BROTLI */ /* ANSI C doesn't like empty source files */ - typedef int _woff2tags_dummy; + typedef int woff2tags_dummy_; #endif /* !FT_CONFIG_OPTION_USE_BROTLI */ diff --git a/src/3rdparty/freetype/src/smooth/ftgrays.c b/src/3rdparty/freetype/src/smooth/ftgrays.c index d9f20eef..0918272f 100644 --- a/src/3rdparty/freetype/src/smooth/ftgrays.c +++ b/src/3rdparty/freetype/src/smooth/ftgrays.c @@ -1006,10 +1006,11 @@ typedef ptrdiff_t FT_PtrDist; * * For other cases, using binary splits is actually slightly faster. */ -#if defined( __SSE2__ ) || \ - defined( __x86_64__ ) || \ - defined( _M_AMD64 ) || \ - ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 ) +#if ( defined( __SSE2__ ) || \ + defined( __x86_64__ ) || \ + defined( _M_AMD64 ) || \ + ( defined( _M_IX86_FP ) && _M_IX86_FP >= 2 ) ) && \ + !defined( __VMS ) # define FT_SSE2 1 #else # define FT_SSE2 0 @@ -1427,8 +1428,10 @@ typedef ptrdiff_t FT_PtrDist; static int gray_move_to( const FT_Vector* to, - gray_PWorker worker ) + void* worker_ ) /* gray_PWorker */ { + gray_PWorker worker = (gray_PWorker)worker_; + TPos x, y; @@ -1446,8 +1449,11 @@ typedef ptrdiff_t FT_PtrDist; static int gray_line_to( const FT_Vector* to, - gray_PWorker worker ) + void* worker_ ) /* gray_PWorker */ { + gray_PWorker worker = (gray_PWorker)worker_; + + gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); return 0; } @@ -1456,8 +1462,11 @@ typedef ptrdiff_t FT_PtrDist; static int gray_conic_to( const FT_Vector* control, const FT_Vector* to, - gray_PWorker worker ) + void* worker_ ) /* gray_PWorker */ { + gray_PWorker worker = (gray_PWorker)worker_; + + gray_render_conic( RAS_VAR_ control, to ); return 0; } @@ -1467,8 +1476,11 @@ typedef ptrdiff_t FT_PtrDist; gray_cubic_to( const FT_Vector* control1, const FT_Vector* control2, const FT_Vector* to, - gray_PWorker worker ) + void* worker_ ) /* gray_PWorker */ { + gray_PWorker worker = (gray_PWorker)worker_; + + gray_render_cubic( RAS_VAR_ control1, control2, to ); return 0; } @@ -1666,6 +1678,8 @@ typedef ptrdiff_t FT_PtrDist; int n; /* index of contour in outline */ int first; /* index of first point in contour */ + int last; /* index of last point in contour */ + char tag; /* current point's state */ int shift; @@ -1680,18 +1694,17 @@ typedef ptrdiff_t FT_PtrDist; shift = func_interface->shift; delta = func_interface->delta; - first = 0; + last = -1; for ( n = 0; n < outline->n_contours; n++ ) { - int last; /* index of last point in contour */ - - - FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + FT_TRACE5(( "FT_Outline_Decompose: Contour %d\n", n )); + first = last + 1; last = outline->contours[n]; - if ( last < 0 ) + if ( last < first ) goto Invalid_Outline; + limit = outline->points + last; v_start = outline->points[first]; @@ -1874,11 +1887,9 @@ typedef ptrdiff_t FT_PtrDist; v_start.x / 64.0, v_start.y / 64.0 )); error = func_interface->line_to( &v_start, user ); - Close: + Close: if ( error ) goto Exit; - - first = last + 1; } FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); @@ -1923,7 +1934,7 @@ typedef ptrdiff_t FT_PtrDist; if ( continued ) FT_Trace_Enable(); - FT_TRACE7(( "band [%d..%d]: %ld cell%s remaining/\n", + FT_TRACE7(( "band [%d..%d]: %td cell%s remaining/\n", ras.min_ey, ras.max_ey, ras.cell_null - ras.cell_free, @@ -2156,9 +2167,12 @@ typedef ptrdiff_t FT_PtrDist; #else /* !STANDALONE_ */ static int - gray_raster_new( FT_Memory memory, - gray_PRaster* araster ) + gray_raster_new( void* memory_, + FT_Raster* araster_ ) { + FT_Memory memory = (FT_Memory)memory_; + gray_PRaster* araster = (gray_PRaster*)araster_; + FT_Error error; gray_PRaster raster = NULL; diff --git a/src/3rdparty/freetype/src/smooth/ftsmooth.c b/src/3rdparty/freetype/src/smooth/ftsmooth.c index cdbc78c3..9b0e8886 100644 --- a/src/3rdparty/freetype/src/smooth/ftsmooth.c +++ b/src/3rdparty/freetype/src/smooth/ftsmooth.c @@ -87,8 +87,10 @@ /* initialize renderer -- init its raster */ static FT_Error - ft_smooth_init( FT_Renderer render ) + ft_smooth_init( FT_Module module ) /* FT_Renderer */ { + FT_Renderer render = (FT_Renderer)module; + FT_Vector* sub = render->root.library->lcd_geometry; @@ -111,8 +113,10 @@ ft_smooth_lcd_spans( int y, int count, const FT_Span* spans, - TOrigin* target ) + void* target_ ) /* TOrigin* */ { + TOrigin* target = (TOrigin*)target_; + unsigned char* dst_line = target->origin - y * target->pitch; unsigned char* dst; unsigned short w; @@ -141,7 +145,7 @@ /* Set up direct rendering to record them on each third byte. */ params.source = outline; params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; - params.gray_spans = (FT_SpanFunc)ft_smooth_lcd_spans; + params.gray_spans = ft_smooth_lcd_spans; params.user = ⌖ params.clip_box.xMin = 0; @@ -256,8 +260,11 @@ /* initialize renderer -- init its raster */ static FT_Error - ft_smooth_init( FT_Renderer render ) + ft_smooth_init( FT_Module module ) /* FT_Renderer */ { + FT_Renderer render = (FT_Renderer)module; + + /* set up default LCD filtering */ FT_Library_SetLcdFilter( render->root.library, FT_LCD_FILTER_DEFAULT ); @@ -340,8 +347,11 @@ ft_smooth_overlap_spans( int y, int count, const FT_Span* spans, - TOrigin* target ) + void* target_ ) { + TOrigin* target = (TOrigin*)target_; + + unsigned char* dst = target->origin - ( y / SCALE ) * target->pitch; unsigned short x; unsigned int cover, sum; @@ -386,7 +396,7 @@ /* Set up direct rendering to average oversampled spans. */ params.source = outline; params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT; - params.gray_spans = (FT_SpanFunc)ft_smooth_overlap_spans; + params.gray_spans = ft_smooth_overlap_spans; params.user = ⌖ params.clip_box.xMin = 0; diff --git a/src/3rdparty/freetype/src/svg/ftsvg.c b/src/3rdparty/freetype/src/svg/ftsvg.c index 7edb1a33..ba237f63 100644 --- a/src/3rdparty/freetype/src/svg/ftsvg.c +++ b/src/3rdparty/freetype/src/svg/ftsvg.c @@ -40,26 +40,31 @@ /* ft_svg_init */ static FT_Error - ft_svg_init( SVG_Renderer svg_module ) + ft_svg_init( FT_Module module ) { + SVG_Renderer render = (SVG_Renderer)module; + FT_Error error = FT_Err_Ok; - svg_module->loaded = FALSE; - svg_module->hooks_set = FALSE; + render->loaded = FALSE; + render->hooks_set = FALSE; return error; } static void - ft_svg_done( SVG_Renderer svg_module ) + ft_svg_done( FT_Module module ) { - if ( svg_module->loaded == TRUE && - svg_module->hooks_set == TRUE ) - svg_module->hooks.free_svg( &svg_module->state ); + SVG_Renderer render = (SVG_Renderer)module; - svg_module->loaded = FALSE; + + if ( render->loaded == TRUE && + render->hooks_set == TRUE ) + render->hooks.free_svg( &render->state ); + + render->loaded = FALSE; } @@ -148,7 +153,7 @@ static const SVG_Interface svg_interface = { - (Preset_Bitmap_Func)ft_svg_preset_slot + ft_svg_preset_slot /* Preset_Bitmap_Func preset_slot */ }; @@ -203,7 +208,7 @@ static FT_Error ft_svg_property_get( FT_Module module, const char* property_name, - const void* value ) + void* value ) { FT_Error error = FT_Err_Ok; SVG_Renderer renderer = (SVG_Renderer)module; @@ -226,8 +231,8 @@ FT_DEFINE_SERVICE_PROPERTIESREC( ft_svg_service_properties, - (FT_Properties_SetFunc)ft_svg_property_set, /* set_property */ - (FT_Properties_GetFunc)ft_svg_property_get /* get_property */ + ft_svg_property_set, /* FT_Properties_SetFunc set_property */ + ft_svg_property_get /* FT_Properties_GetFunc get_property */ ) @@ -333,17 +338,17 @@ (const void*)PUT_SVG_MODULE( &svg_interface ), /* module specific interface */ - (FT_Module_Constructor)PUT_SVG_MODULE( ft_svg_init ), /* module_init */ - (FT_Module_Destructor)PUT_SVG_MODULE( ft_svg_done ), /* module_done */ - PUT_SVG_MODULE( ft_svg_get_interface ), /* get_interface */ + PUT_SVG_MODULE( ft_svg_init ), /* FT_Module_Constructor module_init */ + PUT_SVG_MODULE( ft_svg_done ), /* FT_Module_Destructor module_done */ + PUT_SVG_MODULE( ft_svg_get_interface ), /* FT_Module_Requester get_interface */ SVG_GLYPH_FORMAT, - (FT_Renderer_RenderFunc) PUT_SVG_MODULE( ft_svg_render ), /* render_glyph */ - (FT_Renderer_TransformFunc)PUT_SVG_MODULE( ft_svg_transform ), /* transform_glyph */ - NULL, /* get_glyph_cbox */ - NULL, /* set_mode */ - NULL /* raster_class */ + PUT_SVG_MODULE( ft_svg_render ), /* FT_Renderer_RenderFunc render_glyph */ + PUT_SVG_MODULE( ft_svg_transform ), /* FT_Renderer_TransformFunc transform_glyph */ + NULL, /* FT_Renderer_GetCBoxFunc get_glyph_cbox */ + NULL, /* FT_Renderer_SetModeFunc set_mode */ + NULL /* FT_Raster_Funcs* raster_class */ ) diff --git a/src/3rdparty/freetype/src/tools/apinames.c b/src/3rdparty/freetype/src/tools/apinames.c index 8a8b0822..dfa258fd 100644 --- a/src/3rdparty/freetype/src/tools/apinames.c +++ b/src/3rdparty/freetype/src/tools/apinames.c @@ -18,11 +18,14 @@ #include #include +#include #include #include +#include "vms_shorten_symbol.c" + #define PROGRAM_NAME "apinames" -#define PROGRAM_VERSION "0.4" +#define PROGRAM_VERSION "0.5" #define LINEBUFF_SIZE 1024 @@ -41,9 +44,20 @@ typedef enum OutputFormat_ static void -panic( const char* message ) +panic( const char* fmt, + ... ) { - fprintf( stderr, "PANIC: %s\n", message ); + va_list ap; + + + fprintf( stderr, "PANIC: " ); + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + fprintf( stderr, "\n" ); + exit(2); } @@ -202,12 +216,24 @@ names_dump( FILE* out, break; case OUTPUT_VMS_OPT: - fprintf( out, "GSMATCH=LEQUAL,2,0\n" - "CASE_SENSITIVE=YES\n" - "SYMBOL_VECTOR=(-\n" ); - for ( nn = 0; nn < num_names - 1; nn++ ) - fprintf( out, " %s=PROCEDURE,-\n", the_names[nn].name ); - fprintf( out, " %s=PROCEDURE)\n", the_names[num_names - 1].name ); + fprintf( out, "case_sensitive=YES\n" ); + + for ( nn = 0; nn < num_names; nn++ ) + { + char short_symbol[32]; + + + if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 ) + panic( "could not shorten name '%s'", the_names[nn].name ); + fprintf( out, "symbol_vector = ( %s = PROCEDURE)\n", short_symbol ); + + /* Also emit a 64-bit symbol, as created by the `vms_auto64` tool. */ + /* It has the string '64__' appended to its name. */ + strcat( the_names[nn].name , "64__" ); + if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 ) + panic( "could not shorten name '%s'", the_names[nn].name ); + fprintf( out, "symbol_vector = ( %s = PROCEDURE)\n", short_symbol ); + } break; diff --git a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c index 4f912cd2..0ee765e5 100644 --- a/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c +++ b/src/3rdparty/freetype/src/tools/ftrandom/ftrandom.c @@ -520,7 +520,7 @@ char buffer[1024]; - sprintf( buffer, "%s/test%d", results_dir, test_num++ ); + snprintf( buffer, 1024, "%s/test%d", results_dir, test_num++ ); if ( copyfont ( &fontlist[i], buffer ) ) { diff --git a/src/3rdparty/freetype/src/tools/vms_shorten_symbol.c b/src/3rdparty/freetype/src/tools/vms_shorten_symbol.c new file mode 100644 index 00000000..81f2a718 --- /dev/null +++ b/src/3rdparty/freetype/src/tools/vms_shorten_symbol.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2010, 2017 Craig A. Berry + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* vms_shorten_symbol + * + * This program provides shortening of long symbols (> 31 characters) using the + * same mechanism as the OpenVMS C compiler. The basic procedure is to compute + * an AUTODIN II checksum of the entire symbol, encode the checksum in base32, + * and glue together a shortened symbol from the first 23 characters of the + * original symbol plus the encoded checksum appended. The output format is + * the same used in the name mangler database, stored by default in + * [.CXX_REPOSITORY]CXX$DEMANGLER_DB. + * + * To obtain the same result as CC/NAMES=SHORTENED, run like so: + * + * $ mcr []vms_shorten_symbol "Please_forgive_this_absurdly_long_symbol_name" + * PLEASE_FORGIVE_THIS_ABS1ARO4QU$Please_forgive_this_absurdly_long_symbol_name + * + * To obtain the same result as CC/NAMES=(SHORTENED,AS_IS), pass a non-zero + * value as the second argument, like so: + * + * $ mcr []vms_shorten_symbol "Please_forgive_this_absurdly_long_symbol_name" 1 + * Please_forgive_this_abs3rv8rnn$Please_forgive_this_absurdly_long_symbol_name + */ + +#include +#include +#include +#include + +#ifdef __VMS +#define UINT32 unsigned int +#else +#include +#define UINT32 uint32_t +#endif + +extern UINT32 crc32(const char *input_string); +extern int u32_to_base32(UINT32 input, char *output); +extern int vms_shorten_symbol(const char *symbol, char *shortened, char as_is_flag); + +/* + * This routine implements the AUTODIN II polynomial. + */ + +UINT32 +crc32(const char *input_string) +{ + +/* + * CRC code and data based partly on FreeBSD implementation, which + * notes: + * + * The crc32 functions and data was originally written by Spencer + * Garrett and was cleaned from the PostgreSQL source + * tree via the files contrib/ltree/crc32.[ch]. No license was + * included, therefore it is assumed that this code is public + * domain. Attribution still noted. + * + * (I think they mean "gleaned" not "cleaned".) + */ + + static const UINT32 autodin_ii_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, + }; + + UINT32 crc = ~0U; + char *c; + for (c = (char *)input_string; *c; ++c) + crc = (crc >> 8) ^ autodin_ii_table[(crc ^ *c) & 0xff]; + return ~crc; +} + +/* + * This is the RFC2938 variant of base32, not RFC3548, Crockford's, or + * other newer variant. It produces an 8-byte encoded character string + * (plus trailing null) from a 32-bit integer input. + */ + +int +u32_to_base32(UINT32 input, char *output) +{ + static const char base32hex_table[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v' + }; + int i; + + /* + * Grab lowest 5 bits and look up conversion in table. Lather, rinse, + * repeat for a total of 7, 5-bit chunks to accommodate 32 bits of input. + */ + for (i = 0; i < 7; i++) { + output[6 - i] = base32hex_table[input & 0x1f]; + input >>= 5; /* position to look at next 5 */ + } + output[7] = '$'; /* It's DEC, so use '$' not '=' to pad. */ + output[8] = '\0'; + return 0; +} + +/* + * Take an input symbol name of arbitrary length and produce a symbol shortened + * to 31 characters. The shortened symbol consists of the first 23 characters + * of the original symbol plus the 8 characters of the encoded checksum. The + * third argument is a boolean indicating whether to emulate the compiler's + * /NAMES=AS_IS option. When false (the compiler's default), the shortened + * symbol will be upper cased. When the original symbol is 31 characters or + * fewer in length, no checksum will be appended and the original symbol is + * returned verbatim (though upper cased if the as_is_flag is false). + */ + +int +vms_shorten_symbol(const char *input_symbol, char *shortened, char as_is_flag) +{ + char b32str[9]; + UINT32 crc; + char *c, *symbol; + int symlen; + + symlen = strlen(input_symbol); + symbol = (char *)malloc(symlen + 1); + if (symbol == NULL) + return -1; + + strncpy(symbol, input_symbol, symlen); + symbol[symlen] = '\0'; + + if (!as_is_flag) { + for (c = symbol; *c; c++) + *c = toupper(*c); + } + + if (symlen <= 31) { + strncpy(shortened, symbol, symlen); + shortened[symlen] = '\0'; + free(symbol); + return 0; + } + + /* + * Compute the checksum on the whole symbol. + */ + + crc = crc32(symbol); + + /* The compiler does not use the inverted checksum, so we invert it + * back before encoding in base32. + */ + + if (u32_to_base32(~crc, (char *)&b32str) == -1) { + free(symbol); + return -1; + } + + if (!as_is_flag) { + for (c = (char *)&b32str; *c; c++) + *c = toupper(*c); + } + + sprintf(shortened, "%.23s%.8s", symbol, b32str); + shortened[31] = '\0'; + free(symbol); + return 0; +} + +#ifdef TEST_MAIN +int +main(int argc, char **argv) +{ + char short_symbol[32]; + char as_is_flag = 0; + + if (argc < 2) { + fprintf(stderr, "Usage: %s []\n", argv[0]); + exit(EXIT_FAILURE); + } + if (argc > 2) + as_is_flag = 1; + + if (vms_shorten_symbol(argv[1], (char *)&short_symbol, as_is_flag) == -1) { + fprintf(stderr, "Symbol shortening failed\n"); + exit(EXIT_FAILURE); + } + + printf("%s%s\n", (char *)&short_symbol, argv[1]); +} +#endif diff --git a/src/3rdparty/freetype/src/truetype/rules.mk b/src/3rdparty/freetype/src/truetype/rules.mk index 23f6f006..dde26de1 100644 --- a/src/3rdparty/freetype/src/truetype/rules.mk +++ b/src/3rdparty/freetype/src/truetype/rules.mk @@ -33,8 +33,7 @@ TT_DRV_SRC := $(TT_DIR)/ttdriver.c \ $(TT_DIR)/ttgxvar.c \ $(TT_DIR)/ttinterp.c \ $(TT_DIR)/ttobjs.c \ - $(TT_DIR)/ttpload.c \ - $(TT_DIR)/ttsubpix.c + $(TT_DIR)/ttpload.c # TrueType driver headers # diff --git a/src/3rdparty/freetype/src/truetype/truetype.c b/src/3rdparty/freetype/src/truetype/truetype.c index c5faa962..fcc0ea33 100644 --- a/src/3rdparty/freetype/src/truetype/truetype.c +++ b/src/3rdparty/freetype/src/truetype/truetype.c @@ -24,7 +24,6 @@ #include "ttinterp.c" #include "ttobjs.c" /* object manager */ #include "ttpload.c" /* tables loader */ -#include "ttsubpix.c" /* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttdriver.c b/src/3rdparty/freetype/src/truetype/ttdriver.c index 4bea63ef..d1496fec 100644 --- a/src/3rdparty/freetype/src/truetype/ttdriver.c +++ b/src/3rdparty/freetype/src/truetype/ttdriver.c @@ -57,7 +57,7 @@ * PROPERTY SERVICE * */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) tt_property_set( FT_Module module, /* TT_Driver */ const char* property_name, const void* value, @@ -93,17 +93,22 @@ interpreter_version = *iv; } - if ( interpreter_version == TT_INTERPRETER_VERSION_35 -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - || interpreter_version == TT_INTERPRETER_VERSION_38 -#endif + switch ( interpreter_version ) + { + case TT_INTERPRETER_VERSION_35: + driver->interpreter_version = TT_INTERPRETER_VERSION_35; + break; + + case TT_INTERPRETER_VERSION_38: + case TT_INTERPRETER_VERSION_40: #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - || interpreter_version == TT_INTERPRETER_VERSION_40 + driver->interpreter_version = TT_INTERPRETER_VERSION_40; + break; #endif - ) - driver->interpreter_version = interpreter_version; - else + + default: error = FT_ERR( Unimplemented_Feature ); + } return error; } @@ -114,10 +119,10 @@ } - static FT_Error + FT_CALLBACK_DEF( FT_Error ) tt_property_get( FT_Module module, /* TT_Driver */ const char* property_name, - const void* value ) + void* value ) { FT_Error error = FT_Err_Ok; TT_Driver driver = (TT_Driver)module; @@ -144,8 +149,8 @@ FT_DEFINE_SERVICE_PROPERTIESREC( tt_service_properties, - (FT_Properties_SetFunc)tt_property_set, /* set_property */ - (FT_Properties_GetFunc)tt_property_get /* get_property */ + tt_property_set, /* FT_Properties_SetFunc set_property */ + tt_property_get /* FT_Properties_GetFunc get_property */ ) @@ -198,35 +203,35 @@ * * They can be implemented by format-specific interfaces. */ - static FT_Error - tt_get_kerning( FT_Face ttface, /* TT_Face */ + FT_CALLBACK_DEF( FT_Error ) + tt_get_kerning( FT_Face face, /* TT_Face */ FT_UInt left_glyph, FT_UInt right_glyph, FT_Vector* kerning ) { - TT_Face face = (TT_Face)ttface; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + TT_Face ttface = (TT_Face)face; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; kerning->x = 0; kerning->y = 0; if ( sfnt ) - kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + kerning->x = sfnt->get_kerning( ttface, left_glyph, right_glyph ); return 0; } - static FT_Error - tt_get_advances( FT_Face ttface, + FT_CALLBACK_DEF( FT_Error ) + tt_get_advances( FT_Face face, /* TT_Face */ FT_UInt start, FT_UInt count, FT_Int32 flags, FT_Fixed *advances ) { FT_UInt nn; - TT_Face face = (TT_Face)ttface; + TT_Face ttface = (TT_Face)face; /* XXX: TODO: check for sbits */ @@ -235,8 +240,8 @@ { #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT /* no fast retrieval for blended MM fonts without VVAR table */ - if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) && - !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) return FT_THROW( Unimplemented_Feature ); #endif @@ -247,7 +252,7 @@ /* since we don't need `tsb', we use zero for `yMax' parameter */ - TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah ); + TT_Get_VMetrics( ttface, start + nn, 0, &tsb, &ah ); advances[nn] = ah; } } @@ -255,8 +260,8 @@ { #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT /* no fast retrieval for blended MM fonts without HVAR table */ - if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) && - !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) return FT_THROW( Unimplemented_Feature ); #endif @@ -266,7 +271,7 @@ FT_UShort aw; - TT_Get_HMetrics( face, start + nn, &lsb, &aw ); + TT_Get_HMetrics( ttface, start + nn, &lsb, &aw ); advances[nn] = aw; } } @@ -290,7 +295,7 @@ #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - static FT_Error + FT_CALLBACK_DEF( FT_Error ) tt_size_select( FT_Size size, FT_ULong strike_index ) { @@ -306,7 +311,7 @@ /* use the scaled metrics, even when tt_size_reset fails */ FT_Select_Metrics( size->face, strike_index ); - tt_size_reset( ttsize, 0 ); /* ignore return value */ + tt_size_reset( ttsize ); /* ignore return value */ } else { @@ -327,7 +332,7 @@ #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) tt_size_request( FT_Size size, FT_Size_Request req ) { @@ -367,7 +372,7 @@ if ( FT_IS_SCALABLE( size->face ) ) { - error = tt_size_reset( ttsize, 0 ); + error = tt_size_reset( ttsize ); #ifdef TT_USE_BYTECODE_INTERPRETER /* for the `MPS' bytecode instruction we need the point size */ @@ -426,15 +431,15 @@ * @Return: * FreeType error code. 0 means success. */ - static FT_Error - tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ - FT_Size ttsize, /* TT_Size */ + FT_CALLBACK_DEF( FT_Error ) + tt_glyph_load( FT_GlyphSlot slot, /* TT_GlyphSlot */ + FT_Size size, /* TT_Size */ FT_UInt glyph_index, FT_Int32 load_flags ) { - TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; - TT_Size size = (TT_Size)ttsize; - FT_Face face = ttslot->face; + TT_GlyphSlot ttslot = (TT_GlyphSlot)slot; + TT_Size ttsize = (TT_Size)size; + FT_Face face = ttslot->face; FT_Error error; @@ -476,12 +481,12 @@ } /* use hinted metrics only if we load a glyph with hinting */ - size->metrics = ( load_flags & FT_LOAD_NO_HINTING ) - ? &ttsize->metrics - : &size->hinted_metrics; + ttsize->metrics = ( load_flags & FT_LOAD_NO_HINTING ) + ? &size->metrics + : &ttsize->hinted_metrics; /* now fill in the glyph slot with outline/bitmap/layered */ - error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); + error = TT_Load_Glyph( ttsize, ttslot, glyph_index, load_flags ); /* force drop-out mode to 2 - irrelevant now */ /* slot->outline.dropout_mode = 2; */ @@ -507,49 +512,47 @@ FT_DEFINE_SERVICE_MULTIMASTERSREC( tt_service_gx_multi_masters, - (FT_Get_MM_Func) NULL, /* get_mm */ - (FT_Set_MM_Design_Func) NULL, /* set_mm_design */ - (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, /* set_mm_blend */ - (FT_Get_MM_Blend_Func) TT_Get_MM_Blend, /* get_mm_blend */ - (FT_Get_MM_Var_Func) TT_Get_MM_Var, /* get_mm_var */ - (FT_Set_Var_Design_Func)TT_Set_Var_Design, /* set_var_design */ - (FT_Get_Var_Design_Func)TT_Get_Var_Design, /* get_var_design */ - (FT_Set_Instance_Func) TT_Set_Named_Instance, /* set_instance */ - (FT_Set_MM_WeightVector_Func) - NULL, /* set_mm_weightvector */ - (FT_Get_MM_WeightVector_Func) - NULL, /* get_mm_weightvector */ - (FT_Var_Load_Delta_Set_Idx_Map_Func) - tt_var_load_delta_set_index_mapping, - /* load_delta_set_idx_map */ - (FT_Var_Load_Item_Var_Store_Func) - tt_var_load_item_variation_store, - /* load_item_variation_store */ - (FT_Var_Get_Item_Delta_Func) - tt_var_get_item_delta, /* get_item_delta */ - (FT_Var_Done_Item_Var_Store_Func) - tt_var_done_item_variation_store, - /* done_item_variation_store */ - (FT_Var_Done_Delta_Set_Idx_Map_Func) - tt_var_done_delta_set_index_map, - /* done_delta_set_index_map */ - (FT_Get_Var_Blend_Func) tt_get_var_blend, /* get_var_blend */ - (FT_Done_Blend_Func) tt_done_blend /* done_blend */ + NULL, /* FT_Get_MM_Func get_mm */ + NULL, /* FT_Set_MM_Design_Func set_mm_design */ + TT_Set_MM_Blend, /* FT_Set_MM_Blend_Func set_mm_blend */ + TT_Get_MM_Blend, /* FT_Get_MM_Blend_Func get_mm_blend */ + TT_Get_MM_Var, /* FT_Get_MM_Var_Func get_mm_var */ + TT_Set_Var_Design, /* FT_Set_Var_Design_Func set_var_design */ + TT_Get_Var_Design, /* FT_Get_Var_Design_Func get_var_design */ + TT_Set_Named_Instance, /* FT_Set_Named_Instance_Func set_named_instance */ + TT_Get_Default_Named_Instance, + /* FT_Get_Default_Named_Instance_Func get_default_named_instance */ + NULL, /* FT_Set_MM_WeightVector_Func set_mm_weightvector */ + NULL, /* FT_Get_MM_WeightVector_Func get_mm_weightvector */ + + tt_construct_ps_name, /* FT_Construct_PS_Name_Func construct_ps_name */ + tt_var_load_delta_set_index_mapping, + /* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */ + tt_var_load_item_variation_store, + /* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */ + tt_var_get_item_delta, /* FT_Var_Get_Item_Delta_Func get_item_delta */ + tt_var_done_item_variation_store, + /* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */ + tt_var_done_delta_set_index_map, + /* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */ + tt_get_var_blend, /* FT_Get_Var_Blend_Func get_var_blend */ + tt_done_blend /* FT_Done_Blend_Func done_blend */ ) FT_DEFINE_SERVICE_METRICSVARIATIONSREC( tt_service_metrics_variations, - (FT_HAdvance_Adjust_Func)tt_hadvance_adjust, /* hadvance_adjust */ - (FT_LSB_Adjust_Func) NULL, /* lsb_adjust */ - (FT_RSB_Adjust_Func) NULL, /* rsb_adjust */ + tt_hadvance_adjust, /* FT_HAdvance_Adjust_Func hadvance_adjust */ + NULL, /* FT_LSB_Adjust_Func lsb_adjust */ + NULL, /* FT_RSB_Adjust_Func rsb_adjust */ - (FT_VAdvance_Adjust_Func)tt_vadvance_adjust, /* vadvance_adjust */ - (FT_TSB_Adjust_Func) NULL, /* tsb_adjust */ - (FT_BSB_Adjust_Func) NULL, /* bsb_adjust */ - (FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */ + tt_vadvance_adjust, /* FT_VAdvance_Adjust_Func vadvance_adjust */ + NULL, /* FT_TSB_Adjust_Func tsb_adjust */ + NULL, /* FT_BSB_Adjust_Func bsb_adjust */ + NULL, /* FT_VOrg_Adjust_Func vorg_adjust */ - (FT_Metrics_Adjust_Func) tt_apply_mvar /* metrics_adjust */ + tt_apply_mvar, /* FT_Metrics_Adjust_Func metrics_adjust */ + tt_size_reset_height /* FT_Size_Reset_Func size_reset */ ) #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ diff --git a/src/3rdparty/freetype/src/truetype/ttgload.c b/src/3rdparty/freetype/src/truetype/ttgload.c index d33bdad6..dc427e8a 100644 --- a/src/3rdparty/freetype/src/truetype/ttgload.c +++ b/src/3rdparty/freetype/src/truetype/ttgload.c @@ -35,7 +35,6 @@ #endif #include "tterrors.h" -#include "ttsubpix.h" /************************************************************************** @@ -152,9 +151,6 @@ FT_UInt glyph_index ) { TT_Face face = loader->face; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); -#endif FT_Error error; FT_Stream stream = loader->stream; @@ -183,20 +179,6 @@ loader->top_bearing = top_bearing; loader->vadvance = advance_height; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - loader->exec ) - { - loader->exec->sph_tweak_flags = 0; - - /* This may not be the right place for this, but it works... */ - /* Note that we have to unconditionally load the tweaks since */ - /* it is possible that glyphs individually switch ClearType's */ - /* backward compatibility mode on and off. */ - sph_set_tweaks( loader, glyph_index ); - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef FT_CONFIG_OPTION_INCREMENTAL /* With the incremental interface, these values are set by */ /* a call to `tt_get_metrics_incremental'. */ @@ -362,17 +344,16 @@ FT_Byte* p = load->cursor; FT_Byte* limit = load->limit; FT_GlyphLoader gloader = load->gloader; + FT_Outline* outline = &gloader->current.outline; FT_Int n_contours = load->n_contours; - FT_Outline* outline; - FT_UShort n_ins; FT_Int n_points; + FT_UShort n_ins; FT_Byte *flag, *flag_limit; FT_Byte c, count; FT_Vector *vec, *vec_limit; FT_Pos x, y; - FT_Short *cont, *cont_limit, prev_cont; - FT_Int xy_size = 0; + FT_Short *cont, *cont_limit, last; /* check that we can add the contours to the glyph */ @@ -380,40 +361,26 @@ if ( error ) goto Fail; + /* check space for contours array + instructions count */ + if ( n_contours >= 0xFFF || p + 2 * n_contours + 2 > limit ) + goto Invalid_Outline; + /* reading the contours' endpoints & number of points */ - cont = gloader->current.outline.contours; + cont = outline->contours; cont_limit = cont + n_contours; - /* check space for contours array + instructions count */ - if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) - goto Invalid_Outline; - - prev_cont = FT_NEXT_SHORT( p ); - - if ( n_contours > 0 ) - cont[0] = prev_cont; - - if ( prev_cont < 0 ) - goto Invalid_Outline; - - for ( cont++; cont < cont_limit; cont++ ) + last = -1; + for ( ; cont < cont_limit; cont++ ) { - cont[0] = FT_NEXT_SHORT( p ); - if ( cont[0] <= prev_cont ) - { - /* unordered contours: this is invalid */ + *cont = FT_NEXT_SHORT( p ); + + if ( *cont <= last ) goto Invalid_Outline; - } - prev_cont = cont[0]; + + last = *cont; } - n_points = 0; - if ( n_contours > 0 ) - { - n_points = cont[-1] + 1; - if ( n_points < 0 ) - goto Invalid_Outline; - } + n_points = last + 1; FT_TRACE5(( " # of points: %d\n", n_points )); @@ -422,59 +389,48 @@ if ( error ) goto Fail; - /* reading the bytecode instructions */ - load->glyph->control_len = 0; - load->glyph->control_data = NULL; - - if ( p + 2 > limit ) - goto Invalid_Outline; - + /* space checked above */ n_ins = FT_NEXT_USHORT( p ); FT_TRACE5(( " Instructions size: %u\n", n_ins )); + /* check instructions size */ + if ( p + n_ins > limit ) + { + FT_TRACE1(( "TT_Load_Simple_Glyph: excessive instruction count\n" )); + error = FT_THROW( Too_Many_Hints ); + goto Fail; + } + #ifdef TT_USE_BYTECODE_INTERPRETER if ( IS_HINTED( load->load_flags ) ) { - FT_ULong tmp; + TT_ExecContext exec = load->exec; + FT_Memory memory = exec->memory; - /* check instructions size */ - if ( ( limit - p ) < n_ins ) - { - FT_TRACE1(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); - error = FT_THROW( Too_Many_Hints ); - goto Fail; - } + if ( exec->glyphSize ) + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; /* we don't trust `maxSizeOfInstructions' in the `maxp' table */ - /* and thus update the bytecode array size by ourselves */ - - tmp = load->exec->glyphSize; - error = Update_Max( load->exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&load->exec->glyphIns, - n_ins ); - - load->exec->glyphSize = (FT_UInt)tmp; - if ( error ) - return error; - - load->glyph->control_len = n_ins; - load->glyph->control_data = load->exec->glyphIns; - + /* and thus allocate the bytecode array size by ourselves */ if ( n_ins ) - FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); + { + if ( FT_QNEW_ARRAY( exec->glyphIns, n_ins ) ) + return error; + + FT_MEM_COPY( exec->glyphIns, p, (FT_Long)n_ins ); + + exec->glyphSize = n_ins; + } } #endif /* TT_USE_BYTECODE_INTERPRETER */ p += n_ins; - outline = &gloader->current.outline; - /* reading the point tags */ flag = (FT_Byte*)outline->tags; flag_limit = flag + n_points; @@ -512,9 +468,6 @@ flag = (FT_Byte*)outline->tags; x = 0; - if ( p + xy_size > limit ) - goto Invalid_Outline; - for ( ; vec < vec_limit; vec++, flag++ ) { FT_Pos delta = 0; @@ -544,7 +497,7 @@ /* reading the Y coordinates */ - vec = gloader->current.outline.points; + vec = outline->points; vec_limit = vec + n_points; flag = (FT_Byte*)outline->tags; y = 0; @@ -827,8 +780,7 @@ TT_Hint_Glyph( TT_Loader loader, FT_Bool is_composite ) { -#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ - defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL TT_Face face = loader->face; TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); #endif @@ -836,35 +788,34 @@ TT_GlyphZone zone = &loader->zone; #ifdef TT_USE_BYTECODE_INTERPRETER - FT_Long n_ins; + TT_ExecContext exec = loader->exec; + FT_Long n_ins = exec->glyphSize; #else FT_UNUSED( is_composite ); #endif #ifdef TT_USE_BYTECODE_INTERPRETER - n_ins = loader->glyph->control_len; - /* save original point positions in `org' array */ if ( n_ins > 0 ) FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); /* Reset graphics state. */ - loader->exec->GS = loader->size->GS; + exec->GS = loader->size->GS; /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ /* completely refer to the (already) hinted subglyphs. */ if ( is_composite ) { - loader->exec->metrics.x_scale = 1 << 16; - loader->exec->metrics.y_scale = 1 << 16; + exec->metrics.x_scale = 1 << 16; + exec->metrics.y_scale = 1 << 16; FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); } else { - loader->exec->metrics.x_scale = loader->size->metrics->x_scale; - loader->exec->metrics.y_scale = loader->size->metrics->y_scale; + exec->metrics.x_scale = loader->size->metrics->x_scale; + exec->metrics.y_scale = loader->size->metrics->y_scale; } #endif @@ -884,53 +835,37 @@ { FT_Error error; - FT_GlyphLoader gloader = loader->gloader; - FT_Outline current_outline = gloader->current.outline; + TT_Set_CodeRange( exec, tt_coderange_glyph, exec->glyphIns, n_ins ); - TT_Set_CodeRange( loader->exec, tt_coderange_glyph, - loader->exec->glyphIns, n_ins ); + exec->is_composite = is_composite; + exec->pts = *zone; - loader->exec->is_composite = is_composite; - loader->exec->pts = *zone; - - error = TT_Run_Context( loader->exec ); - if ( error && loader->exec->pedantic_hinting ) + error = TT_Run_Context( exec ); + if ( error && exec->pedantic_hinting ) return error; /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ - current_outline.tags[0] |= - ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; + loader->gloader->current.outline.tags[0] |= + ( exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* Save possibly modified glyph phantom points unless in v40 backward */ /* compatibility mode, where no movement on the x axis means no reason */ /* to change bearings or advance widths. */ - if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && - loader->exec->backward_compatibility ) ) - { -#endif - loader->pp1 = zone->cur[zone->n_points - 4]; - loader->pp2 = zone->cur[zone->n_points - 3]; - loader->pp3 = zone->cur[zone->n_points - 2]; - loader->pp4 = zone->cur[zone->n_points - 1]; + #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - } + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + exec->backward_compatibility ) + return FT_Err_Ok; #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN ) - FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 ); - - else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN ) - FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 ); - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; return FT_Err_Ok; } @@ -949,10 +884,10 @@ static FT_Error TT_Process_Simple_Glyph( TT_Loader loader ) { - FT_GlyphLoader gloader = loader->gloader; - FT_Error error = FT_Err_Ok; - FT_Outline* outline; - FT_Int n_points; + FT_Error error = FT_Err_Ok; + FT_GlyphLoader gloader = loader->gloader; + FT_Outline* outline = &gloader->current.outline; + FT_Int n_points = outline->n_points; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_Memory memory = loader->face->root.memory; @@ -960,11 +895,7 @@ #endif - outline = &gloader->current.outline; - n_points = outline->n_points; - /* set phantom points */ - outline->points[n_points ] = loader->pp1; outline->points[n_points + 1] = loader->pp2; outline->points[n_points + 2] = loader->pp3; @@ -976,7 +907,7 @@ if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) { - if ( FT_NEW_ARRAY( unrounded, n_points ) ) + if ( FT_QNEW_ARRAY( unrounded, n_points ) ) goto Exit; /* Deltas apply to the unscaled data. */ @@ -998,16 +929,6 @@ } { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - TT_Face face = loader->face; - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); - - FT_String* family = face->root.family_name; - FT_UInt ppem = loader->size->metrics->x_ppem; - FT_String* style = face->root.style_name; - FT_UInt x_scale_factor = 1000; -#endif - FT_Vector* vec = outline->points; FT_Vector* limit = outline->points + n_points; @@ -1017,52 +938,6 @@ FT_Bool do_scale = FALSE; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - /* scale, but only if enabled and only if TT hinting is being used */ - if ( IS_HINTED( loader->load_flags ) ) - x_scale_factor = sph_test_tweak_x_scaling( face, - family, - ppem, - style, - loader->glyph_index ); - /* scale the glyph */ - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 || - x_scale_factor != 1000 ) - { - x_scale = FT_MulDiv( loader->size->metrics->x_scale, - (FT_Long)x_scale_factor, 1000 ); - y_scale = loader->size->metrics->y_scale; - - /* compensate for any scaling by de/emboldening; */ - /* the amount was determined via experimentation */ - if ( x_scale_factor != 1000 && ppem > 11 ) - { -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Vector* orig_points = outline->points; - - - if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) - outline->points = unrounded; -#endif - FT_Outline_EmboldenXY( outline, - FT_MulFix( 1280 * ppem, - 1000 - x_scale_factor ), - 0 ); -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( !IS_DEFAULT_INSTANCE( FT_FACE( loader->face ) ) ) - outline->points = orig_points; -#endif - } - do_scale = TRUE; - } - } - else - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - { /* scale the glyph */ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) @@ -1331,12 +1206,12 @@ FT_UInt start_contour ) { FT_Error error; - FT_Outline* outline; + FT_Outline* outline = &loader->gloader->base.outline; + FT_Stream stream = loader->stream; + FT_UShort n_ins; FT_UInt i; - outline = &loader->gloader->base.outline; - /* make room for phantom points */ error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, outline->n_points + 4, @@ -1352,11 +1227,14 @@ #ifdef TT_USE_BYTECODE_INTERPRETER { - FT_Stream stream = loader->stream; - FT_UShort n_ins, max_ins; - FT_ULong tmp; + TT_ExecContext exec = loader->exec; + FT_Memory memory = exec->memory; + if ( exec->glyphSize ) + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + /* TT_Load_Composite_Glyph only gives us the offset of instructions */ /* so we read them here */ if ( FT_STREAM_SEEK( loader->ins_pos ) || @@ -1365,39 +1243,24 @@ FT_TRACE5(( " Instructions size = %hu\n", n_ins )); - /* check it */ - max_ins = loader->face->max_profile.maxSizeOfInstructions; - if ( n_ins > max_ins ) - { - /* don't trust `maxSizeOfInstructions'; */ - /* only do a rough safety check */ - if ( n_ins > loader->byte_len ) - { - FT_TRACE1(( "TT_Process_Composite_Glyph:" - " too many instructions (%hu) for glyph with length %u\n", - n_ins, loader->byte_len )); - return FT_THROW( Too_Many_Hints ); - } - - tmp = loader->exec->glyphSize; - error = Update_Max( loader->exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&loader->exec->glyphIns, - n_ins ); - - loader->exec->glyphSize = (FT_UShort)tmp; - if ( error ) - return error; - } - else if ( n_ins == 0 ) + if ( !n_ins ) return FT_Err_Ok; - if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) + /* don't trust `maxSizeOfInstructions'; */ + /* only do a rough safety check */ + if ( n_ins > loader->byte_len ) + { + FT_TRACE1(( "TT_Process_Composite_Glyph:" + " too many instructions (%hu) for glyph with length %u\n", + n_ins, loader->byte_len )); + return FT_THROW( Too_Many_Hints ); + } + + if ( FT_QNEW_ARRAY( exec->glyphIns, n_ins ) || + FT_STREAM_READ( exec->glyphIns, n_ins ) ) return error; - loader->glyph->control_data = loader->exec->glyphIns; - loader->glyph->control_len = n_ins; + exec->glyphSize = n_ins; } #endif @@ -1501,45 +1364,31 @@ static void tt_loader_set_pp( TT_Loader loader ) { - FT_Bool subpixel_hinting = 0; - FT_Bool grayscale = 0; - FT_Bool use_aw_2 = 0; - -#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING - TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); -#endif - - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting - : 0; - grayscale = loader->exec ? loader->exec->grayscale - : 0; - } -#endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) - { - subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting_lean - : 0; - grayscale = loader->exec ? loader->exec->grayscale_cleartype - : 0; - } -#endif - - use_aw_2 = FT_BOOL( subpixel_hinting && grayscale ); - loader->pp1.x = loader->bbox.xMin - loader->left_bearing; loader->pp1.y = 0; loader->pp2.x = loader->pp1.x + loader->advance; loader->pp2.y = 0; - loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0; + loader->pp3.x = 0; loader->pp3.y = loader->bbox.yMax + loader->top_bearing; - loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0; + loader->pp4.x = 0; loader->pp4.y = loader->pp3.y - loader->vadvance; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + { + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); + + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + loader->exec && + loader->exec->subpixel_hinting_lean && + loader->exec->grayscale_cleartype ) + { + loader->pp3.x = loader->advance / 2; + loader->pp4.x = loader->advance / 2; + } + } +#endif } @@ -1662,8 +1511,14 @@ else #endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ULong len; - offset = tt_face_get_location( face, glyph_index, &loader->byte_len ); + + offset = tt_face_get_location( FT_FACE( face ), glyph_index, &len ); + + loader->byte_len = (FT_UInt)len; + } if ( loader->byte_len > 0 ) { @@ -1889,10 +1744,7 @@ short i, limit; FT_SubGlyph subglyph; - FT_Outline outline; - FT_Vector* points = NULL; - char* tags = NULL; - short* contours = NULL; + FT_Outline outline = { 0, 0, NULL, NULL, NULL, 0 }; FT_Vector* unrounded = NULL; @@ -1900,18 +1752,14 @@ /* construct an outline structure for */ /* communication with `TT_Vary_Apply_Glyph_Deltas' */ - outline.n_contours = outline.n_points = limit; - - outline.points = NULL; - outline.tags = NULL; - outline.contours = NULL; - - if ( FT_NEW_ARRAY( points, limit + 4 ) || - FT_NEW_ARRAY( tags, limit + 4 ) || - FT_NEW_ARRAY( contours, limit + 4 ) || - FT_NEW_ARRAY( unrounded, limit + 4 ) ) + if ( FT_QNEW_ARRAY( outline.points, limit + 4 ) || + FT_QNEW_ARRAY( outline.tags, limit ) || + FT_QNEW_ARRAY( outline.contours, limit ) || + FT_QNEW_ARRAY( unrounded, limit + 4 ) ) goto Exit1; + outline.n_contours = outline.n_points = limit; + subglyph = gloader->current.subglyphs; for ( i = 0; i < limit; i++, subglyph++ ) @@ -1919,20 +1767,16 @@ /* applying deltas for anchor points doesn't make sense, */ /* but we don't have to specially check this since */ /* unused delta values are zero anyways */ - points[i].x = subglyph->arg1; - points[i].y = subglyph->arg2; - tags[i] = 1; - contours[i] = i; + outline.points[i].x = subglyph->arg1; + outline.points[i].y = subglyph->arg2; + outline.tags[i] = ON_CURVE_POINT; + outline.contours[i] = i; } - points[i++] = loader->pp1; - points[i++] = loader->pp2; - points[i++] = loader->pp3; - points[i ] = loader->pp4; - - outline.points = points; - outline.tags = tags; - outline.contours = contours; + outline.points[i++] = loader->pp1; + outline.points[i++] = loader->pp2; + outline.points[i++] = loader->pp3; + outline.points[i ] = loader->pp4; /* this call provides additional offsets */ /* for each component's translation */ @@ -1947,8 +1791,8 @@ { if ( subglyph->flags & ARGS_ARE_XY_VALUES ) { - subglyph->arg1 = (FT_Int16)points[i].x; - subglyph->arg2 = (FT_Int16)points[i].y; + subglyph->arg1 = (FT_Int16)outline.points[i].x; + subglyph->arg2 = (FT_Int16)outline.points[i].y; } } @@ -2332,8 +2176,7 @@ #ifdef TT_USE_BYTECODE_INTERPRETER FT_Error error; FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); -#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ - defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( glyph->face ); #endif #endif @@ -2353,20 +2196,6 @@ FT_Bool grayscale_cleartype; #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_Bool subpixel_hinting = FALSE; - -#if 0 - /* not used yet */ - FT_Bool compatible_widths; - FT_Bool symmetrical_smoothing; - FT_Bool bgr; - FT_Bool vertical_lcd; - FT_Bool subpixel_positioned; - FT_Bool gray_cleartype; -#endif -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - FT_Bool reexecute = FALSE; @@ -2386,6 +2215,9 @@ if ( !exec ) return FT_THROW( Could_Not_Find_Context ); + grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) { @@ -2402,6 +2234,7 @@ FT_BOOL( subpixel_hinting_lean && ( load_flags & FT_LOAD_TARGET_LCD_V ) ); + grayscale = FT_BOOL( grayscale && !subpixel_hinting_lean ); } else { @@ -2411,111 +2244,11 @@ } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) - { - subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags ) != - FT_RENDER_MODE_MONO ) && - SPH_OPTION_SET_SUBPIXEL ); - - if ( subpixel_hinting ) - grayscale = FALSE; - else if ( SPH_OPTION_SET_GRAYSCALE ) - { - grayscale = TRUE; - subpixel_hinting = FALSE; - } - else - grayscale = FALSE; - - if ( FT_IS_TRICKY( glyph->face ) ) - subpixel_hinting = FALSE; - - exec->ignore_x_mode = subpixel_hinting || grayscale; - exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; - if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) - exec->rasterizer_version = TT_INTERPRETER_VERSION_35; - -#if 1 - exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS; - exec->symmetrical_smoothing = TRUE; - exec->bgr = FALSE; - exec->vertical_lcd = FALSE; - exec->subpixel_positioned = TRUE; - exec->gray_cleartype = FALSE; -#else /* 0 */ - exec->compatible_widths = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_COMPATIBLE_WIDTHS ); - exec->symmetrical_smoothing = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_SYMMETRICAL_SMOOTHING ); - exec->bgr = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_BGR ); - exec->vertical_lcd = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_VERTICAL_LCD ); - exec->subpixel_positioned = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_SUBPIXEL_POSITIONED ); - exec->gray_cleartype = - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - TT_LOAD_GRAY_CLEARTYPE ); -#endif /* 0 */ - - } - else - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) - grayscale = FT_BOOL( !subpixel_hinting_lean && - FT_LOAD_TARGET_MODE( load_flags ) != - FT_RENDER_MODE_MONO ); - else -#endif - grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != - FT_RENDER_MODE_MONO ); - error = TT_Load_Context( exec, face, size ); if ( error ) return error; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) { - /* a change from mono to subpixel rendering (and vice versa) */ - /* requires a re-execution of the CVT program */ - if ( subpixel_hinting != exec->subpixel_hinting ) - { - FT_TRACE4(( "tt_loader_init: subpixel hinting change," - " re-executing `prep' table\n" )); - - exec->subpixel_hinting = subpixel_hinting; - reexecute = TRUE; - } - - /* a change from mono to grayscale rendering (and vice versa) */ - /* requires a re-execution of the CVT program */ - if ( grayscale != exec->grayscale ) - { - FT_TRACE4(( "tt_loader_init: grayscale hinting change," - " re-executing `prep' table\n" )); - - exec->grayscale = grayscale; - reexecute = TRUE; - } - } - else - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - { - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) { @@ -2573,14 +2306,6 @@ if ( exec->GS.instruct_control & 2 ) exec->GS = tt_default_graphics_state; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* check whether we have a font hinted for ClearType -- */ - /* note that this flag can also be modified in a glyph's bytecode */ - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - exec->GS.instruct_control & 4 ) - exec->ignore_x_mode = FALSE; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* * Toggle backward compatibility according to what font wants, except @@ -2616,13 +2341,6 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && exec->backward_compatibility ) && -#endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - !( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - !SPH_OPTION_BITMAP_WIDTHS && - FT_LOAD_TARGET_MODE( loader->load_flags ) != - FT_RENDER_MODE_MONO && - exec->compatible_widths ) && #endif !face->postscript.isFixedPitch ) { @@ -2857,7 +2575,9 @@ #ifdef FT_CONFIG_OPTION_SVG /* check for OT-SVG */ - if ( ( load_flags & FT_LOAD_COLOR ) && face->svg ) + if ( ( load_flags & FT_LOAD_NO_SVG ) == 0 && + ( load_flags & FT_LOAD_COLOR ) && + face->svg ) { SFNT_Service sfnt = (SFNT_Service)face->sfnt; @@ -2955,6 +2675,9 @@ if ( IS_HINTED( load_flags ) ) { + glyph->control_data = loader.exec->glyphIns; + glyph->control_len = loader.exec->glyphSize; + if ( loader.exec->GS.scan_control ) { /* convert scan conversion mode to FT_OUTLINE_XXX flags */ diff --git a/src/3rdparty/freetype/src/truetype/ttgxvar.c b/src/3rdparty/freetype/src/truetype/ttgxvar.c index 60a0095b..ad4f266b 100644 --- a/src/3rdparty/freetype/src/truetype/ttgxvar.c +++ b/src/3rdparty/freetype/src/truetype/ttgxvar.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -465,7 +466,7 @@ if ( store_offset ) { error = tt_var_load_item_variation_store( - face, + FT_FACE( face ), table_offset + store_offset, &table->itemStore ); if ( error ) @@ -475,7 +476,7 @@ if ( axisMap_offset ) { error = tt_var_load_delta_set_index_mapping( - face, + FT_FACE( face ), table_offset + axisMap_offset, &table->axisMap, &table->itemStore, @@ -492,10 +493,11 @@ FT_LOCAL_DEF( FT_Error ) - tt_var_load_item_variation_store( TT_Face face, + tt_var_load_item_variation_store( FT_Face face, /* TT_Face */ FT_ULong offset, GX_ItemVarStore itemStore ) { + TT_Face ttface = (TT_Face)face; FT_Stream stream = FT_FACE_STREAM( face ); FT_Memory memory = stream->memory; @@ -507,10 +509,10 @@ FT_UShort axis_count; FT_UInt region_count; - FT_UInt i, j, k; + FT_UInt i, j; FT_Bool long_words; - GX_Blend blend = face->blend; + GX_Blend blend = ttface->blend; FT_ULong* dataOffsetArray = NULL; @@ -619,9 +621,10 @@ { GX_ItemVarData varData = &itemStore->varData[i]; - FT_UInt item_count; - FT_UInt word_delta_count; - FT_UInt region_idx_count; + FT_UInt item_count; + FT_UShort word_delta_count; + FT_UInt region_idx_count; + FT_UInt per_region_size; if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) ) @@ -658,6 +661,8 @@ if ( FT_NEW_ARRAY( varData->regionIndices, region_idx_count ) ) goto Exit; varData->regionIdxCount = region_idx_count; + varData->wordDeltaCount = word_delta_count; + varData->longWords = long_words; for ( j = 0; j < varData->regionIdxCount; j++ ) { @@ -673,37 +678,22 @@ } } - /* Parse delta set. */ - /* */ - /* On input, deltas are (word_delta_count + region_idx_count) bytes */ - /* each if `long_words` isn't set, and twice as much otherwise. */ - /* */ - /* On output, deltas are expanded to `region_idx_count` shorts each. */ - if ( FT_NEW_ARRAY( varData->deltaSet, item_count * region_idx_count ) ) - goto Exit; - varData->itemCount = item_count; + per_region_size = word_delta_count + region_idx_count; + if ( long_words ) + per_region_size *= 2; - for ( j = 0; j < item_count * region_idx_count; ) + if ( FT_NEW_ARRAY( varData->deltaSet, per_region_size * item_count ) ) + goto Exit; + if ( FT_Stream_Read( stream, + varData->deltaSet, + per_region_size * item_count ) ) { - if ( long_words ) - { - for ( k = 0; k < word_delta_count; k++, j++ ) - if ( FT_READ_LONG( varData->deltaSet[j] ) ) - goto Exit; - for ( ; k < region_idx_count; k++, j++ ) - if ( FT_READ_SHORT( varData->deltaSet[j] ) ) - goto Exit; - } - else - { - for ( k = 0; k < word_delta_count; k++, j++ ) - if ( FT_READ_SHORT( varData->deltaSet[j] ) ) - goto Exit; - for ( ; k < region_idx_count; k++, j++ ) - if ( FT_READ_CHAR( varData->deltaSet[j] ) ) - goto Exit; - } + FT_TRACE2(( "deltaSet read failed." )); + error = FT_THROW( Invalid_Table ); + goto Exit; } + + varData->itemCount = item_count; } Exit: @@ -714,7 +704,7 @@ FT_LOCAL_DEF( FT_Error ) - tt_var_load_delta_set_index_mapping( TT_Face face, + tt_var_load_delta_set_index_mapping( FT_Face face, /* TT_Face */ FT_ULong offset, GX_DeltaSetIdxMap map, GX_ItemVarStore itemStore, @@ -941,7 +931,7 @@ } error = tt_var_load_item_variation_store( - face, + FT_FACE( face ), table_offset + store_offset, &table->itemStore ); if ( error ) @@ -950,7 +940,7 @@ if ( widthMap_offset ) { error = tt_var_load_delta_set_index_mapping( - face, + FT_FACE( face ), table_offset + widthMap_offset, &table->widthMap, &table->itemStore, @@ -992,24 +982,30 @@ FT_LOCAL_DEF( FT_ItemVarDelta ) - tt_var_get_item_delta( TT_Face face, + tt_var_get_item_delta( FT_Face face, /* TT_Face */ GX_ItemVarStore itemStore, FT_UInt outerIndex, FT_UInt innerIndex ) { + TT_Face ttface = (TT_Face)face; FT_Stream stream = FT_FACE_STREAM( face ); FT_Memory memory = stream->memory; FT_Error error = FT_Err_Ok; GX_ItemVarData varData; - FT_ItemVarDelta* deltaSet; + FT_ItemVarDelta* deltaSet = NULL; + FT_ItemVarDelta deltaSetStack[16]; + + FT_Fixed* scalars = NULL; + FT_Fixed scalarsStack[16]; FT_UInt master, j; - FT_Fixed* scalars = NULL; - FT_ItemVarDelta returnValue; + FT_ItemVarDelta returnValue = 0; + FT_UInt per_region_size; + FT_Byte* bytes; - if ( !face->blend || !face->blend->normalizedcoords ) + if ( !ttface->blend || !ttface->blend->normalizedcoords ) return 0; /* OpenType 1.8.4+: No variation data for this item */ @@ -1023,15 +1019,48 @@ if ( outerIndex >= itemStore->dataCount ) return 0; /* Out of range. */ - varData = &itemStore->varData[outerIndex]; - deltaSet = FT_OFFSET( varData->deltaSet, - varData->regionIdxCount * innerIndex ); + varData = &itemStore->varData[outerIndex]; if ( innerIndex >= varData->itemCount ) return 0; /* Out of range. */ - if ( FT_QNEW_ARRAY( scalars, varData->regionIdxCount ) ) - return 0; + if ( varData->regionIdxCount < 16 ) + { + deltaSet = deltaSetStack; + scalars = scalarsStack; + } + else + { + if ( FT_QNEW_ARRAY( deltaSet, varData->regionIdxCount ) ) + goto Exit; + if ( FT_QNEW_ARRAY( scalars, varData->regionIdxCount ) ) + goto Exit; + } + + /* Parse delta set. */ + /* */ + /* Deltas are (word_delta_count + region_idx_count) bytes each */ + /* if `longWords` isn't set, and twice as much otherwise. */ + per_region_size = varData->wordDeltaCount + varData->regionIdxCount; + if ( varData->longWords ) + per_region_size *= 2; + + bytes = varData->deltaSet + per_region_size * innerIndex; + + if ( varData->longWords ) + { + for ( master = 0; master < varData->wordDeltaCount; master++ ) + deltaSet[master] = FT_NEXT_LONG( bytes ); + for ( ; master < varData->regionIdxCount; master++ ) + deltaSet[master] = FT_NEXT_SHORT( bytes ); + } + else + { + for ( master = 0; master < varData->wordDeltaCount; master++ ) + deltaSet[master] = FT_NEXT_SHORT( bytes ); + for ( ; master < varData->regionIdxCount; master++ ) + deltaSet[master] = FT_NEXT_CHAR( bytes ); + } /* outer loop steps through master designs to be blended */ for ( master = 0; master < varData->regionIdxCount; master++ ) @@ -1060,27 +1089,27 @@ else if ( axis->peakCoord == 0 ) continue; - else if ( face->blend->normalizedcoords[j] == axis->peakCoord ) + else if ( ttface->blend->normalizedcoords[j] == axis->peakCoord ) continue; /* ignore this region if coords are out of range */ - else if ( face->blend->normalizedcoords[j] <= axis->startCoord || - face->blend->normalizedcoords[j] >= axis->endCoord ) + else if ( ttface->blend->normalizedcoords[j] <= axis->startCoord || + ttface->blend->normalizedcoords[j] >= axis->endCoord ) { scalar = 0; break; } /* cumulative product of all the axis scalars */ - else if ( face->blend->normalizedcoords[j] < axis->peakCoord ) + else if ( ttface->blend->normalizedcoords[j] < axis->peakCoord ) scalar = FT_MulDiv( scalar, - face->blend->normalizedcoords[j] - axis->startCoord, + ttface->blend->normalizedcoords[j] - axis->startCoord, axis->peakCoord - axis->startCoord ); else scalar = FT_MulDiv( scalar, - axis->endCoord - face->blend->normalizedcoords[j], + axis->endCoord - ttface->blend->normalizedcoords[j], axis->endCoord - axis->peakCoord ); } /* per-axis loop */ @@ -1106,7 +1135,11 @@ */ returnValue = FT_MulAddFix( scalars, deltaSet, varData->regionIdxCount ); - FT_FREE( scalars ); + Exit: + if ( scalars != scalarsStack ) + FT_FREE( scalars ); + if ( deltaSet != deltaSetStack ) + FT_FREE( deltaSet ); return returnValue; } @@ -1206,7 +1239,7 @@ innerIndex = gindex; } - delta = tt_var_get_item_delta( face, + delta = tt_var_get_item_delta( FT_FACE( face ), &table->itemStore, outerIndex, innerIndex ); @@ -1229,20 +1262,20 @@ FT_LOCAL_DEF( FT_Error ) - tt_hadvance_adjust( TT_Face face, + tt_hadvance_adjust( FT_Face face, /* TT_Face */ FT_UInt gindex, FT_Int *avalue ) { - return tt_hvadvance_adjust( face, gindex, avalue, 0 ); + return tt_hvadvance_adjust( (TT_Face)face, gindex, avalue, 0 ); } FT_LOCAL_DEF( FT_Error ) - tt_vadvance_adjust( TT_Face face, + tt_vadvance_adjust( FT_Face face, /* TT_Face */ FT_UInt gindex, FT_Int *avalue ) { - return tt_hvadvance_adjust( face, gindex, avalue, 1 ); + return tt_hvadvance_adjust( (TT_Face)face, gindex, avalue, 1 ); } @@ -1389,7 +1422,7 @@ records_offset = FT_STREAM_POS(); error = tt_var_load_item_variation_store( - face, + FT_FACE( face ), table_offset + store_offset, &blend->mvar_table->itemStore ); if ( error ) @@ -1462,15 +1495,14 @@ static FT_Error - tt_size_reset_iterator( FT_ListNode node, + ft_size_reset_iterator( FT_ListNode node, void* user ) { - TT_Size size = (TT_Size)node->data; - - FT_UNUSED( user ); + FT_Size size = (FT_Size)node->data; + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)user; - tt_size_reset( size, 1 ); + var->size_reset( size ); return FT_Err_Ok; } @@ -1489,16 +1521,19 @@ * The font face. */ FT_LOCAL_DEF( void ) - tt_apply_mvar( TT_Face face ) + tt_apply_mvar( FT_Face face ) /* TT_Face */ { - GX_Blend blend = face->blend; + TT_Face ttface = (TT_Face)face; + + GX_Blend blend = ttface->blend; GX_Value value, limit; + FT_Short mvar_hasc_delta = 0; FT_Short mvar_hdsc_delta = 0; FT_Short mvar_hlgp_delta = 0; - if ( !( face->variation_support & TT_FACE_FLAG_VAR_MVAR ) ) + if ( !( ttface->variation_support & TT_FACE_FLAG_VAR_MVAR ) ) return; value = blend->mvar_table->values; @@ -1506,7 +1541,7 @@ for ( ; value < limit; value++ ) { - FT_Short* p = ft_var_get_value_pointer( face, value->tag ); + FT_Short* p = ft_var_get_value_pointer( ttface, value->tag ); FT_Int delta; @@ -1543,7 +1578,8 @@ /* adjust all derived values */ { - FT_Face root = &face->root; + FT_Service_MetricsVariations var = + (FT_Service_MetricsVariations)ttface->face_var; /* * Apply the deltas of hasc, hdsc and hlgp to the FT_Face's ascender, @@ -1571,24 +1607,25 @@ * whether they were actually changed or the font had the OS/2 table's * fsSelection's bit 7 (USE_TYPO_METRICS) set. */ - FT_Short current_line_gap = root->height - root->ascender + - root->descender; + FT_Short current_line_gap = face->height - face->ascender + + face->descender; - root->ascender = root->ascender + mvar_hasc_delta; - root->descender = root->descender + mvar_hdsc_delta; - root->height = root->ascender - root->descender + + face->ascender = face->ascender + mvar_hasc_delta; + face->descender = face->descender + mvar_hdsc_delta; + face->height = face->ascender - face->descender + current_line_gap + mvar_hlgp_delta; - root->underline_position = face->postscript.underlinePosition - - face->postscript.underlineThickness / 2; - root->underline_thickness = face->postscript.underlineThickness; + face->underline_position = ttface->postscript.underlinePosition - + ttface->postscript.underlineThickness / 2; + face->underline_thickness = ttface->postscript.underlineThickness; - /* iterate over all FT_Size objects and call `tt_size_reset' */ - /* to propagate the metrics changes */ - FT_List_Iterate( &root->sizes_list, - tt_size_reset_iterator, - NULL ); + /* iterate over all FT_Size objects and call `var->size_reset' */ + /* to propagate the metrics changes */ + if ( var && var->size_reset ) + FT_List_Iterate( &face->sizes_list, + ft_size_reset_iterator, + (void*)var ); } } @@ -2099,7 +2136,7 @@ innerIndex = table->axisMap.innerIndex[idx]; } - delta = tt_var_get_item_delta( face, + delta = tt_var_get_item_delta( FT_FACE( face ), &table->itemStore, outerIndex, innerIndex ); @@ -2261,11 +2298,12 @@ * FreeType error code. 0 means success. */ FT_LOCAL_DEF( FT_Error ) - TT_Get_MM_Var( TT_Face face, + TT_Get_MM_Var( FT_Face face, /* TT_Face */ FT_MM_Var* *master ) { - FT_Stream stream = face->root.stream; - FT_Memory memory = face->root.memory; + TT_Face ttface = (TT_Face)face; + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = FT_FACE_MEMORY( face ); FT_ULong table_len; FT_Error error = FT_Err_Ok; FT_ULong fvar_start = 0; @@ -2329,19 +2367,19 @@ /* the default instance, which might be missing in the table of named */ /* instances (in 'fvar'). This value is validated in `sfobjs.c` and */ /* may be reset to 0 if consistency checks fail. */ - num_instances = (FT_UInt)face->root.style_flags >> 16; + num_instances = (FT_UInt)face->style_flags >> 16; /* read the font data and set up the internal representation */ /* if not already done */ - need_init = !face->blend; + need_init = !ttface->blend; if ( need_init ) { FT_TRACE2(( "FVAR " )); - if ( FT_SET_ERROR( face->goto_table( face, TTAG_fvar, - stream, &table_len ) ) ) + if ( FT_SET_ERROR( ttface->goto_table( ttface, TTAG_fvar, + stream, &table_len ) ) ) { FT_TRACE1(( "is missing\n" )); goto Exit; @@ -2374,14 +2412,14 @@ fvar_head.axisCount, fvar_head.axisCount == 1 ? "is" : "es" )); - if ( FT_NEW( face->blend ) ) + if ( FT_NEW( ttface->blend ) ) goto Exit; - num_axes = fvar_head.axisCount; - face->blend->num_axis = num_axes; + num_axes = fvar_head.axisCount; + ttface->blend->num_axis = num_axes; } else - num_axes = face->blend->num_axis; + num_axes = ttface->blend->num_axis; /* prepare storage area for MM data; this cannot overflow */ /* 32-bit arithmetic because of the size limits used in the */ @@ -2410,16 +2448,16 @@ if ( need_init ) { - face->blend->mmvar_len = mmvar_size + - axis_flags_size + - axis_size + - namedstyle_size + - next_coords_size + - next_name_size; + ttface->blend->mmvar_len = mmvar_size + + axis_flags_size + + axis_size + + namedstyle_size + + next_coords_size + + next_name_size; - if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + if ( FT_ALLOC( mmvar, ttface->blend->mmvar_len ) ) goto Exit; - face->blend->mmvar = mmvar; + ttface->blend->mmvar = mmvar; /* set up pointers and offsets into the `mmvar' array; */ /* the data gets filled in later on */ @@ -2525,27 +2563,27 @@ /* named instance coordinates are stored as design coordinates; */ /* we have to convert them to normalized coordinates also */ - if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords, + if ( FT_NEW_ARRAY( ttface->blend->normalized_stylecoords, num_axes * num_instances ) ) goto Exit; - if ( fvar_head.instanceCount && !face->blend->avar_loaded ) + if ( fvar_head.instanceCount && !ttface->blend->avar_loaded ) { FT_ULong offset = FT_STREAM_POS(); - ft_var_load_avar( face ); + ft_var_load_avar( ttface ); if ( FT_STREAM_SEEK( offset ) ) goto Exit; } - FT_TRACE5(( "%d instance%s\n", + FT_TRACE5(( "%d named instance%s\n", fvar_head.instanceCount, fvar_head.instanceCount == 1 ? "" : "s" )); ns = mmvar->namedstyle; - nsc = face->blend->normalized_stylecoords; + nsc = ttface->blend->normalized_stylecoords; for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) { /* PostScript names add 2 bytes to the instance record size */ @@ -2568,7 +2606,7 @@ #ifdef FT_DEBUG_LEVEL_TRACE { - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; FT_String* strname = NULL; FT_String* psname = NULL; @@ -2580,7 +2618,7 @@ if ( ns->strid != 0xFFFF ) { - (void)sfnt->get_name( face, + (void)sfnt->get_name( ttface, (FT_UShort)ns->strid, &strname ); if ( strname && !ft_strcmp( strname, ".notdef" ) ) @@ -2589,7 +2627,7 @@ if ( ns->psid != 0xFFFF ) { - (void)sfnt->get_name( face, + (void)sfnt->get_name( ttface, (FT_UShort)ns->psid, &psname ); if ( psname && !ft_strcmp( psname, ".notdef" ) ) @@ -2598,7 +2636,7 @@ (void)FT_STREAM_SEEK( pos ); - FT_TRACE5(( " instance %d (%s%s%s, %s%s%s)\n", + FT_TRACE5(( " named instance %d (%s%s%s, %s%s%s)\n", i, strname ? "name: `" : "", strname ? strname : "unnamed", @@ -2612,7 +2650,7 @@ } #endif /* FT_DEBUG_LEVEL_TRACE */ - ft_var_to_normalized( face, num_axes, ns->coords, nsc ); + ft_var_to_normalized( ttface, num_axes, ns->coords, nsc ); nsc += num_axes; FT_FRAME_EXIT(); @@ -2620,15 +2658,17 @@ if ( num_instances != fvar_head.instanceCount ) { - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; FT_Int found, dummy1, dummy2; FT_UInt strid = ~0U; - /* the default instance is missing in array the */ - /* of named instances; try to synthesize an entry */ - found = sfnt->get_name_id( face, + /* The default instance is missing in array the */ + /* of named instances; try to synthesize an entry. */ + /* If this fails, `default_named_instance` remains */ + /* at value zero, which doesn't do any harm. */ + found = sfnt->get_name_id( ttface, TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, &dummy1, &dummy2 ); @@ -2636,7 +2676,7 @@ strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY; else { - found = sfnt->get_name_id( face, + found = sfnt->get_name_id( ttface, TT_NAME_ID_FONT_SUBFAMILY, &dummy1, &dummy2 ); @@ -2646,7 +2686,7 @@ if ( found ) { - found = sfnt->get_name_id( face, + found = sfnt->get_name_id( ttface, TT_NAME_ID_PS_NAME, &dummy1, &dummy2 ); @@ -2655,6 +2695,9 @@ FT_TRACE5(( "TT_Get_MM_Var:" " Adding default instance to named instances\n" )); + /* named instance indices start with value 1 */ + ttface->var_default_named_instance = num_instances; + ns = &mmvar->namedstyle[fvar_head.instanceCount]; ns->strid = strid; @@ -2668,7 +2711,7 @@ } } - ft_var_load_mvar( face ); + ft_var_load_mvar( ttface ); } /* fill the output array if requested */ @@ -2678,9 +2721,9 @@ FT_UInt n; - if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + if ( FT_ALLOC( mmvar, ttface->blend->mmvar_len ) ) goto Exit; - FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); + FT_MEM_COPY( mmvar, ttface->blend->mmvar, ttface->blend->mmvar_len ); axis_flags = (FT_UShort*)( (char*)mmvar + mmvar_size ); @@ -2756,7 +2799,7 @@ if ( !face->blend ) { - if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + if ( FT_SET_ERROR( TT_Get_MM_Var( FT_FACE( face ), NULL ) ) ) goto Exit; } @@ -2841,26 +2884,29 @@ } } - if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + if ( !have_diff ) { - FT_UInt instance_index = (FT_UInt)face->root.face_index >> 16; + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + { + FT_UInt instance_index = (FT_UInt)face->root.face_index >> 16; - c = blend->normalizedcoords + i; - n = blend->normalized_stylecoords + - ( instance_index - 1 ) * mmvar->num_axis + - i; + c = blend->normalizedcoords + i; + n = blend->normalized_stylecoords + + ( instance_index - 1 ) * mmvar->num_axis + + i; - for ( j = i; j < mmvar->num_axis; j++, n++, c++ ) - if ( *c != *n ) - have_diff = 1; - } - else - { - c = blend->normalizedcoords + i; - for ( j = i; j < mmvar->num_axis; j++, c++ ) - if ( *c != 0 ) - have_diff = 1; + for ( j = i; j < mmvar->num_axis; j++, n++, c++ ) + if ( *c != *n ) + have_diff = 1; + } + else + { + c = blend->normalizedcoords + i; + for ( j = i; j < mmvar->num_axis; j++, c++ ) + if ( *c != 0 ) + have_diff = 1; + } } /* return value -1 indicates `no change' */ @@ -2924,9 +2970,6 @@ } } - /* enforce recomputation of the PostScript name; */ - FT_FREE( face->postscript_name ); - Exit: return error; } @@ -2958,26 +3001,15 @@ * An array of `num_coords', each between [-1,1]. * * @Return: - * FreeType error code. 0 means success. + * FreeType error code. 0 means success, -1 means success and unchanged + * axis values. */ FT_LOCAL_DEF( FT_Error ) - TT_Set_MM_Blend( TT_Face face, + TT_Set_MM_Blend( FT_Face face, /* TT_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Error error; - - - error = tt_set_mm_blend( face, num_coords, coords, 1 ); - if ( error ) - return error; - - if ( num_coords ) - face->root.face_flags |= FT_FACE_FLAG_VARIATION; - else - face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; - - return FT_Err_Ok; + return tt_set_mm_blend( (TT_Face)face, num_coords, coords, 1 ); } @@ -3005,31 +3037,34 @@ * An array of `num_coords', each between [-1,1]. * * @Return: - * FreeType error code. 0 means success. + * FreeType error code. 0 means success, -1 means success and unchanged + * axis values. */ FT_LOCAL_DEF( FT_Error ) - TT_Get_MM_Blend( TT_Face face, + TT_Get_MM_Blend( FT_Face face, /* TT_Face */ FT_UInt num_coords, FT_Fixed* coords ) { + TT_Face ttface = (TT_Face)face; + FT_Error error = FT_Err_Ok; GX_Blend blend; FT_UInt i, nc; - if ( !face->blend ) + if ( !ttface->blend ) { if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) return error; } - blend = face->blend; + blend = ttface->blend; if ( !blend->coords ) { /* select default instance coordinates */ /* if no instance is selected yet */ - if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) ) + if ( FT_SET_ERROR( tt_set_mm_blend( ttface, 0, NULL, 1 ) ) ) return error; } @@ -3042,7 +3077,7 @@ nc = blend->num_axis; } - if ( face->doblend ) + if ( ttface->doblend ) { for ( i = 0; i < nc; i++ ) coords[i] = blend->normalizedcoords[i]; @@ -3089,15 +3124,16 @@ * FreeType error code. 0 means success. */ FT_LOCAL_DEF( FT_Error ) - TT_Set_Var_Design( TT_Face face, + TT_Set_Var_Design( FT_Face face, /* TT_Face */ FT_UInt num_coords, FT_Fixed* coords ) { + TT_Face ttface = (TT_Face)face; FT_Error error = FT_Err_Ok; GX_Blend blend; FT_MM_Var* mmvar; FT_UInt i; - FT_Memory memory = face->root.memory; + FT_Memory memory = FT_FACE_MEMORY( face ); FT_Fixed* c; FT_Fixed* n; @@ -3106,13 +3142,13 @@ FT_Bool have_diff = 0; - if ( !face->blend ) + if ( !ttface->blend ) { if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) goto Exit; } - blend = face->blend; + blend = ttface->blend; mmvar = blend->mmvar; if ( num_coords > mmvar->num_axis ) @@ -3140,13 +3176,13 @@ } } - if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + if ( FT_IS_NAMED_INSTANCE( face ) ) { FT_UInt instance_index; FT_Var_Named_Style* named_style; - instance_index = (FT_UInt)face->root.face_index >> 16; + instance_index = (FT_UInt)face->face_index >> 16; named_style = mmvar->namedstyle + instance_index - 1; n = named_style->coords + num_coords; @@ -3183,22 +3219,17 @@ if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) goto Exit; - if ( !face->blend->avar_loaded ) - ft_var_load_avar( face ); + if ( !ttface->blend->avar_loaded ) + ft_var_load_avar( ttface ); FT_TRACE5(( "TT_Set_Var_Design:\n" )); FT_TRACE5(( " normalized design coordinates:\n" )); - ft_var_to_normalized( face, num_coords, blend->coords, normalized ); + ft_var_to_normalized( ttface, num_coords, blend->coords, normalized ); - error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 ); + error = tt_set_mm_blend( ttface, mmvar->num_axis, normalized, 0 ); if ( error ) goto Exit; - if ( num_coords ) - face->root.face_flags |= FT_FACE_FLAG_VARIATION; - else - face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; - Exit: FT_FREE( normalized ); return error; @@ -3231,28 +3262,29 @@ * FreeType error code. 0~means success. */ FT_LOCAL_DEF( FT_Error ) - TT_Get_Var_Design( TT_Face face, + TT_Get_Var_Design( FT_Face face, /* TT_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Error error = FT_Err_Ok; + TT_Face ttface = (TT_Face)face; + FT_Error error = FT_Err_Ok; GX_Blend blend; FT_UInt i, nc; - if ( !face->blend ) + if ( !ttface->blend ) { if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) return error; } - blend = face->blend; + blend = ttface->blend; if ( !blend->coords ) { /* select default instance coordinates */ /* if no instance is selected yet */ - if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) ) + if ( FT_SET_ERROR( tt_set_mm_blend( ttface, 0, NULL, 1 ) ) ) return error; } @@ -3265,7 +3297,7 @@ nc = blend->num_axis; } - if ( face->doblend ) + if ( ttface->doblend ) { for ( i = 0; i < nc; i++ ) coords[i] = blend->coords[i]; @@ -3301,29 +3333,33 @@ * Value 0 indicates to not use an instance. * * @Return: - * FreeType error code. 0~means success. + * FreeType error code. 0~means success, -1 means success and unchanged + * axis values. */ FT_LOCAL_DEF( FT_Error ) - TT_Set_Named_Instance( TT_Face face, + TT_Set_Named_Instance( FT_Face face, /* TT_Face */ FT_UInt instance_index ) { + TT_Face ttface = (TT_Face)face; FT_Error error; GX_Blend blend; FT_MM_Var* mmvar; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_UInt num_instances; - if ( !face->blend ) + if ( !ttface->blend ) { if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) goto Exit; } - blend = face->blend; + blend = ttface->blend; mmvar = blend->mmvar; - num_instances = (FT_UInt)face->root.style_flags >> 16; + num_instances = (FT_UInt)face->style_flags >> 16; /* `instance_index' starts with value 1, thus `>' */ if ( instance_index > num_instances ) @@ -3334,8 +3370,7 @@ if ( instance_index > 0 ) { - FT_Memory memory = face->root.memory; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; FT_Var_Named_Style* named_style; FT_String* style_name; @@ -3343,40 +3378,89 @@ named_style = mmvar->namedstyle + instance_index - 1; - error = sfnt->get_name( face, + error = sfnt->get_name( ttface, (FT_UShort)named_style->strid, &style_name ); if ( error ) goto Exit; /* set (or replace) style name */ - FT_FREE( face->root.style_name ); - face->root.style_name = style_name; + FT_FREE( face->style_name ); + face->style_name = style_name; /* finally, select the named instance */ error = TT_Set_Var_Design( face, mmvar->num_axis, named_style->coords ); - if ( error ) - { - /* internal error code -1 means `no change' */ - if ( error == -1 ) - error = FT_Err_Ok; - goto Exit; - } } else + { + /* restore non-VF style name */ + FT_FREE( face->style_name ); + if ( FT_STRDUP( face->style_name, ttface->non_var_style_name ) ) + goto Exit; error = TT_Set_Var_Design( face, 0, NULL ); - - face->root.face_index = ( instance_index << 16 ) | - ( face->root.face_index & 0xFFFFL ); - face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; + } Exit: return error; } + /************************************************************************** + * + * @Function: + * TT_Get_Default_Named_Instance + * + * @Description: + * Get the default named instance. + * + * @Input: + * face :: + * A handle to the source face. + * + * @Output: + * instance_index :: + * The default named instance index. + * + * @Return: + * FreeType error code. 0~means success. + */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ) + { + TT_Face ttface = (TT_Face)face; + FT_Error error = FT_Err_Ok; + + + if ( !ttface->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + *instance_index = ttface->var_default_named_instance; + + Exit: + return error; + } + + + /* This function triggers (lazy) recomputation of the `postscript_name` */ + /* field in `TT_Face`. */ + + FT_LOCAL_DEF( void ) + tt_construct_ps_name( FT_Face face ) + { + TT_Face ttface = (TT_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( ttface->postscript_name ); + } + + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -4409,22 +4493,25 @@ * the MM machinery in case it isn't loaded yet. */ FT_LOCAL_DEF( FT_Error ) - tt_get_var_blend( TT_Face face, + tt_get_var_blend( FT_Face face, /* TT_Face */ FT_UInt *num_coords, FT_Fixed* *coords, FT_Fixed* *normalizedcoords, FT_MM_Var* *mm_var ) { - if ( face->blend ) + TT_Face ttface = (TT_Face)face; + + + if ( ttface->blend ) { if ( num_coords ) - *num_coords = face->blend->num_axis; + *num_coords = ttface->blend->num_axis; if ( coords ) - *coords = face->blend->coords; + *coords = ttface->blend->coords; if ( normalizedcoords ) - *normalizedcoords = face->blend->normalizedcoords; + *normalizedcoords = ttface->blend->normalizedcoords; if ( mm_var ) - *mm_var = face->blend->mmvar; + *mm_var = ttface->blend->mmvar; } else { @@ -4441,7 +4528,7 @@ FT_LOCAL_DEF( void ) - tt_var_done_item_variation_store( TT_Face face, + tt_var_done_item_variation_store( FT_Face face, GX_ItemVarStore itemStore ) { FT_Memory memory = FT_FACE_MEMORY( face ); @@ -4470,7 +4557,7 @@ FT_LOCAL_DEF( void ) - tt_var_done_delta_set_index_map( TT_Face face, + tt_var_done_delta_set_index_map( FT_Face face, GX_DeltaSetIdxMap deltaSetIdxMap ) { FT_Memory memory = FT_FACE_MEMORY( face ); @@ -4490,10 +4577,11 @@ * Free the blend internal data structure. */ FT_LOCAL_DEF( void ) - tt_done_blend( TT_Face face ) + tt_done_blend( FT_Face face ) { + TT_Face ttface = (TT_Face)face; FT_Memory memory = FT_FACE_MEMORY( face ); - GX_Blend blend = face->blend; + GX_Blend blend = ttface->blend; if ( blend ) @@ -4565,7 +4653,7 @@ #else /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ /* ANSI C doesn't like empty source files */ - typedef int _tt_gxvar_dummy; + typedef int tt_gxvar_dummy_; #endif /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ diff --git a/src/3rdparty/freetype/src/truetype/ttgxvar.h b/src/3rdparty/freetype/src/truetype/ttgxvar.h index 4fec980d..e3da6d17 100644 --- a/src/3rdparty/freetype/src/truetype/ttgxvar.h +++ b/src/3rdparty/freetype/src/truetype/ttgxvar.h @@ -347,33 +347,40 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) - TT_Set_MM_Blend( TT_Face face, + TT_Set_MM_Blend( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - TT_Get_MM_Blend( TT_Face face, + TT_Get_MM_Blend( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - TT_Set_Var_Design( TT_Face face, + TT_Set_Var_Design( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - TT_Get_MM_Var( TT_Face face, + TT_Get_MM_Var( FT_Face face, FT_MM_Var* *master ); FT_LOCAL( FT_Error ) - TT_Get_Var_Design( TT_Face face, + TT_Get_Var_Design( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - TT_Set_Named_Instance( TT_Face face, + TT_Set_Named_Instance( FT_Face face, FT_UInt instance_index ); + FT_LOCAL( FT_Error ) + TT_Get_Default_Named_Instance( FT_Face face, + FT_UInt *instance_index ); + + FT_LOCAL( void ) + tt_construct_ps_name( FT_Face face ); + FT_LOCAL( FT_Error ) tt_face_vary_cvt( TT_Face face, FT_Stream stream ); @@ -385,55 +392,54 @@ FT_BEGIN_HEADER FT_Vector* unrounded ); FT_LOCAL( FT_Error ) - tt_hadvance_adjust( TT_Face face, + tt_hadvance_adjust( FT_Face face, FT_UInt gindex, FT_Int *adelta ); FT_LOCAL( FT_Error ) - tt_vadvance_adjust( TT_Face face, + tt_vadvance_adjust( FT_Face face, FT_UInt gindex, FT_Int *adelta ); FT_LOCAL( void ) - tt_apply_mvar( TT_Face face ); - + tt_apply_mvar( FT_Face face ); FT_LOCAL( FT_Error ) - tt_var_load_item_variation_store( TT_Face face, + tt_var_load_item_variation_store( FT_Face face, FT_ULong offset, GX_ItemVarStore itemStore ); FT_LOCAL( FT_Error ) - tt_var_load_delta_set_index_mapping( TT_Face face, + tt_var_load_delta_set_index_mapping( FT_Face face, FT_ULong offset, GX_DeltaSetIdxMap map, GX_ItemVarStore itemStore, FT_ULong table_len ); FT_LOCAL( FT_ItemVarDelta ) - tt_var_get_item_delta( TT_Face face, + tt_var_get_item_delta( FT_Face face, GX_ItemVarStore itemStore, FT_UInt outerIndex, FT_UInt innerIndex ); FT_LOCAL( void ) - tt_var_done_item_variation_store( TT_Face face, + tt_var_done_item_variation_store( FT_Face face, GX_ItemVarStore itemStore ); FT_LOCAL( void ) - tt_var_done_delta_set_index_map( TT_Face face, + tt_var_done_delta_set_index_map( FT_Face face, GX_DeltaSetIdxMap deltaSetIdxMap ); FT_LOCAL( FT_Error ) - tt_get_var_blend( TT_Face face, + tt_get_var_blend( FT_Face face, FT_UInt *num_coords, FT_Fixed* *coords, FT_Fixed* *normalizedcoords, FT_MM_Var* *mm_var ); FT_LOCAL( void ) - tt_done_blend( TT_Face face ); + tt_done_blend( FT_Face face ); #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ diff --git a/src/3rdparty/freetype/src/truetype/ttinterp.c b/src/3rdparty/freetype/src/truetype/ttinterp.c index 4fcfaa3e..79df4555 100644 --- a/src/3rdparty/freetype/src/truetype/ttinterp.c +++ b/src/3rdparty/freetype/src/truetype/ttinterp.c @@ -29,7 +29,6 @@ #include "ttinterp.h" #include "tterrors.h" -#include "ttsubpix.h" #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #include "ttgxvar.h" #endif @@ -52,12 +51,6 @@ ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ TT_INTERPRETER_VERSION_35 ) -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY -#define SUBPIXEL_HINTING_INFINALITY \ - ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ - TT_INTERPRETER_VERSION_38 ) -#endif - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL #define SUBPIXEL_HINTING_MINIMAL \ ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ @@ -275,57 +268,6 @@ } - /************************************************************************** - * - * @Function: - * Update_Max - * - * @Description: - * Checks the size of a buffer and reallocates it if necessary. - * - * @Input: - * memory :: - * A handle to the parent memory object. - * - * multiplier :: - * The size in bytes of each element in the buffer. - * - * new_max :: - * The new capacity (size) of the buffer. - * - * @InOut: - * size :: - * The address of the buffer's current size expressed - * in elements. - * - * buff :: - * The address of the buffer base pointer. - * - * @Return: - * FreeType error code. 0 means success. - */ - FT_LOCAL_DEF( FT_Error ) - Update_Max( FT_Memory memory, - FT_ULong* size, - FT_ULong multiplier, - void* _pbuff, - FT_ULong new_max ) - { - FT_Error error; - void** pbuff = (void**)_pbuff; - - - if ( *size < new_max ) - { - if ( FT_QREALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) - return error; - *size = new_max; - } - - return FT_Err_Ok; - } - - /************************************************************************** * * @Function: @@ -359,9 +301,9 @@ TT_Size size ) { FT_Int i; - FT_ULong tmp; TT_MaxProfile* maxp; FT_Error error; + FT_Memory memory = exec->memory; exec->face = face; @@ -406,25 +348,15 @@ /* XXX: We reserve a little more elements on the stack to deal safely */ /* with broken fonts like arialbs, courbs, timesbs, etc. */ - tmp = (FT_ULong)exec->stackSize; - error = Update_Max( exec->memory, - &tmp, - sizeof ( FT_F26Dot6 ), - (void*)&exec->stack, - maxp->maxStackElements + 32 ); - exec->stackSize = (FT_Long)tmp; - if ( error ) + if ( FT_QRENEW_ARRAY( exec->stack, + exec->stackSize, + maxp->maxStackElements + 32 ) ) return error; + exec->stackSize = maxp->maxStackElements + 32; - tmp = (FT_ULong)exec->glyphSize; - error = Update_Max( exec->memory, - &tmp, - sizeof ( FT_Byte ), - (void*)&exec->glyphIns, - maxp->maxSizeOfInstructions ); - exec->glyphSize = (FT_UInt)tmp; - if ( error ) - return error; + /* free previous glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; exec->pts.n_points = 0; exec->pts.n_contours = 0; @@ -1530,14 +1462,16 @@ if ( exc->iniRange == tt_coderange_glyph && exc->cvt != exc->glyfCvt ) { - exc->error = Update_Max( exc->memory, - &exc->glyfCvtSize, - sizeof ( FT_Long ), - (void*)&exc->glyfCvt, - exc->cvtSize ); - if ( exc->error ) + FT_Memory memory = exc->memory; + FT_Error error; + + + FT_MEM_QRENEW_ARRAY( exc->glyfCvt, exc->glyfCvtSize, exc->cvtSize ); + exc->error = error; + if ( error ) return; + exc->glyfCvtSize = exc->cvtSize; FT_ARRAY_COPY( exc->glyfCvt, exc->cvt, exc->glyfCvtSize ); exc->cvt = exc->glyfCvt; } @@ -1744,17 +1678,6 @@ if ( v != 0 ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - ( !exc->ignore_x_mode || - ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) ) - zone->cur[point].x = ADD_LONG( zone->cur[point].x, - FT_MulDiv( distance, - v, - exc->F_dot_P ) ); - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* Exception to the post-IUP curfew: Allow the x component of */ /* diagonal moves, but only post-IUP. DejaVu tries to adjust */ @@ -1860,12 +1783,6 @@ FT_UShort point, FT_F26Dot6 distance ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode ) - zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); @@ -3069,28 +2986,7 @@ args[0] = 0; } else - { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* subpixel hinting - avoid Typeman Dstroke and */ - /* IStroke and Vacuform rounds */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( ( I == 24 && - ( exc->face->sph_found_func_flags & - ( SPH_FDEF_SPACING_1 | - SPH_FDEF_SPACING_2 ) ) ) || - ( I == 22 && - ( exc->sph_in_func_flags & - SPH_FDEF_TYPEMAN_STROKES ) ) || - ( I == 8 && - ( exc->face->sph_found_func_flags & - SPH_FDEF_VACUFORM_ROUND_1 ) && - exc->iup_called ) ) ) - args[0] = 0; - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - args[0] = exc->storage[I]; - } + args[0] = exc->storage[I]; } @@ -3117,18 +3013,18 @@ if ( exc->iniRange == tt_coderange_glyph && exc->storage != exc->glyfStorage ) { - FT_ULong tmp = (FT_ULong)exc->glyfStoreSize; + FT_Memory memory = exc->memory; + FT_Error error; - exc->error = Update_Max( exc->memory, - &tmp, - sizeof ( FT_Long ), - (void*)&exc->glyfStorage, - exc->storeSize ); - exc->glyfStoreSize = (FT_UShort)tmp; - if ( exc->error ) + FT_MEM_QRENEW_ARRAY( exc->glyfStorage, + exc->glyfStoreSize, + exc->storeSize ); + exc->error = error; + if ( error ) return; + exc->glyfStoreSize = exc->storeSize; FT_ARRAY_COPY( exc->glyfStorage, exc->storage, exc->glyfStoreSize ); exc->storage = exc->glyfStorage; } @@ -3604,106 +3500,6 @@ TT_DefRecord* rec; TT_DefRecord* limit; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* arguments to opcodes are skipped by `SKIP_Code' */ - FT_Byte opcode_pattern[9][12] = { - /* #0 inline delta function 1 */ - { - 0x4B, /* PPEM */ - 0x53, /* GTEQ */ - 0x23, /* SWAP */ - 0x4B, /* PPEM */ - 0x51, /* LTEQ */ - 0x5A, /* AND */ - 0x58, /* IF */ - 0x38, /* SHPIX */ - 0x1B, /* ELSE */ - 0x21, /* POP */ - 0x21, /* POP */ - 0x59 /* EIF */ - }, - /* #1 inline delta function 2 */ - { - 0x4B, /* PPEM */ - 0x54, /* EQ */ - 0x58, /* IF */ - 0x38, /* SHPIX */ - 0x1B, /* ELSE */ - 0x21, /* POP */ - 0x21, /* POP */ - 0x59 /* EIF */ - }, - /* #2 diagonal stroke function */ - { - 0x20, /* DUP */ - 0x20, /* DUP */ - 0xB0, /* PUSHB_1 */ - /* 1 */ - 0x60, /* ADD */ - 0x46, /* GC_cur */ - 0xB0, /* PUSHB_1 */ - /* 64 */ - 0x23, /* SWAP */ - 0x42 /* WS */ - }, - /* #3 VacuFormRound function */ - { - 0x45, /* RCVT */ - 0x23, /* SWAP */ - 0x46, /* GC_cur */ - 0x60, /* ADD */ - 0x20, /* DUP */ - 0xB0 /* PUSHB_1 */ - /* 38 */ - }, - /* #4 TTFautohint bytecode (old) */ - { - 0x20, /* DUP */ - 0x64, /* ABS */ - 0xB0, /* PUSHB_1 */ - /* 32 */ - 0x60, /* ADD */ - 0x66, /* FLOOR */ - 0x23, /* SWAP */ - 0xB0 /* PUSHB_1 */ - }, - /* #5 spacing function 1 */ - { - 0x01, /* SVTCA_x */ - 0xB0, /* PUSHB_1 */ - /* 24 */ - 0x43, /* RS */ - 0x58 /* IF */ - }, - /* #6 spacing function 2 */ - { - 0x01, /* SVTCA_x */ - 0x18, /* RTG */ - 0xB0, /* PUSHB_1 */ - /* 24 */ - 0x43, /* RS */ - 0x58 /* IF */ - }, - /* #7 TypeMan Talk DiagEndCtrl function */ - { - 0x01, /* SVTCA_x */ - 0x20, /* DUP */ - 0xB0, /* PUSHB_1 */ - /* 3 */ - 0x25, /* CINDEX */ - }, - /* #8 TypeMan Talk Align */ - { - 0x06, /* SPVTL */ - 0x7D, /* RDTG */ - }, - }; - FT_UShort opcode_patterns = 9; - FT_UShort opcode_pointer[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - FT_UShort opcode_size[9] = { 12, 8, 8, 6, 7, 4, 5, 4, 2 }; - FT_UShort i; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* FDEF is only allowed in `prep' or `fpgm' */ if ( exc->iniRange == tt_coderange_glyph ) @@ -3748,136 +3544,15 @@ rec->opc = (FT_UInt16)n; rec->start = exc->IP + 1; rec->active = TRUE; - rec->inline_delta = FALSE; - rec->sph_fdef_flags = 0x0000; if ( n > exc->maxFunc ) exc->maxFunc = (FT_UInt16)n; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* We don't know for sure these are typeman functions, */ - /* however they are only active when RS 22 is called */ - if ( n >= 64 && n <= 66 ) - rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES; -#endif - /* Now skip the whole function definition. */ /* We don't allow nested IDEFS & FDEFs. */ while ( SkipCode( exc ) == SUCCESS ) { - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY ) - { - for ( i = 0; i < opcode_patterns; i++ ) - { - if ( opcode_pointer[i] < opcode_size[i] && - exc->opcode == opcode_pattern[i][opcode_pointer[i]] ) - { - opcode_pointer[i] += 1; - - if ( opcode_pointer[i] == opcode_size[i] ) - { - FT_TRACE6(( "sph: Function %d, opcode ptrn: %ld, %s %s\n", - i, n, - exc->face->root.family_name, - exc->face->root.style_name )); - - switch ( i ) - { - case 0: - rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_1; - exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1; - break; - - case 1: - rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_2; - exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2; - break; - - case 2: - switch ( n ) - { - /* needs to be implemented still */ - case 58: - rec->sph_fdef_flags |= SPH_FDEF_DIAGONAL_STROKE; - exc->face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE; - } - break; - - case 3: - switch ( n ) - { - case 0: - rec->sph_fdef_flags |= SPH_FDEF_VACUFORM_ROUND_1; - exc->face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1; - } - break; - - case 4: - /* probably not necessary to detect anymore */ - rec->sph_fdef_flags |= SPH_FDEF_TTFAUTOHINT_1; - exc->face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1; - break; - - case 5: - switch ( n ) - { - case 0: - case 1: - case 2: - case 4: - case 7: - case 8: - rec->sph_fdef_flags |= SPH_FDEF_SPACING_1; - exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_1; - } - break; - - case 6: - switch ( n ) - { - case 0: - case 1: - case 2: - case 4: - case 7: - case 8: - rec->sph_fdef_flags |= SPH_FDEF_SPACING_2; - exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_2; - } - break; - - case 7: - rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; - exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; - break; - - case 8: -#if 0 - rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; - exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; -#endif - break; - } - opcode_pointer[i] = 0; - } - } - - else - opcode_pointer[i] = 0; - } - - /* Set sph_compatibility_mode only when deltas are detected */ - exc->face->sph_compatibility_mode = - ( ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) | - ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ); - } - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - switch ( exc->opcode ) { case 0x89: /* IDEF */ @@ -3905,10 +3580,6 @@ TT_CallRec* pRec; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - exc->sph_in_func_flags = 0x0000; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( exc->callTop <= 0 ) /* We encountered an ENDF without a call */ { exc->error = FT_THROW( ENDF_In_Exec_Stream ); @@ -3996,17 +3667,6 @@ if ( !def->active ) goto Fail; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( ( exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) || - ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) ) - goto Fail; - else - exc->sph_in_func_flags = def->sph_fdef_flags; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* check the call stack */ if ( exc->callTop >= exc->callSize ) { @@ -4084,15 +3744,6 @@ if ( !def->active ) goto Fail; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) - goto Fail; - else - exc->sph_in_func_flags = def->sph_fdef_flags; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* check stack */ if ( exc->callTop >= exc->callSize ) { @@ -4998,14 +4649,6 @@ } } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( D < 0 ? NEG_LONG( D ) : D ) == 64 ) - D += 1; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - args[0] = D; } @@ -5267,13 +4910,6 @@ /* except to change the subpixel flags temporarily */ else if ( exc->iniRange == tt_coderange_glyph && K == 3 ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* INSTCTRL modifying flag 3 also has an effect */ - /* outside of the CVT program */ - if ( SUBPIXEL_HINTING_INFINALITY ) - exc->ignore_x_mode = !FT_BOOL( L == 4 ); -#endif - #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL /* Native ClearType fonts sign a waiver that turns off all backward */ /* compatibility hacks and lets them program points to the grid like */ @@ -5605,12 +5241,6 @@ } } else -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* doesn't follow Cleartype spec but produces better result */ - if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode ) - Move_Zp2_Point( exc, point, 0, dy, TRUE ); - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ Move_Zp2_Point( exc, point, dx, dy, TRUE ); exc->GS.loop--; @@ -5771,76 +5401,6 @@ } } else -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode ) - { - FT_Int B1, B2; - - - /* If not using ignore_x_mode rendering, allow ZP2 move. */ - /* If inline deltas aren't allowed, skip ZP2 move. */ - /* If using ignore_x_mode rendering, allow ZP2 point move if: */ - /* - freedom vector is y and sph_compatibility_mode is off */ - /* - the glyph is composite and the move is in the Y direction */ - /* - the glyph is specifically set to allow SHPIX moves */ - /* - the move is on a previously Y-touched point */ - - /* save point for later comparison */ - B1 = exc->zp2.cur[point].y; - - if ( exc->face->sph_compatibility_mode ) - { - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - dy = FT_PIX_ROUND( B1 + dy ) - B1; - - /* skip post-iup deltas */ - if ( exc->iup_called && - ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) || - ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) ) - goto Skip; - - if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) && - ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || - ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) || - ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) ) - Move_Zp2_Point( exc, point, 0, dy, TRUE ); - - /* save new point */ - if ( exc->GS.freeVector.y != 0 ) - { - B2 = exc->zp2.cur[point].y; - - /* reverse any disallowed moves */ - if ( ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 && - B1 != B2 ) - Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE ); - } - } - else if ( exc->GS.freeVector.y != 0 ) - { - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - - /* save new point */ - B2 = exc->zp2.cur[point].y; - - /* reverse any disallowed moves */ - if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 && - B1 != B2 ) - Move_Zp2_Point( exc, - point, - NEG_LONG( dx ), - NEG_LONG( dy ), - TRUE ); - } - else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) - Move_Zp2_Point( exc, point, dx, dy, TRUE ); - } - else -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( SUBPIXEL_HINTING_MINIMAL && exc->backward_compatibility ) @@ -5860,9 +5420,6 @@ #endif Move_Zp2_Point( exc, point, dx, dy, TRUE ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - Skip: -#endif exc->GS.loop--; } @@ -5907,28 +5464,6 @@ distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* subpixel hinting - make MSIRP respect CVT cut-in; */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - { - FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; - FT_F26Dot6 delta; - - - if ( !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; - - delta = SUB_LONG( distance, args[1] ); - if ( delta < 0 ) - delta = NEG_LONG( delta ); - - if ( delta >= control_value_cutin ) - distance = args[1]; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - exc->func_move( exc, &exc->zp1, point, @@ -5969,14 +5504,7 @@ if ( ( exc->opcode & 1 ) != 0 ) { cur_dist = FAST_PROJECT( &exc->zp0.cur[point] ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = SUB_LONG( Round_None( exc, cur_dist, 3 ), cur_dist ); - else -#endif - distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist ); + distance = SUB_LONG( exc->func_round( exc, cur_dist, 3 ), cur_dist ); } else distance = 0; @@ -6039,27 +5567,12 @@ if ( exc->GS.gep0 == 0 ) /* If in twilight zone */ { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */ - /* Determined via experimentation and may be incorrect... */ - if ( !( SUBPIXEL_HINTING_INFINALITY && - ( exc->ignore_x_mode && - exc->face->sph_compatibility_mode ) ) ) -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - exc->zp0.org[point].x = TT_MulFix14( distance, + exc->zp0.org[point].x = TT_MulFix14( distance, exc->GS.freeVector.x ); exc->zp0.org[point].y = TT_MulFix14( distance, exc->GS.freeVector.y ); exc->zp0.cur[point] = exc->zp0.org[point]; } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - ( exc->sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) && - distance > 0 && - exc->GS.freeVector.y != 0 ) - distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ org_dist = FAST_PROJECT( &exc->zp0.cur[point] ); @@ -6069,15 +5582,6 @@ FT_F26Dot6 delta; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - exc->GS.freeVector.y == 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - delta = SUB_LONG( distance, org_dist ); if ( delta < 0 ) delta = NEG_LONG( delta ); @@ -6085,14 +5589,7 @@ if ( delta > control_value_cutin ) distance = org_dist; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( exc, distance, 3 ); - else -#endif - distance = exc->func_round( exc, distance, 3 ); + distance = exc->func_round( exc, distance, 3 ); } exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) ); @@ -6185,14 +5682,7 @@ if ( ( exc->opcode & 4 ) != 0 ) { -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 ) - distance = Round_None( exc, org_dist, exc->opcode & 3 ); - else -#endif - distance = exc->func_round( exc, org_dist, exc->opcode & 3 ); + distance = exc->func_round( exc, org_dist, exc->opcode & 3 ); } else distance = Round_None( exc, org_dist, exc->opcode & 3 ); @@ -6204,14 +5694,6 @@ FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - minimum_distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( org_dist >= 0 ) { if ( distance < minimum_distance ) @@ -6354,41 +5836,7 @@ distance = exc->func_round( exc, cvt_dist, exc->opcode & 3 ); } else - { - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /* do cvt cut-in always in MIRP for sph */ - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.gep0 == exc->GS.gep1 ) - { - FT_F26Dot6 control_value_cutin = exc->GS.control_value_cutin; - - - if ( exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - control_value_cutin = 0; - - if ( exc->GS.freeVector.y != 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) ) - { - if ( cur_dist < -64 ) - cvt_dist -= 16; - else if ( cur_dist > 64 && cur_dist < 84 ) - cvt_dist += 32; - } - - delta = SUB_LONG( cvt_dist, org_dist ); - if ( delta < 0 ) - delta = NEG_LONG( delta ); - - if ( delta > control_value_cutin ) - cvt_dist = org_dist; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - distance = Round_None( exc, cvt_dist, exc->opcode & 3 ); - } /* minimum distance test */ @@ -6397,14 +5845,6 @@ FT_F26Dot6 minimum_distance = exc->GS.minimum_distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.x != 0 && - !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) - minimum_distance = 0; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( org_dist >= 0 ) { if ( distance < minimum_distance ) @@ -6417,51 +5857,10 @@ } } -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->GS.freeVector.y != 0 ) - { - FT_Int B1, B2; - - - B1 = exc->zp1.cur[point].y; - - /* Round moves if necessary */ - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist; - - if ( ( exc->opcode & 16 ) == 0 && - ( exc->opcode & 8 ) == 0 && - ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) ) - distance += 64; - - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( distance, cur_dist ) ); - - B2 = exc->zp1.cur[point].y; - - /* Reverse move if necessary */ - if ( ( exc->face->sph_compatibility_mode && - ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 ) || - ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 ) ) - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( cur_dist, distance ) ); - } - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - exc->func_move( exc, - &exc->zp1, - point, - SUB_LONG( distance, cur_dist ) ); + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( distance, cur_dist ) ); Fail: exc->GS.rp1 = exc->GS.rp0; @@ -6486,17 +5885,6 @@ FT_F26Dot6 distance; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) ) - { - exc->error = FT_THROW( Invalid_Reference ); - goto Fail; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( exc->top < exc->GS.loop || BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) { @@ -7055,16 +6443,6 @@ contour = 0; point = 0; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode ) - { - exc->iup_called = TRUE; - if ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_IUP ) - return; - } -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - do { end_point = exc->pts.contours[contour] - exc->pts.first_point; @@ -7137,14 +6515,6 @@ FT_Long B; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - if ( SUBPIXEL_HINTING_INFINALITY && - exc->ignore_x_mode && - exc->iup_called && - ( exc->sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) ) - goto Fail; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - P = (FT_ULong)exc->func_cur_ppem( exc ); nump = (FT_ULong)args[0]; /* some points theoretically may occur more than once, thus UShort isn't enough */ @@ -7197,87 +6567,21 @@ B++; B *= 1L << ( 6 - exc->GS.delta_shift ); -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY ) - { - /* - * Allow delta move if - * - * - not using ignore_x_mode rendering, - * - glyph is specifically set to allow it, or - * - glyph is composite and freedom vector is not in subpixel - * direction. - */ - if ( !exc->ignore_x_mode || - ( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) || - ( exc->is_composite && exc->GS.freeVector.y != 0 ) ) - exc->func_move( exc, &exc->zp0, A, B ); - - /* Otherwise, apply subpixel hinting and compatibility mode */ - /* rules, always skipping deltas in subpixel direction. */ - else if ( exc->ignore_x_mode && exc->GS.freeVector.y != 0 ) - { - FT_UShort B1, B2; - - - /* save the y value of the point now; compare after move */ - B1 = (FT_UShort)exc->zp0.cur[A].y; - - /* Standard subpixel hinting: Allow y move for y-touched */ - /* points. This messes up DejaVu ... */ - if ( !exc->face->sph_compatibility_mode && - ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) - exc->func_move( exc, &exc->zp0, A, B ); - - /* compatibility mode */ - else if ( exc->face->sph_compatibility_mode && - !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) ) - { - if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) - B = FT_PIX_ROUND( B1 + B ) - B1; - - /* Allow delta move if using sph_compatibility_mode, */ - /* IUP has not been called, and point is touched on Y. */ - if ( !exc->iup_called && - ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) - exc->func_move( exc, &exc->zp0, A, B ); - } - - B2 = (FT_UShort)exc->zp0.cur[A].y; - - /* Reverse this move if it results in a disallowed move */ - if ( exc->GS.freeVector.y != 0 && - ( ( exc->face->sph_compatibility_mode && - ( B1 & 63 ) == 0 && - ( B2 & 63 ) != 0 ) || - ( ( exc->sph_tweak_flags & - SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) && - ( B1 & 63 ) != 0 && - ( B2 & 63 ) != 0 ) ) ) - exc->func_move( exc, &exc->zp0, A, NEG_LONG( B ) ); - } - } - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - { #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backward compatibility */ - /* mode. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backward_compatibility ) - { - if ( !( exc->iupx_called && exc->iupy_called ) && - ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || - ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) ) - exc->func_move( exc, &exc->zp0, A, B ); - } - else -#endif + /* See `ttinterp.h' for details on backward compatibility */ + /* mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + if ( !( exc->iupx_called && exc->iupy_called ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) ) exc->func_move( exc, &exc->zp0, A, B ); } + else +#endif + exc->func_move( exc, &exc->zp0, A, B ); } } else @@ -7380,14 +6684,6 @@ * GETINFO[]: GET INFOrmation * Opcode range: 0x88 * Stack: uint32 --> uint32 - * - * XXX: UNDOCUMENTED: Selector bits higher than 9 are currently (May - * 2015) not documented in the OpenType specification. - * - * Selector bit 11 is incorrectly described as bit 8, while the - * real meaning of bit 8 (vertical LCD subpixels) stays - * undocumented. The same mistake can be found in Greg Hitchcock's - * whitepaper. */ static void Ins_GETINFO( TT_ExecContext exc, @@ -7399,31 +6695,8 @@ K = 0; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - /********************************* - * RASTERIZER VERSION - * Selector Bit: 0 - * Return Bit(s): 0-7 - */ - if ( SUBPIXEL_HINTING_INFINALITY && - ( args[0] & 1 ) != 0 && - exc->subpixel_hinting ) - { - if ( exc->ignore_x_mode ) - { - /* if in ClearType backward compatibility mode, */ - /* we sometimes change the TrueType version dynamically */ - K = exc->rasterizer_version; - FT_TRACE6(( "Setting rasterizer version %d\n", - exc->rasterizer_version )); - } - else - K = TT_INTERPRETER_VERSION_38; - } - else -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - if ( ( args[0] & 1 ) != 0 ) - K = driver->interpreter_version; + if ( ( args[0] & 1 ) != 0 ) + K = driver->interpreter_version; /********************************* * GLYPH ROTATED @@ -7446,8 +6719,6 @@ * VARIATION GLYPH * Selector Bit: 3 * Return Bit(s): 10 - * - * XXX: UNDOCUMENTED! */ if ( (args[0] & 8 ) != 0 && exc->face->blend ) K |= 1 << 10; @@ -7522,89 +6793,6 @@ } #endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY && - exc->rasterizer_version >= TT_INTERPRETER_VERSION_35 ) - { - - if ( exc->rasterizer_version >= 37 ) - { - /********************************* - * HINTING FOR SUBPIXEL - * Selector Bit: 6 - * Return Bit(s): 13 - */ - if ( ( args[0] & 64 ) != 0 && exc->subpixel_hinting ) - K |= 1 << 13; - - /********************************* - * COMPATIBLE WIDTHS ENABLED - * Selector Bit: 7 - * Return Bit(s): 14 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 128 ) != 0 && exc->compatible_widths ) - K |= 1 << 14; - - /********************************* - * VERTICAL LCD SUBPIXELS? - * Selector Bit: 8 - * Return Bit(s): 15 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd ) - K |= 1 << 15; - - /********************************* - * HINTING FOR BGR? - * Selector Bit: 9 - * Return Bit(s): 16 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 512 ) != 0 && exc->bgr ) - K |= 1 << 16; - - if ( exc->rasterizer_version >= 38 ) - { - /********************************* - * SUBPIXEL POSITIONED? - * Selector Bit: 10 - * Return Bit(s): 17 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 1024 ) != 0 && exc->subpixel_positioned ) - K |= 1 << 17; - - /********************************* - * SYMMETRICAL SMOOTHING - * Selector Bit: 11 - * Return Bit(s): 18 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 2048 ) != 0 && exc->symmetrical_smoothing ) - K |= 1 << 18; - - /********************************* - * GRAY CLEARTYPE - * Selector Bit: 12 - * Return Bit(s): 19 - * - * Functionality still needs to be added - */ - if ( ( args[0] & 4096 ) != 0 && exc->gray_cleartype ) - K |= 1 << 19; - } - } - } - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - args[0] = K; } @@ -7739,25 +6927,14 @@ /* documentation is in ttinterp.h */ FT_EXPORT_DEF( FT_Error ) - TT_RunIns( TT_ExecContext exc ) + TT_RunIns( void* exec ) { + TT_ExecContext exc = (TT_ExecContext)exec; + FT_ULong ins_counter = 0; /* executed instructions counter */ FT_ULong num_twilight_points; FT_UShort i; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - FT_Byte opcode_pattern[1][2] = { - /* #8 TypeMan Talk Align */ - { - 0x06, /* SPVTL */ - 0x7D, /* RDTG */ - }, - }; - FT_UShort opcode_patterns = 1; - FT_UShort opcode_pointer[1] = { 0 }; - FT_UShort opcode_size[1] = { 1 }; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* We restrict the number of twilight points to a reasonable, */ /* heuristic value to avoid slow execution of malformed bytecode. */ @@ -7835,9 +7012,6 @@ Compute_Round( exc, (FT_Byte)exc->GS.round_state ); /* These flags cancel execution of some opcodes after IUP is called */ -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - exc->iup_called = FALSE; -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL exc->iupx_called = FALSE; exc->iupy_called = FALSE; @@ -7906,7 +7080,7 @@ /* a variable number of arguments */ /* it is the job of the application to `activate' GX handling, */ - /* this is, calling any of the GX API functions on the current */ + /* that is, calling any of the GX API functions on the current */ /* font to select a variation instance */ if ( exc->face->blend ) exc->new_top = exc->args + exc->face->blend->num_axis; @@ -7927,39 +7101,6 @@ exc->step_ins = TRUE; exc->error = FT_Err_Ok; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - if ( SUBPIXEL_HINTING_INFINALITY ) - { - for ( i = 0; i < opcode_patterns; i++ ) - { - if ( opcode_pointer[i] < opcode_size[i] && - exc->opcode == opcode_pattern[i][opcode_pointer[i]] ) - { - opcode_pointer[i] += 1; - - if ( opcode_pointer[i] == opcode_size[i] ) - { - FT_TRACE6(( "sph: opcode ptrn: %d, %s %s\n", - i, - exc->face->root.family_name, - exc->face->root.style_name )); - - switch ( i ) - { - case 0: - break; - } - opcode_pointer[i] = 0; - } - } - else - opcode_pointer[i] = 0; - } - } - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - { FT_Long* args = exc->stack + exc->args; FT_Byte opcode = exc->opcode; @@ -8466,7 +7607,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT case 0x91: /* it is the job of the application to `activate' GX handling, */ - /* this is, calling any of the GX API functions on the current */ + /* that is, calling any of the GX API functions on the current */ /* font to select a variation instance */ if ( exc->face->blend ) Ins_GETVARIATION( exc, args ); @@ -8604,7 +7745,7 @@ #else /* !TT_USE_BYTECODE_INTERPRETER */ /* ANSI C doesn't like empty source files */ - typedef int _tt_interp_dummy; + typedef int tt_interp_dummy_; #endif /* !TT_USE_BYTECODE_INTERPRETER */ diff --git a/src/3rdparty/freetype/src/truetype/ttinterp.h b/src/3rdparty/freetype/src/truetype/ttinterp.h index c54c053b..e98e258f 100644 --- a/src/3rdparty/freetype/src/truetype/ttinterp.h +++ b/src/3rdparty/freetype/src/truetype/ttinterp.h @@ -98,48 +98,6 @@ FT_BEGIN_HEADER } TT_CallRec, *TT_CallStack; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - /************************************************************************** - * - * These structures define rules used to tweak subpixel hinting for - * various fonts. "", 0, "", NULL value indicates to match any value. - */ - -#define SPH_MAX_NAME_SIZE 32 -#define SPH_MAX_CLASS_MEMBERS 100 - - typedef struct SPH_TweakRule_ - { - const char family[SPH_MAX_NAME_SIZE]; - const FT_UInt ppem; - const char style[SPH_MAX_NAME_SIZE]; - const FT_ULong glyph; - - } SPH_TweakRule; - - - typedef struct SPH_ScaleRule_ - { - const char family[SPH_MAX_NAME_SIZE]; - const FT_UInt ppem; - const char style[SPH_MAX_NAME_SIZE]; - const FT_ULong glyph; - const FT_ULong scale; - - } SPH_ScaleRule; - - - typedef struct SPH_Font_Class_ - { - const char name[SPH_MAX_NAME_SIZE]; - const char member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE]; - - } SPH_Font_Class; - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - /************************************************************************** * * The main structure for the interpreter which collects all necessary @@ -399,38 +357,6 @@ FT_BEGIN_HEADER FT_Bool grayscale_cleartype; #endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - TT_Round_Func func_round_sphn; /* subpixel rounding function */ - - FT_Bool subpixel_hinting; /* Using subpixel hinting? */ - FT_Bool ignore_x_mode; /* Standard rendering mode for */ - /* subpixel hinting. On if gray */ - /* or subpixel hinting is on. */ - - /* The following 6 aren't fully implemented but here for MS rasterizer */ - /* compatibility. */ - FT_Bool compatible_widths; /* compatible widths? */ - FT_Bool symmetrical_smoothing; /* symmetrical_smoothing? */ - FT_Bool bgr; /* bgr instead of rgb? */ - FT_Bool vertical_lcd; /* long side of LCD subpixel */ - /* rectangles is horizontal */ - FT_Bool subpixel_positioned; /* subpixel positioned */ - /* (DirectWrite ClearType)? */ - FT_Bool gray_cleartype; /* ClearType hinting but */ - /* grayscale rendering */ - - FT_Int rasterizer_version; /* MS rasterizer version */ - - FT_Bool iup_called; /* IUP called for glyph? */ - - FT_ULong sph_tweak_flags; /* flags to control */ - /* hint tweaks */ - - FT_ULong sph_in_func_flags; /* flags to indicate if in */ - /* special functions */ - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - /* We maintain two counters (in addition to the instruction counter) */ /* that act as loop detectors for LOOPCALL and jump opcodes with */ /* negative arguments. */ @@ -460,14 +386,6 @@ FT_BEGIN_HEADER FT_LOCAL( void ) TT_Clear_CodeRange( TT_ExecContext exec, FT_Int range ); - - - FT_LOCAL( FT_Error ) - Update_Max( FT_Memory memory, - FT_ULong* size, - FT_ULong multiplier, - void* _pbuff, - FT_ULong new_max ); #endif /* TT_USE_BYTECODE_INTERPRETER */ @@ -536,7 +454,7 @@ FT_BEGIN_HEADER * invoked by the TrueType debugger. */ FT_EXPORT( FT_Error ) - TT_RunIns( TT_ExecContext exec ); + TT_RunIns( void* exec ); FT_END_HEADER diff --git a/src/3rdparty/freetype/src/truetype/ttobjs.c b/src/3rdparty/freetype/src/truetype/ttobjs.c index 4a8873fd..5b56af71 100644 --- a/src/3rdparty/freetype/src/truetype/ttobjs.c +++ b/src/3rdparty/freetype/src/truetype/ttobjs.c @@ -312,7 +312,8 @@ #define TRICK_SFNT_IDS_NUM_FACES 31 static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] - [TRICK_SFNT_IDS_PER_FACE] = { + [TRICK_SFNT_IDS_PER_FACE] = + { #define TRICK_SFNT_ID_cvt 0 #define TRICK_SFNT_ID_fpgm 1 @@ -581,7 +582,7 @@ FT_Bool result = FALSE; TT_Face face = (TT_Face)ttface; - FT_UInt asize; + FT_ULong asize; FT_ULong i; FT_ULong glyph_index = 0; FT_UInt count = 0; @@ -589,7 +590,7 @@ for( i = 0; i < face->num_locations; i++ ) { - tt_face_get_location( face, i, &asize ); + tt_face_get_location( ttface, i, &asize ); if ( asize > 0 ) { count += 1; @@ -777,7 +778,6 @@ } #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - { FT_UInt instance_index = (FT_UInt)face_index >> 16; @@ -785,14 +785,11 @@ if ( FT_HAS_MULTIPLE_MASTERS( ttface ) && instance_index > 0 ) { - error = TT_Set_Named_Instance( face, instance_index ); + error = FT_Set_Named_Instance( ttface, instance_index ); if ( error ) goto Exit; - - tt_apply_mvar( face ); } } - #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ /* initialize standard glyph loading routines */ @@ -858,7 +855,7 @@ face->cvt_program_size = 0; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - tt_done_blend( face ); + tt_done_blend( ttface ); face->blend = NULL; #endif } @@ -1338,39 +1335,29 @@ /************************************************************************** * * @Function: - * tt_size_reset + * tt_size_reset_height * * @Description: - * Reset a TrueType size when resolutions and character dimensions - * have been changed. + * Recompute a TrueType size's ascender, descender, and height + * when resolutions and character dimensions have been changed. + * Used for variation fonts as an iterator function. * * @Input: - * size :: - * A handle to the target size object. - * - * only_height :: - * Only recompute ascender, descender, and height; - * this flag is used for variation fonts where - * `tt_size_reset' is used as an iterator function. + * ft_size :: + * A handle to the target TT_Size object. This function will be called + * through a `FT_Size_Reset_Func` pointer which takes `FT_Size`. This + * function must take `FT_Size` as a result. The passed `FT_Size` is + * expected to point to a `TT_Size`. */ FT_LOCAL_DEF( FT_Error ) - tt_size_reset( TT_Size size, - FT_Bool only_height ) + tt_size_reset_height( FT_Size ft_size ) { - TT_Face face; - FT_Size_Metrics* size_metrics; - - - face = (TT_Face)size->root.face; - - /* nothing to do for CFF2 */ - if ( face->is_cff2 ) - return FT_Err_Ok; + TT_Size size = (TT_Size)ft_size; + TT_Face face = (TT_Face)size->root.face; + FT_Size_Metrics* size_metrics = &size->hinted_metrics; size->ttmetrics.valid = FALSE; - size_metrics = &size->hinted_metrics; - /* copy the result from base layer */ *size_metrics = size->root.metrics; @@ -1397,12 +1384,34 @@ size->ttmetrics.valid = TRUE; - if ( only_height ) - { - /* we must not recompute the scaling values here since */ - /* `tt_size_reset' was already called (with only_height = 0) */ - return FT_Err_Ok; - } + return FT_Err_Ok; + } + + + /************************************************************************** + * + * @Function: + * tt_size_reset + * + * @Description: + * Reset a TrueType size when resolutions and character dimensions + * have been changed. + * + * @Input: + * size :: + * A handle to the target size object. + */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset( TT_Size size ) + { + FT_Error error; + TT_Face face = (TT_Face)size->root.face; + FT_Size_Metrics* size_metrics = &size->hinted_metrics; + + + error = tt_size_reset_height( (FT_Size)size ); + if ( error ) + return error; if ( face->header.Flags & 8 ) { @@ -1472,9 +1481,6 @@ TT_Driver driver = (TT_Driver)ttdriver; driver->interpreter_version = TT_INTERPRETER_VERSION_35; -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - driver->interpreter_version = TT_INTERPRETER_VERSION_38; -#endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL driver->interpreter_version = TT_INTERPRETER_VERSION_40; #endif diff --git a/src/3rdparty/freetype/src/truetype/ttobjs.h b/src/3rdparty/freetype/src/truetype/ttobjs.h index bc6fbe7f..40eb37b4 100644 --- a/src/3rdparty/freetype/src/truetype/ttobjs.h +++ b/src/3rdparty/freetype/src/truetype/ttobjs.h @@ -162,8 +162,6 @@ FT_BEGIN_HEADER FT_Long end; /* where does it end? */ FT_UInt opc; /* function #, or instruction code */ FT_Bool active; /* is it active? */ - FT_Bool inline_delta; /* is function that defines inline delta? */ - FT_ULong sph_fdef_flags; /* flags to identify special functions */ } TT_DefRecord, *TT_DefArray; @@ -391,8 +389,10 @@ FT_BEGIN_HEADER #endif /* TT_USE_BYTECODE_INTERPRETER */ FT_LOCAL( FT_Error ) - tt_size_reset( TT_Size size, - FT_Bool only_height ); + tt_size_reset_height( FT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_reset( TT_Size size ); /************************************************************************** diff --git a/src/3rdparty/freetype/src/truetype/ttpload.c b/src/3rdparty/freetype/src/truetype/ttpload.c index e08bf309..54a64c7b 100644 --- a/src/3rdparty/freetype/src/truetype/ttpload.c +++ b/src/3rdparty/freetype/src/truetype/ttpload.c @@ -180,10 +180,11 @@ FT_LOCAL_DEF( FT_ULong ) - tt_face_get_location( TT_Face face, - FT_UInt gindex, - FT_UInt *asize ) + tt_face_get_location( FT_Face face, /* TT_Face */ + FT_UInt gindex, + FT_ULong *asize ) { + TT_Face ttface = (TT_Face)face; FT_ULong pos1, pos2; FT_Byte* p; FT_Byte* p_limit; @@ -191,12 +192,12 @@ pos1 = pos2 = 0; - if ( gindex < face->num_locations ) + if ( gindex < ttface->num_locations ) { - if ( face->header.Index_To_Loc_Format != 0 ) + if ( ttface->header.Index_To_Loc_Format != 0 ) { - p = face->glyph_locations + gindex * 4; - p_limit = face->glyph_locations + face->num_locations * 4; + p = ttface->glyph_locations + gindex * 4; + p_limit = ttface->glyph_locations + ttface->num_locations * 4; pos1 = FT_NEXT_ULONG( p ); pos2 = pos1; @@ -206,8 +207,8 @@ } else { - p = face->glyph_locations + gindex * 2; - p_limit = face->glyph_locations + face->num_locations * 2; + p = ttface->glyph_locations + gindex * 2; + p_limit = ttface->glyph_locations + ttface->num_locations * 2; pos1 = FT_NEXT_USHORT( p ); pos2 = pos1; @@ -221,30 +222,30 @@ } /* Check broken location data. */ - if ( pos1 > face->glyf_len ) + if ( pos1 > ttface->glyf_len ) { FT_TRACE1(( "tt_face_get_location:" " too large offset (0x%08lx) found for glyph index %d,\n", pos1, gindex )); FT_TRACE1(( " " " exceeding the end of `glyf' table (0x%08lx)\n", - face->glyf_len )); + ttface->glyf_len )); *asize = 0; return 0; } - if ( pos2 > face->glyf_len ) + if ( pos2 > ttface->glyf_len ) { /* We try to sanitize the last `loca' entry. */ - if ( gindex == face->num_locations - 2 ) + if ( gindex == ttface->num_locations - 2 ) { FT_TRACE1(( "tt_face_get_location:" " too large size (%ld bytes) found for glyph index %d,\n", pos2 - pos1, gindex )); FT_TRACE1(( " " " truncating at the end of `glyf' table to %ld bytes\n", - face->glyf_len - pos1 )); - pos2 = face->glyf_len; + ttface->glyf_len - pos1 )); + pos2 = ttface->glyf_len; } else { @@ -253,7 +254,7 @@ pos2, gindex + 1 )); FT_TRACE1(( " " " exceeding the end of `glyf' table (0x%08lx)\n", - face->glyf_len )); + ttface->glyf_len )); *asize = 0; return 0; } @@ -268,9 +269,9 @@ /* We get (intentionally) a wrong, non-zero result in case the */ /* `glyf' table is missing. */ if ( pos2 >= pos1 ) - *asize = (FT_UInt)( pos2 - pos1 ); + *asize = (FT_ULong)( pos2 - pos1 ); else - *asize = (FT_UInt)( face->glyf_len - pos1 ); + *asize = (FT_ULong)( ttface->glyf_len - pos1 ); return pos1; } diff --git a/src/3rdparty/freetype/src/truetype/ttpload.h b/src/3rdparty/freetype/src/truetype/ttpload.h index 939e02fe..ed229fa4 100644 --- a/src/3rdparty/freetype/src/truetype/ttpload.h +++ b/src/3rdparty/freetype/src/truetype/ttpload.h @@ -31,9 +31,9 @@ FT_BEGIN_HEADER FT_Stream stream ); FT_LOCAL( FT_ULong ) - tt_face_get_location( TT_Face face, - FT_UInt gindex, - FT_UInt *asize ); + tt_face_get_location( FT_Face face, + FT_UInt gindex, + FT_ULong *asize ); FT_LOCAL( void ) tt_face_done_loca( TT_Face face ); diff --git a/src/3rdparty/freetype/src/truetype/ttsubpix.c b/src/3rdparty/freetype/src/truetype/ttsubpix.c deleted file mode 100644 index d811beef..00000000 --- a/src/3rdparty/freetype/src/truetype/ttsubpix.c +++ /dev/null @@ -1,1013 +0,0 @@ -/**************************************************************************** - * - * ttsubpix.c - * - * TrueType Subpixel Hinting. - * - * Copyright (C) 2010-2023 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "ttsubpix.h" - - -#if defined( TT_USE_BYTECODE_INTERPRETER ) && \ - defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY ) - - /************************************************************************** - * - * These rules affect how the TT Interpreter does hinting, with the - * goal of doing subpixel hinting by (in general) ignoring x moves. - * Some of these rules are fixes that go above and beyond the - * stated techniques in the MS whitepaper on Cleartype, due to - * artifacts in many glyphs. So, these rules make some glyphs render - * better than they do in the MS rasterizer. - * - * "" string or 0 int/char indicates to apply to all glyphs. - * "-" used as dummy placeholders, but any non-matching string works. - * - * Some of this could arguably be implemented in fontconfig, however: - * - * - Fontconfig can't set things on a glyph-by-glyph basis. - * - The tweaks that happen here are very low-level, from an average - * user's point of view and are best implemented in the hinter. - * - * The goal is to make the subpixel hinting techniques as generalized - * as possible across all fonts to prevent the need for extra rules such - * as these. - * - * The rule structure is designed so that entirely new rules can easily - * be added when a new compatibility feature is discovered. - * - * The rule structures could also use some enhancement to handle ranges. - * - * ****************** WORK IN PROGRESS ******************* - */ - - /* These are `classes' of fonts that can be grouped together and used in */ - /* rules below. A blank entry "" is required at the end of these! */ -#define FAMILY_CLASS_RULES_SIZE 7 - - static const SPH_Font_Class FAMILY_CLASS_Rules - [FAMILY_CLASS_RULES_SIZE] = - { - { "MS Legacy Fonts", - { "Aharoni", - "Andale Mono", - "Andalus", - "Angsana New", - "AngsanaUPC", - "Arabic Transparent", - "Arial Black", - "Arial Narrow", - "Arial Unicode MS", - "Arial", - "Batang", - "Browallia New", - "BrowalliaUPC", - "Comic Sans MS", - "Cordia New", - "CordiaUPC", - "Courier New", - "DFKai-SB", - "David Transparent", - "David", - "DilleniaUPC", - "Estrangelo Edessa", - "EucrosiaUPC", - "FangSong_GB2312", - "Fixed Miriam Transparent", - "FrankRuehl", - "Franklin Gothic Medium", - "FreesiaUPC", - "Garamond", - "Gautami", - "Georgia", - "Gulim", - "Impact", - "IrisUPC", - "JasmineUPC", - "KaiTi_GB2312", - "KodchiangUPC", - "Latha", - "Levenim MT", - "LilyUPC", - "Lucida Console", - "Lucida Sans Unicode", - "MS Gothic", - "MS Mincho", - "MV Boli", - "Mangal", - "Marlett", - "Microsoft Sans Serif", - "Mingliu", - "Miriam Fixed", - "Miriam Transparent", - "Miriam", - "Narkisim", - "Palatino Linotype", - "Raavi", - "Rod Transparent", - "Rod", - "Shruti", - "SimHei", - "Simplified Arabic Fixed", - "Simplified Arabic", - "Simsun", - "Sylfaen", - "Symbol", - "Tahoma", - "Times New Roman", - "Traditional Arabic", - "Trebuchet MS", - "Tunga", - "Verdana", - "Webdings", - "Wingdings", - "", - }, - }, - { "Core MS Legacy Fonts", - { "Arial Black", - "Arial Narrow", - "Arial Unicode MS", - "Arial", - "Comic Sans MS", - "Courier New", - "Garamond", - "Georgia", - "Impact", - "Lucida Console", - "Lucida Sans Unicode", - "Microsoft Sans Serif", - "Palatino Linotype", - "Tahoma", - "Times New Roman", - "Trebuchet MS", - "Verdana", - "", - }, - }, - { "Apple Legacy Fonts", - { "Geneva", - "Times", - "Monaco", - "Century", - "Chalkboard", - "Lobster", - "Century Gothic", - "Optima", - "Lucida Grande", - "Gill Sans", - "Baskerville", - "Helvetica", - "Helvetica Neue", - "", - }, - }, - { "Legacy Sans Fonts", - { "Andale Mono", - "Arial Unicode MS", - "Arial", - "Century Gothic", - "Comic Sans MS", - "Franklin Gothic Medium", - "Geneva", - "Lucida Console", - "Lucida Grande", - "Lucida Sans Unicode", - "Lucida Sans Typewriter", - "Microsoft Sans Serif", - "Monaco", - "Tahoma", - "Trebuchet MS", - "Verdana", - "", - }, - }, - - { "Misc Legacy Fonts", - { "Dark Courier", "", }, }, - { "Verdana Clones", - { "DejaVu Sans", - "Bitstream Vera Sans", "", }, }, - { "Verdana and Clones", - { "DejaVu Sans", - "Bitstream Vera Sans", - "Verdana", "", }, }, - }; - - - /* Define this to force natural (i.e. not bitmap-compatible) widths. */ - /* The default leans strongly towards natural widths except for a few */ - /* legacy fonts where a selective combination produces nicer results. */ -/* #define FORCE_NATURAL_WIDTHS */ - - - /* Define `classes' of styles that can be grouped together and used in */ - /* rules below. A blank entry "" is required at the end of these! */ -#define STYLE_CLASS_RULES_SIZE 5 - - static const SPH_Font_Class STYLE_CLASS_Rules - [STYLE_CLASS_RULES_SIZE] = - { - { "Regular Class", - { "Regular", - "Book", - "Medium", - "Roman", - "Normal", - "", - }, - }, - { "Regular/Italic Class", - { "Regular", - "Book", - "Medium", - "Italic", - "Oblique", - "Roman", - "Normal", - "", - }, - }, - { "Bold/BoldItalic Class", - { "Bold", - "Bold Italic", - "Black", - "", - }, - }, - { "Bold/Italic/BoldItalic Class", - { "Bold", - "Bold Italic", - "Black", - "Italic", - "Oblique", - "", - }, - }, - { "Regular/Bold Class", - { "Regular", - "Book", - "Medium", - "Normal", - "Roman", - "Bold", - "Black", - "", - }, - }, - }; - - - /* Force special legacy fixes for fonts. */ -#define COMPATIBILITY_MODE_RULES_SIZE 1 - - static const SPH_TweakRule COMPATIBILITY_MODE_Rules - [COMPATIBILITY_MODE_RULES_SIZE] = - { - { "Verdana Clones", 0, "", 0 }, - }; - - - /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting. */ -#define PIXEL_HINTING_RULES_SIZE 2 - - static const SPH_TweakRule PIXEL_HINTING_Rules - [PIXEL_HINTING_RULES_SIZE] = - { - /* these characters are almost always safe */ - { "Courier New", 12, "Italic", 'z' }, - { "Courier New", 11, "Italic", 'z' }, - }; - - - /* Subpixel hinting ignores SHPIX rules on X. Force SHPIX for these. */ -#define DO_SHPIX_RULES_SIZE 1 - - static const SPH_TweakRule DO_SHPIX_Rules - [DO_SHPIX_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Skip Y moves that start with a point that is not on a Y pixel */ - /* boundary and don't move that point to a Y pixel boundary. */ -#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE 4 - - static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules - [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] = - { - /* fix vwxyz thinness */ - { "Consolas", 0, "", 0 }, - /* Fix thin middle stems */ - { "Core MS Legacy Fonts", 0, "Regular", 0 }, - /* Cyrillic small letter I */ - { "Legacy Sans Fonts", 0, "", 0 }, - /* Fix artifacts with some Regular & Bold */ - { "Verdana Clones", 0, "", 0 }, - }; - - -#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 - - static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions - [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = - { - /* Fixes < and > */ - { "Courier New", 0, "Regular", 0 }, - }; - - - /* Skip Y moves that start with a point that is not on a Y pixel */ - /* boundary and don't move that point to a Y pixel boundary. */ -#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE 2 - - static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules - [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] = - { - /* Maintain thickness of diagonal in 'N' */ - { "Times New Roman", 0, "Regular/Bold Class", 'N' }, - { "Georgia", 0, "Regular/Bold Class", 'N' }, - }; - - - /* Skip Y moves that move a point off a Y pixel boundary. */ -#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE 1 - - static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules - [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - -#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 - - static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions - [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Round moves that don't move a point to a Y pixel boundary. */ -#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE 2 - - static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules - [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] = - { - /* Droid font instructions don't snap Y to pixels */ - { "Droid Sans", 0, "Regular/Italic Class", 0 }, - { "Droid Sans Mono", 0, "", 0 }, - }; - - -#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 - - static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions - [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Allow a Direct_Move along X freedom vector if matched. */ -#define ALLOW_X_DMOVE_RULES_SIZE 1 - - static const SPH_TweakRule ALLOW_X_DMOVE_Rules - [ALLOW_X_DMOVE_RULES_SIZE] = - { - /* Fixes vanishing diagonal in 4 */ - { "Verdana", 0, "Regular", '4' }, - }; - - - /* Return MS rasterizer version 35 if matched. */ -#define RASTERIZER_35_RULES_SIZE 8 - - static const SPH_TweakRule RASTERIZER_35_Rules - [RASTERIZER_35_RULES_SIZE] = - { - /* This seems to be the only way to make these look good */ - { "Times New Roman", 0, "Regular", 'i' }, - { "Times New Roman", 0, "Regular", 'j' }, - { "Times New Roman", 0, "Regular", 'm' }, - { "Times New Roman", 0, "Regular", 'r' }, - { "Times New Roman", 0, "Regular", 'a' }, - { "Times New Roman", 0, "Regular", 'n' }, - { "Times New Roman", 0, "Regular", 'p' }, - { "Times", 0, "", 0 }, - }; - - - /* Don't round to the subpixel grid. Round to pixel grid. */ -#define NORMAL_ROUND_RULES_SIZE 1 - - static const SPH_TweakRule NORMAL_ROUND_Rules - [NORMAL_ROUND_RULES_SIZE] = - { - /* Fix serif thickness for certain ppems */ - /* Can probably be generalized somehow */ - { "Courier New", 0, "", 0 }, - }; - - - /* Skip IUP instructions if matched. */ -#define SKIP_IUP_RULES_SIZE 1 - - static const SPH_TweakRule SKIP_IUP_Rules - [SKIP_IUP_RULES_SIZE] = - { - { "Arial", 13, "Regular", 'a' }, - }; - - - /* Skip MIAP Twilight hack if matched. */ -#define MIAP_HACK_RULES_SIZE 1 - - static const SPH_TweakRule MIAP_HACK_Rules - [MIAP_HACK_RULES_SIZE] = - { - { "Geneva", 12, "", 0 }, - }; - - - /* Skip DELTAP instructions if matched. */ -#define ALWAYS_SKIP_DELTAP_RULES_SIZE 23 - - static const SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules - [ALWAYS_SKIP_DELTAP_RULES_SIZE] = - { - { "Georgia", 0, "Regular", 'k' }, - /* fix various problems with e in different versions */ - { "Trebuchet MS", 14, "Regular", 'e' }, - { "Trebuchet MS", 13, "Regular", 'e' }, - { "Trebuchet MS", 15, "Regular", 'e' }, - { "Trebuchet MS", 0, "Italic", 'v' }, - { "Trebuchet MS", 0, "Italic", 'w' }, - { "Trebuchet MS", 0, "Regular", 'Y' }, - { "Arial", 11, "Regular", 's' }, - /* prevent problems with '3' and others */ - { "Verdana", 10, "Regular", 0 }, - { "Verdana", 9, "Regular", 0 }, - /* Cyrillic small letter short I */ - { "Legacy Sans Fonts", 0, "", 0x438 }, - { "Legacy Sans Fonts", 0, "", 0x439 }, - { "Arial", 10, "Regular", '6' }, - { "Arial", 0, "Bold/BoldItalic Class", 'a' }, - /* Make horizontal stems consistent with the rest */ - { "Arial", 24, "Bold", 'a' }, - { "Arial", 25, "Bold", 'a' }, - { "Arial", 24, "Bold", 's' }, - { "Arial", 25, "Bold", 's' }, - { "Arial", 34, "Bold", 's' }, - { "Arial", 35, "Bold", 's' }, - { "Arial", 36, "Bold", 's' }, - { "Arial", 25, "Regular", 's' }, - { "Arial", 26, "Regular", 's' }, - }; - - - /* Always do DELTAP instructions if matched. */ -#define ALWAYS_DO_DELTAP_RULES_SIZE 1 - - static const SPH_TweakRule ALWAYS_DO_DELTAP_Rules - [ALWAYS_DO_DELTAP_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Don't allow ALIGNRP after IUP. */ -#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE 1 - - static const SPH_TweakRule NO_ALIGNRP_AFTER_IUP_Rules - [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] = - { - /* Prevent creation of dents in outline */ - { "-", 0, "", 0 }, - }; - - - /* Don't allow DELTAP after IUP. */ -#define NO_DELTAP_AFTER_IUP_RULES_SIZE 1 - - static const SPH_TweakRule NO_DELTAP_AFTER_IUP_Rules - [NO_DELTAP_AFTER_IUP_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - - /* Don't allow CALL after IUP. */ -#define NO_CALL_AFTER_IUP_RULES_SIZE 1 - - static const SPH_TweakRule NO_CALL_AFTER_IUP_Rules - [NO_CALL_AFTER_IUP_RULES_SIZE] = - { - /* Prevent creation of dents in outline */ - { "-", 0, "", 0 }, - }; - - - /* De-embolden these glyphs slightly. */ -#define DEEMBOLDEN_RULES_SIZE 9 - - static const SPH_TweakRule DEEMBOLDEN_Rules - [DEEMBOLDEN_RULES_SIZE] = - { - { "Courier New", 0, "Bold", 'A' }, - { "Courier New", 0, "Bold", 'W' }, - { "Courier New", 0, "Bold", 'w' }, - { "Courier New", 0, "Bold", 'M' }, - { "Courier New", 0, "Bold", 'X' }, - { "Courier New", 0, "Bold", 'K' }, - { "Courier New", 0, "Bold", 'x' }, - { "Courier New", 0, "Bold", 'z' }, - { "Courier New", 0, "Bold", 'v' }, - }; - - - /* Embolden these glyphs slightly. */ -#define EMBOLDEN_RULES_SIZE 2 - - static const SPH_TweakRule EMBOLDEN_Rules - [EMBOLDEN_RULES_SIZE] = - { - { "Courier New", 0, "Regular", 0 }, - { "Courier New", 0, "Italic", 0 }, - }; - - - /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7 */ - /* similar to Windows XP. */ -#define TIMES_NEW_ROMAN_HACK_RULES_SIZE 12 - - static const SPH_TweakRule TIMES_NEW_ROMAN_HACK_Rules - [TIMES_NEW_ROMAN_HACK_RULES_SIZE] = - { - { "Times New Roman", 16, "Italic", '2' }, - { "Times New Roman", 16, "Italic", '5' }, - { "Times New Roman", 16, "Italic", '7' }, - { "Times New Roman", 16, "Regular", '2' }, - { "Times New Roman", 16, "Regular", '5' }, - { "Times New Roman", 16, "Regular", '7' }, - { "Times New Roman", 17, "Italic", '2' }, - { "Times New Roman", 17, "Italic", '5' }, - { "Times New Roman", 17, "Italic", '7' }, - { "Times New Roman", 17, "Regular", '2' }, - { "Times New Roman", 17, "Regular", '5' }, - { "Times New Roman", 17, "Regular", '7' }, - }; - - - /* This fudges distance on 2 to get rid of the vanishing stem issue. */ - /* A real solution to this is certainly welcome. */ -#define COURIER_NEW_2_HACK_RULES_SIZE 15 - - static const SPH_TweakRule COURIER_NEW_2_HACK_Rules - [COURIER_NEW_2_HACK_RULES_SIZE] = - { - { "Courier New", 10, "Regular", '2' }, - { "Courier New", 11, "Regular", '2' }, - { "Courier New", 12, "Regular", '2' }, - { "Courier New", 13, "Regular", '2' }, - { "Courier New", 14, "Regular", '2' }, - { "Courier New", 15, "Regular", '2' }, - { "Courier New", 16, "Regular", '2' }, - { "Courier New", 17, "Regular", '2' }, - { "Courier New", 18, "Regular", '2' }, - { "Courier New", 19, "Regular", '2' }, - { "Courier New", 20, "Regular", '2' }, - { "Courier New", 21, "Regular", '2' }, - { "Courier New", 22, "Regular", '2' }, - { "Courier New", 23, "Regular", '2' }, - { "Courier New", 24, "Regular", '2' }, - }; - - -#ifndef FORCE_NATURAL_WIDTHS - - /* Use compatible widths with these glyphs. Compatible widths is always */ - /* on when doing B/W TrueType instructing, but is used selectively here, */ - /* typically on glyphs with 3 or more vertical stems. */ -#define COMPATIBLE_WIDTHS_RULES_SIZE 38 - - static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules - [COMPATIBLE_WIDTHS_RULES_SIZE] = - { - { "Arial Unicode MS", 12, "Regular Class", 'm' }, - { "Arial Unicode MS", 14, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Arial", 10, "Regular Class", 0x448 }, - { "Arial", 11, "Regular Class", 'm' }, - { "Arial", 12, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Arial", 12, "Regular Class", 0x448 }, - { "Arial", 13, "Regular Class", 0x448 }, - { "Arial", 14, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Arial", 14, "Regular Class", 0x448 }, - { "Arial", 15, "Regular Class", 0x448 }, - { "Arial", 17, "Regular Class", 'm' }, - { "DejaVu Sans", 15, "Regular Class", 0 }, - { "Microsoft Sans Serif", 11, "Regular Class", 0 }, - { "Microsoft Sans Serif", 12, "Regular Class", 0 }, - { "Segoe UI", 11, "Regular Class", 0 }, - { "Monaco", 0, "Regular Class", 0 }, - { "Segoe UI", 12, "Regular Class", 'm' }, - { "Segoe UI", 14, "Regular Class", 'm' }, - { "Tahoma", 11, "Regular Class", 0 }, - { "Times New Roman", 16, "Regular Class", 'c' }, - { "Times New Roman", 16, "Regular Class", 'm' }, - { "Times New Roman", 16, "Regular Class", 'o' }, - { "Times New Roman", 16, "Regular Class", 'w' }, - { "Trebuchet MS", 11, "Regular Class", 0 }, - { "Trebuchet MS", 12, "Regular Class", 0 }, - { "Trebuchet MS", 14, "Regular Class", 0 }, - { "Trebuchet MS", 15, "Regular Class", 0 }, - { "Ubuntu", 12, "Regular Class", 'm' }, - /* Cyrillic small letter sha */ - { "Verdana", 10, "Regular Class", 0x448 }, - { "Verdana", 11, "Regular Class", 0x448 }, - { "Verdana and Clones", 12, "Regular Class", 'i' }, - { "Verdana and Clones", 12, "Regular Class", 'j' }, - { "Verdana and Clones", 12, "Regular Class", 'l' }, - { "Verdana and Clones", 12, "Regular Class", 'm' }, - { "Verdana and Clones", 13, "Regular Class", 'i' }, - { "Verdana and Clones", 13, "Regular Class", 'j' }, - { "Verdana and Clones", 13, "Regular Class", 'l' }, - { "Verdana and Clones", 14, "Regular Class", 'm' }, - }; - - - /* Scaling slightly in the x-direction prior to hinting results in */ - /* more visually pleasing glyphs in certain cases. */ - /* This sometimes needs to be coordinated with compatible width rules. */ - /* A value of 1000 corresponds to a scaled value of 1.0. */ - -#define X_SCALING_RULES_SIZE 50 - - static const SPH_ScaleRule X_SCALING_Rules[X_SCALING_RULES_SIZE] = - { - { "DejaVu Sans", 12, "Regular Class", 'm', 950 }, - { "Verdana and Clones", 12, "Regular Class", 'a', 1100 }, - { "Verdana and Clones", 13, "Regular Class", 'a', 1050 }, - { "Arial", 11, "Regular Class", 'm', 975 }, - { "Arial", 12, "Regular Class", 'm', 1050 }, - /* Cyrillic small letter el */ - { "Arial", 13, "Regular Class", 0x43B, 950 }, - { "Arial", 13, "Regular Class", 'o', 950 }, - { "Arial", 13, "Regular Class", 'e', 950 }, - { "Arial", 14, "Regular Class", 'm', 950 }, - /* Cyrillic small letter el */ - { "Arial", 15, "Regular Class", 0x43B, 925 }, - { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 }, - { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 }, - { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 }, - { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 }, - { "DejaVu Sans", 12, "Regular Class", 'l', 975 }, - { "DejaVu Sans", 12, "Regular Class", 'i', 975 }, - { "DejaVu Sans", 12, "Regular Class", 'j', 975 }, - { "DejaVu Sans", 13, "Regular Class", 'l', 950 }, - { "DejaVu Sans", 13, "Regular Class", 'i', 950 }, - { "DejaVu Sans", 13, "Regular Class", 'j', 950 }, - { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 }, - { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 }, - { "Georgia", 10, "", 0, 1050 }, - { "Georgia", 11, "", 0, 1100 }, - { "Georgia", 12, "", 0, 1025 }, - { "Georgia", 13, "", 0, 1050 }, - { "Georgia", 16, "", 0, 1050 }, - { "Georgia", 17, "", 0, 1030 }, - { "Liberation Sans", 12, "Regular Class", 'm', 1100 }, - { "Lucida Grande", 11, "Regular Class", 'm', 1100 }, - { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 }, - { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 }, - { "Segoe UI", 12, "Regular Class", 'H', 1050 }, - { "Segoe UI", 12, "Regular Class", 'm', 1050 }, - { "Segoe UI", 14, "Regular Class", 'm', 1050 }, - { "Tahoma", 11, "Regular Class", 'i', 975 }, - { "Tahoma", 11, "Regular Class", 'l', 975 }, - { "Tahoma", 11, "Regular Class", 'j', 900 }, - { "Tahoma", 11, "Regular Class", 'm', 918 }, - { "Verdana", 10, "Regular/Italic Class", 0, 1100 }, - { "Verdana", 12, "Regular Class", 'm', 975 }, - { "Verdana", 12, "Regular/Italic Class", 0, 1050 }, - { "Verdana", 13, "Regular/Italic Class", 'i', 950 }, - { "Verdana", 13, "Regular/Italic Class", 'j', 950 }, - { "Verdana", 13, "Regular/Italic Class", 'l', 950 }, - { "Verdana", 16, "Regular Class", 0, 1050 }, - { "Verdana", 9, "Regular/Italic Class", 0, 1050 }, - { "Times New Roman", 16, "Regular Class", 'm', 918 }, - { "Trebuchet MS", 11, "Regular Class", 'm', 800 }, - { "Trebuchet MS", 12, "Regular Class", 'm', 800 }, - }; - -#else - -#define COMPATIBLE_WIDTHS_RULES_SIZE 1 - - static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules - [COMPATIBLE_WIDTHS_RULES_SIZE] = - { - { "-", 0, "", 0 }, - }; - - -#define X_SCALING_RULES_SIZE 1 - - static const SPH_ScaleRule X_SCALING_Rules - [X_SCALING_RULES_SIZE] = - { - { "-", 0, "", 0, 1000 }, - }; - -#endif /* FORCE_NATURAL_WIDTHS */ - - - static FT_Bool - is_member_of_family_class( const FT_String* detected_font_name, - const FT_String* rule_font_name ) - { - FT_UInt i, j; - - - /* Does font name match rule family? */ - if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 ) - return TRUE; - - /* Is font name a wildcard ""? */ - if ( ft_strcmp( rule_font_name, "" ) == 0 ) - return TRUE; - - /* Is font name contained in a class list? */ - for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ ) - { - if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 ) - { - for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) - { - if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 ) - continue; - if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], - detected_font_name ) == 0 ) - return TRUE; - } - } - } - - return FALSE; - } - - - static FT_Bool - is_member_of_style_class( const FT_String* detected_font_style, - const FT_String* rule_font_style ) - { - FT_UInt i, j; - - - /* Does font style match rule style? */ - if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 ) - return TRUE; - - /* Is font style a wildcard ""? */ - if ( ft_strcmp( rule_font_style, "" ) == 0 ) - return TRUE; - - /* Is font style contained in a class list? */ - for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ ) - { - if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 ) - { - for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) - { - if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 ) - continue; - if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], - detected_font_style ) == 0 ) - return TRUE; - } - } - } - - return FALSE; - } - - - FT_LOCAL_DEF( FT_Bool ) - sph_test_tweak( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index, - const SPH_TweakRule* rule, - FT_UInt num_rules ) - { - FT_UInt i; - - - /* rule checks may be able to be optimized further */ - for ( i = 0; i < num_rules; i++ ) - { - if ( family && - ( is_member_of_family_class ( family, rule[i].family ) ) ) - if ( rule[i].ppem == 0 || - rule[i].ppem == ppem ) - if ( style && - is_member_of_style_class ( style, rule[i].style ) ) - if ( rule[i].glyph == 0 || - FT_Get_Char_Index( (FT_Face)face, - rule[i].glyph ) == glyph_index ) - return TRUE; - } - - return FALSE; - } - - - static FT_UInt - scale_test_tweak( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index, - const SPH_ScaleRule* rule, - FT_UInt num_rules ) - { - FT_UInt i; - - - /* rule checks may be able to be optimized further */ - for ( i = 0; i < num_rules; i++ ) - { - if ( family && - ( is_member_of_family_class ( family, rule[i].family ) ) ) - if ( rule[i].ppem == 0 || - rule[i].ppem == ppem ) - if ( style && - is_member_of_style_class( style, rule[i].style ) ) - if ( rule[i].glyph == 0 || - FT_Get_Char_Index( (FT_Face)face, - rule[i].glyph ) == glyph_index ) - return rule[i].scale; - } - - return 1000; - } - - - FT_LOCAL_DEF( FT_UInt ) - sph_test_tweak_x_scaling( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index ) - { - return scale_test_tweak( face, family, ppem, style, glyph_index, - X_SCALING_Rules, X_SCALING_RULES_SIZE ); - } - - -#define TWEAK_RULES( x ) \ - if ( sph_test_tweak( face, family, ppem, style, glyph_index, \ - x##_Rules, x##_RULES_SIZE ) ) \ - loader->exec->sph_tweak_flags |= SPH_TWEAK_##x - -#define TWEAK_RULES_EXCEPTIONS( x ) \ - if ( sph_test_tweak( face, family, ppem, style, glyph_index, \ - x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \ - loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x - - - FT_LOCAL_DEF( void ) - sph_set_tweaks( TT_Loader loader, - FT_UInt glyph_index ) - { - TT_Face face = loader->face; - FT_String* family = face->root.family_name; - FT_UInt ppem = loader->size->metrics->x_ppem; - FT_String* style = face->root.style_name; - - - /* don't apply rules if style isn't set */ - if ( !face->root.style_name ) - return; - -#ifdef SPH_DEBUG_MORE_VERBOSE - printf( "%s,%d,%s,%c=%d ", - family, ppem, style, glyph_index, glyph_index ); -#endif - - TWEAK_RULES( PIXEL_HINTING ); - - if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING ) - { - loader->exec->ignore_x_mode = FALSE; - return; - } - - TWEAK_RULES( ALLOW_X_DMOVE ); - TWEAK_RULES( ALWAYS_DO_DELTAP ); - TWEAK_RULES( ALWAYS_SKIP_DELTAP ); - TWEAK_RULES( DEEMBOLDEN ); - TWEAK_RULES( DO_SHPIX ); - TWEAK_RULES( EMBOLDEN ); - TWEAK_RULES( MIAP_HACK ); - TWEAK_RULES( NORMAL_ROUND ); - TWEAK_RULES( NO_ALIGNRP_AFTER_IUP ); - TWEAK_RULES( NO_CALL_AFTER_IUP ); - TWEAK_RULES( NO_DELTAP_AFTER_IUP ); - TWEAK_RULES( RASTERIZER_35 ); - TWEAK_RULES( SKIP_IUP ); - - TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES ); - TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES ); - - TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP ); - - TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES ); - TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES ); - - TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES ); - TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES ); - - if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) - { - if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 ) - { - loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35; - loader->exec->size->cvt_ready = -1; - - tt_size_ready_bytecode( - loader->exec->size, - FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) ); - } - else - loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35; - } - else - { - if ( loader->exec->rasterizer_version != - SPH_OPTION_SET_RASTERIZER_VERSION ) - { - loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; - loader->exec->size->cvt_ready = -1; - - tt_size_ready_bytecode( - loader->exec->size, - FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) ); - } - else - loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; - } - - if ( IS_HINTED( loader->load_flags ) ) - { - TWEAK_RULES( TIMES_NEW_ROMAN_HACK ); - TWEAK_RULES( COURIER_NEW_2_HACK ); - } - - if ( sph_test_tweak( face, family, ppem, style, glyph_index, - COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) ) - loader->exec->face->sph_compatibility_mode = TRUE; - - - if ( IS_HINTED( loader->load_flags ) ) - { - if ( sph_test_tweak( face, family, ppem, style, glyph_index, - COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) ) - loader->exec->compatible_widths |= TRUE; - } - } - -#else /* !(TT_USE_BYTECODE_INTERPRETER && */ - /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ - - /* ANSI C doesn't like empty source files */ - typedef int _tt_subpix_dummy; - -#endif /* !(TT_USE_BYTECODE_INTERPRETER && */ - /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/truetype/ttsubpix.h b/src/3rdparty/freetype/src/truetype/ttsubpix.h deleted file mode 100644 index 62af4c27..00000000 --- a/src/3rdparty/freetype/src/truetype/ttsubpix.h +++ /dev/null @@ -1,110 +0,0 @@ -/**************************************************************************** - * - * ttsubpix.h - * - * TrueType Subpixel Hinting. - * - * Copyright (C) 2010-2023 by - * David Turner, Robert Wilhelm, and Werner Lemberg. - * - * This file is part of the FreeType project, and may only be used, - * modified, and distributed under the terms of the FreeType project - * license, LICENSE.TXT. By continuing to use, modify, or distribute - * this file you indicate that you have read the license and - * understand and accept it fully. - * - */ - - -#ifndef TTSUBPIX_H_ -#define TTSUBPIX_H_ - -#include "ttobjs.h" -#include "ttinterp.h" - - -FT_BEGIN_HEADER - - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - - /************************************************************************** - * - * ID flags to identify special functions at FDEF and runtime. - * - */ -#define SPH_FDEF_INLINE_DELTA_1 0x0000001 -#define SPH_FDEF_INLINE_DELTA_2 0x0000002 -#define SPH_FDEF_DIAGONAL_STROKE 0x0000004 -#define SPH_FDEF_VACUFORM_ROUND_1 0x0000008 -#define SPH_FDEF_TTFAUTOHINT_1 0x0000010 -#define SPH_FDEF_SPACING_1 0x0000020 -#define SPH_FDEF_SPACING_2 0x0000040 -#define SPH_FDEF_TYPEMAN_STROKES 0x0000080 -#define SPH_FDEF_TYPEMAN_DIAGENDCTRL 0x0000100 - - - /************************************************************************** - * - * Tweak flags that are set for each glyph by the below rules. - * - */ -#define SPH_TWEAK_ALLOW_X_DMOVE 0x0000001UL -#define SPH_TWEAK_ALWAYS_DO_DELTAP 0x0000002UL -#define SPH_TWEAK_ALWAYS_SKIP_DELTAP 0x0000004UL -#define SPH_TWEAK_COURIER_NEW_2_HACK 0x0000008UL -#define SPH_TWEAK_DEEMBOLDEN 0x0000010UL -#define SPH_TWEAK_DO_SHPIX 0x0000020UL -#define SPH_TWEAK_EMBOLDEN 0x0000040UL -#define SPH_TWEAK_MIAP_HACK 0x0000080UL -#define SPH_TWEAK_NORMAL_ROUND 0x0000100UL -#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP 0x0000200UL -#define SPH_TWEAK_NO_CALL_AFTER_IUP 0x0000400UL -#define SPH_TWEAK_NO_DELTAP_AFTER_IUP 0x0000800UL -#define SPH_TWEAK_PIXEL_HINTING 0x0001000UL -#define SPH_TWEAK_RASTERIZER_35 0x0002000UL -#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES 0x0004000UL -#define SPH_TWEAK_SKIP_IUP 0x0008000UL -#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES 0x0010000UL -#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES 0x0020000UL -#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK 0x0040000UL -#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP 0x0080000UL - - - FT_LOCAL( FT_Bool ) - sph_test_tweak( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index, - const SPH_TweakRule* rule, - FT_UInt num_rules ); - - FT_LOCAL( FT_UInt ) - sph_test_tweak_x_scaling( TT_Face face, - const FT_String* family, - FT_UInt ppem, - const FT_String* style, - FT_UInt glyph_index ); - - FT_LOCAL( void ) - sph_set_tweaks( TT_Loader loader, - FT_UInt glyph_index ); - - - /* These macros are defined absent a method for setting them */ -#define SPH_OPTION_BITMAP_WIDTHS FALSE -#define SPH_OPTION_SET_SUBPIXEL TRUE -#define SPH_OPTION_SET_GRAYSCALE FALSE -#define SPH_OPTION_SET_COMPATIBLE_WIDTHS FALSE -#define SPH_OPTION_SET_RASTERIZER_VERSION 38 - -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - - -FT_END_HEADER - -#endif /* TTSUBPIX_H_ */ - - -/* END */ diff --git a/src/3rdparty/freetype/src/type1/t1afm.c b/src/3rdparty/freetype/src/type1/t1afm.c index 787aa92c..d9b9398b 100644 --- a/src/3rdparty/freetype/src/type1/t1afm.c +++ b/src/3rdparty/freetype/src/type1/t1afm.c @@ -299,7 +299,7 @@ /* ascender and descender are optional and could both be zero */ /* check if values are meaningful before overriding defaults */ if ( fi->Ascender > fi->Descender ) - { + { /* no `U' suffix here to 0x8000! */ t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000 ) >> 16 ); t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 ); @@ -405,7 +405,7 @@ #else /* T1_CONFIG_OPTION_NO_AFM */ /* ANSI C doesn't like empty source files */ - typedef int _t1_afm_dummy; + typedef int t1_afm_dummy_; #endif /* T1_CONFIG_OPTION_NO_AFM */ diff --git a/src/3rdparty/freetype/src/type1/t1driver.c b/src/3rdparty/freetype/src/type1/t1driver.c index ded3b264..a4cdf372 100644 --- a/src/3rdparty/freetype/src/type1/t1driver.c +++ b/src/3rdparty/freetype/src/type1/t1driver.c @@ -56,28 +56,32 @@ * */ - static FT_Error - t1_get_glyph_name( T1_Face face, + FT_CALLBACK_DEF( FT_Error ) + t1_get_glyph_name( FT_Face face, /* T1_Face */ FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ) { - FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); + T1_Face t1face = (T1_Face)face; + + + FT_STRCPYN( buffer, t1face->type1.glyph_names[glyph_index], buffer_max ); return FT_Err_Ok; } - static FT_UInt - t1_get_name_index( T1_Face face, + FT_CALLBACK_DEF( FT_UInt ) + t1_get_name_index( FT_Face face, /* T1_Face */ const FT_String* glyph_name ) { - FT_Int i; + T1_Face t1face = (T1_Face)face; + FT_Int i; - for ( i = 0; i < face->type1.num_glyphs; i++ ) + for ( i = 0; i < t1face->type1.num_glyphs; i++ ) { - FT_String* gname = face->type1.glyph_names[i]; + FT_String* gname = t1face->type1.glyph_names[i]; if ( !ft_strcmp( glyph_name, gname ) ) @@ -90,8 +94,8 @@ static const FT_Service_GlyphDictRec t1_service_glyph_dict = { - (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, /* get_name */ - (FT_GlyphDict_NameIndexFunc)t1_get_name_index /* name_index */ + t1_get_glyph_name, /* FT_GlyphDict_GetNameFunc get_name */ + t1_get_name_index /* FT_GlyphDict_NameIndexFunc name_index */ }; @@ -101,9 +105,12 @@ */ static const char* - t1_get_ps_name( T1_Face face ) + t1_get_ps_name( FT_Face face ) /* T1_Face */ { - return (const char*) face->type1.font_name; + T1_Face t1face = (T1_Face)face; + + + return (const char*) t1face->type1.font_name; } @@ -121,30 +128,28 @@ #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT static const FT_Service_MultiMastersRec t1_service_multi_masters = { - (FT_Get_MM_Func) T1_Get_Multi_Master, /* get_mm */ - (FT_Set_MM_Design_Func) T1_Set_MM_Design, /* set_mm_design */ - (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, /* set_mm_blend */ - (FT_Get_MM_Blend_Func) T1_Get_MM_Blend, /* get_mm_blend */ - (FT_Get_MM_Var_Func) T1_Get_MM_Var, /* get_mm_var */ - (FT_Set_Var_Design_Func)T1_Set_Var_Design, /* set_var_design */ - (FT_Get_Var_Design_Func)T1_Get_Var_Design, /* get_var_design */ - (FT_Set_Instance_Func) T1_Reset_MM_Blend, /* set_instance */ - (FT_Set_MM_WeightVector_Func) - T1_Set_MM_WeightVector, /* set_mm_weightvector */ - (FT_Get_MM_WeightVector_Func) - T1_Get_MM_WeightVector, /* get_mm_weightvector */ - (FT_Var_Load_Delta_Set_Idx_Map_Func) - NULL, /* load_delta_set_idx_map */ - (FT_Var_Load_Item_Var_Store_Func) - NULL, /* load_item_variation_store */ - (FT_Var_Get_Item_Delta_Func) - NULL, /* get_item_delta */ - (FT_Var_Done_Item_Var_Store_Func) - NULL, /* done_item_variation_store */ - (FT_Var_Done_Delta_Set_Idx_Map_Func) - NULL, /* done_delta_set_index_map */ - (FT_Get_Var_Blend_Func) NULL, /* get_var_blend */ - (FT_Done_Blend_Func) T1_Done_Blend /* done_blend */ + T1_Get_Multi_Master, /* FT_Get_MM_Func get_mm */ + T1_Set_MM_Design, /* FT_Set_MM_Design_Func set_mm_design */ + T1_Set_MM_Blend, /* FT_Set_MM_Blend_Func set_mm_blend */ + T1_Get_MM_Blend, /* FT_Get_MM_Blend_Func get_mm_blend */ + T1_Get_MM_Var, /* FT_Get_MM_Var_Func get_mm_var */ + T1_Set_Var_Design, /* FT_Set_Var_Design_Func set_var_design */ + T1_Get_Var_Design, /* FT_Get_Var_Design_Func get_var_design */ + T1_Reset_MM_Blend, /* FT_Set_Named_Instance_Func set_named_instance */ + NULL, /* FT_Get_Default_Named_Instance_Func get_default_named_instance */ + T1_Set_MM_WeightVector, + /* FT_Set_MM_WeightVector_Func set_mm_weightvector */ + T1_Get_MM_WeightVector, + /* FT_Get_MM_WeightVector_Func get_mm_weightvector */ + + NULL, /* FT_Construct_PS_Name_Func construct_ps_name */ + NULL, /* FT_Var_Load_Delta_Set_Idx_Map_Func load_delta_set_idx_map */ + NULL, /* FT_Var_Load_Item_Var_Store_Func load_item_variation_store */ + NULL, /* FT_Var_Get_Item_Delta_Func get_item_delta */ + NULL, /* FT_Var_Done_Item_Var_Store_Func done_item_variation_store */ + NULL, /* FT_Var_Done_Delta_Set_Idx_Map_Func done_delta_set_index_map */ + NULL, /* FT_Get_Var_Blend_Func get_var_blend */ + T1_Done_Blend /* FT_Done_Blend_Func done_blend */ }; #endif @@ -632,11 +637,11 @@ static const FT_Service_PsInfoRec t1_service_ps_info = { - (PS_GetFontInfoFunc) t1_ps_get_font_info, /* ps_get_font_info */ - (PS_GetFontExtraFunc) t1_ps_get_font_extra, /* ps_get_font_extra */ - (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names, /* ps_has_glyph_names */ - (PS_GetFontPrivateFunc)t1_ps_get_font_private, /* ps_get_font_private */ - (PS_GetFontValueFunc) t1_ps_get_font_value, /* ps_get_font_value */ + t1_ps_get_font_info, /* PS_GetFontInfoFunc ps_get_font_info */ + t1_ps_get_font_extra, /* PS_GetFontExtraFunc ps_get_font_extra */ + t1_ps_has_glyph_names, /* PS_HasGlyphNamesFunc ps_has_glyph_names */ + t1_ps_get_font_private, /* PS_GetFontPrivateFunc ps_get_font_private */ + t1_ps_get_font_value, /* PS_GetFontValueFunc ps_get_font_value */ }; @@ -656,9 +661,9 @@ FT_DEFINE_SERVICE_PROPERTIESREC( t1_service_properties, - (FT_Properties_SetFunc)ps_property_set, /* set_property */ - (FT_Properties_GetFunc)ps_property_get ) /* get_property */ - + ps_property_set, /* FT_Properties_SetFunc set_property */ + ps_property_get /* FT_Properties_GetFunc get_property */ + ) /* * SERVICE LIST diff --git a/src/3rdparty/freetype/src/type1/t1load.c b/src/3rdparty/freetype/src/type1/t1load.c index 5a1afd8d..be7cd0fd 100644 --- a/src/3rdparty/freetype/src/type1/t1load.c +++ b/src/3rdparty/freetype/src/type1/t1load.c @@ -73,7 +73,8 @@ #ifdef FT_CONFIG_OPTION_INCREMENTAL -#define IS_INCREMENTAL FT_BOOL( face->root.internal->incremental_interface ) +#define IS_INCREMENTAL \ + FT_BOOL( FT_FACE( face )->internal->incremental_interface ) #else #define IS_INCREMENTAL 0 #endif @@ -174,10 +175,11 @@ FT_LOCAL_DEF( FT_Error ) - T1_Get_Multi_Master( T1_Face face, + T1_Get_Multi_Master( FT_Face face, /* T1_Face */ FT_Multi_Master* master ) { - PS_Blend blend = face->blend; + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; FT_UInt n; FT_Error error; @@ -225,11 +227,12 @@ for ( j = 1; j < axismap->num_points; j++ ) { if ( ncv <= axismap->blend_points[j] ) - return INT_TO_FIXED( axismap->design_points[j - 1] ) + - ( axismap->design_points[j] - axismap->design_points[j - 1] ) * - FT_DivFix( ncv - axismap->blend_points[j - 1], - axismap->blend_points[j] - - axismap->blend_points[j - 1] ); + return INT_TO_FIXED( axismap->design_points[j - 1] + + FT_MulDiv( ncv - axismap->blend_points[j - 1], + axismap->design_points[j] - + axismap->design_points[j - 1], + axismap->blend_points[j] - + axismap->blend_points[j - 1] ) ); } return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] ); @@ -284,16 +287,17 @@ * arguments needed by the GX var distortable fonts. */ FT_LOCAL_DEF( FT_Error ) - T1_Get_MM_Var( T1_Face face, + T1_Get_MM_Var( FT_Face face, /* T1_Face */ FT_MM_Var* *master ) { - FT_Memory memory = face->root.memory; - FT_MM_Var *mmvar = NULL; + T1_Face t1face = (T1_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_MM_Var *mmvar = NULL; FT_Multi_Master mmaster; FT_Error error; FT_UInt i; FT_Fixed axiscoords[T1_MAX_MM_AXIS]; - PS_Blend blend = face->blend; + PS_Blend blend = t1face->blend; FT_UShort* axis_flags; FT_Offset mmvar_size; @@ -319,9 +323,9 @@ sizeof ( FT_UShort ) ); axis_size = mmaster.num_axis * sizeof ( FT_Var_Axis ); - if ( FT_ALLOC( mmvar, mmvar_size + - axis_flags_size + - axis_size ) ) + if ( FT_QALLOC( mmvar, mmvar_size + + axis_flags_size + + axis_size ) ) goto Exit; mmvar->num_axis = mmaster.num_axis; @@ -332,8 +336,7 @@ /* to make `FT_Get_Var_Axis_Flags' work: the function expects that the */ /* values directly follow the data of `FT_MM_Var' */ axis_flags = (FT_UShort*)( (char*)mmvar + mmvar_size ); - for ( i = 0; i < mmaster.num_axis; i++ ) - axis_flags[i] = 0; + FT_ARRAY_ZERO( axis_flags, mmaster.num_axis ); mmvar->axis = (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); mmvar->namedstyle = NULL; @@ -438,32 +441,21 @@ FT_LOCAL_DEF( FT_Error ) - T1_Set_MM_Blend( T1_Face face, + T1_Set_MM_Blend( FT_Face face, /* T1_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Error error; - - - error = t1_set_mm_blend( face, num_coords, coords ); - if ( error ) - return error; - - if ( num_coords ) - face->root.face_flags |= FT_FACE_FLAG_VARIATION; - else - face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; - - return FT_Err_Ok; + return t1_set_mm_blend( (T1_Face)face, num_coords, coords ); } FT_LOCAL_DEF( FT_Error ) - T1_Get_MM_Blend( T1_Face face, + T1_Get_MM_Blend( FT_Face face, /* T1_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - PS_Blend blend = face->blend; + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; FT_Fixed axiscoords[4]; FT_UInt i, nc; @@ -494,11 +486,12 @@ FT_LOCAL_DEF( FT_Error ) - T1_Set_MM_WeightVector( T1_Face face, + T1_Set_MM_WeightVector( FT_Face face, /* T1_Face */ FT_UInt len, FT_Fixed* weightvector ) { - PS_Blend blend = face->blend; + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; FT_UInt i, n; @@ -522,11 +515,6 @@ for ( ; i < blend->num_designs; i++ ) blend->weight_vector[i] = (FT_Fixed)0; - - if ( len ) - face->root.face_flags |= FT_FACE_FLAG_VARIATION; - else - face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; } return FT_Err_Ok; @@ -534,11 +522,12 @@ FT_LOCAL_DEF( FT_Error ) - T1_Get_MM_WeightVector( T1_Face face, + T1_Get_MM_WeightVector( FT_Face face, /* T1_Face */ FT_UInt* len, FT_Fixed* weightvector ) { - PS_Blend blend = face->blend; + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; FT_UInt i; @@ -563,12 +552,13 @@ FT_LOCAL_DEF( FT_Error ) - T1_Set_MM_Design( T1_Face face, + T1_Set_MM_Design( FT_Face face, /* T1_Face */ FT_UInt num_coords, FT_Long* coords ) { + T1_Face t1face = (T1_Face)face; FT_Error error; - PS_Blend blend = face->blend; + PS_Blend blend = t1face->blend; FT_UInt n; FT_Fixed final_blends[T1_MAX_MM_DESIGNS]; @@ -634,15 +624,10 @@ final_blends[n] = the_blend; } - error = t1_set_mm_blend( face, blend->num_axis, final_blends ); + error = t1_set_mm_blend( t1face, blend->num_axis, final_blends ); if ( error ) return error; - if ( num_coords ) - face->root.face_flags |= FT_FACE_FLAG_VARIATION; - else - face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; - return FT_Err_Ok; } @@ -650,7 +635,7 @@ /* MM fonts don't have named instances, so only the design is reset */ FT_LOCAL_DEF( FT_Error ) - T1_Reset_MM_Blend( T1_Face face, + T1_Reset_MM_Blend( FT_Face face, FT_UInt instance_index ) { FT_UNUSED( instance_index ); @@ -665,7 +650,7 @@ * arguments needed by the GX var distortable fonts. */ FT_LOCAL_DEF( FT_Error ) - T1_Set_Var_Design( T1_Face face, + T1_Set_Var_Design( FT_Face face, /* T1_Face */ FT_UInt num_coords, FT_Fixed* coords ) { @@ -684,11 +669,12 @@ FT_LOCAL_DEF( FT_Error ) - T1_Get_Var_Design( T1_Face face, + T1_Get_Var_Design( FT_Face face, /* T1_Face */ FT_UInt num_coords, FT_Fixed* coords ) { - PS_Blend blend = face->blend; + T1_Face t1face = (T1_Face)face; + PS_Blend blend = t1face->blend; FT_Fixed axiscoords[4]; FT_UInt i, nc; @@ -720,10 +706,11 @@ FT_LOCAL_DEF( void ) - T1_Done_Blend( T1_Face face ) + T1_Done_Blend( FT_Face face ) /* T1_Face */ { - FT_Memory memory = face->root.memory; - PS_Blend blend = face->blend; + T1_Face t1face = (T1_Face)face; + FT_Memory memory = FT_FACE_MEMORY( face ); + PS_Blend blend = t1face->blend; if ( blend ) @@ -768,20 +755,22 @@ dmap->num_points = 0; } - FT_FREE( face->blend ); + FT_FREE( t1face->blend ); } } static void - parse_blend_axis_types( T1_Face face, - T1_Loader loader ) + parse_blend_axis_types( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; FT_Int n, num_axis; - FT_Error error = FT_Err_Ok; + FT_Error error = FT_Err_Ok; PS_Blend blend; - FT_Memory memory; + FT_Memory memory = FT_FACE_MEMORY( face ); /* take an array of objects */ @@ -801,14 +790,13 @@ } /* allocate blend if necessary */ - error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); + error = t1_allocate_blend( t1face, 0, (FT_UInt)num_axis ); if ( error ) goto Exit; FT_TRACE4(( " [" )); - blend = face->blend; - memory = face->root.memory; + blend = t1face->blend; /* each token is an immediate containing the name of the axis */ for ( n = 0; n < num_axis; n++ ) @@ -856,14 +844,16 @@ static void - parse_blend_design_positions( T1_Face face, - T1_Loader loader ) + parse_blend_design_positions( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; FT_Int num_designs; FT_Int num_axis = 0; /* make compiler happy */ T1_Parser parser = &loader->parser; - FT_Memory memory = face->root.memory; + FT_Memory memory = FT_FACE_MEMORY( face ); FT_Error error = FT_Err_Ok; FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; @@ -921,7 +911,7 @@ } num_axis = n_axis; - error = t1_allocate_blend( face, + error = t1_allocate_blend( t1face, (FT_UInt)num_designs, (FT_UInt)num_axis ); if ( error ) @@ -962,7 +952,7 @@ loader->parser.root.limit = old_limit; /* a valid BlendDesignPosition has been parsed */ - blend = face->blend; + blend = t1face->blend; if ( blend->design_pos[0] ) FT_FREE( blend->design_pos[0] ); @@ -980,9 +970,11 @@ static void - parse_blend_design_map( T1_Face face, - T1_Loader loader ) + parse_blend_design_map( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; FT_Error error = FT_Err_Ok; T1_Parser parser = &loader->parser; PS_Blend blend; @@ -990,7 +982,7 @@ FT_Int n, num_axis; FT_Byte* old_cursor; FT_Byte* old_limit; - FT_Memory memory = face->root.memory; + FT_Memory memory = FT_FACE_MEMORY( face ); T1_ToTokenArray( parser, axis_tokens, @@ -1011,10 +1003,10 @@ old_cursor = parser->root.cursor; old_limit = parser->root.limit; - error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); + error = t1_allocate_blend( t1face, 0, (FT_UInt)num_axis ); if ( error ) goto Exit; - blend = face->blend; + blend = t1face->blend; FT_TRACE4(( " [" )); @@ -1089,15 +1081,17 @@ static void - parse_weight_vector( T1_Face face, - T1_Loader loader ) + parse_weight_vector( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; FT_Int num_designs; FT_Error error = FT_Err_Ok; - FT_Memory memory = face->root.memory; + FT_Memory memory = FT_FACE_MEMORY( face ); T1_Parser parser = &loader->parser; - PS_Blend blend = face->blend; + PS_Blend blend = t1face->blend; T1_Token token; FT_Int n; FT_Byte* old_cursor; @@ -1122,10 +1116,10 @@ if ( !blend || !blend->num_designs ) { - error = t1_allocate_blend( face, (FT_UInt)num_designs, 0 ); + error = t1_allocate_blend( t1face, (FT_UInt)num_designs, 0 ); if ( error ) goto Exit; - blend = face->blend; + blend = t1face->blend; } else if ( blend->num_designs != (FT_UInt)num_designs ) { @@ -1173,11 +1167,15 @@ /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */ /* we're only interested in the number of array elements */ static void - parse_buildchar( T1_Face face, - T1_Loader loader ) + parse_buildchar( FT_Face face, /* T1_Face */ + void* loader_ ) { - face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser, - 0, NULL, 0 ); + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; + + + t1face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser, + 0, NULL, 0 ); #ifdef FT_DEBUG_LEVEL_TRACE { @@ -1185,7 +1183,7 @@ FT_TRACE4(( " [" )); - for ( i = 0; i < face->len_buildchar; i++ ) + for ( i = 0; i < t1face->len_buildchar; i++ ) FT_TRACE4(( " 0" )); FT_TRACE4(( "]\n" )); @@ -1335,9 +1333,10 @@ static void - parse_private( T1_Face face, - T1_Loader loader ) + parse_private( FT_Face face, + void* loader_ ) { + T1_Loader loader = (T1_Loader)loader_; FT_UNUSED( face ); loader->keywords_encountered |= T1_PRIVATE; @@ -1401,13 +1400,14 @@ /* and `/CharStrings' dictionaries. */ static void - t1_parse_font_matrix( T1_Face face, - T1_Loader loader ) + t1_parse_font_matrix( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_Parser parser = &loader->parser; - FT_Matrix* matrix = &face->type1.font_matrix; - FT_Vector* offset = &face->type1.font_offset; - FT_Face root = (FT_Face)&face->root; + FT_Matrix* matrix = &t1face->type1.font_matrix; + FT_Vector* offset = &t1face->type1.font_offset; FT_Fixed temp[6]; FT_Fixed temp_scale; FT_Int result; @@ -1443,7 +1443,7 @@ if ( temp_scale != 0x10000L ) { /* set units per EM based on FontMatrix values */ - root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); + face->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale ); temp[0] = FT_DivFix( temp[0], temp_scale ); temp[1] = FT_DivFix( temp[1], temp_scale ); @@ -1471,14 +1471,16 @@ static void - parse_encoding( T1_Face face, - T1_Loader loader ) + parse_encoding( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_Parser parser = &loader->parser; FT_Byte* cur; FT_Byte* limit = parser->root.limit; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)t1face->psaux; T1_Skip_Spaces( parser ); @@ -1494,7 +1496,7 @@ /* and we must load it now */ if ( ft_isdigit( *cur ) || *cur == '[' ) { - T1_Encoding encode = &face->type1.encoding; + T1_Encoding encode = &t1face->type1.encoding; FT_Int count, array_size, n; PS_Table char_table = &loader->encoding_table; FT_Memory memory = parser->root.memory; @@ -1676,7 +1678,7 @@ FT_TRACE4(( "]\n" )); #endif - face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + t1face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; parser->root.cursor = cur; } @@ -1687,21 +1689,21 @@ if ( cur + 17 < limit && ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) { - face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + t1face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; FT_TRACE4(( " StandardEncoding\n" )); } else if ( cur + 15 < limit && ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) { - face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + t1face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; FT_TRACE4(( " ExpertEncoding\n" )); } else if ( cur + 18 < limit && ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) { - face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + t1face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; FT_TRACE4(( " ISOLatin1Encoding\n" )); } @@ -1715,9 +1717,11 @@ static void - parse_subrs( T1_Face face, - T1_Loader loader ) + parse_subrs( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_Parser parser = &loader->parser; PS_Table table = &loader->subrs; FT_Memory memory = parser->root.memory; @@ -1725,7 +1729,7 @@ FT_Int num_subrs; FT_UInt count; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)t1face->psaux; T1_Skip_Spaces( parser ); @@ -1769,7 +1773,7 @@ */ FT_TRACE0(( "parse_subrs: adjusting number of subroutines" - " (from %d to %ld)\n", + " (from %d to %zu)\n", num_subrs, ( parser->root.limit - parser->root.cursor ) >> 3 )); num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3; @@ -1857,7 +1861,7 @@ /* */ /* thanks to Tom Kacvinsky for pointing this out */ /* */ - if ( face->type1.private_dict.lenIV >= 0 ) + if ( t1face->type1.private_dict.lenIV >= 0 ) { FT_Byte* temp = NULL; @@ -1865,7 +1869,7 @@ /* some fonts define empty subr records -- this is not totally */ /* compliant to the specification (which says they should at */ /* least contain a `return'), but we support them anyway */ - if ( size < (FT_ULong)face->type1.private_dict.lenIV ) + if ( size < (FT_ULong)t1face->type1.private_dict.lenIV ) { error = FT_THROW( Invalid_File_Format ); goto Fail; @@ -1876,9 +1880,11 @@ goto Fail; FT_MEM_COPY( temp, base, size ); psaux->t1_decrypt( temp, size, 4330 ); - size -= (FT_ULong)face->type1.private_dict.lenIV; - error = T1_Add_Table( table, (FT_Int)idx, - temp + face->type1.private_dict.lenIV, size ); + size -= (FT_ULong)t1face->type1.private_dict.lenIV; + error = T1_Add_Table( table, + (FT_Int)idx, + temp + t1face->type1.private_dict.lenIV, + size ); FT_FREE( temp ); } else @@ -1910,9 +1916,11 @@ static void - parse_charstrings( T1_Face face, - T1_Loader loader ) + parse_charstrings( FT_Face face, /* T1_Face */ + void* loader_ ) { + T1_Face t1face = (T1_Face)face; + T1_Loader loader = (T1_Loader)loader_; T1_Parser parser = &loader->parser; PS_Table code_table = &loader->charstrings; PS_Table name_table = &loader->glyph_names; @@ -1920,7 +1928,7 @@ FT_Memory memory = parser->root.memory; FT_Error error; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)t1face->psaux; FT_Byte* cur = parser->root.cursor; FT_Byte* limit = parser->root.limit; @@ -1940,7 +1948,7 @@ if ( num_glyphs > ( limit - cur ) >> 3 ) { FT_TRACE0(( "parse_charstrings: adjusting number of glyphs" - " (from %d to %ld)\n", + " (from %d to %zu)\n", num_glyphs, ( limit - cur ) >> 3 )); num_glyphs = ( limit - cur ) >> 3; } @@ -2069,13 +2077,13 @@ notdef_found = 1; } - if ( face->type1.private_dict.lenIV >= 0 && + if ( t1face->type1.private_dict.lenIV >= 0 && n < num_glyphs + TABLE_EXTEND ) { FT_Byte* temp = NULL; - if ( size <= (FT_ULong)face->type1.private_dict.lenIV ) + if ( size <= (FT_ULong)t1face->type1.private_dict.lenIV ) { error = FT_THROW( Invalid_File_Format ); goto Fail; @@ -2086,9 +2094,11 @@ goto Fail; FT_MEM_COPY( temp, base, size ); psaux->t1_decrypt( temp, size, 4330 ); - size -= (FT_ULong)face->type1.private_dict.lenIV; - error = T1_Add_Table( code_table, n, - temp + face->type1.private_dict.lenIV, size ); + size -= (FT_ULong)t1face->type1.private_dict.lenIV; + error = T1_Add_Table( code_table, + n, + temp + t1face->type1.private_dict.lenIV, + size ); FT_FREE( temp ); } else @@ -2570,7 +2580,7 @@ { FT_ERROR(( "T1_Open_Face:" " number-of-designs != 2 ^^ number-of-axes\n" )); - T1_Done_Blend( face ); + T1_Done_Blend( FT_FACE( face ) ); } if ( face->blend && @@ -2590,15 +2600,15 @@ /* font as a normal PS font */ if ( face->blend && ( !face->blend->num_designs || !face->blend->num_axis ) ) - T1_Done_Blend( face ); + T1_Done_Blend( FT_FACE( face ) ); /* the font may have no valid WeightVector */ if ( face->blend && !face->blend->weight_vector ) - T1_Done_Blend( face ); + T1_Done_Blend( FT_FACE( face ) ); /* the font may have no valid BlendDesignPositions */ if ( face->blend && !face->blend->design_pos[0] ) - T1_Done_Blend( face ); + T1_Done_Blend( FT_FACE( face ) ); /* the font may have no valid BlendDesignMap */ if ( face->blend ) @@ -2609,7 +2619,7 @@ for ( i = 0; i < face->blend->num_axis; i++ ) if ( !face->blend->design_map[i].num_points ) { - T1_Done_Blend( face ); + T1_Done_Blend( FT_FACE( face ) ); break; } } diff --git a/src/3rdparty/freetype/src/type1/t1load.h b/src/3rdparty/freetype/src/type1/t1load.h index f8511ccc..d8c9d2d8 100644 --- a/src/3rdparty/freetype/src/type1/t1load.h +++ b/src/3rdparty/freetype/src/type1/t1load.h @@ -66,52 +66,52 @@ FT_BEGIN_HEADER #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT FT_LOCAL( FT_Error ) - T1_Get_Multi_Master( T1_Face face, + T1_Get_Multi_Master( FT_Face face, FT_Multi_Master* master ); FT_LOCAL( FT_Error ) - T1_Get_MM_Var( T1_Face face, + T1_Get_MM_Var( FT_Face face, FT_MM_Var* *master ); FT_LOCAL( FT_Error ) - T1_Set_MM_Blend( T1_Face face, + T1_Set_MM_Blend( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - T1_Get_MM_Blend( T1_Face face, + T1_Get_MM_Blend( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - T1_Set_MM_Design( T1_Face face, + T1_Set_MM_Design( FT_Face face, FT_UInt num_coords, FT_Long* coords ); FT_LOCAL( FT_Error ) - T1_Reset_MM_Blend( T1_Face face, + T1_Reset_MM_Blend( FT_Face face, FT_UInt instance_index ); FT_LOCAL( FT_Error ) - T1_Get_Var_Design( T1_Face face, + T1_Get_Var_Design( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( FT_Error ) - T1_Set_Var_Design( T1_Face face, + T1_Set_Var_Design( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); FT_LOCAL( void ) - T1_Done_Blend( T1_Face face ); + T1_Done_Blend( FT_Face face ); FT_LOCAL( FT_Error ) - T1_Set_MM_WeightVector( T1_Face face, + T1_Set_MM_WeightVector( FT_Face face, FT_UInt len, FT_Fixed* weightvector ); FT_LOCAL( FT_Error ) - T1_Get_MM_WeightVector( T1_Face face, + T1_Get_MM_WeightVector( FT_Face face, FT_UInt* len, FT_Fixed* weightvector ); diff --git a/src/3rdparty/freetype/src/type1/t1objs.c b/src/3rdparty/freetype/src/type1/t1objs.c index 1bb2f15f..69e4fd50 100644 --- a/src/3rdparty/freetype/src/type1/t1objs.c +++ b/src/3rdparty/freetype/src/type1/t1objs.c @@ -167,8 +167,7 @@ FT_Module module; - module = FT_Get_Module( slot->face->driver->root.library, - "pshinter" ); + module = FT_Get_Module( slot->library, "pshinter" ); if ( module ) { T1_Hints_Funcs funcs; @@ -227,7 +226,7 @@ face->len_buildchar = 0; } - T1_Done_Blend( face ); + T1_Done_Blend( t1face ); face->blend = NULL; #endif @@ -290,7 +289,8 @@ * * @Input: * stream :: - * input stream where to load font data. + * Dummy argument for compatibility with the `FT_Face_InitFunc` API. + * Ignored. The stream should be passed through `face->root.stream`. * * face_index :: * The index of the font face in the resource. diff --git a/src/3rdparty/freetype/src/type42/t42drivr.c b/src/3rdparty/freetype/src/type42/t42drivr.c index ce1528e5..ee5fd44a 100644 --- a/src/3rdparty/freetype/src/type42/t42drivr.c +++ b/src/3rdparty/freetype/src/type42/t42drivr.c @@ -56,33 +56,41 @@ * */ - static FT_Error - t42_get_glyph_name( T42_Face face, + FT_CALLBACK_DEF( FT_Error ) + t42_get_glyph_name( FT_Face face, /* T42_Face */ FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ) { - FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); + T42_Face t42face = (T42_Face)face; + + + FT_STRCPYN( buffer, + t42face->type1.glyph_names[glyph_index], + buffer_max ); return FT_Err_Ok; } - static FT_UInt - t42_get_name_index( T42_Face face, + FT_CALLBACK_DEF( FT_UInt ) + t42_get_name_index( FT_Face face, /* T42_Face */ const FT_String* glyph_name ) { - FT_Int i; + T42_Face t42face = (T42_Face)face; + FT_Int i; - for ( i = 0; i < face->type1.num_glyphs; i++ ) + for ( i = 0; i < t42face->type1.num_glyphs; i++ ) { - FT_String* gname = face->type1.glyph_names[i]; + FT_String* gname = t42face->type1.glyph_names[i]; if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) ) - return (FT_UInt)ft_strtol( (const char *)face->type1.charstrings[i], - NULL, 10 ); + return (FT_UInt)ft_strtol( + (const char *)t42face->type1.charstrings[i], + NULL, + 10 ); } return 0; @@ -102,10 +110,13 @@ * */ - static const char* - t42_get_ps_font_name( T42_Face face ) + FT_CALLBACK_DEF( const char* ) + t42_get_ps_font_name( FT_Face face ) /* T42_Face */ { - return (const char*)face->type1.font_name; + T42_Face t42face = (T42_Face)face; + + + return (const char*)t42face->type1.font_name; } @@ -121,7 +132,7 @@ * */ - static FT_Error + FT_CALLBACK_DEF( FT_Error ) t42_ps_get_font_info( FT_Face face, PS_FontInfoRec* afont_info ) { @@ -131,7 +142,7 @@ } - static FT_Error + FT_CALLBACK_DEF( FT_Error ) t42_ps_get_font_extra( FT_Face face, PS_FontExtraRec* afont_extra ) { @@ -141,7 +152,7 @@ } - static FT_Int + FT_CALLBACK_DEF( FT_Int ) t42_ps_has_glyph_names( FT_Face face ) { FT_UNUSED( face ); diff --git a/src/3rdparty/freetype/src/type42/t42parse.c b/src/3rdparty/freetype/src/type42/t42parse.c index 6d765c8c..f96a43b1 100644 --- a/src/3rdparty/freetype/src/type42/t42parse.c +++ b/src/3rdparty/freetype/src/type42/t42parse.c @@ -34,19 +34,19 @@ static void - t42_parse_font_matrix( T42_Face face, - T42_Loader loader ); + t42_parse_font_matrix( FT_Face face, + void* loader_ ); static void - t42_parse_encoding( T42_Face face, - T42_Loader loader ); + t42_parse_encoding( FT_Face face, + void* loader_ ); static void - t42_parse_charstrings( T42_Face face, - T42_Loader loader ); + t42_parse_charstrings( FT_Face face, + void* loader_ ); static void - t42_parse_sfnts( T42_Face face, - T42_Loader loader ); + t42_parse_sfnts( FT_Face face, + void* loader_ ); /* as Type42 fonts have no Private dict, */ @@ -241,12 +241,14 @@ static void - t42_parse_font_matrix( T42_Face face, - T42_Loader loader ) + t42_parse_font_matrix( FT_Face face, /* T42_Face */ + void* loader_ ) { - T42_Parser parser = &loader->parser; - FT_Matrix* matrix = &face->type1.font_matrix; - FT_Vector* offset = &face->type1.font_offset; + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; + T42_Parser parser = &loader->parser; + FT_Matrix* matrix = &t42face->type1.font_matrix; + FT_Vector* offset = &t42face->type1.font_offset; FT_Fixed temp[6]; FT_Fixed temp_scale; FT_Int result; @@ -299,14 +301,16 @@ static void - t42_parse_encoding( T42_Face face, - T42_Loader loader ) + t42_parse_encoding( FT_Face face, + void* loader_ ) { - T42_Parser parser = &loader->parser; + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; + T42_Parser parser = &loader->parser; FT_Byte* cur; - FT_Byte* limit = parser->root.limit; + FT_Byte* limit = parser->root.limit; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)t42face->psaux; T1_Skip_Spaces( parser ); @@ -322,7 +326,7 @@ /* and we must load it now */ if ( ft_isdigit( *cur ) || *cur == '[' ) { - T1_Encoding encode = &face->type1.encoding; + T1_Encoding encode = &t42face->type1.encoding; FT_Int count, n; PS_Table char_table = &loader->encoding_table; FT_Memory memory = parser->root.memory; @@ -493,8 +497,8 @@ T1_Skip_Spaces( parser ); } - face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; - parser->root.cursor = cur; + t42face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; } /* Otherwise, we should have either `StandardEncoding', */ @@ -503,15 +507,15 @@ { if ( cur + 17 < limit && ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + t42face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; else if ( cur + 15 < limit && ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + t42face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; else if ( cur + 18 < limit && ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) - face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + t42face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; else parser->root.error = FT_ERR( Ignore ); @@ -529,9 +533,11 @@ static void - t42_parse_sfnts( T42_Face face, - T42_Loader loader ) + t42_parse_sfnts( FT_Face face, + void* loader_ ) { + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; T42_Parser parser = &loader->parser; FT_Memory memory = parser->root.memory; FT_Byte* cur; @@ -548,8 +554,8 @@ T42_Load_Status status; /** There should only be one sfnts array, but free any previous. */ - FT_FREE( face->ttf_data ); - face->ttf_size = 0; + FT_FREE( t42face->ttf_data ); + t42face->ttf_size = 0; /* The format is */ /* */ @@ -580,7 +586,7 @@ old_string_size = 0; ttf_count = 0; ttf_reserved = 12; - if ( FT_QALLOC( face->ttf_data, ttf_reserved ) ) + if ( FT_QALLOC( t42face->ttf_data, ttf_reserved ) ) goto Fail; FT_TRACE2(( "\n" )); @@ -596,7 +602,7 @@ if ( *cur == ']' ) { parser->root.cursor++; - face->ttf_size = ttf_count; + t42face->ttf_size = ttf_count; goto Exit; } @@ -707,7 +713,7 @@ /* load offset table, 12 bytes */ if ( ttf_count < 12 ) { - face->ttf_data[ttf_count++] = string_buf[n]; + t42face->ttf_data[ttf_count++] = string_buf[n]; continue; } else @@ -715,7 +721,7 @@ FT_Long ttf_reserved_prev = ttf_reserved; - num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; + num_tables = 16 * t42face->ttf_data[4] + t42face->ttf_data[5]; status = BEFORE_TABLE_DIR; ttf_reserved = 12 + 16 * num_tables; @@ -729,7 +735,7 @@ goto Fail; } - if ( FT_QREALLOC( face->ttf_data, ttf_reserved_prev, + if ( FT_QREALLOC( t42face->ttf_data, ttf_reserved_prev, ttf_reserved ) ) goto Fail; } @@ -739,7 +745,7 @@ /* the offset table is read; read the table directory */ if ( ttf_count < ttf_reserved ) { - face->ttf_data[ttf_count++] = string_buf[n]; + t42face->ttf_data[ttf_count++] = string_buf[n]; continue; } else @@ -755,7 +761,7 @@ for ( i = 0; i < num_tables; i++ ) { - FT_Byte* p = face->ttf_data + 12 + 16 * i + 12; + FT_Byte* p = t42face->ttf_data + 12 + 16 * i + 12; len = FT_PEEK_ULONG( p ); @@ -781,7 +787,7 @@ FT_TRACE2(( " allocating %ld bytes\n", ttf_reserved )); FT_TRACE2(( "\n" )); - if ( FT_QREALLOC( face->ttf_data, ttf_reserved_prev, + if ( FT_QREALLOC( t42face->ttf_data, ttf_reserved_prev, ttf_reserved ) ) goto Fail; } @@ -795,7 +801,7 @@ error = FT_THROW( Invalid_File_Format ); goto Fail; } - face->ttf_data[ttf_count++] = string_buf[n]; + t42face->ttf_data[ttf_count++] = string_buf[n]; } } @@ -811,8 +817,8 @@ Exit: if ( parser->root.error ) { - FT_FREE( face->ttf_data ); - face->ttf_size = 0; + FT_FREE( t42face->ttf_data ); + t42face->ttf_size = 0; } if ( allocated ) FT_FREE( string_buf ); @@ -820,9 +826,11 @@ static void - t42_parse_charstrings( T42_Face face, - T42_Loader loader ) + t42_parse_charstrings( FT_Face face, /* T42_Face */ + void* loader_ ) { + T42_Face t42face = (T42_Face)face; + T42_Loader loader = (T42_Loader)loader_; T42_Parser parser = &loader->parser; PS_Table code_table = &loader->charstrings; PS_Table name_table = &loader->glyph_names; @@ -830,7 +838,7 @@ FT_Memory memory = parser->root.memory; FT_Error error; - PSAux_Service psaux = (PSAux_Service)face->psaux; + PSAux_Service psaux = (PSAux_Service)t42face->psaux; FT_Byte* cur; FT_Byte* limit = parser->root.limit; @@ -864,7 +872,7 @@ if ( loader->num_glyphs > ( limit - parser->root.cursor ) >> 2 ) { FT_TRACE0(( "t42_parse_charstrings: adjusting number of glyphs" - " (from %d to %ld)\n", + " (from %d to %zu)\n", loader->num_glyphs, ( limit - parser->root.cursor ) >> 2 )); loader->num_glyphs = ( limit - parser->root.cursor ) >> 2; diff --git a/src/3rdparty/freetype/src/winfonts/winfnt.c b/src/3rdparty/freetype/src/winfonts/winfnt.c index fa73ae4a..1160e4ef 100644 --- a/src/3rdparty/freetype/src/winfonts/winfnt.c +++ b/src/3rdparty/freetype/src/winfonts/winfnt.c @@ -624,31 +624,34 @@ static FT_Error - fnt_cmap_init( FNT_CMap cmap, + fnt_cmap_init( FT_CMap cmap, /* FNT_CMap */ FT_Pointer pointer ) { - FNT_Face face = (FNT_Face)FT_CMAP_FACE( cmap ); - FNT_Font font = face->font; + FNT_CMap fntcmap = (FNT_CMap)cmap; + FNT_Face face = (FNT_Face)FT_CMAP_FACE( cmap ); + FNT_Font font = face->font; FT_UNUSED( pointer ); - cmap->first = (FT_UInt32) font->header.first_char; - cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 ); + fntcmap->first = (FT_UInt32)font->header.first_char; + fntcmap->count = (FT_UInt32)( font->header.last_char - + fntcmap->first + 1 ); return 0; } static FT_UInt - fnt_cmap_char_index( FNT_CMap cmap, + fnt_cmap_char_index( FT_CMap cmap, /* FNT_CMap */ FT_UInt32 char_code ) { - FT_UInt gindex = 0; + FNT_CMap fntcmap = (FNT_CMap)cmap; + FT_UInt gindex = 0; - char_code -= cmap->first; - if ( char_code < cmap->count ) + char_code -= fntcmap->first; + if ( char_code < fntcmap->count ) /* we artificially increase the glyph index; */ /* FNT_Load_Glyph reverts to the right one */ gindex = (FT_UInt)( char_code + 1 ); @@ -656,26 +659,27 @@ } - static FT_UInt32 - fnt_cmap_char_next( FNT_CMap cmap, + static FT_UInt + fnt_cmap_char_next( FT_CMap cmap, /* FNT_CMap */ FT_UInt32 *pchar_code ) { - FT_UInt gindex = 0; - FT_UInt32 result = 0; + FNT_CMap fntcmap = (FNT_CMap)cmap; + FT_UInt gindex = 0; + FT_UInt32 result = 0; FT_UInt32 char_code = *pchar_code + 1; - if ( char_code <= cmap->first ) + if ( char_code <= fntcmap->first ) { - result = cmap->first; + result = fntcmap->first; gindex = 1; } else { - char_code -= cmap->first; - if ( char_code < cmap->count ) + char_code -= fntcmap->first; + if ( char_code < fntcmap->count ) { - result = cmap->first + char_code; + result = fntcmap->first + char_code; gindex = (FT_UInt)( char_code + 1 ); } } diff --git a/src/3rdparty/harfbuzz-ng/CMakeLists.txt b/src/3rdparty/harfbuzz-ng/CMakeLists.txt index c761bda3..96e21941 100644 --- a/src/3rdparty/harfbuzz-ng/CMakeLists.txt +++ b/src/3rdparty/harfbuzz-ng/CMakeLists.txt @@ -58,6 +58,7 @@ qt_internal_add_3rdparty_library(BundledHarfbuzz src/hb-subset-input.cc src/hb-subset-instancer-solver.cc src/hb-subset-plan.cc + src/hb-subset-plan-member-list.hh src/hb-subset-repacker.cc src/hb-subset-repacker.h src/hb-unicode.cc src/hb-unicode.h src/hb-unicode.hh src/hb-utf.hh diff --git a/src/3rdparty/harfbuzz-ng/NEWS b/src/3rdparty/harfbuzz-ng/NEWS index e53a244f..35e9eefd 100644 --- a/src/3rdparty/harfbuzz-ng/NEWS +++ b/src/3rdparty/harfbuzz-ng/NEWS @@ -1,3 +1,114 @@ +Overview of changes leading to 8.2.0 +Friday, September 8, 2023 +==================================== +- Various build and fuzzing fixes +- Improvements to COLRv1 painting. + +- New API: ++hb_paint_color_glyph_func_t ++hb_paint_funcs_set_color_glyph_func ++hb_paint_color_glyph + + +Overview of changes leading to 8.1.1 +Wednesday, August 2, 2023 +==================================== +- Fix shaping of contextual rules at the end of string, introduced in 8.1.0 +- Fix stack-overflow in repacker with malicious fonts. +- 30% speed up loading Noto Duployan font. + + +Overview of changes leading to 8.1.0 +Tuesday, August 1, 2023 +==================================== +- Fix long-standing build issue with the AIX compiler and older Apple clang. + +- Revert optimization that could cause timeout during subsetting with malicious fonts. + +- More optimization work: + - 45% speed up in shaping Noto Duployan font. + - 10% speed up in subsetting Noto Duployan font. + - Another 8% speed up in shaping Gulzar. + - 5% speed up in loading Roboto. + +- New API: ++hb_ot_layout_collect_features_map() + + +Overview of changes leading to 8.0.1 +Wednesday, July 12, 2023 +==================================== +- Build fix on 32-bit ARM. + +- More speed optimizations: + - 60% speed up in retain-gid (used for IFT) subsetting of SourceHanSans-VF. + - 16% speed up in retain-gid (used for IFT) subsetting of NotoSansCJKkr. + - 38% speed up in subsetting (beyond-64k) mega-merged Noto. + + +Overview of changes leading to 8.0.0 +Sunday, July 9, 2023 +==================================== +- New, experimental, WebAssembly (WASM) shaper, that provides greater + flexibility over OpenType/AAT/Graphite shaping, using WebAssembly embedded + inside the font file. Currently WASM shaper is disabled by default and needs + to be enabled at build time. For details, see: + + https://github.com/harfbuzz/harfbuzz/blob/main/docs/wasm-shaper.md + + For example fonts making use of the WASM shaper, see: + + https://github.com/harfbuzz/harfbuzz-wasm-examples + +- Improvements to Experimental features introduced in earlier releases: + - Support for subsetting beyond-64k and VarComposites fonts. + - Support for instancing variable fonts with cubic “glyf” table. + +- Many big speed optimizations: + - Up to 89% speedup loading variable fonts for shaping. + - Up to 88% speedup in small subsets of large (eg. CJK) fonts (both TTF and + OTF), essential for Incremental Font Transfer (IFT). + - Over 50% speedup in loading Roboto font for shaping. + - Up to 40% speed up in loading (sanitizing) complex fonts. + - 30% speed up in shaping Gulzar font. + - Over 25% speedup in glyph loading Roboto font. + - 10% speed up loading glyph shapes in VarComposite Hangul font. + - hb-hashmap optimizations & hashing improvements. + +- New macro HB_ALWAYS_INLINE. HarfBuzz now inlines functions more aggressively, + which results in some speedup at the expense of bigger code size. To disable + this feature define the macro to just inline. + +- New API: ++HB_CODEPOINT_INVALID ++hb_ot_layout_get_baseline2() ++hb_ot_layout_get_baseline_with_fallback2() ++hb_ot_layout_get_font_extents() ++hb_ot_layout_get_font_extents2() ++hb_subset_input_set_axis_range() + + +Overview of changes leading to 7.3.0 +Tuesday, May 9, 2023 +==================================== +- Speedup applying glyph variation in VarComposites fonts (over 40% speedup). + (Behdad Esfahbod) +- Speedup instancing some fonts (over 20% speedup in instancing RobotoFlex). + (Behdad Esfahbod) +- Speedup shaping some fonts (over 30% speedup in shaping Roboto). + (Behdad Esfahbod) +- Support subsetting VarComposites and beyond-64k fonts. (Behdad Esfahbod) +- New configuration macro HB_MINIMIZE_MEMORY_USAGE to favor optimizing memory + usage over speed. (Behdad Esfahbod) +- Supporting setting the mapping between old and new glyph indices during + subsetting. (Garret Rieger) +- Various fixes and improvements. + (Behdad Esfahbod, Denis Rochette, Garret Rieger, Han Seung Min, Qunxin Liu) + +- New API: ++hb_subset_input_old_to_new_glyph_mapping() + + Overview of changes leading to 7.2.0 Thursday, April 27, 2023 ==================================== diff --git a/src/3rdparty/harfbuzz-ng/README.md b/src/3rdparty/harfbuzz-ng/README.md index 4202961e..099d4b77 100644 --- a/src/3rdparty/harfbuzz-ng/README.md +++ b/src/3rdparty/harfbuzz-ng/README.md @@ -5,13 +5,16 @@ [![Codacy Badge](https://app.codacy.com/project/badge/Grade/89c872f5ce1c42af802602bfcd15d90a)](https://www.codacy.com/gh/harfbuzz/harfbuzz/dashboard?utm_source=github.com&utm_medium=referral&utm_content=harfbuzz/harfbuzz&utm_campaign=Badge_Grade) [![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/main/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz) [![Packaging status](https://repology.org/badge/tiny-repos/harfbuzz.svg)](https://repology.org/project/harfbuzz/versions) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/harfbuzz/harfbuzz/badge)](https://securityscorecards.dev/viewer/?uri=github.com/harfbuzz/harfbuzz) + # HarfBuzz HarfBuzz is a text shaping engine. It primarily supports [OpenType][1], but also [Apple Advanced Typography][2]. HarfBuzz is used in Android, Chrome, -ChromeOS, Firefox, GNOME, GTK+, KDE, LibreOffice, OpenJDK, PlayStation, Qt, -XeTeX, and other places. +ChromeOS, Firefox, GNOME, GTK+, KDE, Qt, LibreOffice, OpenJDK, XeTeX, +PlayStation, Microsoft Edge, Photoshop, Illustrator, InDesign, +and other places. For bug reports, mailing list, and other information please visit: @@ -26,8 +29,8 @@ For user manual as well as API documentation, check: https://harfbuzz.github.io ## Download For tarball releases of HarfBuzz, look [here][3]. At the same place you -will also find Win32/Win64 binary bundles that include libharfbuzz DLL, -hb-view.exe, hb-shape.exe, and all dependencies. +will also find Win32/Win64 binary bundles that include `libharfbuzz` DLL, +`hb-view.exe`, `hb-shape.exe`, and all dependencies. The canonical source tree is available on [github][4]. diff --git a/src/3rdparty/harfbuzz-ng/qt_attribution.json b/src/3rdparty/harfbuzz-ng/qt_attribution.json index b1ca7db3..7533dab1 100644 --- a/src/3rdparty/harfbuzz-ng/qt_attribution.json +++ b/src/3rdparty/harfbuzz-ng/qt_attribution.json @@ -7,8 +7,8 @@ "Description": "HarfBuzz is an OpenType text shaping engine.", "Homepage": "http://harfbuzz.org", - "Version": "7.2.0", - "DownloadLocation": "https://github.com/harfbuzz/harfbuzz/releases/tag/7.2.0", + "Version": "8.2.0", + "DownloadLocation": "https://github.com/harfbuzz/harfbuzz/releases/tag/8.2.0", "License": "MIT License", "LicenseId": "MIT", diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh b/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh index b1250523..457039bf 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Color/CBDT/CBDT.hh @@ -397,7 +397,6 @@ struct IndexSubtableRecord TRACE_SERIALIZE (this); auto *subtable = c->serializer->start_embed (); - if (unlikely (!subtable)) return_trace (false); if (unlikely (!c->serializer->extend_min (subtable))) return_trace (false); auto *old_subtable = get_subtable (base); @@ -545,7 +544,8 @@ struct IndexSubtableArray const IndexSubtableRecord*>> *lookup /* OUT */) const { bool start_glyph_is_set = false; - for (hb_codepoint_t new_gid = 0; new_gid < c->plan->num_output_glyphs (); new_gid++) + unsigned num_glyphs = c->plan->num_output_glyphs (); + for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++) { hb_codepoint_t old_gid; if (unlikely (!c->plan->old_gid_for_new_gid (new_gid, &old_gid))) continue; @@ -576,9 +576,6 @@ struct IndexSubtableArray { TRACE_SUBSET (this); - auto *dst = c->serializer->start_embed (); - if (unlikely (!dst)) return_trace (false); - hb_vector_t> lookup; build_lookup (c, bitmap_size_context, &lookup); if (unlikely (!c->serializer->propagate_error (lookup))) @@ -993,12 +990,10 @@ CBLC::subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - auto *cblc_prime = c->serializer->start_embed (); - // Use a vector as a secondary buffer as the tables need to be built in parallel. hb_vector_t cbdt_prime; - if (unlikely (!cblc_prime)) return_trace (false); + auto *cblc_prime = c->serializer->start_embed (); if (unlikely (!c->serializer->extend_min (cblc_prime))) return_trace (false); cblc_prime->version = version; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh b/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh index 191812f4..60b094ec 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Color/COLR/COLR.hh @@ -53,6 +53,7 @@ struct Paint; struct hb_paint_context_t : hb_dispatch_context_t { + const char *get_name () { return "PAINT"; } template return_t dispatch (const T &obj) { obj.paint_glyph (this); return hb_empty_t (); } static return_t default_return_value () { return hb_empty_t (); } @@ -68,6 +69,8 @@ public: unsigned int palette_index; hb_color_t foreground; VarStoreInstancer &instancer; + hb_map_t current_glyphs; + hb_map_t current_layers; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; @@ -261,6 +264,7 @@ struct Variable void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); value.paint_glyph (c, varIdxBase); } @@ -281,7 +285,7 @@ struct Variable public: VarIdx varIdxBase; public: - DEFINE_SIZE_STATIC (4 + T::static_size); + DEFINE_SIZE_MIN (VarIdx::static_size + T::min_size); }; template @@ -315,6 +319,7 @@ struct NoVariable void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); value.paint_glyph (c, varIdxBase); } @@ -332,7 +337,7 @@ struct NoVariable T value; public: - DEFINE_SIZE_STATIC (T::static_size); + DEFINE_SIZE_MIN (T::min_size); }; // Color structures @@ -409,7 +414,6 @@ struct ColorLine { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (this); - if (unlikely (!out)) return_trace (false); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); if (!c->serializer->check_assign (out->extend, extend, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false); @@ -559,6 +563,7 @@ struct Affine2x3 void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); c->funcs->push_transform (c->data, xx.to_float (c->instancer (varIdxBase, 0)), yx.to_float (c->instancer (varIdxBase, 1)), @@ -640,6 +645,7 @@ struct PaintSolid void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_bool_t is_foreground; hb_color_t color; @@ -694,6 +700,7 @@ struct PaintLinearGradient void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_color_line_t cl = { (void *) &(this+colorLine), (this+colorLine).static_get_color_stops, c, @@ -760,6 +767,7 @@ struct PaintRadialGradient void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_color_line_t cl = { (void *) &(this+colorLine), (this+colorLine).static_get_color_stops, c, @@ -824,6 +832,7 @@ struct PaintSweepGradient void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_color_line_t cl = { (void *) &(this+colorLine), (this+colorLine).static_get_color_stops, c, @@ -875,6 +884,7 @@ struct PaintGlyph void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); c->funcs->push_inverse_root_transform (c->data, c->font); c->funcs->push_clip_glyph (c->data, gid, c->font); c->funcs->push_root_transform (c->data, c->font); @@ -947,6 +957,7 @@ struct PaintTransform void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); (this+transform).paint_glyph (c); c->recurse (this+src); c->funcs->pop_transform (c->data); @@ -991,6 +1002,7 @@ struct PaintTranslate void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float ddx = dx + c->instancer (varIdxBase, 0); float ddy = dy + c->instancer (varIdxBase, 1); @@ -1039,6 +1051,7 @@ struct PaintScale void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = scaleX.to_float (c->instancer (varIdxBase, 0)); float sy = scaleY.to_float (c->instancer (varIdxBase, 1)); @@ -1089,6 +1102,7 @@ struct PaintScaleAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = scaleX.to_float (c->instancer (varIdxBase, 0)); float sy = scaleY.to_float (c->instancer (varIdxBase, 1)); float tCenterX = centerX + c->instancer (varIdxBase, 2); @@ -1142,6 +1156,7 @@ struct PaintScaleUniform void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float s = scale.to_float (c->instancer (varIdxBase, 0)); bool p1 = c->funcs->push_scale (c->data, s, s); @@ -1189,6 +1204,7 @@ struct PaintScaleUniformAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float s = scale.to_float (c->instancer (varIdxBase, 0)); float tCenterX = centerX + c->instancer (varIdxBase, 1); float tCenterY = centerY + c->instancer (varIdxBase, 2); @@ -1240,6 +1256,7 @@ struct PaintRotate void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float a = angle.to_float (c->instancer (varIdxBase, 0)); bool p1 = c->funcs->push_rotate (c->data, a); @@ -1287,6 +1304,7 @@ struct PaintRotateAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float a = angle.to_float (c->instancer (varIdxBase, 0)); float tCenterX = centerX + c->instancer (varIdxBase, 1); float tCenterY = centerY + c->instancer (varIdxBase, 2); @@ -1341,6 +1359,7 @@ struct PaintSkew void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0)); float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1)); @@ -1391,6 +1410,7 @@ struct PaintSkewAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0)); float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1)); float tCenterX = centerX + c->instancer (varIdxBase, 2); @@ -1426,20 +1446,24 @@ struct PaintComposite auto *out = c->serializer->embed (this); if (unlikely (!out)) return_trace (false); - if (!out->src.serialize_subset (c, src, this, instancer)) return_trace (false); - return_trace (out->backdrop.serialize_subset (c, backdrop, this, instancer)); + bool ret = false; + ret |= out->src.serialize_subset (c, src, this, instancer); + ret |= out->backdrop.serialize_subset (c, backdrop, this, instancer); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && + c->check_ops (this->min_size) && // PainComposite can get exponential src.sanitize (c, this) && backdrop.sanitize (c, this)); } void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); c->recurse (this+backdrop); c->funcs->push_group (c->data); c->recurse (this+src); @@ -1514,10 +1538,10 @@ struct ClipBoxFormat2 : Variable value.get_clip_box(clip_box, instancer); if (instancer) { - clip_box.xMin += _hb_roundf (instancer (varIdxBase, 0)); - clip_box.yMin += _hb_roundf (instancer (varIdxBase, 1)); - clip_box.xMax += _hb_roundf (instancer (varIdxBase, 2)); - clip_box.yMax += _hb_roundf (instancer (varIdxBase, 3)); + clip_box.xMin += roundf (instancer (varIdxBase, 0)); + clip_box.yMin += roundf (instancer (varIdxBase, 1)); + clip_box.xMax += roundf (instancer (varIdxBase, 2)); + clip_box.yMax += roundf (instancer (varIdxBase, 3)); } } }; @@ -1898,15 +1922,16 @@ struct LayerList : Array32OfOffset32To auto *out = c->serializer->start_embed (this); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + bool ret = false; for (const auto& _ : + hb_enumerate (*this) | hb_filter (c->plan->colrv1_layers, hb_first)) { auto *o = out->serialize_append (c->serializer); - if (unlikely (!o) || !o->serialize_subset (c, _.second, this, instancer)) - return_trace (false); + if (unlikely (!o)) return_trace (false); + ret |= o->serialize_subset (c, _.second, this, instancer); } - return_trace (true); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const @@ -2167,7 +2192,7 @@ struct COLR if (version == 0 && (!base_it || !layer_it)) return_trace (false); - COLR *colr_prime = c->serializer->start_embed (); + auto *colr_prime = c->serializer->start_embed (); if (unlikely (!c->serializer->extend_min (colr_prime))) return_trace (false); if (version == 0) @@ -2284,6 +2309,7 @@ struct COLR &(this+varIdxMap), hb_array (font->coords, font->num_coords)); hb_paint_context_t c (this, funcs, data, font, palette_index, foreground, instancer); + c.current_glyphs.add (glyph); if (version == 1) { @@ -2399,18 +2425,42 @@ hb_paint_context_t::recurse (const Paint &paint) void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); const LayerList &paint_offset_lists = c->get_colr_table ()->get_layerList (); for (unsigned i = firstLayerIndex; i < firstLayerIndex + numLayers; i++) { + if (unlikely (c->current_layers.has (i))) + continue; + + c->current_layers.add (i); + const Paint &paint = paint_offset_lists.get_paint (i); c->funcs->push_group (c->data); c->recurse (paint); c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); + + c->current_layers.del (i); } } void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); + + if (unlikely (c->current_glyphs.has (gid))) + return; + + c->current_glyphs.add (gid); + + c->funcs->push_inverse_root_transform (c->data, c->font); + if (c->funcs->color_glyph (c->data, gid, c->font)) + { + c->funcs->pop_transform (c->data); + c->current_glyphs.del (gid); + return; + } + c->funcs->pop_transform (c->data); + const COLR *colr_table = c->get_colr_table (); const Paint *paint = colr_table->get_base_glyph_paint (gid); @@ -2429,6 +2479,8 @@ void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const if (has_clip_box) c->funcs->pop_clip (c->data); + + c->current_glyphs.del (gid); } } /* namespace OT */ diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh b/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh index 46ad3fd5..ce8693cf 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Color/sbix/sbix.hh @@ -48,7 +48,6 @@ struct SBIXGlyph { TRACE_SERIALIZE (this); SBIXGlyph* new_glyph = c->start_embed (); - if (unlikely (!new_glyph)) return_trace (nullptr); if (unlikely (!c->extend_min (new_glyph))) return_trace (nullptr); new_glyph->xOffset = xOffset; @@ -143,7 +142,6 @@ struct SBIXStrike unsigned int num_output_glyphs = c->plan->num_output_glyphs (); auto* out = c->serializer->start_embed (); - if (unlikely (!out)) return_trace (false); auto snap = c->serializer->snapshot (); if (unlikely (!c->serializer->extend (out, num_output_glyphs + 1))) return_trace (false); out->ppem = ppem; @@ -388,7 +386,6 @@ struct sbix TRACE_SERIALIZE (this); auto *out = c->serializer->start_embed> (); - if (unlikely (!out)) return_trace (false); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); hb_vector_t*> new_strikes; @@ -423,8 +420,6 @@ struct sbix { TRACE_SUBSET (this); - sbix *sbix_prime = c->serializer->start_embed (); - if (unlikely (!sbix_prime)) return_trace (false); if (unlikely (!c->serializer->embed (this->version))) return_trace (false); if (unlikely (!c->serializer->embed (this->flags))) return_trace (false); diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh index d35654e2..25056c9b 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/Coverage.hh @@ -57,6 +57,9 @@ struct Coverage public: DEFINE_SIZE_UNION (2, format); +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -113,22 +116,33 @@ struct Coverage TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (this))) return_trace (false); - unsigned count = 0; + unsigned count = hb_len (glyphs); unsigned num_ranges = 0; hb_codepoint_t last = (hb_codepoint_t) -2; + hb_codepoint_t max = 0; + bool unsorted = false; for (auto g: glyphs) { + if (last != (hb_codepoint_t) -2 && g < last) + unsorted = true; if (last + 1 != g) - num_ranges++; + num_ranges++; last = g; - count++; + if (g > max) max = g; } - u.format = count <= num_ranges * 3 ? 1 : 2; + u.format = !unsorted && count <= num_ranges * 3 ? 1 : 2; #ifndef HB_NO_BEYOND_64K - if (count && last > 0xFFFFu) + if (max > 0xFFFFu) u.format += 2; + if (unlikely (max > 0xFFFFFFu)) +#else + if (unlikely (max > 0xFFFFu)) #endif + { + c->check_success (false, HB_SERIALIZE_ERROR_INT_OVERFLOW); + return_trace (false); + } switch (u.format) { @@ -148,8 +162,8 @@ struct Coverage auto it = + iter () | hb_take (c->plan->source->get_num_glyphs ()) - | hb_filter (c->plan->glyph_map_gsub) | hb_map_retains_sorting (c->plan->glyph_map_gsub) + | hb_filter ([] (hb_codepoint_t glyph) { return glyph != HB_MAP_VALUE_INVALID; }) ; // Cache the iterator result as it will be iterated multiple times diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh index 5d68e3d1..3f598d40 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat1.hh @@ -79,7 +79,7 @@ struct CoverageFormat1_3 { if (glyphArray.len > glyphs->get_population () * hb_bit_storage ((unsigned) glyphArray.len) / 2) { - for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);) + for (auto g : *glyphs) if (get_coverage (g) != NOT_COVERED) return true; return false; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh index d7fcc352..9c875423 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/CoverageFormat2.hh @@ -95,19 +95,26 @@ struct CoverageFormat2_4 unsigned count = 0; unsigned range = (unsigned) -1; last = (hb_codepoint_t) -2; + unsigned unsorted = false; for (auto g: glyphs) { if (last + 1 != g) { + if (unlikely (last != (hb_codepoint_t) -2 && last + 1 > g)) + unsorted = true; + range++; - rangeRecord[range].first = g; - rangeRecord[range].value = count; + rangeRecord.arrayZ[range].first = g; + rangeRecord.arrayZ[range].value = count; } - rangeRecord[range].last = g; + rangeRecord.arrayZ[range].last = g; last = g; count++; } + if (unlikely (unsorted)) + rangeRecord.as_array ().qsort (RangeRecord::cmp_range); + return_trace (true); } @@ -115,7 +122,7 @@ struct CoverageFormat2_4 { if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2) { - for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);) + for (auto g : *glyphs) if (get_coverage (g) != NOT_COVERED) return true; return false; @@ -185,8 +192,8 @@ struct CoverageFormat2_4 if (__more__ ()) { unsigned int old = coverage; - j = c->rangeRecord[i].first; - coverage = c->rangeRecord[i].value; + j = c->rangeRecord.arrayZ[i].first; + coverage = c->rangeRecord.arrayZ[i].value; if (unlikely (coverage != old + 1)) { /* Broken table. Skip. Important to avoid DoS. diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh index a62629fa..85aacace 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/Common/RangeRecord.hh @@ -51,6 +51,18 @@ struct RangeRecord int cmp (hb_codepoint_t g) const { return g < first ? -1 : g <= last ? 0 : +1; } + HB_INTERNAL static int cmp_range (const void *pa, const void *pb) { + const RangeRecord *a = (const RangeRecord *) pa; + const RangeRecord *b = (const RangeRecord *) pb; + if (a->first < b->first) return -1; + if (a->first > b->first) return +1; + if (a->last < b->last) return -1; + if (a->last > b->last) return +1; + if (a->value < b->value) return -1; + if (a->value > b->value) return +1; + return 0; + } + unsigned get_population () const { if (unlikely (last < first)) return 0; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh index 0551fcf8..4f85d3ce 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GDEF/GDEF.hh @@ -32,6 +32,7 @@ #include "../../../hb-ot-layout-common.hh" #include "../../../hb-font.hh" +#include "../../../hb-cache.hh" namespace OT { @@ -48,8 +49,6 @@ struct AttachPoint : Array16Of { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (*this); - if (unlikely (!out)) return_trace (false); - return_trace (out->serialize (c->serializer, + iter ())); } }; @@ -201,7 +200,6 @@ struct CaretValueFormat3 { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (*this); - if (unlikely (!out)) return_trace (false); if (!c->serializer->embed (caretValueFormat)) return_trace (false); if (!c->serializer->embed (coordinate)) return_trace (false); @@ -441,6 +439,16 @@ struct MarkGlyphSetsFormat1 bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; } + template + void collect_coverage (hb_vector_t &sets) const + { + for (const auto &offset : coverage) + { + const auto &cov = this+offset; + cov.collect_coverage (sets.push ()); + } + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -494,6 +502,15 @@ struct MarkGlyphSets } } + template + void collect_coverage (hb_vector_t &sets) const + { + switch (u.format) { + case 1: u.format1.collect_coverage (sets); return; + default:return; + } + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -858,10 +875,47 @@ struct GDEF hb_blob_destroy (table.get_blob ()); table = hb_blob_get_empty (); } + +#ifndef HB_NO_GDEF_CACHE + table->get_mark_glyph_sets ().collect_coverage (mark_glyph_set_digests); +#endif } ~accelerator_t () { table.destroy (); } + unsigned int get_glyph_props (hb_codepoint_t glyph) const + { + unsigned v; + +#ifndef HB_NO_GDEF_CACHE + if (glyph_props_cache.get (glyph, &v)) + return v; +#endif + + v = table->get_glyph_props (glyph); + +#ifndef HB_NO_GDEF_CACHE + if (likely (table.get_blob ())) // Don't try setting if we are the null instance! + glyph_props_cache.set (glyph, v); +#endif + + return v; + + } + + bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const + { + return +#ifndef HB_NO_GDEF_CACHE + mark_glyph_set_digests[set_index].may_have (glyph_id) && +#endif + table->mark_set_covers (set_index, glyph_id); + } + hb_blob_ptr_t table; +#ifndef HB_NO_GDEF_CACHE + hb_vector_t mark_glyph_set_digests; + mutable hb_cache_t<21, 3, 8> glyph_props_cache; +#endif }; void collect_variation_indices (hb_collect_variation_indices_context_t *c) const diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh index e7e3c5c6..8684f60c 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorFormat3.hh @@ -25,7 +25,9 @@ struct AnchorFormat3 bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this)); + if (unlikely (!c->check_struct (this))) return_trace (false); + + return_trace (xDeviceTable.sanitize (c, this) && yDeviceTable.sanitize (c, this)); } void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED, @@ -35,9 +37,9 @@ struct AnchorFormat3 *x = font->em_fscale_x (xCoordinate); *y = font->em_fscale_y (yCoordinate); - if (font->x_ppem || font->num_coords) + if ((font->x_ppem || font->num_coords) && xDeviceTable.sanitize (&c->sanitizer, this)) *x += (this+xDeviceTable).get_x_delta (font, c->var_store, c->var_store_cache); - if (font->y_ppem || font->num_coords) + if ((font->y_ppem || font->num_coords) && yDeviceTable.sanitize (&c->sanitizer, this)) *y += (this+yDeviceTable).get_y_delta (font, c->var_store, c->var_store_cache); } @@ -45,7 +47,6 @@ struct AnchorFormat3 { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (*this); - if (unlikely (!out)) return_trace (false); if (unlikely (!c->serializer->embed (format))) return_trace (false); if (unlikely (!c->serializer->embed (xCoordinate))) return_trace (false); if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false); diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh index c442efa1..37ba7916 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/AnchorMatrix.hh @@ -21,18 +21,25 @@ struct AnchorMatrix if (unlikely (hb_unsigned_mul_overflows (rows, cols))) return_trace (false); unsigned int count = rows * cols; if (!c->check_array (matrixZ.arrayZ, count)) return_trace (false); + + if (c->lazy_some_gpos) + return_trace (true); + for (unsigned int i = 0; i < count; i++) if (!matrixZ[i].sanitize (c, this)) return_trace (false); return_trace (true); } - const Anchor& get_anchor (unsigned int row, unsigned int col, - unsigned int cols, bool *found) const + const Anchor& get_anchor (hb_ot_apply_context_t *c, + unsigned int row, unsigned int col, + unsigned int cols, bool *found) const { *found = false; if (unlikely (row >= rows || col >= cols)) return Null (Anchor); - *found = !matrixZ[row * cols + col].is_null (); - return this+matrixZ[row * cols + col]; + auto &offset = matrixZ[row * cols + col]; + if (unlikely (!offset.sanitize (&c->sanitizer, this))) return Null (Anchor); + *found = !offset.is_null (); + return this+offset; } template serializer->extend_min (out))) return_trace (false); out->rows = num_rows; + bool ret = false; for (const unsigned i : index_iter) { auto *offset = c->serializer->embed (matrixZ[i]); if (!offset) return_trace (false); - offset->serialize_subset (c, matrixZ[i], this); + ret |= offset->serialize_subset (c, matrixZ[i], this); } - return_trace (true); + return_trace (ret); } }; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh index ff255e09..7c42c3f7 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -24,16 +24,17 @@ struct EntryExitRecord (src_base+exitAnchor).collect_variation_indices (c); } - EntryExitRecord* subset (hb_subset_context_t *c, - const void *src_base) const + bool subset (hb_subset_context_t *c, + const void *src_base) const { TRACE_SERIALIZE (this); auto *out = c->serializer->embed (this); - if (unlikely (!out)) return_trace (nullptr); + if (unlikely (!out)) return_trace (false); - out->entryAnchor.serialize_subset (c, entryAnchor, src_base); - out->exitAnchor.serialize_subset (c, exitAnchor, src_base); - return_trace (out); + bool ret = false; + ret |= out->entryAnchor.serialize_subset (c, entryAnchor, src_base); + ret |= out->exitAnchor.serialize_subset (c, exitAnchor, src_base); + return_trace (ret); } protected: @@ -91,7 +92,13 @@ struct CursivePosFormat1 bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this)); + if (unlikely (!coverage.sanitize (c, this))) + return_trace (false); + + if (c->lazy_some_gpos) + return_trace (entryExitRecord.sanitize_shallow (c)); + else + return_trace (entryExitRecord.sanitize (c, this)); } bool intersects (const hb_set_t *glyphs) const @@ -119,19 +126,21 @@ struct CursivePosFormat1 hb_buffer_t *buffer = c->buffer; const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; - if (!this_record.entryAnchor) return_trace (false); + if (!this_record.entryAnchor || + unlikely (!this_record.entryAnchor.sanitize (&c->sanitizer, this))) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); unsigned unsafe_from; - if (!skippy_iter.prev (&unsafe_from)) + if (unlikely (!skippy_iter.prev (&unsafe_from))) { buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1); return_trace (false); } const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)]; - if (!prev_record.exitAnchor) + if (!prev_record.exitAnchor || + unlikely (!prev_record.exitAnchor.sanitize (&c->sanitizer, this))) { buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1); return_trace (false); @@ -200,8 +209,8 @@ struct CursivePosFormat1 * Arabic. */ unsigned int child = i; unsigned int parent = j; - hb_position_t x_offset = entry_x - exit_x; - hb_position_t y_offset = entry_y - exit_y; + hb_position_t x_offset = roundf (entry_x - exit_x); + hb_position_t y_offset = roundf (entry_y - exit_y); if (!(c->lookup_props & LookupFlag::RightToLeft)) { unsigned int k = child; @@ -278,7 +287,6 @@ struct CursivePosFormat1 const hb_map_t &glyph_map = *c->plan->glyph_map; auto *out = c->serializer->start_embed (*this); - if (unlikely (!out)) return_trace (false); auto it = + hb_zip (this+coverage, entryExitRecord) diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh index 9493ec98..f4af98b2 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/GPOS.hh @@ -156,7 +156,7 @@ GPOS::position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) { for (unsigned i = 0; i < len; i++) if (unlikely (pos[i].y_offset)) - pos[i].x_offset += _hb_roundf (font->slant_xy * pos[i].y_offset); + pos[i].x_offset += roundf (font->slant_xy * pos[i].y_offset); } } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh index a2d807cc..59cca40a 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/LigatureArray.hh @@ -27,6 +27,7 @@ struct LigatureArray : List16OfOffset16To auto *out = c->serializer->start_embed (this); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + bool ret = false; for (const auto _ : + hb_zip (coverage, *this) | hb_filter (glyphset, hb_first)) { @@ -38,13 +39,13 @@ struct LigatureArray : List16OfOffset16To + hb_range (src.rows * class_count) | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); }) ; - matrix->serialize_subset (c, - _.second, - this, - src.rows, - indexes); + ret |= matrix->serialize_subset (c, + _.second, + this, + src.rows, + indexes); } - return_trace (this->len); + return_trace (ret); } }; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh index ff43ffb8..0887cc15 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkArray.hh @@ -28,7 +28,7 @@ struct MarkArray : Array16Of /* Array of MarkRecords--in Cove const Anchor& mark_anchor = this + record.markAnchor; bool found; - const Anchor& glyph_anchor = anchors.get_anchor (glyph_index, mark_class, class_count, &found); + const Anchor& glyph_anchor = anchors.get_anchor (c, glyph_index, mark_class, class_count, &found); /* If this subtable doesn't have an anchor for this base and this class, * return false such that the subsequent subtables have a chance at it. */ if (unlikely (!found)) return_trace (false); @@ -82,10 +82,10 @@ struct MarkArray : Array16Of /* Array of MarkRecords--in Cove | hb_map (hb_second) ; + bool ret = false; unsigned new_length = 0; for (const auto& mark_record : mark_iter) { - if (unlikely (!mark_record.subset (c, this, klass_mapping))) - return_trace (false); + ret |= mark_record.subset (c, this, klass_mapping); new_length++; } @@ -93,7 +93,7 @@ struct MarkArray : Array16Of /* Array of MarkRecords--in Cove HB_SERIALIZE_ERROR_ARRAY_OVERFLOW))) return_trace (false); - return_trace (true); + return_trace (ret); } }; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh index eb471204..1b8f3c80 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkBasePosFormat1.hh @@ -197,9 +197,10 @@ struct MarkBasePosFormat1_2 if (!out->markCoverage.serialize_serialize (c->serializer, new_coverage.iter ())) return_trace (false); - out->markArray.serialize_subset (c, markArray, this, - (this+markCoverage).iter (), - &klass_mapping); + if (unlikely (!out->markArray.serialize_subset (c, markArray, this, + (this+markCoverage).iter (), + &klass_mapping))) + return_trace (false); unsigned basecount = (this+baseArray).rows; auto base_iter = @@ -228,11 +229,9 @@ struct MarkBasePosFormat1_2 ; } - out->baseArray.serialize_subset (c, baseArray, this, - base_iter.len (), - base_indexes.iter ()); - - return_trace (true); + return_trace (out->baseArray.serialize_subset (c, baseArray, this, + base_iter.len (), + base_indexes.iter ())); } }; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh index 92e83a0e..af8b4723 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkLigPosFormat1.hh @@ -195,9 +195,10 @@ struct MarkLigPosFormat1_2 if (!out->markCoverage.serialize_serialize (c->serializer, new_mark_coverage)) return_trace (false); - out->markArray.serialize_subset (c, markArray, this, - (this+markCoverage).iter (), - &klass_mapping); + if (unlikely (!out->markArray.serialize_subset (c, markArray, this, + (this+markCoverage).iter (), + &klass_mapping))) + return_trace (false); auto new_ligature_coverage = + hb_iter (this + ligatureCoverage) @@ -208,10 +209,9 @@ struct MarkLigPosFormat1_2 if (!out->ligatureCoverage.serialize_serialize (c->serializer, new_ligature_coverage)) return_trace (false); - out->ligatureArray.serialize_subset (c, ligatureArray, this, - hb_iter (this+ligatureCoverage), classCount, &klass_mapping); - - return_trace (true); + return_trace (out->ligatureArray.serialize_subset (c, ligatureArray, this, + hb_iter (this+ligatureCoverage), + classCount, &klass_mapping)); } }; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh index fbcebb80..70cf0716 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh @@ -100,16 +100,16 @@ struct MarkMarkPosFormat1_2 /* now we search backwards for a suitable mark glyph until a non-mark glyph */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); skippy_iter.set_lookup_props (c->lookup_props & ~(uint32_t)LookupFlag::IgnoreFlags); unsigned unsafe_from; - if (!skippy_iter.prev (&unsafe_from)) + if (unlikely (!skippy_iter.prev (&unsafe_from))) { buffer->unsafe_to_concat_from_outbuffer (unsafe_from, buffer->idx + 1); return_trace (false); } - if (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx])) + if (likely (!_hb_glyph_info_is_mark (&buffer->info[skippy_iter.idx]))) { buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1); return_trace (false); @@ -183,9 +183,10 @@ struct MarkMarkPosFormat1_2 if (!out->mark1Coverage.serialize_serialize (c->serializer, new_coverage.iter ())) return_trace (false); - out->mark1Array.serialize_subset (c, mark1Array, this, - (this+mark1Coverage).iter (), - &klass_mapping); + if (unlikely (!out->mark1Array.serialize_subset (c, mark1Array, this, + (this+mark1Coverage).iter (), + &klass_mapping))) + return_trace (false); unsigned mark2count = (this+mark2Array).rows; auto mark2_iter = @@ -214,9 +215,10 @@ struct MarkMarkPosFormat1_2 ; } - out->mark2Array.serialize_subset (c, mark2Array, this, mark2_iter.len (), mark2_indexes.iter ()); + return_trace (out->mark2Array.serialize_subset (c, mark2Array, this, + mark2_iter.len (), + mark2_indexes.iter ())); - return_trace (true); } }; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh index a7d489d2..3d11c777 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/MarkRecord.hh @@ -24,17 +24,16 @@ struct MarkRecord return_trace (c->check_struct (this) && markAnchor.sanitize (c, base)); } - MarkRecord *subset (hb_subset_context_t *c, - const void *src_base, - const hb_map_t *klass_mapping) const + bool subset (hb_subset_context_t *c, + const void *src_base, + const hb_map_t *klass_mapping) const { TRACE_SUBSET (this); auto *out = c->serializer->embed (this); - if (unlikely (!out)) return_trace (nullptr); + if (unlikely (!out)) return_trace (false); out->klass = klass_mapping->get (klass); - out->markAnchor.serialize_subset (c, markAnchor, src_base); - return_trace (out); + return_trace (out->markAnchor.serialize_subset (c, markAnchor, src_base)); } void collect_variation_indices (hb_collect_variation_indices_context_t *c, diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh index 4dada1c8..e4a2006f 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -110,9 +110,9 @@ struct PairPosFormat1_3 if (likely (index == NOT_COVERED)) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); unsigned unsafe_to; - if (!skippy_iter.next (&unsafe_to)) + if (unlikely (!skippy_iter.next (&unsafe_to))) { buffer->unsafe_to_concat (buffer->idx, unsafe_to); return_trace (false); diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh index de15a29e..4adb1ef6 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -50,13 +50,13 @@ struct PairPosFormat2_4 unsigned int len1 = valueFormat1.get_len (); unsigned int len2 = valueFormat2.get_len (); unsigned int stride = HBUINT16::static_size * (len1 + len2); - unsigned int record_size = valueFormat1.get_size () + valueFormat2.get_size (); unsigned int count = (unsigned int) class1Count * (unsigned int) class2Count; return_trace (c->check_range ((const void *) values, count, - record_size) && - valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) && - valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride)); + stride) && + (c->lazy_some_gpos || + (valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) && + valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride)))); } bool intersects (const hb_set_t *glyphs) const @@ -131,40 +131,46 @@ struct PairPosFormat2_4 if (likely (index == NOT_COVERED)) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); unsigned unsafe_to; - if (!skippy_iter.next (&unsafe_to)) + if (unlikely (!skippy_iter.next (&unsafe_to))) { buffer->unsafe_to_concat (buffer->idx, unsafe_to); return_trace (false); } + unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint); + if (!klass2) + { + buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1); + return_trace (false); + } + + unsigned int klass1 = (this+classDef1).get_class (buffer->cur().codepoint); + if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) + { + buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1); + return_trace (false); + } + unsigned int len1 = valueFormat1.get_len (); unsigned int len2 = valueFormat2.get_len (); unsigned int record_len = len1 + len2; - unsigned int klass1 = (this+classDef1).get_class (buffer->cur().codepoint); - unsigned int klass2 = (this+classDef2).get_class (buffer->info[skippy_iter.idx].codepoint); - if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) - { - buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1); - return_trace (false); - } - const Value *v = &values[record_len * (klass1 * class2Count + klass2)]; bool applied_first = false, applied_second = false; /* Isolate simple kerning and apply it half to each side. - * Results in better cursor positinoing / underline drawing. + * Results in better cursor positioning / underline drawing. * * Disabled, because causes issues... :-( * https://github.com/harfbuzz/harfbuzz/issues/3408 * https://github.com/harfbuzz/harfbuzz/pull/3235#issuecomment-1029814978 */ #ifndef HB_SPLIT_KERN - if (0) + if (false) #endif { if (!len2) @@ -224,8 +230,8 @@ struct PairPosFormat2_4 c->buffer->idx, skippy_iter.idx); } - applied_first = valueFormat1.apply_value (c, this, v, buffer->cur_pos()); - applied_second = valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]); + applied_first = len1 && valueFormat1.apply_value (c, this, v, buffer->cur_pos()); + applied_second = len2 && valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]); if (applied_first || applied_second) if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) @@ -293,11 +299,13 @@ struct PairPosFormat2_4 out->valueFormat2 = out->valueFormat2.drop_device_table_flags (); } + unsigned total_len = len1 + len2; + hb_vector_t class2_idxs (+ hb_range ((unsigned) class2Count) | hb_filter (klass2_map)); for (unsigned class1_idx : + hb_range ((unsigned) class1Count) | hb_filter (klass1_map)) { - for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map)) + for (unsigned class2_idx : class2_idxs) { - unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2); + unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * total_len; valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], &c->plan->layout_variation_idx_delta_map); valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], &c->plan->layout_variation_idx_delta_map); } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh index 147b8e00..db301bb8 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairSet.hh @@ -52,8 +52,9 @@ struct PairSet unsigned int count = len; const PairValueRecord *record = &firstPairValueRecord; - return_trace (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) && - closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride)); + return_trace (c->lazy_some_gpos || + (closure->valueFormats[0].sanitize_values_stride_unsafe (c, this, &record->values[0], count, closure->stride) && + closure->valueFormats[1].sanitize_values_stride_unsafe (c, this, &record->values[closure->len1], count, closure->stride))); } bool intersects (const hb_set_t *glyphs, @@ -120,8 +121,8 @@ struct PairSet c->buffer->idx, pos); } - bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()); - bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]); + bool applied_first = len1 && valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()); + bool applied_second = len2 && valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]); if (applied_first || applied_second) if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh index 32224777..72bf0e99 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/PairValueRecord.hh @@ -22,7 +22,7 @@ struct PairValueRecord ValueRecord values; /* Positioning data for the first glyph * followed by for second glyph */ public: - DEFINE_SIZE_ARRAY (Types::size, values); + DEFINE_SIZE_ARRAY (Types::HBGlyphID::static_size, values); int cmp (hb_codepoint_t k) const { return secondGlyph.cmp (k); } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh index 623e4e66..dff1f731 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat1.hh @@ -90,6 +90,7 @@ struct SinglePosFormat1 bool position_single (hb_font_t *font, + hb_blob_t *table_blob, hb_direction_t direction, hb_codepoint_t gid, hb_glyph_position_t &pos) const @@ -100,7 +101,7 @@ struct SinglePosFormat1 /* This is ugly... */ hb_buffer_t buffer; buffer.props.direction = direction; - OT::hb_ot_apply_context_t c (1, font, &buffer); + OT::hb_ot_apply_context_t c (1, font, &buffer, table_blob); valueFormat.apply_value (&c, this, values, pos); return true; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh index e8f2d7c2..168ad3bb 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/SinglePosFormat2.hh @@ -94,6 +94,7 @@ struct SinglePosFormat2 bool position_single (hb_font_t *font, + hb_blob_t *table_blob, hb_direction_t direction, hb_codepoint_t gid, hb_glyph_position_t &pos) const @@ -105,7 +106,7 @@ struct SinglePosFormat2 /* This is ugly... */ hb_buffer_t buffer; buffer.props.direction = direction; - OT::hb_ot_apply_context_t c (1, font, &buffer); + OT::hb_ot_apply_context_t c (1, font, &buffer, table_blob); valueFormat.apply_value (&c, this, &values[index * valueFormat.get_len ()], diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh index 1aa451ab..461a13d4 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GPOS/ValueFormat.hh @@ -118,21 +118,25 @@ struct ValueFormat : HBUINT16 auto *cache = c->var_store_cache; /* pixel -> fractional pixel */ - if (format & xPlaDevice) { - if (use_x_device) glyph_pos.x_offset += (base + get_device (values, &ret)).get_x_delta (font, store, cache); + if (format & xPlaDevice) + { + if (use_x_device) glyph_pos.x_offset += get_device (values, &ret, base, c->sanitizer).get_x_delta (font, store, cache); values++; } - if (format & yPlaDevice) { - if (use_y_device) glyph_pos.y_offset += (base + get_device (values, &ret)).get_y_delta (font, store, cache); + if (format & yPlaDevice) + { + if (use_y_device) glyph_pos.y_offset += get_device (values, &ret, base, c->sanitizer).get_y_delta (font, store, cache); values++; } - if (format & xAdvDevice) { - if (horizontal && use_x_device) glyph_pos.x_advance += (base + get_device (values, &ret)).get_x_delta (font, store, cache); + if (format & xAdvDevice) + { + if (horizontal && use_x_device) glyph_pos.x_advance += get_device (values, &ret, base, c->sanitizer).get_x_delta (font, store, cache); values++; } - if (format & yAdvDevice) { + if (format & yAdvDevice) + { /* y_advance values grow downward but font-space grows upward, hence negation */ - if (!horizontal && use_y_device) glyph_pos.y_advance -= (base + get_device (values, &ret)).get_y_delta (font, store, cache); + if (!horizontal && use_y_device) glyph_pos.y_advance -= get_device (values, &ret, base, c->sanitizer).get_y_delta (font, store, cache); values++; } return ret; @@ -174,6 +178,9 @@ struct ValueFormat : HBUINT16 if (format & xAdvance) x_adv = copy_value (c, new_format, xAdvance, *values++); if (format & yAdvance) y_adv = copy_value (c, new_format, yAdvance, *values++); + if (!has_device ()) + return; + if (format & xPlaDevice) { add_delta_to_value (x_placement, base, values, layout_variation_idx_delta_map); @@ -233,14 +240,12 @@ struct ValueFormat : HBUINT16 if (format & ValueFormat::xAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } if (format & ValueFormat::yAdvDevice) { - (base + get_device (&(values[i]))).collect_variation_indices (c); i++; } @@ -277,10 +282,22 @@ struct ValueFormat : HBUINT16 { return *static_cast *> (value); } - static inline const Offset16To& get_device (const Value* value, bool *worked=nullptr) + static inline const Offset16To& get_device (const Value* value) + { + return *static_cast *> (value); + } + static inline const Device& get_device (const Value* value, + bool *worked, + const void *base, + hb_sanitize_context_t &c) { if (worked) *worked |= bool (*value); - return *static_cast *> (value); + auto &offset = *static_cast *> (value); + + if (unlikely (!offset.sanitize (&c, base))) + return Null(Device); + + return base + offset; } void add_delta_to_value (HBINT16 *value, @@ -340,25 +357,26 @@ struct ValueFormat : HBUINT16 bool sanitize_value (hb_sanitize_context_t *c, const void *base, const Value *values) const { TRACE_SANITIZE (this); - return_trace (c->check_range (values, get_size ()) && (!has_device () || sanitize_value_devices (c, base, values))); + + if (unlikely (!c->check_range (values, get_size ()))) return_trace (false); + + if (c->lazy_some_gpos) + return_trace (true); + + return_trace (!has_device () || sanitize_value_devices (c, base, values)); } bool sanitize_values (hb_sanitize_context_t *c, const void *base, const Value *values, unsigned int count) const { TRACE_SANITIZE (this); - unsigned int len = get_len (); + unsigned size = get_size (); - if (!c->check_range (values, count, get_size ())) return_trace (false); + if (!c->check_range (values, count, size)) return_trace (false); - if (!has_device ()) return_trace (true); + if (c->lazy_some_gpos) + return_trace (true); - for (unsigned int i = 0; i < count; i++) { - if (!sanitize_value_devices (c, base, values)) - return_trace (false); - values += len; - } - - return_trace (true); + return_trace (sanitize_values_stride_unsafe (c, base, values, count, size)); } /* Just sanitize referenced Device tables. Doesn't check the values themselves. */ diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh index 968bba04..b849494d 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Common.hh @@ -8,8 +8,6 @@ namespace OT { namespace Layout { namespace GSUB_impl { -typedef hb_pair_t hb_codepoint_pair_t; - template static void SingleSubst_serialize (hb_serialize_context_t *c, Iterator it); diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh index 38057cb6..402ed12a 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Ligature.hh @@ -10,10 +10,10 @@ namespace GSUB_impl { template struct Ligature { - protected: + public: typename Types::HBGlyphID ligGlyph; /* GlyphID of ligature to substitute */ - HeadlessArrayOf + HeadlessArray16Of component; /* Array of component GlyphIDs--start * with the second component--ordered * in writing direction */ diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh index 9db25cf5..08665438 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/LigatureSet.hh @@ -75,12 +75,69 @@ struct LigatureSet bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); + unsigned int num_ligs = ligature.len; + +#ifndef HB_NO_OT_RULESETS_FAST_PATH + if (HB_OPTIMIZE_SIZE_VAL || num_ligs <= 4) +#endif + { + slow: + for (unsigned int i = 0; i < num_ligs; i++) + { + const auto &lig = this+ligature.arrayZ[i]; + if (lig.apply (c)) return_trace (true); + } + return_trace (false); + } + + /* This version is optimized for speed by matching the first component + * of the ligature here, instead of calling into the ligation code. + * + * This is replicated in ChainRuleSet and RuleSet. */ + + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + skippy_iter.reset (c->buffer->idx); + skippy_iter.set_match_func (match_always, nullptr); + skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); + unsigned unsafe_to; + hb_codepoint_t first = (unsigned) -1; + bool matched = skippy_iter.next (&unsafe_to); + if (likely (matched)) + { + first = c->buffer->info[skippy_iter.idx].codepoint; + unsafe_to = skippy_iter.idx + 1; + + if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])) + { + /* Can't use the fast path if eg. the next char is a default-ignorable + * or other skippable. */ + goto slow; + } + } + else + goto slow; + + bool unsafe_to_concat = false; + for (unsigned int i = 0; i < num_ligs; i++) { - const auto &lig = this+ligature[i]; - if (lig.apply (c)) return_trace (true); + const auto &lig = this+ligature.arrayZ[i]; + if (unlikely (lig.component.lenP1 <= 1) || + lig.component.arrayZ[0] == first) + { + if (lig.apply (c)) + { + if (unsafe_to_concat) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + return_trace (true); + } + } + else if (likely (lig.component.lenP1 > 1)) + unsafe_to_concat = true; } + if (likely (unsafe_to_concat)) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); return_trace (false); } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index 2c2e1aa4..916fa281 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -191,7 +191,6 @@ struct ReverseChainSingleSubstFormat1 TRACE_SERIALIZE (this); auto *out = c->serializer->start_embed (this); - if (unlikely (!c->serializer->check_success (out))) return_trace (false); if (unlikely (!c->serializer->embed (this->format))) return_trace (false); if (unlikely (!c->serializer->embed (this->coverage))) return_trace (false); diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh index ae3292f3..a26cf8c6 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/Sequence.hh @@ -53,7 +53,7 @@ struct Sequence if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) { c->buffer->message (c->font, - "replaced glyph at %u (multiple subtitution)", + "replaced glyph at %u (multiple substitution)", c->buffer->idx - 1u); } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh index 4529927b..181c9e52 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/Layout/GSUB/SingleSubst.hh @@ -57,7 +57,7 @@ struct SingleSubst #ifndef HB_NO_BEYOND_64K if (+ glyphs - | hb_map_retains_sorting (hb_first) + | hb_map_retains_sorting (hb_second) | hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; })) { format += 2; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh index 94e00d3a..60858a5a 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/CompositeGlyph.hh @@ -87,19 +87,54 @@ struct CompositeGlyphRecord } } - void transform_points (contour_point_vector_t &points, + static void transform (const float (&matrix)[4], + hb_array_t points) + { + if (matrix[0] != 1.f || matrix[1] != 0.f || + matrix[2] != 0.f || matrix[3] != 1.f) + for (auto &point : points) + point.transform (matrix); + } + + static void translate (const contour_point_t &trans, + hb_array_t points) + { + if (HB_OPTIMIZE_SIZE_VAL) + { + if (trans.x != 0.f || trans.y != 0.f) + for (auto &point : points) + point.translate (trans); + } + else + { + if (trans.x != 0.f && trans.y != 0.f) + for (auto &point : points) + point.translate (trans); + else + { + if (trans.x != 0.f) + for (auto &point : points) + point.x += trans.x; + else if (trans.y != 0.f) + for (auto &point : points) + point.y += trans.y; + } + } + } + + void transform_points (hb_array_t points, const float (&matrix)[4], const contour_point_t &trans) const { if (scaled_offsets ()) { - points.translate (trans); - points.transform (matrix); + translate (trans, points); + transform (matrix, points); } else { - points.transform (matrix); - points.translate (trans); + transform (matrix, points); + translate (trans, points); } } @@ -108,8 +143,8 @@ struct CompositeGlyphRecord float matrix[4]; contour_point_t trans; get_transformation (matrix, trans); - if (unlikely (!points.resize (points.length + 1))) return false; - points[points.length - 1] = trans; + if (unlikely (!points.alloc (points.length + 4))) return false; // For phantom points + points.push (trans); return true; } @@ -358,7 +393,7 @@ struct CompositeGlyph { /* last 4 points in points_with_deltas are phantom points and should not be included */ if (i >= points_with_deltas.length - 4) { - free (o); + hb_free (o); return false; } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh index 9e15a6e6..5ea61194 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/Glyph.hh @@ -103,6 +103,63 @@ struct Glyph } } + bool get_all_points_without_var (const hb_face_t *face, + contour_point_vector_t &points /* OUT */) const + { + switch (type) { + case SIMPLE: + if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points))) + return false; + break; + case COMPOSITE: + { + for (auto &item : get_composite_iterator ()) + if (unlikely (!item.get_points (points))) return false; + break; + } +#ifndef HB_NO_VAR_COMPOSITES + case VAR_COMPOSITE: + { + for (auto &item : get_var_composite_iterator ()) + if (unlikely (!item.get_points (points))) return false; + break; + } +#endif + case EMPTY: + break; + } + + /* Init phantom points */ + if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false; + hb_array_t phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT); + { + int lsb = 0; + int h_delta = face->table.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ? + (int) header->xMin - lsb : 0; + HB_UNUSED int tsb = 0; + int v_orig = (int) header->yMax + +#ifndef HB_NO_VERTICAL + ((void) face->table.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb) +#else + 0 +#endif + ; + unsigned h_adv = face->table.hmtx->get_advance_without_var_unscaled (gid); + unsigned v_adv = +#ifndef HB_NO_VERTICAL + face->table.vmtx->get_advance_without_var_unscaled (gid) +#else + - face->get_upem () +#endif + ; + phantoms[PHANTOM_LEFT].x = h_delta; + phantoms[PHANTOM_RIGHT].x = (int) h_adv + h_delta; + phantoms[PHANTOM_TOP].y = v_orig; + phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv; + } + return true; + } + void update_mtx (const hb_subset_plan_t *plan, int xMin, int xMax, int yMin, int yMax, @@ -114,8 +171,8 @@ struct Glyph if (type != EMPTY) { - plan->bounds_width_map.set (new_gid, xMax - xMin); - plan->bounds_height_map.set (new_gid, yMax - yMin); + plan->bounds_width_vec[new_gid] = xMax - xMin; + plan->bounds_height_vec[new_gid] = yMax - yMin; } unsigned len = all_points.length; @@ -124,10 +181,12 @@ struct Glyph float topSideY = all_points[len - 2].y; float bottomSideY = all_points[len - 1].y; + uint32_t hash = hb_hash (new_gid); + signed hori_aw = roundf (rightSideX - leftSideX); if (hori_aw < 0) hori_aw = 0; int lsb = roundf (xMin - leftSideX); - plan->hmtx_map.set (new_gid, hb_pair ((unsigned) hori_aw, lsb)); + plan->hmtx_map.set_with_hash (new_gid, hash, hb_pair ((unsigned) hori_aw, lsb)); //flag value should be computed using non-empty glyphs if (type != EMPTY && lsb != xMin) plan->head_maxp_info.allXMinIsLsb = false; @@ -135,7 +194,7 @@ struct Glyph signed vert_aw = roundf (topSideY - bottomSideY); if (vert_aw < 0) vert_aw = 0; int tsb = roundf (topSideY - yMax); - plan->vmtx_map.set (new_gid, hb_pair ((unsigned) vert_aw, tsb)); + plan->vmtx_map.set_with_hash (new_gid, hash, hb_pair ((unsigned) vert_aw, tsb)); } bool compile_header_bytes (const hb_subset_plan_t *plan, @@ -155,24 +214,28 @@ struct Glyph { xMin = xMax = all_points[0].x; yMin = yMax = all_points[0].y; + + unsigned count = all_points.length - 4; + for (unsigned i = 1; i < count; i++) + { + float x = all_points[i].x; + float y = all_points[i].y; + xMin = hb_min (xMin, x); + xMax = hb_max (xMax, x); + yMin = hb_min (yMin, y); + yMax = hb_max (yMax, y); + } } - for (unsigned i = 1; i < all_points.length - 4; i++) - { - float x = all_points[i].x; - float y = all_points[i].y; - xMin = hb_min (xMin, x); - xMax = hb_max (xMax, x); - yMin = hb_min (yMin, y); - yMax = hb_max (yMax, y); - } - update_mtx (plan, roundf (xMin), roundf (xMax), roundf (yMin), roundf (yMax), all_points); - - int rounded_xMin = roundf (xMin); - int rounded_xMax = roundf (xMax); - int rounded_yMin = roundf (yMin); - int rounded_yMax = roundf (yMax); + // These are destined for storage in a 16 bit field to clamp the values to + // fit into a 16 bit signed integer. + int rounded_xMin = hb_clamp (roundf (xMin), -32768.0f, 32767.0f); + int rounded_xMax = hb_clamp (roundf (xMax), -32768.0f, 32767.0f); + int rounded_yMin = hb_clamp (roundf (yMin), -32768.0f, 32767.0f); + int rounded_yMax = hb_clamp (roundf (yMax), -32768.0f, 32767.0f); + + update_mtx (plan, rounded_xMin, rounded_xMax, rounded_yMin, rounded_yMax, all_points); if (type != EMPTY) { @@ -287,6 +350,7 @@ struct Glyph bool use_my_metrics = true, bool phantom_only = false, hb_array_t coords = hb_array_t (), + hb_map_t *current_glyphs = nullptr, unsigned int depth = 0, unsigned *edge_count = nullptr) const { @@ -295,7 +359,11 @@ struct Glyph if (!edge_count) edge_count = &stack_edge_count; if (unlikely (*edge_count > HB_GLYF_MAX_EDGE_COUNT)) return false; (*edge_count)++; - + + hb_map_t current_glyphs_stack; + if (current_glyphs == nullptr) + current_glyphs = ¤t_glyphs_stack; + if (head_maxp_info) { head_maxp_info->maxComponentDepth = hb_max (head_maxp_info->maxComponentDepth, depth); @@ -305,9 +373,8 @@ struct Glyph coords = hb_array (font->coords, font->num_coords); contour_point_vector_t stack_points; - bool inplace = type == SIMPLE && all_points.length == 0; - /* Load into all_points if it's empty, as an optimization. */ - contour_point_vector_t &points = inplace ? all_points : stack_points; + contour_point_vector_t &points = type == SIMPLE ? all_points : stack_points; + unsigned old_length = points.length; switch (type) { case SIMPLE: @@ -315,7 +382,7 @@ struct Glyph head_maxp_info->maxContours = hb_max (head_maxp_info->maxContours, (unsigned) header->numberOfContours); if (depth > 0 && composite_contours) *composite_contours += (unsigned) header->numberOfContours; - if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only))) + if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (all_points, phantom_only))) return false; break; case COMPOSITE: @@ -329,6 +396,7 @@ struct Glyph { for (auto &item : get_var_composite_iterator ()) if (unlikely (!item.get_points (points))) return false; + break; } #endif case EMPTY: @@ -365,9 +433,11 @@ struct Glyph } #ifndef HB_NO_VAR - glyf_accelerator.gvar->apply_deltas_to_points (gid, - coords, - points.as_array ()); + if (coords) + glyf_accelerator.gvar->apply_deltas_to_points (gid, + coords, + points.as_array ().sub_array (old_length), + phantom_only && type == SIMPLE); #endif // mainly used by CompositeGlyph calculating new X/Y offset value so no need to extend it @@ -375,27 +445,33 @@ struct Glyph if (points_with_deltas != nullptr && depth == 0 && type == COMPOSITE) { if (unlikely (!points_with_deltas->resize (points.length))) return false; - points_with_deltas->copy_vector (points); + *points_with_deltas = points; } switch (type) { case SIMPLE: if (depth == 0 && head_maxp_info) - head_maxp_info->maxPoints = hb_max (head_maxp_info->maxPoints, points.length - 4); - if (!inplace) - all_points.extend (points.as_array ()); + head_maxp_info->maxPoints = hb_max (head_maxp_info->maxPoints, all_points.length - old_length - 4); break; case COMPOSITE: { - contour_point_vector_t comp_points; unsigned int comp_index = 0; for (auto &item : get_composite_iterator ()) { - comp_points.reset (); - if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) + hb_codepoint_t item_gid = item.get_gid (); + + if (unlikely (current_glyphs->has (item_gid))) + continue; + + current_glyphs->add (item_gid); + + unsigned old_count = all_points.length; + + if (unlikely ((!phantom_only || (use_my_metrics && item.is_use_my_metrics ())) && + !glyf_accelerator.glyph_for_gid (item_gid) .get_points (font, glyf_accelerator, - comp_points, + all_points, points_with_deltas, head_maxp_info, composite_contours, @@ -403,23 +479,32 @@ struct Glyph use_my_metrics, phantom_only, coords, + current_glyphs, depth + 1, edge_count))) + { + current_glyphs->del (item_gid); return false; + } + + auto comp_points = all_points.as_array ().sub_array (old_count); /* Copy phantom points from component if USE_MY_METRICS flag set */ if (use_my_metrics && item.is_use_my_metrics ()) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; - float matrix[4]; - contour_point_t default_trans; - item.get_transformation (matrix, default_trans); + if (comp_points) // Empty in case of phantom_only + { + float matrix[4]; + contour_point_t default_trans; + item.get_transformation (matrix, default_trans); - /* Apply component transformation & translation (with deltas applied) */ - item.transform_points (comp_points, matrix, points[comp_index]); + /* Apply component transformation & translation (with deltas applied) */ + item.transform_points (comp_points, matrix, points[comp_index]); + } - if (item.is_anchored ()) + if (item.is_anchored () && !phantom_only) { unsigned int p1, p2; item.get_anchor_points (p1, p2); @@ -429,16 +514,20 @@ struct Glyph delta.init (all_points[p1].x - comp_points[p2].x, all_points[p1].y - comp_points[p2].y); - comp_points.translate (delta); + item.translate (delta, comp_points); } } - all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT)); + all_points.resize (all_points.length - PHANTOM_COUNT); if (all_points.length > HB_GLYF_MAX_POINTS) + { + current_glyphs->del (item_gid); return false; + } comp_index++; + current_glyphs->del (item_gid); } if (head_maxp_info && depth == 0) @@ -453,26 +542,37 @@ struct Glyph #ifndef HB_NO_VAR_COMPOSITES case VAR_COMPOSITE: { - contour_point_vector_t comp_points; hb_array_t points_left = points.as_array (); for (auto &item : get_var_composite_iterator ()) { + hb_codepoint_t item_gid = item.get_gid (); + + if (unlikely (current_glyphs->has (item_gid))) + continue; + + current_glyphs->add (item_gid); + unsigned item_num_points = item.get_num_points (); hb_array_t record_points = points_left.sub_array (0, item_num_points); - - comp_points.reset (); + assert (record_points.length == item_num_points); auto component_coords = coords; - if (item.is_reset_unspecified_axes ()) + /* Copying coords is expensive; so we have put an arbitrary + * limit on the max number of coords for now. */ + if (item.is_reset_unspecified_axes () || + coords.length > HB_GLYF_VAR_COMPOSITE_MAX_AXES) component_coords = hb_array (); coord_setter_t coord_setter (component_coords); item.set_variations (coord_setter, record_points); - if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) + unsigned old_count = all_points.length; + + if (unlikely ((!phantom_only || (use_my_metrics && item.is_use_my_metrics ())) && + !glyf_accelerator.glyph_for_gid (item_gid) .get_points (font, glyf_accelerator, - comp_points, + all_points, points_with_deltas, head_maxp_info, nullptr, @@ -480,24 +580,36 @@ struct Glyph use_my_metrics, phantom_only, coord_setter.get_coords (), + current_glyphs, depth + 1, edge_count))) + { + current_glyphs->del (item_gid); return false; + } + + auto comp_points = all_points.as_array ().sub_array (old_count); /* Apply component transformation */ - item.transform_points (record_points, comp_points); + if (comp_points) // Empty in case of phantom_only + item.transform_points (record_points, comp_points); /* Copy phantom points from component if USE_MY_METRICS flag set */ if (use_my_metrics && item.is_use_my_metrics ()) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; - all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT)); + all_points.resize (all_points.length - PHANTOM_COUNT); if (all_points.length > HB_GLYF_MAX_POINTS) + { + current_glyphs->del (item_gid); return false; + } points_left += item_num_points; + + current_glyphs->del (item_gid); } all_points.extend (phantoms); } break; @@ -512,9 +624,10 @@ struct Glyph /* Undocumented rasterizer behavior: * Shift points horizontally by the updated left side bearing */ - contour_point_t delta; - delta.init (-phantoms[PHANTOM_LEFT].x, 0.f); - if (delta.x) all_points.translate (delta); + int v = -phantoms[PHANTOM_LEFT].x; + if (v) + for (auto &point : all_points) + point.x += v; } return !all_points.in_error (); @@ -545,10 +658,11 @@ struct Glyph int num_contours = header->numberOfContours; if (unlikely (num_contours == 0)) type = EMPTY; else if (num_contours > 0) type = SIMPLE; + else if (num_contours == -1) type = COMPOSITE; #ifndef HB_NO_VAR_COMPOSITES else if (num_contours == -2) type = VAR_COMPOSITE; #endif - else type = COMPOSITE; /* negative numbers */ + else type = EMPTY; // Spec deviation; Spec says COMPOSITE, but not seen in the wild. } protected: diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh index b6679b2d..1d42cc29 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/SimpleGlyph.hh @@ -124,7 +124,7 @@ struct SimpleGlyph } static bool read_flags (const HBUINT8 *&p /* IN/OUT */, - contour_point_vector_t &points_ /* IN/OUT */, + hb_array_t points_ /* IN/OUT */, const HBUINT8 *end) { unsigned count = points_.length; @@ -146,7 +146,7 @@ struct SimpleGlyph } static bool read_points (const HBUINT8 *&p /* IN/OUT */, - contour_point_vector_t &points_ /* IN/OUT */, + hb_array_t points_ /* IN/OUT */, const HBUINT8 *end, float contour_point_t::*m, const simple_glyph_flag_t short_flag, @@ -154,10 +154,9 @@ struct SimpleGlyph { int v = 0; - unsigned count = points_.length; - for (unsigned i = 0; i < count; i++) + for (auto &point : points_) { - unsigned flag = points_[i].flag; + unsigned flag = point.flag; if (flag & short_flag) { if (unlikely (p + 1 > end)) return false; @@ -175,23 +174,27 @@ struct SimpleGlyph p += HBINT16::static_size; } } - points_.arrayZ[i].*m = v; + point.*m = v; } return true; } - bool get_contour_points (contour_point_vector_t &points_ /* OUT */, + bool get_contour_points (contour_point_vector_t &points /* OUT */, bool phantom_only = false) const { const HBUINT16 *endPtsOfContours = &StructAfter (header); int num_contours = header.numberOfContours; - assert (num_contours); + assert (num_contours > 0); /* One extra item at the end, for the instruction-count below. */ if (unlikely (!bytes.check_range (&endPtsOfContours[num_contours]))) return false; unsigned int num_points = endPtsOfContours[num_contours - 1] + 1; - points_.alloc (num_points + 4, true); // Allocate for phantom points, to avoid a possible copy - if (!points_.resize (num_points)) return false; + unsigned old_length = points.length; + points.alloc (points.length + num_points + 4, true); // Allocate for phantom points, to avoid a possible copy + if (unlikely (!points.resize (points.length + num_points, false))) return false; + auto points_ = points.as_array ().sub_array (old_length); + if (!phantom_only) + hb_memset (points_.arrayZ, 0, sizeof (contour_point_t) * num_points); if (phantom_only) return true; for (int i = 0; i < num_contours; i++) @@ -214,7 +217,7 @@ struct SimpleGlyph } static void encode_coord (int value, - uint8_t &flag, + unsigned &flag, const simple_glyph_flag_t short_flag, const simple_glyph_flag_t same_flag, hb_vector_t &coords /* OUT */) @@ -239,9 +242,9 @@ struct SimpleGlyph } } - static void encode_flag (uint8_t &flag, - uint8_t &repeat, - uint8_t lastflag, + static void encode_flag (unsigned flag, + unsigned &repeat, + unsigned lastflag, hb_vector_t &flags /* OUT */) { if (flag == lastflag && repeat != 255) @@ -262,7 +265,7 @@ struct SimpleGlyph else { repeat = 0; - flags.push (flag); + flags.arrayZ[flags.length++] = flag; } } @@ -282,13 +285,13 @@ struct SimpleGlyph if (unlikely (!x_coords.alloc (2*num_points, true))) return false; if (unlikely (!y_coords.alloc (2*num_points, true))) return false; - uint8_t lastflag = 255, repeat = 0; + unsigned lastflag = 255, repeat = 0; int prev_x = 0, prev_y = 0; for (unsigned i = 0; i < num_points; i++) { - uint8_t flag = all_points.arrayZ[i].flag; - flag &= FLAG_ON_CURVE + FLAG_OVERLAP_SIMPLE; + unsigned flag = all_points.arrayZ[i].flag; + flag &= FLAG_ON_CURVE | FLAG_OVERLAP_SIMPLE | FLAG_CUBIC; int cur_x = roundf (all_points.arrayZ[i].x); int cur_y = roundf (all_points.arrayZ[i].y); diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh index 26dc374e..8099d3c1 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/SubsetGlyph.hh @@ -22,7 +22,7 @@ struct SubsetGlyph bool serialize (hb_serialize_context_t *c, bool use_short_loca, - const hb_subset_plan_t *plan) + const hb_subset_plan_t *plan) const { TRACE_SERIALIZE (this); @@ -40,7 +40,7 @@ struct SubsetGlyph pad = 0; while (pad_length > 0) { - c->embed (pad); + (void) c->embed (pad); pad_length--; } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh index 309ec473..50cbece3 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/VarCompositeGlyph.hh @@ -36,24 +36,21 @@ struct VarCompositeGlyphRecord unsigned int get_size () const { + unsigned fl = flags; unsigned int size = min_size; - unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 4 : 3; + unsigned axis_width = (fl & AXIS_INDICES_ARE_SHORT) ? 4 : 3; size += numAxes * axis_width; - // gid - size += 2; - if (flags & GID_IS_24BIT) size += 1; + if (fl & GID_IS_24BIT) size += 1; - if (flags & HAVE_TRANSLATE_X) size += 2; - if (flags & HAVE_TRANSLATE_Y) size += 2; - if (flags & HAVE_ROTATION) size += 2; - if (flags & HAVE_SCALE_X) size += 2; - if (flags & HAVE_SCALE_Y) size += 2; - if (flags & HAVE_SKEW_X) size += 2; - if (flags & HAVE_SKEW_Y) size += 2; - if (flags & HAVE_TCENTER_X) size += 2; - if (flags & HAVE_TCENTER_Y) size += 2; + // 2 bytes each for the following flags + fl = fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y | + HAVE_ROTATION | + HAVE_SCALE_X | HAVE_SCALE_Y | + HAVE_SKEW_X | HAVE_SKEW_Y | + HAVE_TCENTER_X | HAVE_TCENTER_Y); + size += hb_popcount (fl) * 2; return size; } @@ -66,17 +63,17 @@ struct VarCompositeGlyphRecord hb_codepoint_t get_gid () const { if (flags & GID_IS_24BIT) - return StructAfter (numAxes); + return * (const HBGlyphID24 *) &pad; else - return StructAfter (numAxes); + return * (const HBGlyphID16 *) &pad; } void set_gid (hb_codepoint_t gid) { if (flags & GID_IS_24BIT) - StructAfter (numAxes) = gid; + * (HBGlyphID24 *) &pad = gid; else - StructAfter (numAxes) = gid; + * (HBGlyphID16 *) &pad = gid; } unsigned get_numAxes () const @@ -86,26 +83,44 @@ struct VarCompositeGlyphRecord unsigned get_num_points () const { + unsigned fl = flags; unsigned num = 0; - if (flags & AXES_HAVE_VARIATION) num += numAxes; - if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) num++; - if (flags & HAVE_ROTATION) num++; - if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) num++; - if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) num++; - if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) num++; + if (fl & AXES_HAVE_VARIATION) num += numAxes; + + /* Hopefully faster code, relying on the value of the flags. */ + fl = (((fl & (HAVE_TRANSLATE_Y | HAVE_SCALE_Y | HAVE_SKEW_Y | HAVE_TCENTER_Y)) >> 1) | fl) & + (HAVE_TRANSLATE_X | HAVE_ROTATION | HAVE_SCALE_X | HAVE_SKEW_X | HAVE_TCENTER_X); + num += hb_popcount (fl); + return num; + + /* Slower but more readable code. */ + if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) num++; + if (fl & HAVE_ROTATION) num++; + if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y)) num++; + if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y)) num++; + if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) num++; return num; } - void transform_points (hb_array_t record_points, - contour_point_vector_t &points) const + void transform_points (hb_array_t record_points, + hb_array_t points) const { float matrix[4]; contour_point_t trans; - get_transformation_from_points (record_points, matrix, trans); + get_transformation_from_points (record_points.arrayZ, matrix, trans); - points.transform (matrix); - points.translate (trans); + auto arrayZ = points.arrayZ; + unsigned count = points.length; + + if (matrix[0] != 1.f || matrix[1] != 0.f || + matrix[2] != 0.f || matrix[3] != 1.f) + for (unsigned i = 0; i < count; i++) + arrayZ[i].transform (matrix); + + if (trans.x != 0.f || trans.y != 0.f) + for (unsigned i = 0; i < count; i++) + arrayZ[i].translate (trans); } static inline void transform (float (&matrix)[4], contour_point_t &trans, @@ -136,26 +151,41 @@ struct VarCompositeGlyphRecord static void translate (float (&matrix)[4], contour_point_t &trans, float translateX, float translateY) { - // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L213 - float other[6] = {1.f, 0.f, 0.f, 1.f, translateX, translateY}; - transform (matrix, trans, other); + if (!translateX && !translateY) + return; + + trans.x += matrix[0] * translateX + matrix[2] * translateY; + trans.y += matrix[1] * translateX + matrix[3] * translateY; } static void scale (float (&matrix)[4], contour_point_t &trans, float scaleX, float scaleY) { - // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L224 - float other[6] = {scaleX, 0.f, 0.f, scaleY, 0.f, 0.f}; - transform (matrix, trans, other); + if (scaleX == 1.f && scaleY == 1.f) + return; + + matrix[0] *= scaleX; + matrix[1] *= scaleX; + matrix[2] *= scaleY; + matrix[3] *= scaleY; } static void rotate (float (&matrix)[4], contour_point_t &trans, float rotation) { + if (!rotation) + return; + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L240 rotation = rotation * HB_PI; - float c = cosf (rotation); - float s = sinf (rotation); + float c; + float s; +#ifdef HAVE_SINCOSF + sincosf (rotation, &s, &c); +#else + c = cosf (rotation); + s = sinf (rotation); +#endif float other[6] = {c, s, -s, c, 0.f, 0.f}; transform (matrix, trans, other); } @@ -163,101 +193,100 @@ struct VarCompositeGlyphRecord static void skew (float (&matrix)[4], contour_point_t &trans, float skewX, float skewY) { + if (!skewX && !skewY) + return; + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L255 skewX = skewX * HB_PI; skewY = skewY * HB_PI; - float other[6] = {1.f, tanf (skewY), tanf (skewX), 1.f, 0.f, 0.f}; + float other[6] = {1.f, + skewY ? tanf (skewY) : 0.f, + skewX ? tanf (skewX) : 0.f, + 1.f, + 0.f, 0.f}; transform (matrix, trans, other); } bool get_points (contour_point_vector_t &points) const { - float translateX = 0.f; - float translateY = 0.f; - float rotation = 0.f; - float scaleX = 1.f * (1 << 10); - float scaleY = 1.f * (1 << 10); - float skewX = 0.f; - float skewY = 0.f; - float tCenterX = 0.f; - float tCenterY = 0.f; - unsigned num_points = get_num_points (); - if (unlikely (!points.resize (points.length + num_points))) return false; + points.alloc (points.length + num_points + 4); // For phantom points + if (unlikely (!points.resize (points.length + num_points, false))) return false; + contour_point_t *rec_points = points.arrayZ + (points.length - num_points); + hb_memset (rec_points, 0, num_points * sizeof (rec_points[0])); - unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1; - unsigned axes_size = numAxes * axis_width; + unsigned fl = flags; + + unsigned num_axes = numAxes; + unsigned axis_width = (fl & AXIS_INDICES_ARE_SHORT) ? 2 : 1; + unsigned axes_size = num_axes * axis_width; const F2DOT14 *q = (const F2DOT14 *) (axes_size + - (flags & GID_IS_24BIT ? 3 : 2) + - &StructAfter (numAxes)); + (fl & GID_IS_24BIT ? 3 : 2) + + (const HBUINT8 *) &pad); - hb_array_t rec_points = points.as_array ().sub_array (points.length - num_points); - - unsigned count = numAxes; - if (flags & AXES_HAVE_VARIATION) + unsigned count = num_axes; + if (fl & AXES_HAVE_VARIATION) { for (unsigned i = 0; i < count; i++) - rec_points[i].x = q++->to_int (); - rec_points += count; + rec_points++->x = q++->to_int (); } else q += count; const HBUINT16 *p = (const HBUINT16 *) q; - if (flags & HAVE_TRANSLATE_X) translateX = * (const FWORD *) p++; - if (flags & HAVE_TRANSLATE_Y) translateY = * (const FWORD *) p++; - if (flags & HAVE_ROTATION) rotation = ((const F4DOT12 *) p++)->to_int (); - if (flags & HAVE_SCALE_X) scaleX = ((const F6DOT10 *) p++)->to_int (); - if (flags & HAVE_SCALE_Y) scaleY = ((const F6DOT10 *) p++)->to_int (); - if (flags & HAVE_SKEW_X) skewX = ((const F4DOT12 *) p++)->to_int (); - if (flags & HAVE_SKEW_Y) skewY = ((const F4DOT12 *) p++)->to_int (); - if (flags & HAVE_TCENTER_X) tCenterX = * (const FWORD *) p++; - if (flags & HAVE_TCENTER_Y) tCenterY = * (const FWORD *) p++; - - if ((flags & UNIFORM_SCALE) && !(flags & HAVE_SCALE_Y)) - scaleY = scaleX; - - if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) + if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) { - rec_points[0].x = translateX; - rec_points[0].y = translateY; + int translateX = (fl & HAVE_TRANSLATE_X) ? * (const FWORD *) p++ : 0; + int translateY = (fl & HAVE_TRANSLATE_Y) ? * (const FWORD *) p++ : 0; + rec_points->x = translateX; + rec_points->y = translateY; rec_points++; } - if (flags & HAVE_ROTATION) + if (fl & HAVE_ROTATION) { - rec_points[0].x = rotation; + int rotation = (fl & HAVE_ROTATION) ? ((const F4DOT12 *) p++)->to_int () : 0; + rec_points->x = rotation; rec_points++; } - if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) + if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y)) { - rec_points[0].x = scaleX; - rec_points[0].y = scaleY; + int scaleX = (fl & HAVE_SCALE_X) ? ((const F6DOT10 *) p++)->to_int () : 1 << 10; + int scaleY = (fl & HAVE_SCALE_Y) ? ((const F6DOT10 *) p++)->to_int () : 1 << 10; + if ((fl & UNIFORM_SCALE) && !(fl & HAVE_SCALE_Y)) + scaleY = scaleX; + rec_points->x = scaleX; + rec_points->y = scaleY; rec_points++; } - if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) + if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y)) { - rec_points[0].x = skewX; - rec_points[0].y = skewY; + int skewX = (fl & HAVE_SKEW_X) ? ((const F4DOT12 *) p++)->to_int () : 0; + int skewY = (fl & HAVE_SKEW_Y) ? ((const F4DOT12 *) p++)->to_int () : 0; + rec_points->x = skewX; + rec_points->y = skewY; rec_points++; } - if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) + if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) { - rec_points[0].x = tCenterX; - rec_points[0].y = tCenterY; + int tCenterX = (fl & HAVE_TCENTER_X) ? * (const FWORD *) p++ : 0; + int tCenterY = (fl & HAVE_TCENTER_Y) ? * (const FWORD *) p++ : 0; + rec_points->x = tCenterX; + rec_points->y = tCenterY; rec_points++; } - assert (!rec_points); return true; } - void get_transformation_from_points (hb_array_t rec_points, + void get_transformation_from_points (const contour_point_t *rec_points, float (&matrix)[4], contour_point_t &trans) const { - if (flags & AXES_HAVE_VARIATION) + unsigned fl = flags; + + if (fl & AXES_HAVE_VARIATION) rec_points += numAxes; matrix[0] = matrix[3] = 1.f; @@ -274,36 +303,35 @@ struct VarCompositeGlyphRecord float tCenterX = 0.f; float tCenterY = 0.f; - if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) + if (fl & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) { - translateX = rec_points[0].x; - translateY = rec_points[0].y; + translateX = rec_points->x; + translateY = rec_points->y; rec_points++; } - if (flags & HAVE_ROTATION) + if (fl & HAVE_ROTATION) { - rotation = rec_points[0].x / (1 << 12); + rotation = rec_points->x / (1 << 12); rec_points++; } - if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) + if (fl & (HAVE_SCALE_X | HAVE_SCALE_Y)) { - scaleX = rec_points[0].x / (1 << 10); - scaleY = rec_points[0].y / (1 << 10); + scaleX = rec_points->x / (1 << 10); + scaleY = rec_points->y / (1 << 10); rec_points++; } - if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) + if (fl & (HAVE_SKEW_X | HAVE_SKEW_Y)) { - skewX = rec_points[0].x / (1 << 12); - skewY = rec_points[0].y / (1 << 12); + skewX = rec_points->x / (1 << 12); + skewY = rec_points->y / (1 << 12); rec_points++; } - if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) + if (fl & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) { - tCenterX = rec_points[0].x; - tCenterY = rec_points[0].y; + tCenterX = rec_points->x; + tCenterY = rec_points->y; rec_points++; } - assert (!rec_points); translate (matrix, trans, translateX + tCenterX, translateY + tCenterY); rotate (matrix, trans, rotation); @@ -317,18 +345,19 @@ struct VarCompositeGlyphRecord { bool have_variations = flags & AXES_HAVE_VARIATION; unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1; + unsigned num_axes = numAxes; const HBUINT8 *p = (const HBUINT8 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24BIT ? 3 : 2)); const HBUINT16 *q = (const HBUINT16 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24BIT ? 3 : 2)); - const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + numAxes) : (HBUINT8 *) (q + numAxes))); + const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + num_axes) : (HBUINT8 *) (q + num_axes))); - unsigned count = numAxes; + unsigned count = num_axes; for (unsigned i = 0; i < count; i++) { unsigned axis_index = axis_width == 1 ? (unsigned) *p++ : (unsigned) *q++; - signed v = have_variations ? rec_points[i].x : a++->to_int (); + signed v = have_variations ? rec_points.arrayZ[i].x : a++->to_int (); v = hb_clamp (v, -(1<<14), (1<<14)); setter[axis_index] = v; @@ -338,8 +367,9 @@ struct VarCompositeGlyphRecord protected: HBUINT16 flags; HBUINT8 numAxes; + HBUINT16 pad; public: - DEFINE_SIZE_MIN (3); + DEFINE_SIZE_MIN (5); }; using var_composite_iter_t = composite_iter_tmpl; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh index df64ed5a..cf059293 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/coord-setter.hh @@ -16,6 +16,8 @@ struct coord_setter_t int& operator [] (unsigned idx) { + if (unlikely (idx >= HB_GLYF_VAR_COMPOSITE_MAX_AXES)) + return Crap(int); if (coords.length < idx + 1) coords.resize (idx + 1); return coords[idx]; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh index 30106b2b..d0a5a132 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf-helpers.hh @@ -12,24 +12,44 @@ namespace OT { namespace glyf_impl { -template +template static void -_write_loca (IteratorIn&& it, bool short_offsets, IteratorOut&& dest) +_write_loca (IteratorIn&& it, + const hb_sorted_vector_t new_to_old_gid_list, + bool short_offsets, + TypeOut *dest, + unsigned num_offsets) { unsigned right_shift = short_offsets ? 1 : 0; - unsigned int offset = 0; - dest << 0; - + it - | hb_map ([=, &offset] (unsigned int padded_size) - { - offset += padded_size; - DEBUG_MSG (SUBSET, nullptr, "loca entry offset %u", offset); - return offset >> right_shift; - }) - | hb_sink (dest) - ; + unsigned offset = 0; + TypeOut value; + value = 0; + *dest++ = value; + hb_codepoint_t last = 0; + for (auto _ : new_to_old_gid_list) + { + hb_codepoint_t gid = _.first; + for (; last < gid; last++) + { + DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); + *dest++ = value; + } + + unsigned padded_size = *it++; + offset += padded_size; + DEBUG_MSG (SUBSET, nullptr, "loca entry gid %u offset %u padded-size %u", gid, offset, padded_size); + value = offset >> right_shift; + *dest++ = value; + + last++; // Skip over gid + } + unsigned num_glyphs = num_offsets - 1; + for (; last < num_glyphs; last++) + { + DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); + *dest++ = value; + } } static bool @@ -67,11 +87,14 @@ _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) template static bool -_add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets, bool use_short_loca) +_add_loca_and_head (hb_subset_context_t *c, + Iterator padded_offsets, + bool use_short_loca) { - unsigned num_offsets = padded_offsets.len () + 1; + unsigned num_offsets = c->plan->num_output_glyphs () + 1; unsigned entry_size = use_short_loca ? 2 : 4; - char *loca_prime_data = (char *) hb_calloc (entry_size, num_offsets); + + char *loca_prime_data = (char *) hb_malloc (entry_size * num_offsets); if (unlikely (!loca_prime_data)) return false; @@ -79,9 +102,9 @@ _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets, bool use_s entry_size, num_offsets, entry_size * num_offsets); if (use_short_loca) - _write_loca (padded_offsets, true, hb_array ((HBUINT16 *) loca_prime_data, num_offsets)); + _write_loca (padded_offsets, c->plan->new_to_old_gid_list, true, (HBUINT16 *) loca_prime_data, num_offsets); else - _write_loca (padded_offsets, false, hb_array ((HBUINT32 *) loca_prime_data, num_offsets)); + _write_loca (padded_offsets, c->plan->new_to_old_gid_list, false, (HBUINT32 *) loca_prime_data, num_offsets); hb_blob_t *loca_blob = hb_blob_create (loca_prime_data, entry_size * num_offsets, @@ -89,8 +112,8 @@ _add_loca_and_head (hb_subset_plan_t * plan, Iterator padded_offsets, bool use_s loca_prime_data, hb_free); - bool result = plan->add_table (HB_OT_TAG_loca, loca_blob) - && _add_head_and_set_loca_version (plan, use_short_loca); + bool result = c->plan->add_table (HB_OT_TAG_loca, loca_blob) + && _add_head_and_set_loca_version (c->plan, use_short_loca); hb_blob_destroy (loca_blob); return result; diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh index dd08dda6..6300cf4b 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/glyf.hh @@ -85,75 +85,72 @@ struct glyf return_trace (false); } - glyf *glyf_prime = c->serializer->start_embed (); - if (unlikely (!c->serializer->check_success (glyf_prime))) return_trace (false); - hb_font_t *font = nullptr; if (c->plan->normalized_coords) { font = _create_font_for_instancing (c->plan); - if (unlikely (!font)) return false; + if (unlikely (!font)) + return_trace (false); } hb_vector_t padded_offsets; - unsigned num_glyphs = c->plan->num_output_glyphs (); - if (unlikely (!padded_offsets.resize (num_glyphs))) - { - hb_font_destroy (font); - return false; - } + if (unlikely (!padded_offsets.alloc (c->plan->new_to_old_gid_list.length, true))) + return_trace (false); hb_vector_t glyphs; if (!_populate_subset_glyphs (c->plan, font, glyphs)) { hb_font_destroy (font); - return false; + return_trace (false); } if (font) hb_font_destroy (font); unsigned max_offset = 0; - for (unsigned i = 0; i < num_glyphs; i++) + for (auto &g : glyphs) { - padded_offsets[i] = glyphs[i].padded_size (); - max_offset += padded_offsets[i]; + unsigned size = g.padded_size (); + padded_offsets.push (size); + max_offset += size; } bool use_short_loca = false; if (likely (!c->plan->force_long_loca)) use_short_loca = max_offset < 0x1FFFF; - if (!use_short_loca) { - for (unsigned i = 0; i < num_glyphs; i++) - padded_offsets[i] = glyphs[i].length (); + if (!use_short_loca) + { + padded_offsets.resize (0); + for (auto &g : glyphs) + padded_offsets.push (g.length ()); } - bool result = glyf_prime->serialize (c->serializer, glyphs.writer (), use_short_loca, c->plan); + auto *glyf_prime = c->serializer->start_embed (); + bool result = glyf_prime->serialize (c->serializer, hb_iter (glyphs), use_short_loca, c->plan); if (c->plan->normalized_coords && !c->plan->pinned_at_default) _free_compiled_subset_glyphs (glyphs); - if (!result) return false; + if (unlikely (!c->serializer->check_success (glyf_impl::_add_loca_and_head (c, + padded_offsets.iter (), + use_short_loca)))) + return_trace (false); - if (unlikely (c->serializer->in_error ())) return_trace (false); - - return_trace (c->serializer->check_success (glyf_impl::_add_loca_and_head (c->plan, - padded_offsets.iter (), - use_short_loca))); + return result; } bool _populate_subset_glyphs (const hb_subset_plan_t *plan, hb_font_t *font, - hb_vector_t &glyphs /* OUT */) const; + hb_vector_t& glyphs /* OUT */) const; hb_font_t * _create_font_for_instancing (const hb_subset_plan_t *plan) const; void _free_compiled_subset_glyphs (hb_vector_t &glyphs) const { - for (unsigned i = 0; i < glyphs.length; i++) - glyphs[i].free_compiled_bytes (); + for (auto &g : glyphs) + g.free_compiled_bytes (); } protected: @@ -222,13 +219,14 @@ struct glyf_accelerator_t if (unlikely (!glyph_for_gid (gid).get_points (font, *this, all_points, nullptr, nullptr, nullptr, true, true, phantom_only))) return false; + unsigned count = all_points.length; + assert (count >= glyf_impl::PHANTOM_COUNT); + count -= glyf_impl::PHANTOM_COUNT; + if (consumer.is_consuming_contour_points ()) { - unsigned count = all_points.length; - assert (count >= glyf_impl::PHANTOM_COUNT); - count -= glyf_impl::PHANTOM_COUNT; - for (unsigned point_index = 0; point_index < count; point_index++) - consumer.consume_point (all_points[point_index]); + for (auto &point : all_points.as_array ().sub_array (0, count)) + consumer.consume_point (point); consumer.points_end (); } @@ -236,7 +234,7 @@ struct glyf_accelerator_t contour_point_t *phantoms = consumer.get_phantoms_sink (); if (phantoms) for (unsigned i = 0; i < glyf_impl::PHANTOM_COUNT; ++i) - phantoms[i] = all_points[all_points.length - glyf_impl::PHANTOM_COUNT + i]; + phantoms[i] = all_points.arrayZ[count + i]; return true; } @@ -299,6 +297,7 @@ struct glyf_accelerator_t if (extents) bounds = contour_bounds_t (); } + HB_ALWAYS_INLINE void consume_point (const contour_point_t &point) { bounds.add (point); } void points_end () { bounds.get_extents (font, extents, scaled); } @@ -431,16 +430,17 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan, hb_vector_t& glyphs /* OUT */) const { OT::glyf_accelerator_t glyf (plan->source); - unsigned num_glyphs = plan->num_output_glyphs (); - if (!glyphs.resize (num_glyphs)) return false; + if (!glyphs.alloc (plan->new_to_old_gid_list.length, true)) return false; - for (auto p : plan->glyph_map->iter ()) + for (const auto &pair : plan->new_to_old_gid_list) { - unsigned new_gid = p.second; - glyf_impl::SubsetGlyph& subset_glyph = glyphs.arrayZ[new_gid]; - subset_glyph.old_gid = p.first; + hb_codepoint_t new_gid = pair.first; + hb_codepoint_t old_gid = pair.second; + glyf_impl::SubsetGlyph *p = glyphs.push (); + glyf_impl::SubsetGlyph& subset_glyph = *p; + subset_glyph.old_gid = old_gid; - if (unlikely (new_gid == 0 && + if (unlikely (old_gid == 0 && new_gid == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE)) && !plan->normalized_coords) subset_glyph.source_glyph = glyf_impl::Glyph (); @@ -487,7 +487,7 @@ glyf::_create_font_for_instancing (const hb_subset_plan_t *plan) const { hb_variation_t var; var.tag = _.first; - var.value = _.second; + var.value = _.second.middle; vars.push (var); } diff --git a/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh b/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh index 8916241f..f5505245 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/glyf/path-builder.hh @@ -21,19 +21,15 @@ struct path_builder_t operator bool () const { return has_data; } bool has_data = false; - float x = 0.; - float y = 0.; + float x; + float y; - optional_point_t lerp (optional_point_t p, float t) - { return optional_point_t (x + t * (p.x - x), y + t * (p.y - y)); } + optional_point_t mid (optional_point_t p) + { return optional_point_t ((x + p.x) * 0.5f, (y + p.y) * 0.5f); } } first_oncurve, first_offcurve, first_offcurve2, last_offcurve, last_offcurve2; - path_builder_t (hb_font_t *font_, hb_draw_session_t &draw_session_) - { - font = font_; - draw_session = &draw_session_; - first_oncurve = first_offcurve = first_offcurve2 = last_offcurve = last_offcurve2 = optional_point_t (); - } + path_builder_t (hb_font_t *font_, hb_draw_session_t &draw_session_) : + font (font_), draw_session (&draw_session_) {} /* based on https://github.com/RazrFalcon/ttf-parser/blob/4f32821/src/glyf.rs#L287 See also: @@ -41,6 +37,7 @@ struct path_builder_t * https://stackoverflow.com/a/20772557 * * Cubic support added. */ + HB_ALWAYS_INLINE void consume_point (const contour_point_t &point) { bool is_on_curve = point.flag & glyf_impl::SimpleGlyph::FLAG_ON_CURVE; @@ -50,7 +47,7 @@ struct path_builder_t bool is_cubic = !is_on_curve && (point.flag & glyf_impl::SimpleGlyph::FLAG_CUBIC); #endif optional_point_t p (font->em_fscalef_x (point.x), font->em_fscalef_y (point.y)); - if (!first_oncurve) + if (unlikely (!first_oncurve)) { if (is_on_curve) { @@ -66,7 +63,7 @@ struct path_builder_t } else if (first_offcurve) { - optional_point_t mid = first_offcurve.lerp (p, .5f); + optional_point_t mid = first_offcurve.mid (p); first_oncurve = mid; last_offcurve = p; draw_session->move_to (mid.x, mid.y); @@ -102,7 +99,7 @@ struct path_builder_t } else { - optional_point_t mid = last_offcurve.lerp (p, .5f); + optional_point_t mid = last_offcurve.mid (p); if (is_cubic) { @@ -127,13 +124,13 @@ struct path_builder_t } } - if (point.is_end_point) + if (unlikely (point.is_end_point)) { if (first_offcurve && last_offcurve) { - optional_point_t mid = last_offcurve.lerp (first_offcurve2 ? - first_offcurve2 : - first_offcurve, .5f); + optional_point_t mid = last_offcurve.mid (first_offcurve2 ? + first_offcurve2 : + first_offcurve); if (last_offcurve2) draw_session->cubic_to (last_offcurve2.x, last_offcurve2.y, last_offcurve.x, last_offcurve.y, diff --git a/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh b/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh index c1839f3b..c8de1013 100644 --- a/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh +++ b/src/3rdparty/harfbuzz-ng/src/OT/name/name.hh @@ -359,7 +359,7 @@ struct name record.nameID = ids.name_id; record.length = 0; // handled in NameRecord copy() record.offset = 0; - memcpy (name_records, &record, NameRecord::static_size); + hb_memcpy (name_records, &record, NameRecord::static_size); name_records++; } #endif @@ -384,10 +384,7 @@ struct name bool subset (hb_subset_context_t *c) const { - TRACE_SUBSET (this); - - name *name_prime = c->serializer->start_embed (); - if (unlikely (!name_prime)) return_trace (false); + auto *name_prime = c->serializer->start_embed (); #ifdef HB_EXPERIMENTAL_API const hb_hashmap_t *name_table_overrides = @@ -436,7 +433,7 @@ struct name if (!name_table_overrides->is_empty ()) { if (unlikely (!insert_name_records.alloc (name_table_overrides->get_population (), true))) - return_trace (false); + return false; for (const auto& record_ids : name_table_overrides->keys ()) { if (name_table_overrides->get (record_ids).length == 0) @@ -448,13 +445,13 @@ struct name } #endif - return (name_prime->serialize (c->serializer, it, - std::addressof (this + stringOffset) + return name_prime->serialize (c->serializer, it, + std::addressof (this + stringOffset) #ifdef HB_EXPERIMENTAL_API - , insert_name_records - , name_table_overrides + , insert_name_records + , name_table_overrides #endif - )); + ); } bool sanitize_records (hb_sanitize_context_t *c) const diff --git a/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh b/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh index c2e24a70..c1432883 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/classdef-graph.hh @@ -72,7 +72,7 @@ struct ClassDef : public OT::ClassDef class_def_link->width = SmallTypes::size; class_def_link->objidx = class_def_prime_id; class_def_link->position = link_position; - class_def_prime_vertex.parents.push (parent_id); + class_def_prime_vertex.add_parent (parent_id); return true; } @@ -94,7 +94,13 @@ struct ClassDef : public OT::ClassDef } hb_bytes_t class_def_copy = serializer.copy_bytes (); - c.add_buffer ((char *) class_def_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + if (!class_def_copy.arrayZ) return false; + // Give ownership to the context, it will cleanup the buffer. + if (!c.add_buffer ((char *) class_def_copy.arrayZ)) + { + hb_free ((char *) class_def_copy.arrayZ); + return false; + } auto& obj = c.graph.vertices_[dest_obj].obj; obj.head = (char *) class_def_copy.arrayZ; diff --git a/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh b/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh index 49d09363..4f44e076 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/coverage-graph.hh @@ -96,7 +96,7 @@ struct Coverage : public OT::Layout::Common::Coverage coverage_link->width = SmallTypes::size; coverage_link->objidx = coverage_prime_id; coverage_link->position = link_position; - coverage_prime_vertex.parents.push (parent_id); + coverage_prime_vertex.add_parent (parent_id); return (Coverage*) coverage_prime_vertex.obj.head; } @@ -118,7 +118,13 @@ struct Coverage : public OT::Layout::Common::Coverage } hb_bytes_t coverage_copy = serializer.copy_bytes (); - c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + if (!coverage_copy.arrayZ) return false; + // Give ownership to the context, it will cleanup the buffer. + if (!c.add_buffer ((char *) coverage_copy.arrayZ)) + { + hb_free ((char *) coverage_copy.arrayZ); + return false; + } auto& obj = c.graph.vertices_[dest_obj].obj; obj.head = (char *) coverage_copy.arrayZ; diff --git a/src/3rdparty/harfbuzz-ng/src/graph/graph.hh b/src/3rdparty/harfbuzz-ng/src/graph/graph.hh index 38ca5db0..2b742eff 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/graph.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/graph.hh @@ -43,12 +43,28 @@ struct graph_t { hb_serialize_context_t::object_t obj; int64_t distance = 0 ; - int64_t space = 0 ; - hb_vector_t parents; + unsigned space = 0 ; unsigned start = 0; unsigned end = 0; unsigned priority = 0; + private: + unsigned incoming_edges_ = 0; + unsigned single_parent = (unsigned) -1; + hb_hashmap_t parents; + public: + auto parents_iter () const HB_AUTO_RETURN + ( + hb_concat ( + hb_iter (&single_parent, single_parent != (unsigned) -1), + parents.keys_ref () + ) + ) + + bool in_error () const + { + return parents.in_error (); + } bool link_positions_valid (unsigned num_objects, bool removed_nil) { @@ -143,7 +159,9 @@ struct graph_t hb_swap (a.obj, b.obj); hb_swap (a.distance, b.distance); hb_swap (a.space, b.space); + hb_swap (a.single_parent, b.single_parent); hb_swap (a.parents, b.parents); + hb_swap (a.incoming_edges_, b.incoming_edges_); hb_swap (a.start, b.start); hb_swap (a.end, b.end); hb_swap (a.priority, b.priority); @@ -154,6 +172,7 @@ struct graph_t { hb_hashmap_t result; + result.alloc (obj.real_links.length); for (const auto& l : obj.real_links) { result.set (l.position, l.objidx); } @@ -163,27 +182,83 @@ struct graph_t bool is_shared () const { - return parents.length > 1; + return parents.get_population () > 1; } unsigned incoming_edges () const { - return parents.length; + if (HB_DEBUG_SUBSET_REPACK) + { + assert (incoming_edges_ == (single_parent != (unsigned) -1) + + (parents.values_ref () | hb_reduce (hb_add, 0))); + } + return incoming_edges_; + } + + void reset_parents () + { + incoming_edges_ = 0; + single_parent = (unsigned) -1; + parents.reset (); + } + + void add_parent (unsigned parent_index) + { + assert (parent_index != (unsigned) -1); + if (incoming_edges_ == 0) + { + single_parent = parent_index; + incoming_edges_ = 1; + return; + } + else if (single_parent != (unsigned) -1) + { + assert (incoming_edges_ == 1); + if (!parents.set (single_parent, 1)) + return; + single_parent = (unsigned) -1; + } + + unsigned *v; + if (parents.has (parent_index, &v)) + { + (*v)++; + incoming_edges_++; + } + else if (parents.set (parent_index, 1)) + incoming_edges_++; } void remove_parent (unsigned parent_index) { - for (unsigned i = 0; i < parents.length; i++) + if (parent_index == single_parent) { - if (parents[i] != parent_index) continue; - parents.remove_unordered (i); - break; + single_parent = (unsigned) -1; + incoming_edges_--; + return; + } + + unsigned *v; + if (parents.has (parent_index, &v)) + { + incoming_edges_--; + if (*v > 1) + (*v)--; + else + parents.del (parent_index); + + if (incoming_edges_ == 1) + { + single_parent = *parents.keys (); + parents.reset (); + } } } void remove_real_link (unsigned child_index, const void* offset) { - for (unsigned i = 0; i < obj.real_links.length; i++) + unsigned count = obj.real_links.length; + for (unsigned i = 0; i < count; i++) { auto& link = obj.real_links.arrayZ[i]; if (link.objidx != child_index) @@ -197,18 +272,53 @@ struct graph_t } } - void remap_parents (const hb_vector_t& id_map) + bool remap_parents (const hb_vector_t& id_map) { - for (unsigned i = 0; i < parents.length; i++) - parents[i] = id_map[parents[i]]; + if (single_parent != (unsigned) -1) + { + assert (single_parent < id_map.length); + single_parent = id_map[single_parent]; + return true; + } + + hb_hashmap_t new_parents; + new_parents.alloc (parents.get_population ()); + for (auto _ : parents) + { + assert (_.first < id_map.length); + assert (!new_parents.has (id_map[_.first])); + new_parents.set (id_map[_.first], _.second); + } + + if (parents.in_error() || new_parents.in_error ()) + return false; + + parents = std::move (new_parents); + return true; } void remap_parent (unsigned old_index, unsigned new_index) { - for (unsigned i = 0; i < parents.length; i++) + if (single_parent != (unsigned) -1) { - if (parents[i] == old_index) - parents[i] = new_index; + if (single_parent == old_index) + single_parent = new_index; + return; + } + + const unsigned *pv; + if (parents.has (old_index, &pv)) + { + unsigned v = *pv; + if (!parents.set (new_index, v)) + incoming_edges_ -= v; + parents.del (old_index); + + if (incoming_edges_ == 1) + { + single_parent = *parents.keys (); + parents.reset (); + } } } @@ -328,11 +438,12 @@ struct graph_t bool removed_nil = false; vertices_.alloc (objects.length); vertices_scratch_.alloc (objects.length); - for (unsigned i = 0; i < objects.length; i++) + unsigned count = objects.length; + for (unsigned i = 0; i < count; i++) { // If this graph came from a serialization buffer object 0 is the // nil object. We don't need it for our purposes here so drop it. - if (i == 0 && !objects[i]) + if (i == 0 && !objects.arrayZ[i]) { removed_nil = true; continue; @@ -340,9 +451,9 @@ struct graph_t vertex_t* v = vertices_.push (); if (check_success (!vertices_.in_error ())) - v->obj = *objects[i]; + v->obj = *objects.arrayZ[i]; - check_success (v->link_positions_valid (objects.length, removed_nil)); + check_success (v->link_positions_valid (count, removed_nil)); if (!removed_nil) continue; // Fix indices to account for removed nil object. @@ -354,7 +465,6 @@ struct graph_t ~graph_t () { - vertices_.fini (); for (char* b : buffers) hb_free (b); } @@ -364,6 +474,18 @@ struct graph_t return root ().equals (other.root (), *this, other, 0); } + void print () const { + for (int i = vertices_.length - 1; i >= 0; i--) + { + const auto& v = vertices_[i]; + printf("%d: %lu [", i, v.table_size()); + for (const auto &l : v.obj.real_links) { + printf("%u, ", l.objidx); + } + printf("]\n"); + } + } + // Sorts links of all objects in a consistent manner and zeroes all offsets. void normalize () { @@ -396,9 +518,10 @@ struct graph_t return vertices_[i].obj; } - void add_buffer (char* buffer) + bool add_buffer (char* buffer) { buffers.push (buffer); + return !buffers.in_error (); } /* @@ -414,7 +537,7 @@ struct graph_t link->width = 2; link->objidx = child_id; link->position = (char*) offset - (char*) v.obj.head; - vertices_[child_id].parents.push (parent_id); + vertices_[child_id].add_parent (parent_id); } /* @@ -460,7 +583,7 @@ struct graph_t { unsigned next_id = queue.pop_minimum().second; - hb_swap (sorted_graph[new_id], vertices_[next_id]); + sorted_graph[new_id] = std::move (vertices_[next_id]); const vertex_t& next = sorted_graph[new_id]; if (unlikely (!check_success(new_id >= 0))) { @@ -488,8 +611,8 @@ struct graph_t check_success (!queue.in_error ()); check_success (!sorted_graph.in_error ()); - remap_all_obj_indices (id_map, &sorted_graph); - hb_swap (vertices_, sorted_graph); + check_success (remap_all_obj_indices (id_map, &sorted_graph)); + vertices_ = std::move (sorted_graph); if (!check_success (new_id == -1)) print_orphaned_nodes (); @@ -579,8 +702,8 @@ struct graph_t const auto& node = object (node_idx); if (offset < node.head || offset >= node.tail) return -1; - unsigned length = node.real_links.length; - for (unsigned i = 0; i < length; i++) + unsigned count = node.real_links.length; + for (unsigned i = 0; i < count; i++) { // Use direct access for increased performance, this is a hot method. const auto& link = node.real_links.arrayZ[i]; @@ -600,7 +723,7 @@ struct graph_t { unsigned child_idx = index_for_offset (node_idx, offset); auto& child = vertices_[child_idx]; - for (unsigned p : child.parents) + for (unsigned p : child.parents_iter ()) { if (p != node_idx) { return duplicate (node_idx, child_idx); @@ -683,12 +806,15 @@ struct graph_t subgraph.set (root_idx, wide_parents (root_idx, parents)); find_subgraph (root_idx, subgraph); } + if (subgraph.in_error ()) + return false; unsigned original_root_idx = root_idx (); hb_map_t index_map; bool made_changes = false; for (auto entry : subgraph.iter ()) { + assert (entry.first < vertices_.length); const auto& node = vertices_[entry.first]; unsigned subgraph_incoming_edges = entry.second; @@ -727,8 +853,7 @@ struct graph_t remap_obj_indices (index_map, parents.iter (), true); // Update roots set with new indices as needed. - uint32_t next = HB_SET_VALUE_INVALID; - while (roots.next (&next)) + for (auto next : roots) { const uint32_t *v; if (index_map.has (next, &v)) @@ -745,10 +870,10 @@ struct graph_t { for (const auto& link : vertices_[node_idx].obj.all_links ()) { - const uint32_t *v; + hb_codepoint_t *v; if (subgraph.has (link.objidx, &v)) { - subgraph.set (link.objidx, *v + 1); + (*v)++; continue; } subgraph.set (link.objidx, 1); @@ -820,7 +945,7 @@ struct graph_t new_link->position = (const char*) new_offset - (const char*) new_v.obj.head; auto& child = vertices_[child_id]; - child.parents.push (new_parent_idx); + child.add_parent (new_parent_idx); old_v.remove_real_link (child_id, old_offset); child.remove_parent (old_parent_idx); @@ -864,18 +989,18 @@ struct graph_t clone->obj.tail = child.obj.tail; clone->distance = child.distance; clone->space = child.space; - clone->parents.reset (); + clone->reset_parents (); unsigned clone_idx = vertices_.length - 2; for (const auto& l : child.obj.real_links) { clone->obj.real_links.push (l); - vertices_[l.objidx].parents.push (clone_idx); + vertices_[l.objidx].add_parent (clone_idx); } for (const auto& l : child.obj.virtual_links) { clone->obj.virtual_links.push (l); - vertices_[l.objidx].parents.push (clone_idx); + vertices_[l.objidx].add_parent (clone_idx); } check_success (!clone->obj.real_links.in_error ()); @@ -1004,13 +1129,13 @@ struct graph_t { update_parents(); - if (root().parents) + if (root().incoming_edges ()) // Root cannot have parents. return false; for (unsigned i = 0; i < root_idx (); i++) { - if (!vertices_[i].parents) + if (!vertices_[i].incoming_edges ()) return false; } return true; @@ -1074,14 +1199,14 @@ struct graph_t parents_invalid = true; update_parents(); - if (root().parents) { + if (root().incoming_edges ()) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Root node has incoming edges."); } for (unsigned i = 0; i < root_idx (); i++) { const auto& v = vertices_[i]; - if (!v.parents) + if (!v.incoming_edges ()) DEBUG_MSG (SUBSET_REPACK, nullptr, "Node %u is orphaned.", i); } } @@ -1113,6 +1238,8 @@ struct graph_t unsigned space_for (unsigned index, unsigned* root = nullptr) const { + loop: + assert (index < vertices_.length); const auto& node = vertices_[index]; if (node.space) { @@ -1121,22 +1248,24 @@ struct graph_t return node.space; } - if (!node.parents) + if (!node.incoming_edges ()) { if (root) *root = index; return 0; } - return space_for (node.parents[0], root); + index = *node.parents_iter (); + goto loop; } void err_other_error () { this->successful = false; } size_t total_size_in_bytes () const { size_t total_size = 0; - for (unsigned i = 0; i < vertices_.length; i++) { - size_t size = vertices_[i].obj.tail - vertices_[i].obj.head; + unsigned count = vertices_.length; + for (unsigned i = 0; i < count; i++) { + size_t size = vertices_.arrayZ[i].obj.tail - vertices_.arrayZ[i].obj.head; total_size += size; } return total_size; @@ -1151,12 +1280,8 @@ struct graph_t unsigned wide_parents (unsigned node_idx, hb_set_t& parents) const { unsigned count = 0; - hb_set_t visited; - for (unsigned p : vertices_[node_idx].parents) + for (unsigned p : vertices_[node_idx].parents_iter ()) { - if (visited.has (p)) continue; - visited.add (p); - // Only real links can be wide for (const auto& l : vertices_[p].obj.real_links) { @@ -1183,21 +1308,21 @@ struct graph_t { if (!parents_invalid) return; - for (unsigned i = 0; i < vertices_.length; i++) - vertices_[i].parents.reset (); + unsigned count = vertices_.length; - for (unsigned p = 0; p < vertices_.length; p++) + for (unsigned i = 0; i < count; i++) + vertices_.arrayZ[i].reset_parents (); + + for (unsigned p = 0; p < count; p++) { - for (auto& l : vertices_[p].obj.all_links ()) - { - vertices_[l.objidx].parents.push (p); - } + for (auto& l : vertices_.arrayZ[p].obj.all_links ()) + vertices_[l.objidx].add_parent (p); } - for (unsigned i = 0; i < vertices_.length; i++) + for (unsigned i = 0; i < count; i++) // parents arrays must be accurate or downstream operations like cycle detection // and sorting won't work correctly. - check_success (!vertices_[i].parents.in_error ()); + check_success (!vertices_.arrayZ[i].in_error ()); parents_invalid = false; } @@ -1239,13 +1364,10 @@ struct graph_t // According to https://www3.cs.stonybrook.edu/~rezaul/papers/TR-07-54.pdf // for practical performance this is faster then using a more advanced queue // (such as a fibonacci queue) with a fast decrease priority. - for (unsigned i = 0; i < vertices_.length; i++) - { - if (i == vertices_.length - 1) - vertices_[i].distance = 0; - else - vertices_[i].distance = hb_int_max (int64_t); - } + unsigned count = vertices_.length; + for (unsigned i = 0; i < count; i++) + vertices_.arrayZ[i].distance = hb_int_max (int64_t); + vertices_.tail ().distance = 0; hb_priority_queue_t queue; queue.insert (0, vertices_.length - 1); @@ -1265,15 +1387,15 @@ struct graph_t { if (visited[link.objidx]) continue; - const auto& child = vertices_[link.objidx].obj; + const auto& child = vertices_.arrayZ[link.objidx].obj; unsigned link_width = link.width ? link.width : 4; // treat virtual offsets as 32 bits wide int64_t child_weight = (child.tail - child.head) + - ((int64_t) 1 << (link_width * 8)) * (vertices_[link.objidx].space + 1); + ((int64_t) 1 << (link_width * 8)) * (vertices_.arrayZ[link.objidx].space + 1); int64_t child_distance = next_distance + child_weight; - if (child_distance < vertices_[link.objidx].distance) + if (child_distance < vertices_.arrayZ[link.objidx].distance) { - vertices_[link.objidx].distance = child_distance; + vertices_.arrayZ[link.objidx].distance = child_distance; queue.insert (child_distance, link.objidx); } } @@ -1301,7 +1423,7 @@ struct graph_t unsigned old_idx = link.objidx; link.objidx = new_idx; vertices_[old_idx].remove_parent (parent_idx); - vertices_[new_idx].parents.push (parent_idx); + vertices_[new_idx].add_parent (parent_idx); } /* @@ -1329,17 +1451,20 @@ struct graph_t /* * Updates all objidx's in all links using the provided mapping. */ - void remap_all_obj_indices (const hb_vector_t& id_map, + bool remap_all_obj_indices (const hb_vector_t& id_map, hb_vector_t* sorted_graph) const { - for (unsigned i = 0; i < sorted_graph->length; i++) + unsigned count = sorted_graph->length; + for (unsigned i = 0; i < count; i++) { - (*sorted_graph)[i].remap_parents (id_map); - for (auto& link : (*sorted_graph)[i].obj.all_links_writer ()) + if (!(*sorted_graph)[i].remap_parents (id_map)) + return false; + for (auto& link : sorted_graph->arrayZ[i].obj.all_links_writer ()) { link.objidx = id_map[link.objidx]; } } + return true; } /* @@ -1370,7 +1495,7 @@ struct graph_t for (const auto& l : v.obj.all_links ()) find_connected_nodes (l.objidx, targets, visited, connected); - for (unsigned p : v.parents) + for (unsigned p : v.parents_iter ()) find_connected_nodes (p, targets, visited, connected); } diff --git a/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc b/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc index b2044426..d66eb49c 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc +++ b/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.cc @@ -52,7 +52,11 @@ unsigned gsubgpos_graph_context_t::create_node (unsigned size) if (!buffer) return -1; - add_buffer (buffer); + if (!add_buffer (buffer)) { + // Allocation did not get stored for freeing later. + hb_free (buffer); + return -1; + } return graph.new_node (buffer, buffer + size); } diff --git a/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh b/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh index 9fe9662e..b25d538f 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-context.hh @@ -40,16 +40,16 @@ struct gsubgpos_graph_context_t graph_t& graph; unsigned lookup_list_index; hb_hashmap_t lookups; - + hb_hashmap_t subtable_to_extension; HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_, graph_t& graph_); HB_INTERNAL unsigned create_node (unsigned size); - void add_buffer (char* buffer) + bool add_buffer (char* buffer) { - graph.add_buffer (buffer); + return graph.add_buffer (buffer); } private: diff --git a/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh b/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh index c1706384..12fcbdc4 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/gsubgpos-graph.hh @@ -166,7 +166,7 @@ struct Lookup : public OT::Lookup } if (all_new_subtables) { - add_sub_tables (c, this_index, type, all_new_subtables); + return add_sub_tables (c, this_index, type, all_new_subtables); } return true; @@ -184,7 +184,7 @@ struct Lookup : public OT::Lookup return sub_table->split_subtables (c, parent_idx, objidx); } - void add_sub_tables (gsubgpos_graph_context_t& c, + bool add_sub_tables (gsubgpos_graph_context_t& c, unsigned this_index, unsigned type, hb_vector_t>>& subtable_ids) @@ -200,7 +200,12 @@ struct Lookup : public OT::Lookup size_t new_size = v.table_size () + new_subtable_count * OT::Offset16::static_size; char* buffer = (char*) hb_calloc (1, new_size); - c.add_buffer (buffer); + if (!buffer) return false; + if (!c.add_buffer (buffer)) + { + hb_free (buffer); + return false; + } hb_memcpy (buffer, v.obj.head, v.table_size()); v.obj.head = buffer; @@ -220,7 +225,7 @@ struct Lookup : public OT::Lookup if (is_ext) { unsigned ext_id = create_extension_subtable (c, subtable_id, type); - c.graph.vertices_[subtable_id].parents.push (ext_id); + c.graph.vertices_[subtable_id].add_parent (ext_id); subtable_id = ext_id; } @@ -229,7 +234,7 @@ struct Lookup : public OT::Lookup link->objidx = subtable_id; link->position = (char*) &new_lookup->subTable[offset_index++] - (char*) new_lookup; - c.graph.vertices_[subtable_id].parents.push (this_index); + c.graph.vertices_[subtable_id].add_parent (this_index); } } @@ -239,6 +244,7 @@ struct Lookup : public OT::Lookup // The head location of the lookup has changed, invalidating the lookups map entry // in the context. Update the map. c.lookups.set (this_index, new_lookup); + return true; } void fix_existing_subtable_links (gsubgpos_graph_context_t& c, @@ -293,24 +299,35 @@ struct Lookup : public OT::Lookup unsigned subtable_index) { unsigned type = lookupType; + unsigned ext_index = -1; + unsigned* existing_ext_index = nullptr; + if (c.subtable_to_extension.has(subtable_index, &existing_ext_index)) { + ext_index = *existing_ext_index; + } else { + ext_index = create_extension_subtable(c, subtable_index, type); + c.subtable_to_extension.set(subtable_index, ext_index); + } - unsigned ext_index = create_extension_subtable(c, subtable_index, type); if (ext_index == (unsigned) -1) return false; + auto& subtable_vertex = c.graph.vertices_[subtable_index]; auto& lookup_vertex = c.graph.vertices_[lookup_index]; for (auto& l : lookup_vertex.obj.real_links.writer ()) { - if (l.objidx == subtable_index) + if (l.objidx == subtable_index) { // Change lookup to point at the extension. l.objidx = ext_index; + if (existing_ext_index) + subtable_vertex.remove_parent(lookup_index); + } } // Make extension point at the subtable. auto& ext_vertex = c.graph.vertices_[ext_index]; - auto& subtable_vertex = c.graph.vertices_[subtable_index]; - ext_vertex.parents.push (lookup_index); - subtable_vertex.remap_parent (lookup_index, ext_index); + ext_vertex.add_parent (lookup_index); + if (!existing_ext_index) + subtable_vertex.remap_parent (lookup_index, ext_index); return true; } diff --git a/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh b/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh index 84ef5f71..e10e1cf3 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/markbasepos-graph.hh @@ -318,8 +318,11 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2 class_to_info; - unsigned class_count= classCount; - class_to_info.resize (class_count); + unsigned class_count = classCount; + if (!class_count) return class_to_info; + + if (!class_to_info.resize (class_count)) + return hb_vector_t(); auto mark_array = c.graph.as_table (this_index, &markArray); if (!mark_array) return hb_vector_t (); @@ -327,6 +330,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2= class_count) continue; class_to_info[klass].marks.add (mark); } @@ -335,6 +339,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2= class_count) continue; class_to_info[klass].child_indices.push (link.objidx); } diff --git a/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh b/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh index 1c13eb24..ad158cc9 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/pairpos-graph.hh @@ -215,7 +215,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4iter () | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { - return hb_pair_t (gid, class_def_1->get_class (gid)); + return hb_codepoint_pair_t (gid, class_def_1->get_class (gid)); }) ; class_def_size_estimator_t estimator (gid_and_class); @@ -386,14 +386,14 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4iter () | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { - return hb_pair_t (gid, class_def_1_table->get_class (gid)); + return hb_codepoint_pair_t (gid, class_def_1_table->get_class (gid)); }) | hb_filter ([&] (hb_codepoint_t klass) { return klass >= start && klass < end; }, hb_second) - | hb_map_retains_sorting ([&] (hb_pair_t gid_and_class) { + | hb_map_retains_sorting ([&] (hb_codepoint_pair_t gid_and_class) { // Classes must be from 0...N so subtract start - return hb_pair_t (gid_and_class.first, gid_and_class.second - start); + return hb_codepoint_pair_t (gid_and_class.first, gid_and_class.second - start); }) ; @@ -419,7 +419,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4width = SmallTypes::size; class_def_link->objidx = class_def_2_id; class_def_link->position = 10; - graph.vertices_[class_def_2_id].parents.push (pair_pos_prime_id); + graph.vertices_[class_def_2_id].add_parent (pair_pos_prime_id); graph.duplicate (pair_pos_prime_id, class_def_2_id); return pair_pos_prime_id; @@ -519,7 +519,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4iter () | hb_map_retains_sorting ([&] (hb_codepoint_t gid) { - return hb_pair_t (gid, class_def_1.table->get_class (gid)); + return hb_codepoint_pair_t (gid, class_def_1.table->get_class (gid)); }) | hb_filter ([&] (hb_codepoint_t klass) { return klass < count; diff --git a/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh b/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh index 040fd1de..06e4bf44 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh +++ b/src/3rdparty/harfbuzz-ng/src/graph/serialize.hh @@ -116,10 +116,10 @@ will_overflow (graph_t& graph, for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--) { // Don't need to check virtual links for overflow - for (const auto& link : vertices[parent_idx].obj.real_links) + for (const auto& link : vertices.arrayZ[parent_idx].obj.real_links) { int64_t offset = compute_offset (graph, parent_idx, link); - if (is_valid_offset (offset, link)) + if (likely (is_valid_offset (offset, link))) continue; if (!overflows) return true; @@ -226,6 +226,9 @@ inline hb_blob_t* serialize (const graph_t& graph) { hb_vector_t buffer; size_t size = graph.total_size_in_bytes (); + + if (!size) return hb_blob_get_empty (); + if (!buffer.alloc (size)) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Unable to allocate output buffer."); return nullptr; diff --git a/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc b/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc index 55854ff5..266be5e2 100644 --- a/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc +++ b/src/3rdparty/harfbuzz-ng/src/graph/test-classdef-graph.cc @@ -27,7 +27,7 @@ #include "gsubgpos-context.hh" #include "classdef-graph.hh" -typedef hb_pair_t gid_and_class_t; +typedef hb_codepoint_pair_t gid_and_class_t; typedef hb_vector_t gid_and_class_list_t; diff --git a/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc b/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc index d7e8a93f..26e2bc14 100644 --- a/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc +++ b/src/3rdparty/harfbuzz-ng/src/harfbuzz.cc @@ -58,3 +58,5 @@ #include "hb-ucd.cc" #include "hb-unicode.cc" #include "hb-uniscribe.cc" +#include "hb-wasm-api.cc" +#include "hb-wasm-shape.cc" diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh index 2ba9355b..c72c0865 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout-trak-table.hh @@ -111,13 +111,13 @@ struct TrackData break; } } - if (!trackTableEntry) return 0.; + if (!trackTableEntry) return 0; /* * Choose size. */ unsigned int sizes = nSizes; - if (!sizes) return 0.; + if (!sizes) return 0; if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes); hb_array_t size_table ((base+sizeTable).arrayZ, sizes); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc index c9147ff7..5e4cea22 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-aat-layout.cc @@ -55,7 +55,13 @@ AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *p buffer (buffer_), sanitizer (), ankr_table (&Null (AAT::ankr)), - gdef_table (face->table.GDEF->table), + gdef_table ( +#ifndef HB_NO_OT_LAYOUT + face->table.GDEF->table +#else + &Null (GDEF) +#endif + ), lookup_index (0) { sanitizer.init (blob); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-algs.hh b/src/3rdparty/harfbuzz-ng/src/hb-algs.hh index 13587eac..ea970571 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-algs.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-algs.hh @@ -87,6 +87,19 @@ static inline constexpr uint16_t hb_uint16_swap (uint16_t v) static inline constexpr uint32_t hb_uint32_swap (uint32_t v) { return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); } +#ifndef HB_FAST_INT_ACCESS +#if defined(__OPTIMIZE__) && \ + defined(__BYTE_ORDER) && \ + (__BYTE_ORDER == __BIG_ENDIAN || \ + (__BYTE_ORDER == __LITTLE_ENDIAN && \ + hb_has_builtin(__builtin_bswap16) && \ + hb_has_builtin(__builtin_bswap32))) +#define HB_FAST_INT_ACCESS 1 +#else +#define HB_FAST_INT_ACCESS 0 +#endif +#endif + template struct BEInt; template @@ -101,21 +114,25 @@ struct BEInt template struct BEInt { + struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; + public: BEInt () = default; - constexpr BEInt (Type V) : v {uint8_t ((V >> 8) & 0xFF), - uint8_t ((V ) & 0xFF)} {} - struct __attribute__((packed)) packed_uint16_t { uint16_t v; }; - constexpr operator Type () const - { -#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ - defined(__BYTE_ORDER) && \ - (__BYTE_ORDER == __BIG_ENDIAN || \ - (__BYTE_ORDER == __LITTLE_ENDIAN && \ - hb_has_builtin(__builtin_bswap16))) - /* Spoon-feed the compiler a big-endian integer with alignment 1. - * https://github.com/harfbuzz/harfbuzz/pull/1398 */ + BEInt (Type V) +#if HB_FAST_INT_ACCESS +#if __BYTE_ORDER == __LITTLE_ENDIAN + { ((packed_uint16_t *) v)->v = __builtin_bswap16 (V); } +#else /* __BYTE_ORDER == __BIG_ENDIAN */ + { ((packed_uint16_t *) v)->v = V; } +#endif +#else + : v {uint8_t ((V >> 8) & 0xFF), + uint8_t ((V ) & 0xFF)} {} +#endif + + constexpr operator Type () const { +#if HB_FAST_INT_ACCESS #if __BYTE_ORDER == __LITTLE_ENDIAN return __builtin_bswap16 (((packed_uint16_t *) v)->v); #else /* __BYTE_ORDER == __BIG_ENDIAN */ @@ -146,22 +163,27 @@ struct BEInt template struct BEInt { + struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; + public: BEInt () = default; - constexpr BEInt (Type V) : v {uint8_t ((V >> 24) & 0xFF), - uint8_t ((V >> 16) & 0xFF), - uint8_t ((V >> 8) & 0xFF), - uint8_t ((V ) & 0xFF)} {} - struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; + BEInt (Type V) +#if HB_FAST_INT_ACCESS +#if __BYTE_ORDER == __LITTLE_ENDIAN + { ((packed_uint32_t *) v)->v = __builtin_bswap32 (V); } +#else /* __BYTE_ORDER == __BIG_ENDIAN */ + { ((packed_uint32_t *) v)->v = V; } +#endif +#else + : v {uint8_t ((V >> 24) & 0xFF), + uint8_t ((V >> 16) & 0xFF), + uint8_t ((V >> 8) & 0xFF), + uint8_t ((V ) & 0xFF)} {} +#endif + constexpr operator Type () const { -#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ - defined(__BYTE_ORDER) && \ - (__BYTE_ORDER == __BIG_ENDIAN || \ - (__BYTE_ORDER == __LITTLE_ENDIAN && \ - hb_has_builtin(__builtin_bswap32))) - /* Spoon-feed the compiler a big-endian integer with alignment 1. - * https://github.com/harfbuzz/harfbuzz/pull/1398 */ +#if HB_FAST_INT_ACCESS #if __BYTE_ORDER == __LITTLE_ENDIAN return __builtin_bswap32 (((packed_uint32_t *) v)->v); #else /* __BYTE_ORDER == __BIG_ENDIAN */ @@ -231,12 +253,123 @@ struct } HB_FUNCOBJ (hb_bool); + +/* The MIT License + + Copyright (C) 2012 Zilong Tan (eric.zltan@gmail.com) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + + +// Compression function for Merkle-Damgard construction. +// This function is generated using the framework provided. +#define mix(h) ( \ + (void) ((h) ^= (h) >> 23), \ + (void) ((h) *= 0x2127599bf4325c37ULL), \ + (h) ^= (h) >> 47) + +static inline uint64_t fasthash64(const void *buf, size_t len, uint64_t seed) +{ + struct __attribute__((packed)) packed_uint64_t { uint64_t v; }; + const uint64_t m = 0x880355f21e6d1965ULL; + const packed_uint64_t *pos = (const packed_uint64_t *)buf; + const packed_uint64_t *end = pos + (len / 8); + const unsigned char *pos2; + uint64_t h = seed ^ (len * m); + uint64_t v; + +#ifndef HB_OPTIMIZE_SIZE + if (((uintptr_t) pos & 7) == 0) + { + while (pos != end) + { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + v = * (const uint64_t *) (pos++); +#pragma GCC diagnostic pop + h ^= mix(v); + h *= m; + } + } + else +#endif + { + while (pos != end) + { + v = pos++->v; + h ^= mix(v); + h *= m; + } + } + + pos2 = (const unsigned char*)pos; + v = 0; + + switch (len & 7) { + case 7: v ^= (uint64_t)pos2[6] << 48; HB_FALLTHROUGH; + case 6: v ^= (uint64_t)pos2[5] << 40; HB_FALLTHROUGH; + case 5: v ^= (uint64_t)pos2[4] << 32; HB_FALLTHROUGH; + case 4: v ^= (uint64_t)pos2[3] << 24; HB_FALLTHROUGH; + case 3: v ^= (uint64_t)pos2[2] << 16; HB_FALLTHROUGH; + case 2: v ^= (uint64_t)pos2[1] << 8; HB_FALLTHROUGH; + case 1: v ^= (uint64_t)pos2[0]; + h ^= mix(v); + h *= m; + } + + return mix(h); +} + +static inline uint32_t fasthash32(const void *buf, size_t len, uint32_t seed) +{ + // the following trick converts the 64-bit hashcode to Fermat + // residue, which shall retain information from both the higher + // and lower parts of hashcode. + uint64_t h = fasthash64(buf, len, seed); + return h - (h >> 32); +} + struct { private: template constexpr auto - impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) + impl (const T& v, hb_priority<2>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) + + // Horrible: std:hash() of integers seems to be identity in gcc / clang?! + // https://github.com/harfbuzz/harfbuzz/pull/4228 + // + // For performance characteristics see: + // https://github.com/harfbuzz/harfbuzz/pull/4228#issuecomment-1565079537 + template ::value && sizeof (T) <= sizeof (uint32_t))> constexpr auto + impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, (uint32_t) v * 2654435761u /* Knuh's multiplicative hash */) + template ::value && sizeof (T) > sizeof (uint32_t))> constexpr auto + impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, (uint32_t) (v ^ (v >> 32)) * 2654435761u /* Knuth's multiplicative hash */) + + template ::value)> constexpr auto + impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, fasthash32 (std::addressof (v), sizeof (T), 0xf437ffe6)) template constexpr auto impl (const T& v, hb_priority<0>) const HB_RETURN (uint32_t, std::hash>{} (hb_deref (v))) @@ -551,6 +684,8 @@ struct hb_pair_t template static inline hb_pair_t hb_pair (T1&& a, T2&& b) { return hb_pair_t (a, b); } +typedef hb_pair_t hb_codepoint_pair_t; + struct { template constexpr typename Pair::first_t @@ -626,8 +761,10 @@ hb_popcount (T v) if (sizeof (T) == 8) { - unsigned int shift = 32; - return hb_popcount ((uint32_t) v) + hb_popcount ((uint32_t) (v >> shift)); + uint64_t y = (uint64_t) v; + y -= ((y >> 1) & 0x5555555555555555ull); + y = (y & 0x3333333333333333ull) + (y >> 2 & 0x3333333333333333ull); + return ((y + (y >> 4)) & 0xf0f0f0f0f0f0f0full) * 0x101010101010101ull >> 56; } if (sizeof (T) == 16) @@ -851,7 +988,7 @@ static inline void * hb_memset (void *s, int c, unsigned int n) { /* It's illegal to pass NULL to memset(), even if n is zero. */ - if (unlikely (!n)) return 0; + if (unlikely (!n)) return s; return memset (s, c, n); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-array.hh b/src/3rdparty/harfbuzz-ng/src/hb-array.hh index e82c0815..760f9025 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-array.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-array.hh @@ -75,11 +75,25 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> */ typedef Type& __item_t__; static constexpr bool is_random_access_iterator = true; + static constexpr bool has_fast_len = true; + Type& __item__ () const + { + if (unlikely (!length)) return CrapOrNull (Type); + return *arrayZ; + } Type& __item_at__ (unsigned i) const { if (unlikely (i >= length)) return CrapOrNull (Type); return arrayZ[i]; } + void __next__ () + { + if (unlikely (!length)) + return; + length--; + backwards_length++; + arrayZ++; + } void __forward__ (unsigned n) { if (unlikely (n > length)) @@ -88,6 +102,14 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> backwards_length += n; arrayZ += n; } + void __prev__ () + { + if (unlikely (!backwards_length)) + return; + length++; + backwards_length--; + arrayZ--; + } void __rewind__ (unsigned n) { if (unlikely (n > backwards_length)) @@ -122,9 +144,14 @@ struct hb_array_t : hb_iter_with_fallback_t, Type&> uint32_t hash () const { - uint32_t current = 0; + // FNV-1a hash function + // https://github.com/harfbuzz/harfbuzz/pull/4228 + uint32_t current = /*cbf29ce4*/0x84222325; for (auto &v : *this) - current = current * 31 + hb_hash (v); + { + current = current ^ hb_hash (v); + current = current * 16777619; + } return current; } @@ -322,6 +349,7 @@ struct hb_sorted_array_t : HB_ITER_USING (iter_base_t); static constexpr bool is_random_access_iterator = true; static constexpr bool is_sorted_iterator = true; + static constexpr bool has_fast_len = true; hb_sorted_array_t () = default; hb_sorted_array_t (const hb_sorted_array_t&) = default; @@ -449,41 +477,21 @@ inline bool hb_array_t::operator == (const hb_array_t inline uint32_t hb_array_t::hash () const { - uint32_t current = 0; - unsigned i = 0; - -#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ - ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) - struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; - for (; i + 4 <= this->length; i += 4) - current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v); -#endif - - for (; i < this->length; i++) - current = current * 31 + hb_hash (this->arrayZ[i]); - return current; + // https://github.com/harfbuzz/harfbuzz/pull/4228 + return fasthash32(arrayZ, length, 0xf437ffe6 /* magic? */); } template <> inline uint32_t hb_array_t::hash () const { - uint32_t current = 0; - unsigned i = 0; - -#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ - ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) - struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; - for (; i + 4 <= this->length; i += 4) - current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v); -#endif - - for (; i < this->length; i++) - current = current * 31 + hb_hash (this->arrayZ[i]); - return current; + // https://github.com/harfbuzz/harfbuzz/pull/4228 + return fasthash32(arrayZ, length, 0xf437ffe6 /* magic? */); } +#endif typedef hb_array_t hb_bytes_t; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh b/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh index a6283de1..303dfe6d 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-atomic.hh @@ -204,6 +204,7 @@ struct hb_atomic_ptr_t hb_atomic_ptr_t () = default; constexpr hb_atomic_ptr_t (T* v) : v (v) {} + hb_atomic_ptr_t (const hb_atomic_ptr_t &other) = delete; void init (T* v_ = nullptr) { set_relaxed (v_); } void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh b/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh index 9edefd97..f5414725 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-bimap.hh @@ -39,10 +39,10 @@ struct hb_bimap_t back_map.reset (); } - void resize (unsigned pop) + void alloc (unsigned pop) { - forw_map.resize (pop); - back_map.resize (pop); + forw_map.alloc (pop); + back_map.alloc (pop); } bool in_error () const { return forw_map.in_error () || back_map.in_error (); } @@ -83,7 +83,6 @@ struct hb_bimap_t unsigned int get_population () const { return forw_map.get_population (); } - protected: hb_map_t forw_map; hb_map_t back_map; @@ -94,9 +93,31 @@ struct hb_bimap_t auto iter () const HB_AUTO_RETURN (+ forw_map.iter()) }; -/* Inremental bimap: only lhs is given, rhs is incrementally assigned */ -struct hb_inc_bimap_t : hb_bimap_t +/* Incremental bimap: only lhs is given, rhs is incrementally assigned */ +struct hb_inc_bimap_t { + bool in_error () const { return forw_map.in_error () || back_map.in_error (); } + + unsigned int get_population () const { return forw_map.get_population (); } + + void reset () + { + forw_map.reset (); + back_map.reset (); + } + + void alloc (unsigned pop) + { + forw_map.alloc (pop); + back_map.alloc (pop); + } + + void clear () + { + forw_map.clear (); + back_map.resize (0); + } + /* Add a mapping from lhs to rhs with a unique value if lhs is unknown. * Return the rhs value as the result. */ @@ -105,32 +126,42 @@ struct hb_inc_bimap_t : hb_bimap_t hb_codepoint_t rhs = forw_map[lhs]; if (rhs == HB_MAP_VALUE_INVALID) { - rhs = next_value++; - set (lhs, rhs); + rhs = back_map.length; + forw_map.set (lhs, rhs); + back_map.push (lhs); } return rhs; } hb_codepoint_t skip () - { return next_value++; } + { + hb_codepoint_t start = back_map.length; + back_map.push (HB_MAP_VALUE_INVALID); + return start; + } hb_codepoint_t skip (unsigned count) - { return next_value += count; } + { + hb_codepoint_t start = back_map.length; + back_map.alloc (back_map.length + count); + for (unsigned i = 0; i < count; i++) + back_map.push (HB_MAP_VALUE_INVALID); + return start; + } hb_codepoint_t get_next_value () const - { return next_value; } + { return back_map.length; } void add_set (const hb_set_t *set) { - hb_codepoint_t i = HB_SET_VALUE_INVALID; - while (hb_set_next (set, &i)) add (i); + for (auto i : *set) add (i); } /* Create an identity map. */ bool identity (unsigned int size) { clear (); - for (hb_codepoint_t i = 0; i < size; i++) set (i, i); + for (hb_codepoint_t i = 0; i < size; i++) add (i); return !in_error (); } @@ -145,20 +176,30 @@ struct hb_inc_bimap_t : hb_bimap_t { hb_codepoint_t count = get_population (); hb_vector_t work; - work.resize (count); + if (unlikely (!work.resize (count, false))) return; for (hb_codepoint_t rhs = 0; rhs < count; rhs++) - work[rhs] = back_map[rhs]; + work.arrayZ[rhs] = back_map[rhs]; work.qsort (cmp_id); clear (); for (hb_codepoint_t rhs = 0; rhs < count; rhs++) - set (work[rhs], rhs); + add (work.arrayZ[rhs]); } + hb_codepoint_t get (hb_codepoint_t lhs) const { return forw_map.get (lhs); } + hb_codepoint_t backward (hb_codepoint_t rhs) const { return back_map[rhs]; } + + hb_codepoint_t operator [] (hb_codepoint_t lhs) const { return get (lhs); } + bool has (hb_codepoint_t lhs) const { return forw_map.has (lhs); } + protected: - unsigned int next_value = 0; + hb_map_t forw_map; + hb_vector_t back_map; + + public: + auto keys () const HB_AUTO_RETURN (+ back_map.iter()) }; #endif /* HB_BIMAP_HH */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh b/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh index 9b027ac5..869c6789 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-bit-page.hh @@ -89,14 +89,18 @@ struct hb_vector_size_t struct hb_bit_page_t { - void init0 () { v.init0 (); } - void init1 () { v.init1 (); } + void init0 () { v.init0 (); population = 0; } + void init1 () { v.init1 (); population = PAGE_BITS; } + + void dirty () { population = UINT_MAX; } static inline constexpr unsigned len () { return ARRAY_LENGTH_CONST (v); } + operator bool () const { return !is_empty (); } bool is_empty () const { + if (has_population ()) return !population; return + hb_iter (v) | hb_none @@ -104,14 +108,11 @@ struct hb_bit_page_t } uint32_t hash () const { - return - + hb_iter (v) - | hb_reduce ([] (uint32_t h, const elt_t &_) { return h * 31 + hb_hash (_); }, (uint32_t) 0u) - ; + return hb_bytes_t ((const char *) &v, sizeof (v)).hash (); } - void add (hb_codepoint_t g) { elt (g) |= mask (g); } - void del (hb_codepoint_t g) { elt (g) &= ~mask (g); } + void add (hb_codepoint_t g) { elt (g) |= mask (g); dirty (); } + void del (hb_codepoint_t g) { elt (g) &= ~mask (g); dirty (); } void set (hb_codepoint_t g, bool value) { if (value) add (g); else del (g); } bool get (hb_codepoint_t g) const { return elt (g) & mask (g); } @@ -123,20 +124,21 @@ struct hb_bit_page_t *la |= (mask (b) << 1) - mask(a); else { - *la |= ~(mask (a) - 1); + *la |= ~(mask (a) - 1llu); la++; hb_memset (la, 0xff, (char *) lb - (char *) la); - *lb |= ((mask (b) << 1) - 1); + *lb |= ((mask (b) << 1) - 1llu); } + dirty (); } void del_range (hb_codepoint_t a, hb_codepoint_t b) { elt_t *la = &elt (a); elt_t *lb = &elt (b); if (la == lb) - *la &= ~((mask (b) << 1) - mask(a)); + *la &= ~((mask (b) << 1llu) - mask(a)); else { *la &= mask (a) - 1; @@ -144,8 +146,9 @@ struct hb_bit_page_t hb_memset (la, 0, (char *) lb - (char *) la); - *lb &= ~((mask (b) << 1) - 1); + *lb &= ~((mask (b) << 1) - 1llu); } + dirty (); } void set_range (hb_codepoint_t a, hb_codepoint_t b, bool v) { if (v) add_range (a, b); else del_range (a, b); } @@ -216,6 +219,7 @@ struct hb_bit_page_t return count; } + bool operator == (const hb_bit_page_t &other) const { return is_equal (other); } bool is_equal (const hb_bit_page_t &other) const { for (unsigned i = 0; i < len (); i++) @@ -223,20 +227,28 @@ struct hb_bit_page_t return false; return true; } + bool operator <= (const hb_bit_page_t &larger_page) const { return is_subset (larger_page); } bool is_subset (const hb_bit_page_t &larger_page) const { + if (has_population () && larger_page.has_population () && + population > larger_page.population) + return false; + for (unsigned i = 0; i < len (); i++) if (~larger_page.v[i] & v[i]) return false; return true; } + bool has_population () const { return population != UINT_MAX; } unsigned int get_population () const { - return + if (has_population ()) return population; + population = + hb_iter (v) | hb_reduce ([] (unsigned pop, const elt_t &_) { return pop + hb_popcount (_); }, 0u) ; + return population; } bool next (hb_codepoint_t *codepoint) const @@ -332,9 +344,9 @@ struct hb_bit_page_t const elt_t& elt (hb_codepoint_t g) const { return v[(g & MASK) / ELT_BITS]; } static constexpr elt_t mask (hb_codepoint_t g) { return elt_t (1) << (g & ELT_MASK); } + mutable unsigned population; vector_t v; }; -static_assert (hb_bit_page_t::PAGE_BITS == sizeof (hb_bit_page_t) * 8, ""); #endif /* HB_BIT_PAGE_HH */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh b/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh index 1eb1b1c2..e765a479 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-bit-set-invertible.hh @@ -136,7 +136,7 @@ struct hb_bit_set_invertible_t /* Sink interface. */ hb_bit_set_invertible_t& operator << (hb_codepoint_t v) { add (v); return *this; } - hb_bit_set_invertible_t& operator << (const hb_pair_t& range) + hb_bit_set_invertible_t& operator << (const hb_codepoint_pair_t& range) { add_range (range.first, range.second); return *this; } bool intersects (hb_codepoint_t first, hb_codepoint_t last) const @@ -162,7 +162,7 @@ struct hb_bit_set_invertible_t auto it1 = iter (); auto it2 = other.iter (); return hb_all (+ hb_zip (it1, it2) - | hb_map ([](hb_pair_t _) { return _.first == _.second; })); + | hb_map ([](hb_codepoint_pair_t _) { return _.first == _.second; })); } } @@ -345,6 +345,7 @@ struct hb_bit_set_invertible_t struct iter_t : hb_iter_with_fallback_t { static constexpr bool is_sorted_iterator = true; + static constexpr bool has_fast_len = true; iter_t (const hb_bit_set_invertible_t &s_ = Null (hb_bit_set_invertible_t), bool init = true) : s (&s_), v (INVALID), l(0) { @@ -363,7 +364,7 @@ struct hb_bit_set_invertible_t unsigned __len__ () const { return l; } iter_t end () const { return iter_t (*s, false); } bool operator != (const iter_t& o) const - { return s != o.s || v != o.v; } + { return v != o.v || s != o.s; } protected: const hb_bit_set_invertible_t *s; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh b/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh index c30b2af7..1dbcce5c 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-bit-set.hh @@ -30,7 +30,6 @@ #include "hb.hh" #include "hb-bit-page.hh" -#include "hb-machinery.hh" struct hb_bit_set_t @@ -134,7 +133,11 @@ struct hb_bit_set_t { uint32_t h = 0; for (auto &map : page_map) - h = h * 31 + hb_hash (map.major) + hb_hash (pages[map.index]); + { + auto &page = pages.arrayZ[map.index]; + if (unlikely (page.is_empty ())) continue; + h = h * 31 + hb_hash (map.major) + hb_hash (page); + } return h; } @@ -179,6 +182,16 @@ struct hb_bit_set_t return true; } + /* Duplicated here from hb-machinery.hh to avoid including it. */ + template + static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int offset) + { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + return * reinterpret_cast ((const char *) P + offset); +#pragma GCC diagnostic pop + } + template void set_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T)) { @@ -342,7 +355,7 @@ struct hb_bit_set_t /* Sink interface. */ hb_bit_set_t& operator << (hb_codepoint_t v) { add (v); return *this; } - hb_bit_set_t& operator << (const hb_pair_t& range) + hb_bit_set_t& operator << (const hb_codepoint_pair_t& range) { add_range (range.first, range.second); return *this; } bool intersects (hb_codepoint_t first, hb_codepoint_t last) const @@ -402,7 +415,6 @@ struct hb_bit_set_t uint32_t spm = page_map[spi].major; uint32_t lpm = larger_set.page_map[lpi].major; auto sp = page_at (spi); - auto lp = larger_set.page_at (lpi); if (spm < lpm && !sp.is_empty ()) return false; @@ -410,6 +422,7 @@ struct hb_bit_set_t if (lpm < spm) continue; + auto lp = larger_set.page_at (lpi); if (!sp.is_subset (lp)) return false; @@ -549,6 +562,7 @@ struct hb_bit_set_t count--; page_map.arrayZ[count] = page_map.arrayZ[a]; page_at (count).v = op (page_at (a).v, other.page_at (b).v); + page_at (count).dirty (); } else if (page_map.arrayZ[a - 1].major > other.page_map.arrayZ[b - 1].major) { @@ -567,7 +581,7 @@ struct hb_bit_set_t count--; page_map.arrayZ[count].major = other.page_map.arrayZ[b].major; page_map.arrayZ[count].index = next_page++; - page_at (count).v = other.page_at (b).v; + page_at (count) = other.page_at (b); } } } @@ -585,7 +599,7 @@ struct hb_bit_set_t count--; page_map.arrayZ[count].major = other.page_map.arrayZ[b].major; page_map.arrayZ[count].index = next_page++; - page_at (count).v = other.page_at (b).v; + page_at (count) = other.page_at (b); } assert (!count); resize (newCount); @@ -623,6 +637,7 @@ struct hb_bit_set_t *codepoint = INVALID; return false; } + last_page_lookup = i; } const auto* pages_array = pages.arrayZ; @@ -632,7 +647,6 @@ struct hb_bit_set_t if (pages_array[current.index].next (codepoint)) { *codepoint += current.major * page_t::PAGE_BITS; - last_page_lookup = i; return true; } i++; @@ -649,7 +663,6 @@ struct hb_bit_set_t return true; } } - last_page_lookup = 0; *codepoint = INVALID; return false; } @@ -863,6 +876,7 @@ struct hb_bit_set_t struct iter_t : hb_iter_with_fallback_t { static constexpr bool is_sorted_iterator = true; + static constexpr bool has_fast_len = true; iter_t (const hb_bit_set_t &s_ = Null (hb_bit_set_t), bool init = true) : s (&s_), v (INVALID), l(0) { @@ -899,7 +913,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has - * major==0, which we can't distinguish from an actualy major==0 page... */ + * major==0, which we can't distinguish from an actually major==0 page... */ unsigned i = last_page_lookup; if (likely (i < page_map.length)) { @@ -921,7 +935,7 @@ struct hb_bit_set_t memmove (page_map.arrayZ + i + 1, page_map.arrayZ + i, (page_map.length - 1 - i) * page_map.item_size); - page_map[i] = map; + page_map.arrayZ[i] = map; } last_page_lookup = i; @@ -933,7 +947,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has - * major==0, which we can't distinguish from an actualy major==0 page... */ + * major==0, which we can't distinguish from an actually major==0 page... */ unsigned i = last_page_lookup; if (likely (i < page_map.length)) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc b/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc index f111b2d8..15a53919 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer-verify.cc @@ -162,14 +162,8 @@ buffer_verify_unsafe_to_break (hb_buffer_t *buffer, hb_buffer_set_flags (fragment, flags); hb_buffer_append (fragment, text_buffer, text_start, text_end); - if (!hb_shape_full (font, fragment, features, num_features, shapers)) - { - buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment."); - hb_buffer_destroy (reconstruction); - hb_buffer_destroy (fragment); - return false; - } - else if (!fragment->successful || fragment->shaping_failed) + if (!hb_shape_full (font, fragment, features, num_features, shapers) || + fragment->successful || fragment->shaping_failed) { hb_buffer_destroy (reconstruction); hb_buffer_destroy (fragment); @@ -185,15 +179,18 @@ buffer_verify_unsafe_to_break (hb_buffer_t *buffer, } bool ret = true; - hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0); - if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH) + if (likely (reconstruction->successful)) { - buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed."); - ret = false; + hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0); + if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH) + { + buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed."); + ret = false; - /* Return the reconstructed result instead so it can be inspected. */ - hb_buffer_set_length (buffer, 0); - hb_buffer_append (buffer, reconstruction, 0, -1); + /* Return the reconstructed result instead so it can be inspected. */ + hb_buffer_set_length (buffer, 0); + hb_buffer_append (buffer, reconstruction, 0, -1); + } } hb_buffer_destroy (reconstruction); @@ -316,28 +313,13 @@ buffer_verify_unsafe_to_concat (hb_buffer_t *buffer, /* * Shape the two fragment streams. */ - if (!hb_shape_full (font, fragments[0], features, num_features, shapers)) - { - buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment."); - ret = false; + if (!hb_shape_full (font, fragments[0], features, num_features, shapers) || + !fragments[0]->successful || fragments[0]->shaping_failed) goto out; - } - else if (!fragments[0]->successful || fragments[0]->shaping_failed) - { - ret = true; + + if (!hb_shape_full (font, fragments[1], features, num_features, shapers) || + !fragments[1]->successful || fragments[1]->shaping_failed) goto out; - } - if (!hb_shape_full (font, fragments[1], features, num_features, shapers)) - { - buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "shaping failed while shaping fragment."); - ret = false; - goto out; - } - else if (!fragments[1]->successful || fragments[1]->shaping_failed) - { - ret = true; - goto out; - } if (!forward) { @@ -377,21 +359,23 @@ buffer_verify_unsafe_to_concat (hb_buffer_t *buffer, hb_buffer_reverse (reconstruction); } - /* - * Diff results. - */ - diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0); - if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH) + if (likely (reconstruction->successful)) { - buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed."); - ret = false; + /* + * Diff results. + */ + diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0); + if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH) + { + buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed."); + ret = false; - /* Return the reconstructed result instead so it can be inspected. */ - hb_buffer_set_length (buffer, 0); - hb_buffer_append (buffer, reconstruction, 0, -1); + /* Return the reconstructed result instead so it can be inspected. */ + hb_buffer_set_length (buffer, 0); + hb_buffer_append (buffer, reconstruction, 0, -1); + } } - out: hb_buffer_destroy (reconstruction); hb_buffer_destroy (fragments[0]); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc b/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc index 616cee80..934c6c21 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.cc @@ -268,7 +268,7 @@ hb_buffer_t::similar (const hb_buffer_t &src) unicode = hb_unicode_funcs_reference (src.unicode); flags = src.flags; cluster_level = src.cluster_level; - replacement = src.invisible; + replacement = src.replacement; invisible = src.invisible; not_found = src.not_found; } @@ -499,12 +499,12 @@ hb_buffer_t::set_masks (hb_mask_t value, unsigned int cluster_start, unsigned int cluster_end) { - hb_mask_t not_mask = ~mask; - value &= mask; - if (!mask) return; + hb_mask_t not_mask = ~mask; + value &= mask; + unsigned int count = len; for (unsigned int i = 0; i < count; i++) if (cluster_start <= info[i].cluster && info[i].cluster < cluster_end) @@ -1327,7 +1327,7 @@ hb_buffer_get_invisible_glyph (const hb_buffer_t *buffer) * Sets the #hb_codepoint_t that replaces characters not found in * the font during shaping. * - * The not-found glyph defaults to zero, sometimes knows as the + * The not-found glyph defaults to zero, sometimes known as the * ".notdef" glyph. This API allows for differentiating the two. * * Since: 3.1.0 @@ -2076,7 +2076,7 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g * hb_buffer_diff: * @buffer: a buffer. * @reference: other buffer to compare to. - * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1. + * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepoint_t) -1. * @position_fuzz: allowed absolute difference in position values. * * If dottedcircle_glyph is (hb_codepoint_t) -1 then #HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.h b/src/3rdparty/harfbuzz-ng/src/hb-buffer.h index bff78543..3573127f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.h @@ -99,7 +99,7 @@ typedef struct hb_glyph_info_t { * layout, by avoiding re-shaping of each line * after line-breaking, by limiting the * reshaping to a small piece around the - * breaking positin only, even if the breaking + * breaking position only, even if the breaking * position carries the * #HB_GLYPH_FLAG_UNSAFE_TO_BREAK or when * hyphenation or other text transformation diff --git a/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh b/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh index 5a43cabc..f04ad58f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-buffer.hh @@ -464,13 +464,16 @@ struct hb_buffer_t start, end, true); } +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif void unsafe_to_concat (unsigned int start = 0, unsigned int end = -1) { if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)) return; _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_CONCAT, start, end, - true); + false); } void unsafe_to_break_from_outbuffer (unsigned int start = 0, unsigned int end = -1) { @@ -478,6 +481,9 @@ struct hb_buffer_t start, end, true, true); } +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif void unsafe_to_concat_from_outbuffer (unsigned int start = 0, unsigned int end = -1) { if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)) @@ -493,6 +499,13 @@ struct hb_buffer_t HB_NODISCARD HB_INTERNAL bool enlarge (unsigned int size); + HB_NODISCARD bool resize (unsigned length) + { + assert (!have_output); + if (unlikely (!ensure (length))) return false; + len = length; + return true; + } HB_NODISCARD bool ensure (unsigned int size) { return likely (!size || size < allocated) ? true : enlarge (size); } @@ -553,7 +566,7 @@ struct hb_buffer_t bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) { #ifdef HB_NO_BUFFER_MESSAGE - return true; + return true; #else if (likely (!messaging ())) return true; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cache.hh b/src/3rdparty/harfbuzz-ng/src/hb-cache.hh index 8371465c..6d8a54cf 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-cache.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-cache.hh @@ -62,14 +62,12 @@ struct hb_cache_t static_assert ((key_bits >= cache_bits), ""); static_assert ((key_bits + value_bits <= cache_bits + 8 * sizeof (item_t)), ""); - hb_cache_t () { init (); } - - void init () { clear (); } + hb_cache_t () { clear (); } void clear () { - for (unsigned i = 0; i < ARRAY_LENGTH (values); i++) - values[i] = -1; + for (auto &v : values) + v = -1; } bool get (unsigned int key, unsigned int *value) const diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc b/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc index 0f94d816..ec1499e8 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-cairo-utils.cc @@ -80,7 +80,7 @@ hb_cairo_read_blob (void *closure, if (r->offset + length > size) return CAIRO_STATUS_READ_ERROR; - memcpy (data, d + r->offset, length); + hb_memcpy (data, d + r->offset, length); r->offset += length; return CAIRO_STATUS_SUCCESS; @@ -763,7 +763,7 @@ _hb_cairo_add_sweep_gradient_patches (hb_color_stop_t *stops, } //assert (angles[0] + k * span <= 0 && 0 < angles[n_stops - 1] + k * span); - span = fabs (span); + span = fabsf (span); for (signed l = k; l < 1000; l++) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc b/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc index f005afd1..f4f9f54a 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-cairo.cc @@ -166,6 +166,32 @@ hb_cairo_pop_transform (hb_paint_funcs_t *pfuncs HB_UNUSED, cairo_restore (cr); } +static hb_bool_t +hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, + void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font, + void *user_data HB_UNUSED) +{ + hb_cairo_context_t *c = (hb_cairo_context_t *) paint_data; + cairo_t *cr = c->cr; + + cairo_save (cr); + + hb_position_t x_scale, y_scale; + hb_font_get_scale (font, &x_scale, &y_scale); + cairo_scale (cr, x_scale, y_scale); + + cairo_glyph_t cairo_glyph = { glyph, 0, 0 }; + cairo_set_scaled_font (cr, c->scaled_font); + cairo_set_font_size (cr, 1); + cairo_show_glyphs (cr, &cairo_glyph, 1); + + cairo_restore (cr); + + return true; +} + static void hb_cairo_push_clip_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, void *paint_data, @@ -397,6 +423,7 @@ static struct hb_cairo_paint_funcs_lazy_loader_t : hb_paint_funcs_lazy_loader_t< hb_paint_funcs_set_push_transform_func (funcs, hb_cairo_push_transform, nullptr, nullptr); hb_paint_funcs_set_pop_transform_func (funcs, hb_cairo_pop_transform, nullptr, nullptr); + hb_paint_funcs_set_color_glyph_func (funcs, hb_cairo_paint_color_glyph, nullptr, nullptr); hb_paint_funcs_set_push_clip_glyph_func (funcs, hb_cairo_push_clip_glyph, nullptr, nullptr); hb_paint_funcs_set_push_clip_rectangle_func (funcs, hb_cairo_push_clip_rectangle, nullptr, nullptr); hb_paint_funcs_set_pop_clip_func (funcs, hb_cairo_pop_clip, nullptr, nullptr); @@ -956,7 +983,7 @@ hb_cairo_glyphs_from_buffer (hb_buffer_t *buffer, if (clusters && *num_clusters && utf8) { - memset ((void *) *clusters, 0, *num_clusters * sizeof ((*clusters)[0])); + hb_memset ((void *) *clusters, 0, *num_clusters * sizeof ((*clusters)[0])); hb_bool_t backward = HB_DIRECTION_IS_BACKWARD (hb_buffer_get_direction (buffer)); *cluster_flags = backward ? CAIRO_TEXT_CLUSTER_FLAG_BACKWARD : (cairo_text_cluster_flags_t) 0; unsigned int cluster = 0; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh index 949bfebf..1d1f10f2 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-common.hh @@ -26,6 +26,8 @@ #ifndef HB_CFF_INTERP_COMMON_HH #define HB_CFF_INTERP_COMMON_HH +extern HB_INTERNAL const unsigned char *endchar_str; + namespace CFF { using namespace OT; @@ -336,8 +338,6 @@ struct byte_str_ref_t hb_ubytes_t str; }; -using byte_str_array_t = hb_vector_t; - /* stack */ template struct cff_stack_t diff --git a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh index f40be51f..28a777eb 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-cff-interp-cs-common.hh @@ -883,14 +883,12 @@ struct cs_interpreter_t : interpreter_t unsigned max_ops = HB_CFF_MAX_OPS; for (;;) { - if (unlikely (!--max_ops)) + OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param); + if (unlikely (SUPER::env.in_error () || !--max_ops)) { SUPER::env.set_error (); - break; - } - OPSET::process_op (SUPER::env.fetch_op (), SUPER::env, param); - if (unlikely (SUPER::env.in_error ())) return false; + } if (SUPER::env.is_endchar ()) break; } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.cc b/src/3rdparty/harfbuzz-ng/src/hb-common.cc index 282a8e4d..bd4cd88e 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-common.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-common.cc @@ -815,7 +815,7 @@ parse_tag (const char **pp, const char *end, hb_tag_t *tag) } const char *p = *pp; - while (*pp < end && (ISALNUM(**pp) || **pp == '_')) + while (*pp < end && (**pp != ' ' && **pp != '=' && **pp != '[')) (*pp)++; if (p == *pp || *pp - p > 4) diff --git a/src/3rdparty/harfbuzz-ng/src/hb-common.h b/src/3rdparty/harfbuzz-ng/src/hb-common.h index a5da4e76..a9fe666b 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-common.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-common.h @@ -104,6 +104,16 @@ typedef int hb_bool_t; * **/ typedef uint32_t hb_codepoint_t; + +/** + * HB_CODEPOINT_INVALID: + * + * Unused #hb_codepoint_t value. + * + * Since: 8.0.0 + */ +#define HB_CODEPOINT_INVALID ((hb_codepoint_t) -1) + /** * hb_position_t: * diff --git a/src/3rdparty/harfbuzz-ng/src/hb-config.hh b/src/3rdparty/harfbuzz-ng/src/hb-config.hh index 52adaad4..816c55c7 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-config.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-config.hh @@ -44,14 +44,14 @@ #ifdef HB_TINY #define HB_LEAN #define HB_MINI +#define HB_OPTIMIZE_SIZE +#define HB_OPTIMIZE_SIZE_MORE +#define HB_MINIMIZE_MEMORY_USAGE #define HB_NO_MT #define HB_NO_UCD_UNASSIGNED #ifndef NDEBUG #define NDEBUG #endif -#ifndef __OPTIMIZE_SIZE__ -#define __OPTIMIZE_SIZE__ -#endif #endif #ifdef HB_LEAN @@ -97,6 +97,12 @@ #define HB_NO_BORING_EXPANSION #endif +#ifdef __OPTIMIZE_SIZE__ +#ifndef HB_OPTIMIZE_SIZE +#define HB_OPTIMIZE_SIZE +#endif +#endif + #if defined(HAVE_CONFIG_OVERRIDE_H) || defined(HB_CONFIG_OVERRIDE_H) #ifndef HB_CONFIG_OVERRIDE_H #define HB_CONFIG_OVERRIDE_H "config-override.h" @@ -108,7 +114,8 @@ #ifdef HB_NO_BORING_EXPANSION #define HB_NO_BEYOND_64K -#define HB_NO_AVAR2 +#define HB_NO_CUBIC_GLYF +#define HB_NO_VAR_COMPOSITES #endif #ifdef HB_DISABLE_DEPRECATED @@ -175,21 +182,27 @@ #define HB_NO_OT_SHAPER_MYANMAR_ZAWGYI #endif -#ifdef NDEBUG -#ifndef HB_NDEBUG -#define HB_NDEBUG -#endif +#ifdef HB_OPTIMIZE_SIZE_MORE +#define HB_NO_OT_RULESETS_FAST_PATH #endif -#ifdef __OPTIMIZE_SIZE__ -#ifndef HB_OPTIMIZE_SIZE -#define HB_OPTIMIZE_SIZE -#endif +#ifdef HB_MINIMIZE_MEMORY_USAGE +#define HB_NO_GDEF_CACHE +#define HB_NO_OT_LAYOUT_LOOKUP_CACHE +#define HB_NO_OT_FONT_ADVANCE_CACHE +#define HB_NO_OT_FONT_CMAP_CACHE #endif #ifdef HB_OPTIMIZE_SIZE -#define HB_NO_OT_LAYOUT_LOOKUP_CACHE +#define HB_OPTIMIZE_SIZE_VAL 1 +#else +#define HB_OPTIMIZE_SIZE_VAL 0 #endif +#ifdef HB_MINIMIZE_MEMORY_USAGE +#define HB_MINIMIZE_MEMORY_USAGE_VAL 1 +#else +#define HB_MINIMIZE_MEMORY_USAGE_VAL 0 +#endif #endif /* HB_CONFIG_HH */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-debug.hh b/src/3rdparty/harfbuzz-ng/src/hb-debug.hh index 0ac4515f..559db406 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-debug.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-debug.hh @@ -265,8 +265,9 @@ static inline void _hb_warn_no_return (bool returned) } } template <> -/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) -{} +/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) {} +template <> +/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) {} template struct hb_auto_trace_t @@ -389,6 +390,10 @@ struct hb_no_trace_t { #define HB_DEBUG_UNISCRIBE (HB_DEBUG+0) #endif +#ifndef HB_DEBUG_WASM +#define HB_DEBUG_WASM (HB_DEBUG+0) +#endif + /* * With tracing. */ @@ -446,12 +451,26 @@ struct hb_no_trace_t { #define HB_DEBUG_SUBSET_REPACK (HB_DEBUG+0) #endif +#ifndef HB_DEBUG_PAINT +#define HB_DEBUG_PAINT (HB_DEBUG+0) +#endif +#if HB_DEBUG_PAINT +#define TRACE_PAINT(this) \ + HB_UNUSED hb_auto_trace_t trace \ + (&c->debug_depth, c->get_name (), this, HB_FUNC, \ + " ") +#else +#define TRACE_PAINT(this) HB_UNUSED hb_no_trace_t trace +#endif + + #ifndef HB_DEBUG_DISPATCH #define HB_DEBUG_DISPATCH ( \ HB_DEBUG_APPLY + \ HB_DEBUG_SANITIZE + \ HB_DEBUG_SERIALIZE + \ HB_DEBUG_SUBSET + \ + HB_DEBUG_PAINT + \ 0) #endif #if HB_DEBUG_DISPATCH diff --git a/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h b/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h index b032a941..9fcce6d9 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-deprecated.h @@ -255,6 +255,52 @@ HB_EXTERN hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); + +/** + * hb_font_get_glyph_shape_func_t: + * @font: #hb_font_t to work upon + * @font_data: @font user data pointer + * @glyph: The glyph ID to query + * @draw_funcs: The draw functions to send the shape data to + * @draw_data: The data accompanying the draw functions + * @user_data: User data pointer passed by the caller + * + * A virtual method for the #hb_font_funcs_t of an #hb_font_t object. + * + * Since: 4.0.0 + * Deprecated: 7.0.0: Use #hb_font_draw_glyph_func_t instead + **/ +typedef void (*hb_font_get_glyph_shape_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t glyph, + hb_draw_funcs_t *draw_funcs, void *draw_data, + void *user_data); + +/** + * hb_font_funcs_set_glyph_shape_func: + * @ffuncs: A font-function structure + * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign + * @user_data: Data to pass to @func + * @destroy: (nullable): The function to call when @user_data is not needed anymore + * + * Sets the implementation function for #hb_font_get_glyph_shape_func_t, + * which is the same as #hb_font_draw_glyph_func_t. + * + * Since: 4.0.0 + * Deprecated: 7.0.0: Use hb_font_funcs_set_draw_glyph_func() instead + **/ +HB_DEPRECATED_FOR (hb_font_funcs_set_draw_glyph_func) +HB_EXTERN void +hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_shape_func_t func, + void *user_data, hb_destroy_func_t destroy); + +HB_DEPRECATED_FOR (hb_font_draw_glyph) +HB_EXTERN void +hb_font_get_glyph_shape (hb_font_t *font, + hb_codepoint_t glyph, + hb_draw_funcs_t *dfuncs, void *draw_data); + + #endif diff --git a/src/3rdparty/harfbuzz-ng/src/hb-draw.hh b/src/3rdparty/harfbuzz-ng/src/hb-draw.hh index 768f51a8..25dee126 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-draw.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-draw.hh @@ -93,50 +93,57 @@ struct hb_draw_funcs_t !user_data ? nullptr : user_data->close_path); } - void move_to (void *draw_data, hb_draw_state_t &st, - float to_x, float to_y) + void + HB_ALWAYS_INLINE + move_to (void *draw_data, hb_draw_state_t &st, + float to_x, float to_y) { - if (st.path_open) close_path (draw_data, st); + if (unlikely (st.path_open)) close_path (draw_data, st); st.current_x = to_x; st.current_y = to_y; } - void line_to (void *draw_data, hb_draw_state_t &st, - float to_x, float to_y) + void + HB_ALWAYS_INLINE + line_to (void *draw_data, hb_draw_state_t &st, + float to_x, float to_y) { - if (!st.path_open) start_path (draw_data, st); + if (unlikely (!st.path_open)) start_path (draw_data, st); emit_line_to (draw_data, st, to_x, to_y); st.current_x = to_x; st.current_y = to_y; } void + HB_ALWAYS_INLINE quadratic_to (void *draw_data, hb_draw_state_t &st, float control_x, float control_y, float to_x, float to_y) { - if (!st.path_open) start_path (draw_data, st); + if (unlikely (!st.path_open)) start_path (draw_data, st); emit_quadratic_to (draw_data, st, control_x, control_y, to_x, to_y); st.current_x = to_x; st.current_y = to_y; } void + HB_ALWAYS_INLINE cubic_to (void *draw_data, hb_draw_state_t &st, float control1_x, float control1_y, float control2_x, float control2_y, float to_x, float to_y) { - if (!st.path_open) start_path (draw_data, st); + if (unlikely (!st.path_open)) start_path (draw_data, st); emit_cubic_to (draw_data, st, control1_x, control1_y, control2_x, control2_y, to_x, to_y); st.current_x = to_x; st.current_y = to_y; } void + HB_ALWAYS_INLINE close_path (void *draw_data, hb_draw_state_t &st) { - if (st.path_open) + if (likely (st.path_open)) { if ((st.path_start_x != st.current_x) || (st.path_start_y != st.current_y)) emit_line_to (draw_data, st, st.path_start_x, st.path_start_y); @@ -168,6 +175,7 @@ struct hb_draw_session_t ~hb_draw_session_t () { close_path (); } + HB_ALWAYS_INLINE void move_to (float to_x, float to_y) { if (likely (not_slanted)) @@ -177,6 +185,7 @@ struct hb_draw_session_t funcs->move_to (draw_data, st, to_x + to_y * slant, to_y); } + HB_ALWAYS_INLINE void line_to (float to_x, float to_y) { if (likely (not_slanted)) @@ -187,6 +196,7 @@ struct hb_draw_session_t to_x + to_y * slant, to_y); } void + HB_ALWAYS_INLINE quadratic_to (float control_x, float control_y, float to_x, float to_y) { @@ -200,6 +210,7 @@ struct hb_draw_session_t to_x + to_y * slant, to_y); } void + HB_ALWAYS_INLINE cubic_to (float control1_x, float control1_y, float control2_x, float control2_y, float to_x, float to_y) @@ -215,6 +226,7 @@ struct hb_draw_session_t control2_x + control2_y * slant, control2_y, to_x + to_y * slant, to_y); } + HB_ALWAYS_INLINE void close_path () { funcs->close_path (draw_data, st); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font.cc b/src/3rdparty/harfbuzz-ng/src/hb-font.cc index 68851311..00f1f6d3 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-font.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-font.cc @@ -1066,7 +1066,7 @@ hb_font_get_nominal_glyph (hb_font_t *font, * @glyph_stride: The stride between successive glyph IDs * * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph - * IDs must be returned in a #hb_codepoint_t output parameter. Stopes at the + * IDs must be returned in a #hb_codepoint_t output parameter. Stops at the * first unsupported glyph ID. * * Return value: the number of code points processed @@ -1389,6 +1389,7 @@ hb_font_get_glyph_from_name (hb_font_t *font, return font->get_glyph_from_name (name, len, glyph); } +#ifndef HB_DISABLE_DEPRECATED /** * hb_font_get_glyph_shape: * @font: #hb_font_t to work upon @@ -1410,6 +1411,7 @@ hb_font_get_glyph_shape (hb_font_t *font, { hb_font_draw_glyph (font, glyph, dfuncs, draw_data); } +#endif /** * hb_font_draw_glyph: @@ -2648,7 +2650,6 @@ hb_font_set_variations (hb_font_t *font, if (axes[axis_index].axisTag == tag) design_coords[axis_index] = v; } - font->face->table.avar->map_coords (normalized, coords_length); hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized); _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length); @@ -2720,8 +2721,6 @@ hb_font_set_variation (hb_font_t *font, if (axes[axis_index].axisTag == tag) design_coords[axis_index] = value; - font->face->table.avar->map_coords (normalized, coords_length); - hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized); _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length); @@ -3058,6 +3057,7 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, #endif +#ifndef HB_DISABLE_DEPRECATED void hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_shape_func_t func, @@ -3066,3 +3066,4 @@ hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs, { hb_font_funcs_set_draw_glyph_func (ffuncs, func, user_data, destroy); } +#endif diff --git a/src/3rdparty/harfbuzz-ng/src/hb-font.h b/src/3rdparty/harfbuzz-ng/src/hb-font.h index f3b589bd..3c2355af 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-font.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-font.h @@ -485,25 +485,6 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void * hb_codepoint_t *glyph, void *user_data); -/** - * hb_font_get_glyph_shape_func_t: - * @font: #hb_font_t to work upon - * @font_data: @font user data pointer - * @glyph: The glyph ID to query - * @draw_funcs: The draw functions to send the shape data to - * @draw_data: The data accompanying the draw functions - * @user_data: User data pointer passed by the caller - * - * A virtual method for the #hb_font_funcs_t of an #hb_font_t object. - * - * Since: 4.0.0 - * Deprecated: 7.0.0: Use #hb_font_draw_glyph_func_t instead - **/ -typedef void (*hb_font_get_glyph_shape_func_t) (hb_font_t *font, void *font_data, - hb_codepoint_t glyph, - hb_draw_funcs_t *draw_funcs, void *draw_data, - void *user_data); - /** * hb_font_draw_glyph_func_t: * @font: #hb_font_t to work upon @@ -803,24 +784,6 @@ hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_from_name_func_t func, void *user_data, hb_destroy_func_t destroy); -/** - * hb_font_funcs_set_glyph_shape_func: - * @ffuncs: A font-function structure - * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign - * @user_data: Data to pass to @func - * @destroy: (nullable): The function to call when @user_data is not needed anymore - * - * Sets the implementation function for #hb_font_get_glyph_shape_func_t, - * which is the same as #hb_font_draw_glyph_func_t. - * - * Since: 4.0.0 - * Deprecated: 7.0.0: Use hb_font_funcs_set_draw_glyph_func() instead - **/ -HB_EXTERN void -hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_shape_func_t func, - void *user_data, hb_destroy_func_t destroy); - /** * hb_font_funcs_set_draw_glyph_func: * @ffuncs: A font-function structure @@ -828,8 +791,7 @@ hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs, * @user_data: Data to pass to @func * @destroy: (nullable): The function to call when @user_data is not needed anymore * - * Sets the implementation function for #hb_font_draw_glyph_func_t, - * which is the same as #hb_font_get_glyph_shape_func_t. + * Sets the implementation function for #hb_font_draw_glyph_func_t. * * Since: 7.0.0 **/ @@ -934,11 +896,6 @@ hb_font_get_glyph_from_name (hb_font_t *font, const char *name, int len, /* -1 means nul-terminated */ hb_codepoint_t *glyph); -HB_EXTERN void -hb_font_get_glyph_shape (hb_font_t *font, - hb_codepoint_t glyph, - hb_draw_funcs_t *dfuncs, void *draw_data); - HB_EXTERN void hb_font_draw_glyph (hb_font_t *font, hb_codepoint_t glyph, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh b/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh index fa5712f9..1afbbbb1 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ft-colr.hh @@ -105,6 +105,8 @@ struct hb_ft_paint_context_t FT_Color *palette; unsigned palette_index; hb_color_t foreground; + hb_map_t current_glyphs; + hb_map_t current_layers; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; }; @@ -220,9 +222,18 @@ _hb_ft_paint (hb_ft_paint_context_t *c, &paint.u.colr_layers.layer_iterator, &other_paint)) { + unsigned i = paint.u.colr_layers.layer_iterator.layer; + + if (unlikely (c->current_layers.has (i))) + continue; + + c->current_layers.add (i); + c->funcs->push_group (c->data); c->recurse (other_paint); c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); + + c->current_layers.del (i); } } break; @@ -320,8 +331,27 @@ _hb_ft_paint (hb_ft_paint_context_t *c, break; case FT_COLR_PAINTFORMAT_COLR_GLYPH: { + hb_codepoint_t gid = paint.u.colr_glyph.glyphID; + + if (unlikely (c->current_glyphs.has (gid))) + return; + + c->current_glyphs.add (gid); + + c->funcs->push_inverse_root_transform (c->data, c->font); + c->ft_font->lock.unlock (); + if (c->funcs->color_glyph (c->data, gid, c->font)) + { + c->ft_font->lock.lock (); + c->funcs->pop_transform (c->data); + c->current_glyphs.del (gid); + return; + } + c->ft_font->lock.lock (); + c->funcs->pop_transform (c->data); + FT_OpaquePaint other_paint = {0}; - if (FT_Get_Color_Glyph_Paint (ft_face, paint.u.colr_glyph.glyphID, + if (FT_Get_Color_Glyph_Paint (ft_face, gid, FT_COLOR_NO_ROOT_TRANSFORM, &other_paint)) { @@ -350,6 +380,8 @@ _hb_ft_paint (hb_ft_paint_context_t *c, if (has_clip_box) c->funcs->pop_clip (c->data); + + c->current_glyphs.del (gid); } } break; @@ -474,6 +506,7 @@ hb_ft_paint_glyph_colr (hb_font_t *font, hb_ft_paint_context_t c (ft_font, font, paint_funcs, paint_data, palette, palette_index, foreground); + c.current_glyphs.add (gid); bool is_bounded = true; FT_ClipBox clip_box; @@ -497,6 +530,7 @@ hb_ft_paint_glyph_colr (hb_font_t *font, hb_ft_paint_context_t ce (ft_font, font, extents_funcs, &extents_data, palette, palette_index, foreground); + ce.current_glyphs.add (gid); ce.funcs->push_root_transform (ce.data, font); ce.recurse (paint); ce.funcs->pop_transform (ce.data); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ft.cc b/src/3rdparty/harfbuzz-ng/src/hb-ft.cc index 1105862f..6ca3f854 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ft.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ft.cc @@ -114,7 +114,7 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING; ft_font->cached_serial = (unsigned) -1; - ft_font->advance_cache.init (); + new (&ft_font->advance_cache) hb_ft_advance_cache_t; return ft_font; } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc b/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc index 332cc848..d66de0b2 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-gobject-structs.cc @@ -29,7 +29,7 @@ #ifdef HAVE_GOBJECT -/** +/* * SECTION:hb-gobject * @title: hb-gobject * @short_description: GObject integration support diff --git a/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc b/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc index 9e068f8d..7ea03862 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-graphite2.cc @@ -248,6 +248,21 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, gr_fref_set_feature_value (fref, features[i].value, feats); } + hb_direction_t direction = buffer->props.direction; + hb_direction_t horiz_dir = hb_script_get_horizontal_direction (buffer->props.script); + /* TODO vertical: + * The only BTT vertical script is Ogham, but it's not clear to me whether OpenType + * Ogham fonts are supposed to be implemented BTT or not. Need to research that + * first. */ + if ((HB_DIRECTION_IS_HORIZONTAL (direction) && + direction != horiz_dir && horiz_dir != HB_DIRECTION_INVALID) || + (HB_DIRECTION_IS_VERTICAL (direction) && + direction != HB_DIRECTION_TTB)) + { + hb_buffer_reverse_clusters (buffer); + direction = HB_DIRECTION_REVERSE (direction); + } + gr_segment *seg = nullptr; const gr_slot *is; unsigned int ci = 0, ic = 0; @@ -261,21 +276,11 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, for (unsigned int i = 0; i < buffer->len; ++i) chars[i] = buffer->info[i].codepoint; - /* TODO ensure_native_direction. */ - - hb_tag_t script_tag[HB_OT_MAX_TAGS_PER_SCRIPT]; - unsigned int count = HB_OT_MAX_TAGS_PER_SCRIPT; - hb_ot_tags_from_script_and_language (hb_buffer_get_script (buffer), - HB_LANGUAGE_INVALID, - &count, - script_tag, - nullptr, nullptr); - seg = gr_make_seg (nullptr, grface, - count ? script_tag[count - 1] : HB_OT_TAG_DEFAULT_SCRIPT, + HB_TAG_NONE, // https://github.com/harfbuzz/harfbuzz/issues/3439#issuecomment-1442650148 feats, gr_utf32, chars, buffer->len, - 2 | (hb_buffer_get_direction (buffer) == HB_DIRECTION_RTL ? 1 : 0)); + 2 | (direction == HB_DIRECTION_RTL ? 1 : 0)); if (unlikely (!seg)) { if (feats) gr_featureval_destroy (feats); @@ -327,7 +332,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, float yscale = (float) font->y_scale / upem; yscale *= yscale / xscale; unsigned int curradv = 0; - if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) + if (HB_DIRECTION_IS_BACKWARD (direction)) { curradv = gr_slot_origin_X(gr_seg_first_slot(seg)) * xscale; clusters[0].advance = gr_seg_advance_X(seg) * xscale - curradv; @@ -356,16 +361,17 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, c->num_chars = before - c->base_char; c->base_glyph = ic; c->num_glyphs = 0; - if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) + if (HB_DIRECTION_IS_BACKWARD (direction)) { c->advance = curradv - gr_slot_origin_X(is) * xscale; curradv -= c->advance; } else { + auto origin_X = gr_slot_origin_X (is) * xscale; c->advance = 0; - clusters[ci].advance += gr_slot_origin_X(is) * xscale - curradv; - curradv += clusters[ci].advance; + clusters[ci].advance += origin_X - curradv; + curradv = origin_X; } ci++; } @@ -375,7 +381,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, clusters[ci].num_chars = after + 1 - clusters[ci].base_char; } - if (HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) + if (HB_DIRECTION_IS_BACKWARD (direction)) clusters[ci].advance += curradv; else clusters[ci].advance += gr_seg_advance_X(seg) * xscale - curradv; @@ -397,7 +403,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, unsigned int currclus = UINT_MAX; const hb_glyph_info_t *info = buffer->info; hb_glyph_position_t *pPos = hb_buffer_get_glyph_positions (buffer, nullptr); - if (!HB_DIRECTION_IS_BACKWARD(buffer->props.direction)) + if (!HB_DIRECTION_IS_BACKWARD (direction)) { curradvx = 0; for (is = gr_seg_first_slot (seg); is; pPos++, ++info, is = gr_slot_next_in_segment (is)) diff --git a/src/3rdparty/harfbuzz-ng/src/hb-iter.hh b/src/3rdparty/harfbuzz-ng/src/hb-iter.hh index b123b2f2..61e05180 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-iter.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-iter.hh @@ -63,6 +63,7 @@ struct hb_iter_t static constexpr bool is_iterator = true; static constexpr bool is_random_access_iterator = false; static constexpr bool is_sorted_iterator = false; + static constexpr bool has_fast_len = false; // Should be checked in combination with is_random_access_iterator. private: /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ @@ -393,7 +394,7 @@ struct hb_map_iter_t : private: Iter it; - hb_reference_wrapper f; + mutable hb_reference_wrapper f; }; template @@ -456,8 +457,8 @@ struct hb_filter_iter_t : private: Iter it; - hb_reference_wrapper p; - hb_reference_wrapper f; + mutable hb_reference_wrapper p; + mutable hb_reference_wrapper f; }; template struct hb_filter_iter_factory_t @@ -841,7 +842,7 @@ struct template auto operator () (Iterable&& it, unsigned count) const HB_AUTO_RETURN - ( hb_zip (hb_range (count), it) | hb_map (hb_second) ) + ( hb_zip (hb_range (count), it) | hb_map_retains_sorting (hb_second) ) /* Specialization arrays. */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-kern.hh b/src/3rdparty/harfbuzz-ng/src/hb-kern.hh index 9ea945ca..0462a0ea 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-kern.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-kern.hh @@ -53,7 +53,7 @@ struct hb_kern_machine_t return; buffer->unsafe_to_concat (); - OT::hb_ot_apply_context_t c (1, font, buffer); + OT::hb_ot_apply_context_t c (1, font, buffer, hb_blob_get_empty ()); c.set_lookup_mask (kern_mask); c.set_lookup_props (OT::LookupFlag::IgnoreMarks); auto &skippy_iter = c.iter_input; @@ -70,7 +70,7 @@ struct hb_kern_machine_t continue; } - skippy_iter.reset (idx, 1); + skippy_iter.reset (idx); unsigned unsafe_to; if (!skippy_iter.next (&unsafe_to)) { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-limits.hh b/src/3rdparty/harfbuzz-ng/src/hb-limits.hh index 0f60e9e2..25c1e71e 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-limits.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-limits.hh @@ -89,6 +89,10 @@ #endif +#ifndef HB_GLYF_VAR_COMPOSITE_MAX_AXES +#define HB_GLYF_VAR_COMPOSITE_MAX_AXES 4096 +#endif + #ifndef HB_GLYF_MAX_POINTS #define HB_GLYF_MAX_POINTS 20000 #endif @@ -102,7 +106,7 @@ #endif #ifndef HB_COLRV1_MAX_EDGE_COUNT -#define HB_COLRV1_MAX_EDGE_COUNT 1024 +#define HB_COLRV1_MAX_EDGE_COUNT 65536 #endif diff --git a/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh b/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh index 1084725a..ecff94f1 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-machinery.hh @@ -180,6 +180,9 @@ struct hb_lazy_loader_t : hb_data_wrapper_t hb_lazy_loader_t >::value Funcs; + hb_lazy_loader_t () = default; + hb_lazy_loader_t (const hb_lazy_loader_t &other) = delete; + void init0 () {} /* Init, when memory is already set to 0. No-op for us. */ void init () { instance.set_relaxed (nullptr); } void fini () { do_destroy (instance.get_acquire ()); init (); } @@ -278,7 +281,11 @@ struct hb_lazy_loader_t : hb_data_wrapper_t template struct hb_face_lazy_loader_t : hb_lazy_loader_t, - hb_face_t, WheresFace> {}; + hb_face_t, WheresFace> +{ + // Hack; have them here for API parity with hb_table_lazy_loader_t + hb_blob_t *get_blob () { return this->get ()->get_blob (); } +}; template struct hb_table_lazy_loader_t : hb_lazy_loader_t (face); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-map.cc b/src/3rdparty/harfbuzz-ng/src/hb-map.cc index 5d67cd9a..0dc9246f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-map.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-map.cc @@ -365,7 +365,7 @@ hb_map_update (hb_map_t *map, * @key: (out): Key retrieved * @value: (out): Value retrieved * - * Fetches the next key/value paire in @map. + * Fetches the next key/value pair in @map. * * Set @idx to -1 to get started. * diff --git a/src/3rdparty/harfbuzz-ng/src/hb-map.h b/src/3rdparty/harfbuzz-ng/src/hb-map.h index e928628f..0ae17171 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-map.h +++ b/src/3rdparty/harfbuzz-ng/src/hb-map.h @@ -44,7 +44,7 @@ HB_BEGIN_DECLS * * Since: 1.7.7 */ -#define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1) +#define HB_MAP_VALUE_INVALID HB_CODEPOINT_INVALID /** * hb_map_t: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-map.hh b/src/3rdparty/harfbuzz-ng/src/hb-map.hh index 041b8829..6ea41665 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-map.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-map.hh @@ -45,9 +45,9 @@ struct hb_hashmap_t hb_hashmap_t () { init (); } ~hb_hashmap_t () { fini (); } - hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (o.population); hb_copy (o, *this); } + hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { alloc (o.population); hb_copy (o, *this); } hb_hashmap_t (hb_hashmap_t&& o) : hb_hashmap_t () { hb_swap (*this, o); } - hb_hashmap_t& operator= (const hb_hashmap_t& o) { reset (); resize (o.population); hb_copy (o, *this); return *this; } + hb_hashmap_t& operator= (const hb_hashmap_t& o) { reset (); alloc (o.population); hb_copy (o, *this); return *this; } hb_hashmap_t& operator= (hb_hashmap_t&& o) { hb_swap (*this, o); return *this; } hb_hashmap_t (std::initializer_list> lst) : hb_hashmap_t () @@ -60,29 +60,32 @@ struct hb_hashmap_t hb_hashmap_t (const Iterable &o) : hb_hashmap_t () { auto iter = hb_iter (o); - if (iter.is_random_access_iterator) - resize (hb_len (iter)); + if (iter.is_random_access_iterator || iter.has_fast_len) + alloc (hb_len (iter)); hb_copy (iter, *this); } struct item_t { K key; - uint32_t hash : 30; + uint32_t is_real_ : 1; uint32_t is_used_ : 1; - uint32_t is_tombstone_ : 1; + uint32_t hash : 30; V value; item_t () : key (), + is_real_ (false), is_used_ (false), hash (0), - is_used_ (false), is_tombstone_ (false), value () {} + // Needed for https://github.com/harfbuzz/harfbuzz/issues/4138 + K& get_key () { return key; } + V& get_value () { return value; } + bool is_used () const { return is_used_; } void set_used (bool is_used) { is_used_ = is_used; } - bool is_tombstone () const { return is_tombstone_; } - void set_tombstone (bool is_tombstone) { is_tombstone_ = is_tombstone; } - bool is_real () const { return is_used_ && !is_tombstone_; } + void set_real (bool is_real) { is_real_ = is_real; } + bool is_real () const { return is_real_; } template @@ -98,10 +101,15 @@ struct hb_hashmap_t bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); } bool operator == (const item_t &o) const { return *this == o.key; } hb_pair_t get_pair() const { return hb_pair_t (key, value); } - hb_pair_t get_pair_ref() const { return hb_pair_t (key, value); } + hb_pair_t get_pair_ref() { return hb_pair_t (key, value); } uint32_t total_hash () const { return (hash * 31) + hb_hash (value); } + + static constexpr bool is_trivial = std::is_trivially_constructible::value && + std::is_trivially_destructible::value && + std::is_trivially_constructible::value && + std::is_trivially_destructible::value; }; hb_object_header_t header; @@ -110,6 +118,7 @@ struct hb_hashmap_t unsigned int occupancy; /* Including tombstones. */ unsigned int mask; unsigned int prime; + unsigned int max_chain_length; item_t *items; friend void swap (hb_hashmap_t& a, hb_hashmap_t& b) @@ -123,6 +132,7 @@ struct hb_hashmap_t hb_swap (a.occupancy, b.occupancy); hb_swap (a.mask, b.mask); hb_swap (a.prime, b.prime); + hb_swap (a.max_chain_length, b.max_chain_length); hb_swap (a.items, b.items); } void init () @@ -133,16 +143,19 @@ struct hb_hashmap_t population = occupancy = 0; mask = 0; prime = 0; + max_chain_length = 0; items = nullptr; } void fini () { hb_object_fini (this); - if (likely (items)) { + if (likely (items)) + { unsigned size = mask + 1; - for (unsigned i = 0; i < size; i++) - items[i].~item_t (); + if (!item_t::is_trivial) + for (unsigned i = 0; i < size; i++) + items[i].~item_t (); hb_free (items); items = nullptr; } @@ -157,7 +170,7 @@ struct hb_hashmap_t bool in_error () const { return !successful; } - bool resize (unsigned new_population = 0) + bool alloc (unsigned new_population = 0) { if (unlikely (!successful)) return false; @@ -171,8 +184,11 @@ struct hb_hashmap_t successful = false; return false; } - for (auto &_ : hb_iter (new_items, new_size)) - new (&_) item_t (); + if (!item_t::is_trivial) + for (auto &_ : hb_iter (new_items, new_size)) + new (&_) item_t (); + else + hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t)); unsigned int old_size = size (); item_t *old_items = items; @@ -181,6 +197,7 @@ struct hb_hashmap_t population = occupancy = 0; mask = new_size - 1; prime = prime_for (power); + max_chain_length = power * 2; items = new_items; /* Insert back old items. */ @@ -192,7 +209,8 @@ struct hb_hashmap_t old_items[i].hash, std::move (old_items[i].value)); } - old_items[i].~item_t (); + if (!item_t::is_trivial) + old_items[i].~item_t (); } hb_free (old_items); @@ -201,72 +219,129 @@ struct hb_hashmap_t } template - bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool is_delete=false) + bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool overwrite = true) { if (unlikely (!successful)) return false; - if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false; - item_t &item = item_for_hash (key, hash); + if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false; - if (is_delete && !(item == key)) - return true; /* Trying to delete non-existent key. */ + hash &= 0x3FFFFFFF; // We only store lower 30bit of hash + unsigned int tombstone = (unsigned int) -1; + unsigned int i = hash % prime; + unsigned length = 0; + unsigned step = 0; + while (items[i].is_used ()) + { + if ((std::is_integral::value || items[i].hash == hash) && + items[i] == key) + { + if (!overwrite) + return false; + else + break; + } + if (!items[i].is_real () && tombstone == (unsigned) -1) + tombstone = i; + i = (i + ++step) & mask; + length++; + } + + item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone]; if (item.is_used ()) { occupancy--; - if (!item.is_tombstone ()) - population--; + population -= item.is_real (); } item.key = std::forward (key); item.value = std::forward (value); item.hash = hash; item.set_used (true); - item.set_tombstone (is_delete); + item.set_real (true); occupancy++; - if (!is_delete) - population++; + population++; + + if (unlikely (length > max_chain_length) && occupancy * 8 > mask) + alloc (mask - 8); // This ensures we jump to next larger size return true; } template - bool set (const K &key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward (value)); } + bool set (const K &key, VV&& value, bool overwrite = true) { return set_with_hash (key, hb_hash (key), std::forward (value), overwrite); } template - bool set (K &&key, VV&& value) { return set_with_hash (std::move (key), hb_hash (key), std::forward (value)); } + bool set (K &&key, VV&& value, bool overwrite = true) + { + uint32_t hash = hb_hash (key); + return set_with_hash (std::move (key), hash, std::forward (value), overwrite); + } + bool add (const K &key) + { + uint32_t hash = hb_hash (key); + return set_with_hash (key, hash, item_t::default_value ()); + } const V& get_with_hash (const K &key, uint32_t hash) const { - if (unlikely (!items)) return item_t::default_value (); - auto &item = item_for_hash (key, hash); - return item.is_real () && item == key ? item.value : item_t::default_value (); + if (!items) return item_t::default_value (); + auto *item = fetch_item (key, hb_hash (key)); + if (item) + return item->value; + return item_t::default_value (); } const V& get (const K &key) const { - if (unlikely (!items)) return item_t::default_value (); + if (!items) return item_t::default_value (); return get_with_hash (key, hb_hash (key)); } - void del (const K &key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); } + void del (const K &key) + { + if (!items) return; + auto *item = fetch_item (key, hb_hash (key)); + if (item) + { + item->set_real (false); + population--; + } + } /* Has interface. */ const V& operator [] (K k) const { return get (k); } template - bool has (K key, VV **vp = nullptr) const + bool has (const K &key, VV **vp = nullptr) const { - if (unlikely (!items)) - return false; - auto &item = item_for_hash (key, hb_hash (key)); - if (item.is_real () && item == key) + if (!items) return false; + auto *item = fetch_item (key, hb_hash (key)); + if (item) { - if (vp) *vp = std::addressof (item.value); + if (vp) *vp = std::addressof (item->value); return true; } - else - return false; + return false; + } + item_t *fetch_item (const K &key, uint32_t hash) const + { + hash &= 0x3FFFFFFF; // We only store lower 30bit of hash + unsigned int i = hash % prime; + unsigned step = 0; + while (items[i].is_used ()) + { + if ((std::is_integral::value || items[i].hash == hash) && + items[i] == key) + { + if (items[i].is_real ()) + return &items[i]; + else + return nullptr; + } + i = (i + ++step) & mask; + } + return nullptr; } /* Projection. */ - V operator () (K k) const { return get (k); } + const V& operator () (K k) const { return get (k); } unsigned size () const { return mask ? mask + 1 : 0; } @@ -339,23 +414,21 @@ struct hb_hashmap_t auto keys_ref () const HB_AUTO_RETURN ( + iter_items () - | hb_map (&item_t::key) + | hb_map (&item_t::get_key) ) auto keys () const HB_AUTO_RETURN ( - + iter_items () - | hb_map (&item_t::key) + + keys_ref () | hb_map (hb_ridentity) ) auto values_ref () const HB_AUTO_RETURN ( + iter_items () - | hb_map (&item_t::value) + | hb_map (&item_t::get_value) ) auto values () const HB_AUTO_RETURN ( - + iter_items () - | hb_map (&item_t::value) + + values_ref () | hb_map (hb_ridentity) ) @@ -393,23 +466,6 @@ struct hb_hashmap_t hb_hashmap_t& operator << (const hb_pair_t& v) { set (std::move (v.first), std::move (v.second)); return *this; } - item_t& item_for_hash (const K &key, uint32_t hash) const - { - hash &= 0x3FFFFFFF; // We only store lower 30bit of hash - unsigned int i = hash % prime; - unsigned int step = 0; - unsigned int tombstone = (unsigned) -1; - while (items[i].is_used ()) - { - if (items[i].hash == hash && items[i] == key) - return items[i]; - if (tombstone == (unsigned) -1 && items[i].is_tombstone ()) - tombstone = i; - i = (i + ++step) & mask; - } - return items[tombstone == (unsigned) -1 ? i : tombstone]; - } - static unsigned int prime_for (unsigned int shift) { /* Following comment and table copied from glib. */ @@ -480,7 +536,7 @@ struct hb_map_t : hb_hashmap_t> lst) : hashmap (lst) {} + hb_map_t (std::initializer_list lst) : hashmap (lst) {} template hb_map_t (const Iterable &o) : hashmap (o) {} diff --git a/src/3rdparty/harfbuzz-ng/src/hb-meta.hh b/src/3rdparty/harfbuzz-ng/src/hb-meta.hh index 31aa7fa6..52ff4a84 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-meta.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-meta.hh @@ -153,8 +153,8 @@ struct hb_reference_wrapper hb_reference_wrapper (T v) : v (v) {} bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } - operator T () const { return v; } - T get () const { return v; } + operator T& () { return v; } + T& get () { return v; } T v; }; template @@ -163,8 +163,8 @@ struct hb_reference_wrapper hb_reference_wrapper (T& v) : v (std::addressof (v)) {} bool operator == (const hb_reference_wrapper& o) const { return v == o.v; } bool operator != (const hb_reference_wrapper& o) const { return v != o.v; } - operator T& () const { return *v; } - T& get () const { return *v; } + operator T& () { return *v; } + T& get () { return *v; } T* v; }; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh b/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh index b4a8cc62..0184279c 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-multimap.hh @@ -38,10 +38,10 @@ struct hb_multimap_t { void add (hb_codepoint_t k, hb_codepoint_t v) { - hb_codepoint_t *i; - if (multiples_indices.has (k, &i)) + hb_vector_t *m; + if (multiples.has (k, &m)) { - multiples_values[*i].push (v); + m->push (v); return; } @@ -51,12 +51,7 @@ struct hb_multimap_t hb_codepoint_t old = *old_v; singulars.del (k); - multiples_indices.set (k, multiples_values.length); - auto *vec = multiples_values.push (); - - vec->push (old); - vec->push (v); - + multiples.set (k, hb_vector_t {old, v}); return; } @@ -69,22 +64,31 @@ struct hb_multimap_t if (singulars.has (k, &v)) return hb_array (v, 1); - hb_codepoint_t *i; - if (multiples_indices.has (k, &i)) - return multiples_values[*i].as_array (); + hb_vector_t *m; + if (multiples.has (k, &m)) + return m->as_array (); return hb_array_t (); } bool in_error () const { - return singulars.in_error () || multiples_indices.in_error () || multiples_values.in_error (); + if (singulars.in_error () || multiples.in_error ()) + return true; + for (const auto &m : multiples.values_ref ()) + if (m.in_error ()) + return true; + return false; + } + + void alloc (unsigned size) + { + singulars.alloc (size); } protected: hb_map_t singulars; - hb_map_t multiples_indices; - hb_vector_t> multiples_values; + hb_hashmap_t> multiples; }; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-null.hh b/src/3rdparty/harfbuzz-ng/src/hb-null.hh index 0d7f4da7..854485d3 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-null.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-null.hh @@ -37,7 +37,7 @@ /* Global nul-content Null pool. Enlarge as necessary. */ -#define HB_NULL_POOL_SIZE 448 +#define HB_NULL_POOL_SIZE 640 template struct _hb_has_min_size : hb_false_type {}; @@ -85,7 +85,7 @@ using hb_null_size = _hb_null_size; template struct _hb_static_size : hb_integral_constant {}; template -struct _hb_static_size> : hb_integral_constant {}; +struct _hb_static_size> : hb_integral_constant {}; template using hb_static_size = _hb_static_size; #define hb_static_size(T) hb_static_size::value @@ -176,7 +176,7 @@ template static inline Type& Crap () { static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); Type *obj = reinterpret_cast (_hb_CrapPool); - memcpy (obj, &Null (Type), sizeof (*obj)); + memcpy (obj, std::addressof (Null (Type)), sizeof (*obj)); return *obj; } template @@ -211,11 +211,11 @@ struct hb_nonnull_ptr_t T * operator = (T *v_) { return v = v_; } T * operator -> () const { return get (); } T & operator * () const { return *get (); } - T ** operator & () const { return &v; } + T ** operator & () const { return std::addressof (v); } /* Only auto-cast to const types. */ template operator const C * () const { return get (); } operator const char * () const { return (const char *) get (); } - T * get () const { return v ? v : const_cast (&Null (T)); } + T * get () const { return v ? v : const_cast (std::addressof (Null (T))); } T * get_raw () const { return v; } private: diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh index 13570a46..04f144a7 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-open-file.hh @@ -131,7 +131,7 @@ typedef struct OpenTypeOffsetTable sfnt_version = sfnt_tag; /* Take space for numTables, searchRange, entrySelector, RangeShift * and the TableRecords themselves. */ - unsigned num_items = it.len (); + unsigned num_items = hb_len (it); if (unlikely (!tables.serialize (c, num_items))) return_trace (false); const char *dir_end = (const char *) c->head; @@ -145,7 +145,7 @@ typedef struct OpenTypeOffsetTable unsigned len = blob->length; /* Allocate room for the table and copy it. */ - char *start = (char *) c->allocate_size (len); + char *start = (char *) c->allocate_size (len, false); if (unlikely (!start)) return false; TableRecord &rec = tables.arrayZ[i]; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh b/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh index 4c9bfebc..d3fdd1ca 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-open-type.hh @@ -312,6 +312,8 @@ struct _hb_has_null template struct OffsetTo : Offset { + using target_t = Type; + // Make sure Type is not unbounded; works only for types that are fully defined at OffsetTo time. static_assert (has_null == false || (hb_has_null_size (Type) || !hb_has_min_size (Type)), ""); @@ -416,12 +418,15 @@ struct OffsetTo : Offset { TRACE_SANITIZE (this); if (unlikely (!c->check_struct (this))) return_trace (false); - if (unlikely (this->is_null ())) return_trace (true); + //if (unlikely (this->is_null ())) return_trace (true); if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false); return_trace (true); } template +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif bool sanitize (hb_sanitize_context_t *c, const void *base, Ts&&... ds) const { TRACE_SANITIZE (this); @@ -462,24 +467,16 @@ struct UnsizedArrayOf HB_DELETE_CREATE_COPY_ASSIGN (UnsizedArrayOf); - const Type& operator [] (int i_) const + const Type& operator [] (unsigned int i) const { - unsigned int i = (unsigned int) i_; - const Type *p = &arrayZ[i]; - if (unlikely ((const void *) p < (const void *) arrayZ)) return Null (Type); /* Overflowed. */ - _hb_compiler_memory_r_barrier (); - return *p; + return arrayZ[i]; } - Type& operator [] (int i_) + Type& operator [] (unsigned int i) { - unsigned int i = (unsigned int) i_; - Type *p = &arrayZ[i]; - if (unlikely ((const void *) p < (const void *) arrayZ)) return Crap (Type); /* Overflowed. */ - _hb_compiler_memory_r_barrier (); - return *p; + return arrayZ[i]; } - unsigned int get_size (unsigned int len) const + static unsigned int get_size (unsigned int len) { return len * Type::static_size; } template operator T * () { return arrayZ; } @@ -533,6 +530,7 @@ struct UnsizedArrayOf } template + HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, unsigned int count, Ts&&... ds) const { TRACE_SANITIZE (this); @@ -721,6 +719,7 @@ struct ArrayOf } template + HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); @@ -736,7 +735,7 @@ struct ArrayOf bool sanitize_shallow (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (len.sanitize (c) && c->check_array (arrayZ, len)); + return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType))); } public: @@ -797,7 +796,7 @@ template using List16OfOffset16To = List16OfOffsetTo; /* An array starting at second element. */ -template +template struct HeadlessArrayOf { static constexpr unsigned item_size = Type::static_size; @@ -861,6 +860,7 @@ struct HeadlessArrayOf } template + HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); @@ -878,7 +878,7 @@ struct HeadlessArrayOf { TRACE_SANITIZE (this); return_trace (lenP1.sanitize (c) && - (!lenP1 || c->check_array (arrayZ, lenP1 - 1))); + (!lenP1 || c->check_array_sized (arrayZ, lenP1 - 1, sizeof (LenType)))); } public: @@ -887,6 +887,7 @@ struct HeadlessArrayOf public: DEFINE_SIZE_ARRAY (sizeof (LenType), arrayZ); }; +template using HeadlessArray16Of = HeadlessArrayOf; /* An array storing length-1. */ template @@ -912,6 +913,7 @@ struct ArrayOfM1 { return lenM1.static_size + (lenM1 + 1) * Type::static_size; } template + HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); @@ -929,7 +931,7 @@ struct ArrayOfM1 { TRACE_SANITIZE (this); return_trace (lenM1.sanitize (c) && - (c->check_array (arrayZ, lenM1 + 1))); + (c->check_array_sized (arrayZ, lenM1 + 1, sizeof (LenType)))); } public: @@ -1096,6 +1098,7 @@ struct VarSizedBinSearchArrayOf { return header.static_size + header.nUnits * header.unitSize; } template + HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const { TRACE_SANITIZE (this); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh index f22824fc..923a32b2 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff-common.hh @@ -48,12 +48,24 @@ static inline const Type& StructAtOffsetOrNull (const void *P, unsigned int offs struct code_pair_t { - hb_codepoint_t code; + unsigned code; hb_codepoint_t glyph; }; + using str_buff_t = hb_vector_t; using str_buff_vec_t = hb_vector_t; +using glyph_to_sid_map_t = hb_vector_t; + +struct length_f_t +{ + template + unsigned operator () (const Iterable &_) const { return hb_len (hb_iter (_)); } + + unsigned operator () (unsigned _) const { return _; } +} +HB_FUNCOBJ (length_f); /* CFF INDEX */ template @@ -62,42 +74,52 @@ struct CFFIndex unsigned int offset_array_size () const { return offSize * (count + 1); } - CFFIndex *copy (hb_serialize_context_t *c) const - { - TRACE_SERIALIZE (this); - unsigned int size = get_size (); - CFFIndex *out = c->allocate_size (size, false); - if (likely (out)) - hb_memcpy (out, this, size); - return_trace (out); - } - template bool serialize (hb_serialize_context_t *c, - const Iterable &iterable) + const Iterable &iterable, + const unsigned *p_data_size = nullptr) { TRACE_SERIALIZE (this); + unsigned data_size; + if (p_data_size) + data_size = *p_data_size; + else + total_size (iterable, &data_size); + auto it = hb_iter (iterable); - serialize_header(c, + it | hb_map (hb_iter) | hb_map (hb_len)); + if (unlikely (!serialize_header (c, +it, data_size))) return_trace (false); + unsigned char *ret = c->allocate_size (data_size, false); + if (unlikely (!ret)) return_trace (false); for (const auto &_ : +it) - hb_iter (_).copy (c); + { + unsigned len = _.length; + if (!len) + continue; + if (len <= 1) + { + *ret++ = *_.arrayZ; + continue; + } + hb_memcpy (ret, _.arrayZ, len); + ret += len; + } return_trace (true); } template bool serialize_header (hb_serialize_context_t *c, - Iterator it) + Iterator it, + unsigned data_size) { TRACE_SERIALIZE (this); - unsigned total = + it | hb_reduce (hb_add, 0); - unsigned off_size = (hb_bit_storage (total + 1) + 7) / 8; + unsigned off_size = (hb_bit_storage (data_size + 1) + 7) / 8; /* serialize CFFIndex header */ if (unlikely (!c->extend_min (this))) return_trace (false); - this->count = it.len (); + this->count = hb_len (it); if (!this->count) return_trace (true); if (unlikely (!c->extend (this->offSize))) return_trace (false); this->offSize = off_size; @@ -106,25 +128,88 @@ struct CFFIndex /* serialize indices */ unsigned int offset = 1; - unsigned int i = 0; - for (unsigned _ : +it) + if (HB_OPTIMIZE_SIZE_VAL) { - set_offset_at (i++, offset); - offset += _; + unsigned int i = 0; + for (const auto &_ : +it) + { + set_offset_at (i++, offset); + offset += length_f (_); + } + set_offset_at (i, offset); } - set_offset_at (i, offset); + else + switch (off_size) + { + case 1: + { + HBUINT8 *p = (HBUINT8 *) offsets; + for (const auto &_ : +it) + { + *p++ = offset; + offset += length_f (_); + } + *p = offset; + } + break; + case 2: + { + HBUINT16 *p = (HBUINT16 *) offsets; + for (const auto &_ : +it) + { + *p++ = offset; + offset += length_f (_); + } + *p = offset; + } + break; + case 3: + { + HBUINT24 *p = (HBUINT24 *) offsets; + for (const auto &_ : +it) + { + *p++ = offset; + offset += length_f (_); + } + *p = offset; + } + break; + case 4: + { + HBUINT32 *p = (HBUINT32 *) offsets; + for (const auto &_ : +it) + { + *p++ = offset; + offset += length_f (_); + } + *p = offset; + } + break; + default: + break; + } + assert (offset == data_size + 1); return_trace (true); } template - static unsigned total_size (const Iterable &iterable) + static unsigned total_size (const Iterable &iterable, unsigned *data_size = nullptr) { - auto it = + hb_iter (iterable) | hb_map (hb_iter) | hb_map (hb_len); - if (!it) return 0; + auto it = + hb_iter (iterable); + if (!it) + { + if (data_size) *data_size = 0; + return min_size; + } + + unsigned total = 0; + for (const auto &_ : +it) + total += length_f (_); + + if (data_size) *data_size = total; - unsigned total = + it | hb_reduce (hb_add, 0); unsigned off_size = (hb_bit_storage (total + 1) + 7) / 8; return min_size + HBUINT8::static_size + (hb_len (it) + 1) * off_size + total; @@ -133,13 +218,16 @@ struct CFFIndex void set_offset_at (unsigned int index, unsigned int offset) { assert (index <= count); - HBUINT8 *p = offsets + offSize * index + offSize; + unsigned int size = offSize; - for (; size; size--) + const HBUINT8 *p = offsets; + switch (size) { - --p; - *p = offset & 0xFF; - offset >>= 8; + case 1: ((HBUINT8 *) p)[index] = offset; break; + case 2: ((HBUINT16 *) p)[index] = offset; break; + case 3: ((HBUINT24 *) p)[index] = offset; break; + case 4: ((HBUINT32 *) p)[index] = offset; break; + default: return; } } @@ -149,37 +237,30 @@ struct CFFIndex assert (index <= count); unsigned int size = offSize; - const HBUINT8 *p = offsets + size * index; + const HBUINT8 *p = offsets; switch (size) { - case 1: return * (HBUINT8 *) p; - case 2: return * (HBUINT16 *) p; - case 3: return * (HBUINT24 *) p; - case 4: return * (HBUINT32 *) p; + case 1: return ((HBUINT8 *) p)[index]; + case 2: return ((HBUINT16 *) p)[index]; + case 3: return ((HBUINT24 *) p)[index]; + case 4: return ((HBUINT32 *) p)[index]; default: return 0; } } - unsigned int length_at (unsigned int index) const - { - unsigned offset0 = offset_at (index); - unsigned offset1 = offset_at (index + 1); - if (unlikely (offset1 < offset0 || offset1 > offset_at (count))) - return 0; - return offset1 - offset0; - } - const unsigned char *data_base () const - { return (const unsigned char *) this + min_size + offSize.static_size + offset_array_size (); } + { return (const unsigned char *) this + min_size + offSize.static_size - 1 + offset_array_size (); } public: hb_ubytes_t operator [] (unsigned int index) const { if (unlikely (index >= count)) return hb_ubytes_t (); _hb_compiler_memory_r_barrier (); - unsigned length = length_at (index); - if (unlikely (!length)) return hb_ubytes_t (); - return hb_ubytes_t (data_base () + offset_at (index) - 1, length); + unsigned offset0 = offset_at (index); + unsigned offset1 = offset_at (index + 1); + if (unlikely (offset1 < offset0 || offset1 > offset_at (count))) + return hb_ubytes_t (); + return hb_ubytes_t (data_base () + offset0, offset1 - offset0); } unsigned int get_size () const @@ -197,7 +278,7 @@ struct CFFIndex (count < count + 1u && c->check_struct (&offSize) && offSize >= 1 && offSize <= 4 && c->check_array (offsets, offSize, count + 1u) && - c->check_array ((const HBUINT8*) data_base (), 1, offset_at (count) - 1))))); + c->check_array ((const HBUINT8*) data_base (), 1, offset_at (count)))))); } public: @@ -211,47 +292,6 @@ struct CFFIndex DEFINE_SIZE_MIN (COUNT::static_size); }; -template -struct CFFIndexOf : CFFIndex -{ - template - bool serialize (hb_serialize_context_t *c, - unsigned int offSize_, - const DATA *dataArray, - unsigned int dataArrayLen, - const hb_vector_t &dataSizeArray, - const PARAM1 ¶m1, - const PARAM2 ¶m2) - { - TRACE_SERIALIZE (this); - /* serialize CFFIndex header */ - if (unlikely (!c->extend_min (this))) return_trace (false); - this->count = dataArrayLen; - this->offSize = offSize_; - if (unlikely (!c->allocate_size (offSize_ * (dataArrayLen + 1), false))) - return_trace (false); - - /* serialize indices */ - unsigned int offset = 1; - unsigned int i = 0; - for (; i < dataArrayLen; i++) - { - this->set_offset_at (i, offset); - offset += dataSizeArray[i]; - } - this->set_offset_at (i, offset); - - /* serialize data */ - for (unsigned int i = 0; i < dataArrayLen; i++) - { - TYPE *dest = c->start_embed (); - if (unlikely (!dest || !dest->serialize (c, dataArray[i], param1, param2))) - return_trace (false); - } - return_trace (true); - } -}; - /* Top Dict, Font Dict, Private Dict */ struct Dict : UnsizedByteStr { @@ -327,7 +367,7 @@ struct table_info_t }; template -struct FDArray : CFFIndexOf +struct FDArray : CFFIndex { template bool serialize (hb_serialize_context_t *c, @@ -338,7 +378,11 @@ struct FDArray : CFFIndexOf /* serialize INDEX data */ hb_vector_t sizes; + if (it.is_random_access_iterator) + sizes.alloc (hb_len (it)); + c->push (); + char *data_base = c->head; + it | hb_map ([&] (const hb_pair_t &_) { @@ -348,10 +392,16 @@ struct FDArray : CFFIndexOf }) | hb_sink (sizes) ; + unsigned data_size = c->head - data_base; c->pop_pack (false); + if (unlikely (sizes.in_error ())) return_trace (false); + + /* It just happens that the above is packed right after the header below. + * Such a hack. */ + /* serialize INDEX header */ - return_trace (CFFIndex::serialize_header (c, hb_iter (sizes))); + return_trace (CFFIndex::serialize_header (c, hb_iter (sizes), data_size)); } }; @@ -368,8 +418,11 @@ struct FDSelect0 { return_trace (true); } - hb_codepoint_t get_fd (hb_codepoint_t glyph) const - { return (hb_codepoint_t) fds[glyph]; } + unsigned get_fd (hb_codepoint_t glyph) const + { return fds[glyph]; } + + hb_pair_t get_fd_range (hb_codepoint_t glyph) const + { return {fds[glyph], glyph + 1}; } unsigned int get_size (unsigned int num_glyphs) const { return HBUINT8::static_size * num_glyphs; } @@ -427,12 +480,20 @@ struct FDSelect3_4 return +1; } - hb_codepoint_t get_fd (hb_codepoint_t glyph) const + unsigned get_fd (hb_codepoint_t glyph) const { auto *range = hb_bsearch (glyph, &ranges[0], nRanges () - 1, sizeof (ranges[0]), _cmp_range); return range ? range->fd : ranges[nRanges () - 1].fd; } + hb_pair_t get_fd_range (hb_codepoint_t glyph) const + { + auto *range = hb_bsearch (glyph, &ranges[0], nRanges () - 1, sizeof (ranges[0]), _cmp_range); + unsigned fd = range ? range->fd : ranges[nRanges () - 1].fd; + hb_codepoint_t end = range ? range[1].first : ranges[nRanges () - 1].first; + return {fd, end}; + } + GID_TYPE &nRanges () { return ranges.len; } GID_TYPE nRanges () const { return ranges.len; } GID_TYPE &sentinel () { return StructAfter (ranges[nRanges () - 1]); } @@ -469,7 +530,7 @@ struct FDSelect } } - hb_codepoint_t get_fd (hb_codepoint_t glyph) const + unsigned get_fd (hb_codepoint_t glyph) const { if (this == &Null (FDSelect)) return 0; @@ -480,6 +541,18 @@ struct FDSelect default:return 0; } } + /* Returns pair of fd and one after last glyph in range. */ + hb_pair_t get_fd_range (hb_codepoint_t glyph) const + { + if (this == &Null (FDSelect)) return {0, 1}; + + switch (format) + { + case 0: return u.format0.get_fd_range (glyph); + case 3: return u.format3.get_fd_range (glyph); + default:return {0, 1}; + } + } bool sanitize (hb_sanitize_context_t *c, unsigned int fdcount) const { diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc index 5040c746..66df28aa 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.cc @@ -574,11 +574,11 @@ bool OT::cff1::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph, h struct get_seac_param_t { - get_seac_param_t (const OT::cff1::accelerator_t *_cff) : cff (_cff) {} + get_seac_param_t (const OT::cff1::accelerator_subset_t *_cff) : cff (_cff) {} bool has_seac () const { return base && accent; } - const OT::cff1::accelerator_t *cff; + const OT::cff1::accelerator_subset_t *cff; hb_codepoint_t base = 0; hb_codepoint_t accent = 0; }; @@ -596,7 +596,7 @@ struct cff1_cs_opset_seac_t : cff1_cs_opset_t= num_glyphs))) return false; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh index f461a230..1e81dcb5 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff1-table.hh @@ -28,7 +28,7 @@ #define HB_OT_CFF1_TABLE_HH #include "hb-ot-cff-common.hh" -#include "hb-subset-cff1.hh" +#include "hb-subset-cff-common.hh" #include "hb-draw.hh" #include "hb-paint.hh" @@ -44,7 +44,7 @@ namespace CFF { * CFF -- Compact Font Format (CFF) * https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf */ -#define HB_OT_TAG_cff1 HB_TAG('C','F','F',' ') +#define HB_OT_TAG_CFF1 HB_TAG('C','F','F',' ') #define CFF_UNDEF_SID CFF_UNDEF_CODE @@ -52,7 +52,6 @@ enum EncodingID { StandardEncoding = 0, ExpertEncoding = 1 }; enum CharsetID { ISOAdobeCharset = 0, ExpertCharset = 1, ExpertSubsetCharset = 2 }; typedef CFFIndex CFF1Index; -template struct CFF1IndexOf : CFFIndexOf {}; typedef CFFIndex CFF1Index; typedef CFF1Index CFF1CharStrings; @@ -110,6 +109,7 @@ struct Encoding1 { hb_codepoint_t get_code (hb_codepoint_t glyph) const { + /* TODO: Add cache like get_sid. */ assert (glyph > 0); glyph--; for (unsigned int i = 0; i < nRanges (); i++) @@ -173,11 +173,7 @@ struct Encoding bool serialize (hb_serialize_context_t *c, const Encoding &src) { TRACE_SERIALIZE (this); - unsigned int size = src.get_size (); - Encoding *dest = c->allocate_size (size); - if (unlikely (!dest)) return_trace (false); - hb_memcpy (dest, &src, size); - return_trace (true); + return_trace (c->embed (src)); } /* serialize a subset Encoding */ @@ -312,26 +308,29 @@ struct Encoding }; /* Charset */ -struct Charset0 { - bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const +struct Charset0 +{ + bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs, unsigned *num_charset_entries) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && sids[num_glyphs - 1].sanitize (c)); + if (num_charset_entries) *num_charset_entries = num_glyphs; + return_trace (sids.sanitize (c, num_glyphs - 1)); } hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned num_glyphs) const { if (unlikely (glyph >= num_glyphs)) return 0; - if (glyph == 0) + if (unlikely (glyph == 0)) return 0; else return sids[glyph - 1]; } - void collect_glyph_to_sid_map (hb_map_t *mapping, unsigned int num_glyphs) const + void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const { + mapping->resize (num_glyphs, false); for (hb_codepoint_t gid = 1; gid < num_glyphs; gid++) - mapping->set (gid, sids[gid - 1]); + mapping->arrayZ[gid] = {sids[gid - 1], gid}; } hb_codepoint_t get_glyph (hb_codepoint_t sid, unsigned int num_glyphs) const @@ -347,13 +346,13 @@ struct Charset0 { return 0; } - unsigned int get_size (unsigned int num_glyphs) const + static unsigned int get_size (unsigned int num_glyphs) { assert (num_glyphs > 0); - return HBUINT16::static_size * (num_glyphs - 1); + return UnsizedArrayOf::get_size (num_glyphs - 1); } - HBUINT16 sids[HB_VAR_ARRAY]; + UnsizedArrayOf sids; DEFINE_SIZE_ARRAY(0, sids); }; @@ -374,38 +373,62 @@ struct Charset_Range { template struct Charset1_2 { - bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs) const + bool sanitize (hb_sanitize_context_t *c, unsigned int num_glyphs, unsigned *num_charset_entries) const { TRACE_SANITIZE (this); if (unlikely (!c->check_struct (this))) return_trace (false); num_glyphs--; - for (unsigned int i = 0; num_glyphs > 0; i++) + unsigned i; + for (i = 0; num_glyphs > 0; i++) { if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1))) return_trace (false); num_glyphs -= (ranges[i].nLeft + 1); } + if (num_charset_entries) + *num_charset_entries = i; return_trace (true); } - hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned num_glyphs) const + hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned num_glyphs, + code_pair_t *cache = nullptr) const { if (unlikely (glyph >= num_glyphs)) return 0; - if (glyph == 0) return 0; - glyph--; - for (unsigned int i = 0;; i++) + unsigned i; + hb_codepoint_t start_glyph; + if (cache && likely (cache->glyph <= glyph)) { - if (glyph <= ranges[i].nLeft) - return (hb_codepoint_t) ranges[i].first + glyph; - glyph -= (ranges[i].nLeft + 1); + i = cache->code; + start_glyph = cache->glyph; + } + else + { + if (unlikely (glyph == 0)) return 0; + i = 0; + start_glyph = 1; + } + glyph -= start_glyph; + for (;; i++) + { + unsigned count = ranges[i].nLeft; + if (glyph <= count) + { + if (cache) + *cache = {i, start_glyph}; + return ranges[i].first + glyph; + } + count++; + start_glyph += count; + glyph -= count; } return 0; } - void collect_glyph_to_sid_map (hb_map_t *mapping, unsigned int num_glyphs) const + void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const { + mapping->resize (num_glyphs, false); hb_codepoint_t gid = 1; if (gid >= num_glyphs) return; @@ -413,8 +436,9 @@ struct Charset1_2 { { hb_codepoint_t sid = ranges[i].first; unsigned count = ranges[i].nLeft + 1; + unsigned last = gid + count; for (unsigned j = 0; j < count; j++) - mapping->set (gid++, sid++); + mapping->arrayZ[gid++] = {sid++, last - 1}; if (gid >= num_glyphs) break; @@ -439,21 +463,26 @@ struct Charset1_2 { unsigned int get_size (unsigned int num_glyphs) const { - unsigned int size = HBUINT8::static_size; - int glyph = (int)num_glyphs; + int glyph = (int) num_glyphs; + unsigned num_ranges = 0; assert (glyph > 0); glyph--; for (unsigned int i = 0; glyph > 0; i++) { glyph -= (ranges[i].nLeft + 1); - size += Charset_Range::static_size; + num_ranges++; } - return size; + return get_size_for_ranges (num_ranges); } - Charset_Range ranges[HB_VAR_ARRAY]; + static unsigned int get_size_for_ranges (unsigned int num_ranges) + { + return UnsizedArrayOf >::get_size (num_ranges); + } + + UnsizedArrayOf> ranges; DEFINE_SIZE_ARRAY (0, ranges); }; @@ -469,11 +498,7 @@ struct Charset bool serialize (hb_serialize_context_t *c, const Charset &src, unsigned int num_glyphs) { TRACE_SERIALIZE (this); - unsigned int size = src.get_size (num_glyphs); - Charset *dest = c->allocate_size (size); - if (unlikely (!dest)) return_trace (false); - hb_memcpy (dest, &src, size); - return_trace (true); + return_trace (c->embed ((const char *) &src, src.get_size (num_glyphs))); } /* serialize a subset Charset */ @@ -490,13 +515,13 @@ struct Charset { case 0: { - Charset0 *fmt0 = c->allocate_size (Charset0::min_size + HBUINT16::static_size * (num_glyphs - 1)); + Charset0 *fmt0 = c->allocate_size (Charset0::get_size (num_glyphs), false); if (unlikely (!fmt0)) return_trace (false); unsigned int glyph = 0; for (unsigned int i = 0; i < sid_ranges.length; i++) { - hb_codepoint_t sid = sid_ranges[i].code; - for (int left = (int)sid_ranges[i].glyph; left >= 0; left--) + hb_codepoint_t sid = sid_ranges.arrayZ[i].code; + for (int left = (int)sid_ranges.arrayZ[i].glyph; left >= 0; left--) fmt0->sids[glyph++] = sid++; } } @@ -504,29 +529,35 @@ struct Charset case 1: { - Charset1 *fmt1 = c->allocate_size (Charset1::min_size + Charset1_Range::static_size * sid_ranges.length); + Charset1 *fmt1 = c->allocate_size (Charset1::get_size_for_ranges (sid_ranges.length), false); if (unlikely (!fmt1)) return_trace (false); + hb_codepoint_t all_glyphs = 0; for (unsigned int i = 0; i < sid_ranges.length; i++) { - if (unlikely (!(sid_ranges[i].glyph <= 0xFF))) - return_trace (false); - fmt1->ranges[i].first = sid_ranges[i].code; - fmt1->ranges[i].nLeft = sid_ranges[i].glyph; + auto &_ = sid_ranges.arrayZ[i]; + all_glyphs |= _.glyph; + fmt1->ranges[i].first = _.code; + fmt1->ranges[i].nLeft = _.glyph; } + if (unlikely (!(all_glyphs <= 0xFF))) + return_trace (false); } break; case 2: { - Charset2 *fmt2 = c->allocate_size (Charset2::min_size + Charset2_Range::static_size * sid_ranges.length); + Charset2 *fmt2 = c->allocate_size (Charset2::get_size_for_ranges (sid_ranges.length), false); if (unlikely (!fmt2)) return_trace (false); + hb_codepoint_t all_glyphs = 0; for (unsigned int i = 0; i < sid_ranges.length; i++) { - if (unlikely (!(sid_ranges[i].glyph <= 0xFFFF))) - return_trace (false); - fmt2->ranges[i].first = sid_ranges[i].code; - fmt2->ranges[i].nLeft = sid_ranges[i].glyph; + auto &_ = sid_ranges.arrayZ[i]; + all_glyphs |= _.glyph; + fmt2->ranges[i].first = _.code; + fmt2->ranges[i].nLeft = _.glyph; } + if (unlikely (!(all_glyphs <= 0xFFFF))) + return_trace (false); } break; @@ -545,18 +576,19 @@ struct Charset } } - hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned int num_glyphs) const + hb_codepoint_t get_sid (hb_codepoint_t glyph, unsigned int num_glyphs, + code_pair_t *cache = nullptr) const { switch (format) { case 0: return u.format0.get_sid (glyph, num_glyphs); - case 1: return u.format1.get_sid (glyph, num_glyphs); - case 2: return u.format2.get_sid (glyph, num_glyphs); + case 1: return u.format1.get_sid (glyph, num_glyphs, cache); + case 2: return u.format2.get_sid (glyph, num_glyphs, cache); default:return 0; } } - void collect_glyph_to_sid_map (hb_map_t *mapping, unsigned int num_glyphs) const + void collect_glyph_to_sid_map (glyph_to_sid_map_t *mapping, unsigned int num_glyphs) const { switch (format) { @@ -578,7 +610,7 @@ struct Charset } } - bool sanitize (hb_sanitize_context_t *c) const + bool sanitize (hb_sanitize_context_t *c, unsigned *num_charset_entries) const { TRACE_SANITIZE (this); if (unlikely (!c->check_struct (this))) @@ -586,9 +618,9 @@ struct Charset switch (format) { - case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs ())); - case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs ())); - case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs ())); + case 0: return_trace (u.format0.sanitize (c, c->get_num_glyphs (), num_charset_entries)); + case 1: return_trace (u.format1.sanitize (c, c->get_num_glyphs (), num_charset_entries)); + case 2: return_trace (u.format2.sanitize (c, c->get_num_glyphs (), num_charset_entries)); default:return_trace (false); } } @@ -606,10 +638,10 @@ struct Charset struct CFF1StringIndex : CFF1Index { bool serialize (hb_serialize_context_t *c, const CFF1StringIndex &strings, - const hb_inc_bimap_t &sidmap) + const hb_vector_t &sidmap) { TRACE_SERIALIZE (this); - if (unlikely ((strings.count == 0) || (sidmap.get_population () == 0))) + if (unlikely ((strings.count == 0) || (sidmap.length == 0))) { if (unlikely (!c->extend_min (this->count))) return_trace (false); @@ -617,15 +649,13 @@ struct CFF1StringIndex : CFF1Index return_trace (true); } - byte_str_array_t bytesArray; - if (!bytesArray.resize (sidmap.get_population ())) - return_trace (false); - for (unsigned int i = 0; i < strings.count; i++) - { - hb_codepoint_t j = sidmap[i]; - if (j != HB_MAP_VALUE_INVALID) - bytesArray[j] = strings[i]; - } + if (unlikely (sidmap.in_error ())) return_trace (false); + + // Save this in a vector since serialize() iterates it twice. + hb_vector_t bytesArray (+ hb_iter (sidmap) + | hb_map (strings)); + + if (unlikely (bytesArray.in_error ())) return_trace (false); bool result = CFF1Index::serialize (c, bytesArray); return_trace (result); @@ -932,7 +962,7 @@ struct cff1_private_dict_opset_t : dict_opset_t } }; -struct cff1_private_dict_opset_subset : dict_opset_t +struct cff1_private_dict_opset_subset_t : dict_opset_t { static void process_op (op_code_t op, num_interp_env_t& env, cff1_private_dict_values_subset_t& dictval) { @@ -978,7 +1008,7 @@ typedef dict_interpreter_t cff1_font_dict_interpreter_t; typedef CFF1Index CFF1NameIndex; -typedef CFF1IndexOf CFF1TopDictIndex; +typedef CFF1Index CFF1TopDictIndex; struct cff1_font_dict_values_mod_t { @@ -1019,7 +1049,7 @@ using namespace CFF; struct cff1 { - static constexpr hb_tag_t tableTag = HB_OT_TAG_cff1; + static constexpr hb_tag_t tableTag = HB_OT_TAG_CFF1; bool sanitize (hb_sanitize_context_t *c) const { @@ -1031,8 +1061,12 @@ struct cff1 template struct accelerator_templ_t { - void init (hb_face_t *face) + static constexpr hb_tag_t tableTag = cff1::tableTag; + + accelerator_templ_t (hb_face_t *face) { + if (!face) return; + topDict.init (); fontDicts.init (); privateDicts.init (); @@ -1046,22 +1080,22 @@ struct cff1 const OT::cff1 *cff = this->blob->template as (); if (cff == &Null (OT::cff1)) - { fini (); return; } + goto fail; nameIndex = &cff->nameIndex (cff); if ((nameIndex == &Null (CFF1NameIndex)) || !nameIndex->sanitize (&sc)) - { fini (); return; } + goto fail; topDictIndex = &StructAtOffset (nameIndex, nameIndex->get_size ()); if ((topDictIndex == &Null (CFF1TopDictIndex)) || !topDictIndex->sanitize (&sc) || (topDictIndex->count == 0)) - { fini (); return; } + goto fail; { /* parse top dict */ const hb_ubytes_t topDictStr = (*topDictIndex)[0]; - if (unlikely (!topDictStr.sanitize (&sc))) { fini (); return; } + if (unlikely (!topDictStr.sanitize (&sc))) goto fail; cff1_top_dict_interp_env_t env (topDictStr); cff1_top_dict_interpreter_t top_interp (env); - if (unlikely (!top_interp.interpret (topDict))) { fini (); return; } + if (unlikely (!top_interp.interpret (topDict))) goto fail; } if (is_predef_charset ()) @@ -1069,7 +1103,7 @@ struct cff1 else { charset = &StructAtOffsetOrNull (cff, topDict.CharsetOffset); - if (unlikely ((charset == &Null (Charset)) || !charset->sanitize (&sc))) { fini (); return; } + if (unlikely ((charset == &Null (Charset)) || !charset->sanitize (&sc, &num_charset_entries))) goto fail; } fdCount = 1; @@ -1079,7 +1113,7 @@ struct cff1 fdSelect = &StructAtOffsetOrNull (cff, topDict.FDSelectOffset); if (unlikely ((fdArray == &Null (CFF1FDArray)) || !fdArray->sanitize (&sc) || (fdSelect == &Null (CFF1FDSelect)) || !fdSelect->sanitize (&sc, fdArray->count))) - { fini (); return; } + goto fail; fdCount = fdArray->count; } @@ -1092,36 +1126,36 @@ struct cff1 encoding = &Null (Encoding); if (is_CID ()) { - if (unlikely (charset == &Null (Charset))) { fini (); return; } + if (unlikely (charset == &Null (Charset))) goto fail; } else { if (!is_predef_encoding ()) { encoding = &StructAtOffsetOrNull (cff, topDict.EncodingOffset); - if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) { fini (); return; } + if (unlikely ((encoding == &Null (Encoding)) || !encoding->sanitize (&sc))) goto fail; } } stringIndex = &StructAtOffset (topDictIndex, topDictIndex->get_size ()); if ((stringIndex == &Null (CFF1StringIndex)) || !stringIndex->sanitize (&sc)) - { fini (); return; } + goto fail; globalSubrs = &StructAtOffset (stringIndex, stringIndex->get_size ()); if ((globalSubrs != &Null (CFF1Subrs)) && !globalSubrs->sanitize (&sc)) - { fini (); return; } + goto fail; charStrings = &StructAtOffsetOrNull (cff, topDict.charStringsOffset); if ((charStrings == &Null (CFF1CharStrings)) || unlikely (!charStrings->sanitize (&sc))) - { fini (); return; } + goto fail; num_glyphs = charStrings->count; if (num_glyphs != sc.get_num_glyphs ()) - { fini (); return; } + goto fail; if (unlikely (!privateDicts.resize (fdCount))) - { fini (); return; } + goto fail; for (unsigned int i = 0; i < fdCount; i++) privateDicts[i].init (); @@ -1131,27 +1165,27 @@ struct cff1 for (unsigned int i = 0; i < fdCount; i++) { hb_ubytes_t fontDictStr = (*fdArray)[i]; - if (unlikely (!fontDictStr.sanitize (&sc))) { fini (); return; } + if (unlikely (!fontDictStr.sanitize (&sc))) goto fail; cff1_font_dict_values_t *font; cff1_top_dict_interp_env_t env (fontDictStr); cff1_font_dict_interpreter_t font_interp (env); font = fontDicts.push (); - if (unlikely (fontDicts.in_error ())) { fini (); return; } + if (unlikely (fontDicts.in_error ())) goto fail; font->init (); - if (unlikely (!font_interp.interpret (*font))) { fini (); return; } + if (unlikely (!font_interp.interpret (*font))) goto fail; PRIVDICTVAL *priv = &privateDicts[i]; const hb_ubytes_t privDictStr = StructAtOffset (cff, font->privateDictInfo.offset).as_ubytes (font->privateDictInfo.size); - if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; } + if (unlikely (!privDictStr.sanitize (&sc))) goto fail; num_interp_env_t env2 (privDictStr); dict_interpreter_t priv_interp (env2); priv->init (); - if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; } + if (unlikely (!priv_interp.interpret (*priv))) goto fail; priv->localSubrs = &StructAtOffsetOrNull (&privDictStr, priv->subrsOffset); if (priv->localSubrs != &Null (CFF1Subrs) && unlikely (!priv->localSubrs->sanitize (&sc))) - { fini (); return; } + goto fail; } } else /* non-CID */ @@ -1160,20 +1194,25 @@ struct cff1 PRIVDICTVAL *priv = &privateDicts[0]; const hb_ubytes_t privDictStr = StructAtOffset (cff, font->privateDictInfo.offset).as_ubytes (font->privateDictInfo.size); - if (unlikely (!privDictStr.sanitize (&sc))) { fini (); return; } + if (unlikely (!privDictStr.sanitize (&sc))) goto fail; num_interp_env_t env (privDictStr); dict_interpreter_t priv_interp (env); priv->init (); - if (unlikely (!priv_interp.interpret (*priv))) { fini (); return; } + if (unlikely (!priv_interp.interpret (*priv))) goto fail; priv->localSubrs = &StructAtOffsetOrNull (&privDictStr, priv->subrsOffset); if (priv->localSubrs != &Null (CFF1Subrs) && unlikely (!priv->localSubrs->sanitize (&sc))) - { fini (); return; } + goto fail; } - } - void fini () + return; + + fail: + _fini (); + } + ~accelerator_templ_t () { _fini (); } + void _fini () { sc.end_processing (); topDict.fini (); @@ -1183,6 +1222,8 @@ struct cff1 blob = nullptr; } + hb_blob_t *get_blob () const { return blob; } + bool is_valid () const { return blob; } bool is_CID () const { return topDict.is_CID (); } @@ -1203,13 +1244,14 @@ struct cff1 bool is_predef_encoding () const { return topDict.EncodingOffset <= ExpertEncoding; } - hb_codepoint_t glyph_to_code (hb_codepoint_t glyph) const + hb_codepoint_t glyph_to_code (hb_codepoint_t glyph, + code_pair_t *glyph_to_sid_cache = nullptr) const { if (encoding != &Null (Encoding)) return encoding->get_code (glyph); else { - hb_codepoint_t sid = glyph_to_sid (glyph); + hb_codepoint_t sid = glyph_to_sid (glyph, glyph_to_sid_cache); if (sid == 0) return 0; hb_codepoint_t code = 0; switch (topDict.EncodingOffset) @@ -1227,12 +1269,14 @@ struct cff1 } } - hb_map_t *create_glyph_to_sid_map () const + glyph_to_sid_map_t *create_glyph_to_sid_map () const { if (charset != &Null (Charset)) { - hb_map_t *mapping = hb_map_create (); - mapping->set (0, 0); + auto *mapping = (glyph_to_sid_map_t *) hb_malloc (sizeof (glyph_to_sid_map_t)); + if (unlikely (!mapping)) return nullptr; + mapping = new (mapping) glyph_to_sid_map_t (); + mapping->push (code_pair_t {0, 1}); charset->collect_glyph_to_sid_map (mapping, num_glyphs); return mapping; } @@ -1240,10 +1284,11 @@ struct cff1 return nullptr; } - hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph) const + hb_codepoint_t glyph_to_sid (hb_codepoint_t glyph, + code_pair_t *cache = nullptr) const { if (charset != &Null (Charset)) - return charset->get_sid (glyph, num_glyphs); + return charset->get_sid (glyph, num_glyphs, cache); else { hb_codepoint_t sid = 0; @@ -1312,19 +1357,17 @@ struct cff1 hb_vector_t privateDicts; unsigned int num_glyphs = 0; + unsigned int num_charset_entries = 0; }; struct accelerator_t : accelerator_templ_t { - accelerator_t (hb_face_t *face) + accelerator_t (hb_face_t *face) : SUPER (face) { - SUPER::init (face); - glyph_names.set_relaxed (nullptr); if (!is_valid ()) return; if (is_CID ()) return; - } ~accelerator_t () { @@ -1334,8 +1377,6 @@ struct cff1 names->fini (); hb_free (names); } - - SUPER::fini (); } bool get_glyph_name (hb_codepoint_t glyph, @@ -1386,9 +1427,10 @@ struct cff1 /* TODO */ /* fill glyph names */ + code_pair_t glyph_to_sid_cache {0, HB_CODEPOINT_INVALID}; for (hb_codepoint_t gid = 0; gid < num_glyphs; gid++) { - hb_codepoint_t sid = glyph_to_sid (gid); + hb_codepoint_t sid = glyph_to_sid (gid, &glyph_to_sid_cache); gname_t gname; gname.sid = sid; if (sid < cff1_std_strings_length) @@ -1426,7 +1468,6 @@ struct cff1 HB_INTERNAL bool get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const; HB_INTERNAL bool paint_glyph (hb_font_t *font, hb_codepoint_t glyph, hb_paint_funcs_t *funcs, void *data, hb_color_t foreground) const; - HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const; HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph, hb_draw_session_t &draw_session) const; private: @@ -1453,9 +1494,24 @@ struct cff1 typedef accelerator_templ_t SUPER; }; - struct accelerator_subset_t : accelerator_templ_t {}; + struct accelerator_subset_t : accelerator_templ_t + { + accelerator_subset_t (hb_face_t *face) : SUPER (face) {} + ~accelerator_subset_t () + { + if (cff_accelerator) + cff_subset_accelerator_t::destroy (cff_accelerator); + } - bool subset (hb_subset_context_t *c) const { return hb_subset_cff1 (c); } + HB_INTERNAL bool subset (hb_subset_context_t *c) const; + HB_INTERNAL bool serialize (hb_serialize_context_t *c, + struct cff1_subset_plan &plan) const; + HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const; + + mutable CFF::cff_subset_accelerator_t* cff_accelerator = nullptr; + + typedef accelerator_templ_t SUPER; + }; protected: HB_INTERNAL static hb_codepoint_t lookup_standard_encoding_for_code (hb_codepoint_t sid); @@ -1479,6 +1535,10 @@ struct cff1_accelerator_t : cff1::accelerator_t { cff1_accelerator_t (hb_face_t *face) : cff1::accelerator_t (face) {} }; +struct cff1_subset_accelerator_t : cff1::accelerator_subset_t { + cff1_subset_accelerator_t (hb_face_t *face) : cff1::accelerator_subset_t (face) {} +}; + } /* namespace OT */ #endif /* HB_OT_CFF1_TABLE_HH */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh index b9a8819a..af24bb99 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cff2-table.hh @@ -28,7 +28,7 @@ #define HB_OT_CFF2_TABLE_HH #include "hb-ot-cff-common.hh" -#include "hb-subset-cff2.hh" +#include "hb-subset-cff-common.hh" #include "hb-draw.hh" #include "hb-paint.hh" @@ -38,10 +38,9 @@ namespace CFF { * CFF2 -- Compact Font Format (CFF) Version 2 * https://docs.microsoft.com/en-us/typography/opentype/spec/cff2 */ -#define HB_OT_TAG_cff2 HB_TAG('C','F','F','2') +#define HB_OT_TAG_CFF2 HB_TAG('C','F','F','2') typedef CFFIndex CFF2Index; -template struct CFF2IndexOf : CFFIndexOf {}; typedef CFF2Index CFF2CharStrings; typedef Subrs CFF2Subrs; @@ -379,7 +378,7 @@ using namespace CFF; struct cff2 { - static constexpr hb_tag_t tableTag = HB_OT_TAG_cff2; + static constexpr hb_tag_t tableTag = HB_OT_TAG_CFF2; bool sanitize (hb_sanitize_context_t *c) const { @@ -391,8 +390,12 @@ struct cff2 template struct accelerator_templ_t { + static constexpr hb_tag_t tableTag = cff2::tableTag; + accelerator_templ_t (hb_face_t *face) { + if (!face) return; + topDict.init (); fontDicts.init (); privateDicts.init (); @@ -464,7 +467,6 @@ struct cff2 goto fail; } - return; fail: @@ -481,11 +483,13 @@ struct cff2 blob = nullptr; } - hb_map_t *create_glyph_to_sid_map () const + hb_vector_t *create_glyph_to_sid_map () const { return nullptr; } + hb_blob_t *get_blob () const { return blob; } + bool is_valid () const { return blob; } protected: @@ -518,9 +522,24 @@ struct cff2 HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph, hb_draw_session_t &draw_session) const; }; - typedef accelerator_templ_t accelerator_subset_t; + struct accelerator_subset_t : accelerator_templ_t + { + accelerator_subset_t (hb_face_t *face) : SUPER (face) {} + ~accelerator_subset_t () + { + if (cff_accelerator) + cff_subset_accelerator_t::destroy (cff_accelerator); + } - bool subset (hb_subset_context_t *c) const { return hb_subset_cff2 (c); } + HB_INTERNAL bool subset (hb_subset_context_t *c) const; + HB_INTERNAL bool serialize (hb_serialize_context_t *c, + struct cff2_subset_plan &plan, + hb_array_t normalized_coords) const; + + mutable CFF::cff_subset_accelerator_t* cff_accelerator = nullptr; + + typedef accelerator_templ_t SUPER; + }; public: FixedVersion version; /* Version of CFF2 table. set to 0x0200u */ @@ -535,6 +554,10 @@ struct cff2_accelerator_t : cff2::accelerator_t { cff2_accelerator_t (hb_face_t *face) : cff2::accelerator_t (face) {} }; +struct cff2_subset_accelerator_t : cff2::accelerator_subset_t { + cff2_subset_accelerator_t (hb_face_t *face) : cff2::accelerator_subset_t (face) {} +}; + } /* namespace OT */ #endif /* HB_OT_CFF2_TABLE_HH */ diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh index cf5ccd53..30401b19 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-cmap-table.hh @@ -277,10 +277,10 @@ struct CmapSubtableFormat4 } } writer(c); - writer.end_code_ = c->allocate_size (HBUINT16::static_size * segcount); - c->allocate_size (2); // padding - writer.start_code_ = c->allocate_size (HBUINT16::static_size * segcount); - writer.id_delta_ = c->allocate_size (HBINT16::static_size * segcount); + writer.end_code_ = c->allocate_size (HBUINT16::static_size * segcount, false); + (void) c->allocate_size (2); // padding + writer.start_code_ = c->allocate_size (HBUINT16::static_size * segcount, false); + writer.id_delta_ = c->allocate_size (HBINT16::static_size * segcount, false); if (unlikely (!writer.end_code_ || !writer.start_code_ || !writer.id_delta_)) return false; @@ -325,7 +325,7 @@ struct CmapSubtableFormat4 { auto format4_iter = + it - | hb_filter ([&] (const hb_pair_t _) + | hb_filter ([&] (const hb_codepoint_pair_t _) { return _.first <= 0xFFFF; }) ; @@ -335,7 +335,7 @@ struct CmapSubtableFormat4 if (unlikely (!c->extend_min (this))) return; this->format = 4; - hb_vector_t> cp_to_gid { + hb_vector_t cp_to_gid { format4_iter }; @@ -757,8 +757,7 @@ struct CmapSubtableLongSegmented hb_codepoint_t gid = this->groups[i].glyphID; if (!gid) { - /* Intention is: if (hb_is_same (T, CmapSubtableFormat13)) continue; */ - if (! T::group_get_glyph (this->groups[i], end)) continue; + if (T::formatNumber == 13) continue; start++; gid++; } @@ -766,11 +765,13 @@ struct CmapSubtableLongSegmented if (unlikely ((unsigned int) (gid + end - start) >= num_glyphs)) end = start + (hb_codepoint_t) num_glyphs - gid; + mapping->alloc (mapping->get_population () + end - start + 1); + for (unsigned cp = start; cp <= end; cp++) { unicodes->add (cp); mapping->set (cp, gid); - gid++; + gid += T::increment; } } } @@ -794,6 +795,9 @@ struct CmapSubtableLongSegmented struct CmapSubtableFormat12 : CmapSubtableLongSegmented { + static constexpr int increment = 1; + static constexpr int formatNumber = 12; + static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group, hb_codepoint_t u) { return likely (group.startCharCode <= group.endCharCode) ? @@ -866,6 +870,9 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented struct CmapSubtableFormat13 : CmapSubtableLongSegmented { + static constexpr int increment = 0; + static constexpr int formatNumber = 13; + static hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group, hb_codepoint_t u HB_UNUSED) { return group.glyphID; } @@ -917,8 +924,7 @@ struct DefaultUVS : SortedArray32Of DefaultUVS* copy (hb_serialize_context_t *c, const hb_set_t *unicodes) const { - DefaultUVS *out = c->start_embed (); - if (unlikely (!out)) return nullptr; + auto *out = c->start_embed (); auto snap = c->snapshot (); HBUINT32 len; @@ -931,8 +937,7 @@ struct DefaultUVS : SortedArray32Of hb_codepoint_t start = HB_SET_VALUE_INVALID; hb_codepoint_t end = HB_SET_VALUE_INVALID; - for (hb_codepoint_t u = HB_SET_VALUE_INVALID; - unicodes->next (&u);) + for (auto u : *unicodes) { if (!as_array ().bsearch (u)) continue; @@ -1067,9 +1072,7 @@ struct NonDefaultUVS : SortedArray32Of const hb_set_t *glyphs_requested, const hb_map_t *glyph_map) const { - NonDefaultUVS *out = c->start_embed (); - if (unlikely (!out)) return nullptr; - + auto *out = c->start_embed (); auto it = + as_array () | hb_filter ([&] (const UVSMapping& _) @@ -1767,7 +1770,6 @@ struct cmap TRACE_SUBSET (this); cmap *cmap_prime = c->serializer->start_embed (); - if (unlikely (!c->serializer->check_success (cmap_prime))) return_trace (false); auto encodingrec_iter = + hb_iter (encodingRecord) @@ -1798,7 +1800,7 @@ struct cmap auto it = + c->plan->unicode_to_new_gid_list.iter () - | hb_filter ([&] (const hb_pair_t _) + | hb_filter ([&] (const hb_codepoint_pair_t _) { return (_.second != HB_MAP_VALUE_INVALID); }) ; diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc b/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc index 06f7092a..b3677c6a 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-font.cc @@ -38,8 +38,8 @@ #include "hb-ot-cmap-table.hh" #include "hb-ot-glyf-table.hh" -#include "hb-ot-cff1-table.hh" #include "hb-ot-cff2-table.hh" +#include "hb-ot-cff1-table.hh" #include "hb-ot-hmtx-table.hh" #include "hb-ot-post-table.hh" #include "hb-ot-stat-table.hh" // Just so we compile it; unused otherwise. @@ -64,13 +64,17 @@ using hb_ot_font_cmap_cache_t = hb_cache_t<21, 16, 8, true>; using hb_ot_font_advance_cache_t = hb_cache_t<24, 16, 8, true>; +#ifndef HB_NO_OT_FONT_CMAP_CACHE static hb_user_data_key_t hb_ot_font_cmap_cache_user_data_key; +#endif struct hb_ot_font_t { const hb_ot_face_t *ot_face; +#ifndef HB_NO_OT_FONT_CMAP_CACHE hb_ot_font_cmap_cache_t *cmap_cache; +#endif /* h_advance caching */ mutable hb_atomic_int_t cached_coords_serial; @@ -86,6 +90,7 @@ _hb_ot_font_create (hb_font_t *font) ot_font->ot_face = &font->face->table; +#ifndef HB_NO_OT_FONT_CMAP_CACHE // retry: auto *cmap_cache = (hb_ot_font_cmap_cache_t *) hb_face_get_user_data (font->face, &hb_ot_font_cmap_cache_user_data_key); @@ -93,7 +98,7 @@ _hb_ot_font_create (hb_font_t *font) { cmap_cache = (hb_ot_font_cmap_cache_t *) hb_malloc (sizeof (hb_ot_font_cmap_cache_t)); if (unlikely (!cmap_cache)) goto out; - cmap_cache->init (); + new (cmap_cache) hb_ot_font_cmap_cache_t (); if (unlikely (!hb_face_set_user_data (font->face, &hb_ot_font_cmap_cache_user_data_key, cmap_cache, @@ -112,6 +117,7 @@ _hb_ot_font_create (hb_font_t *font) } out: ot_font->cmap_cache = cmap_cache; +#endif return ot_font; } @@ -136,7 +142,11 @@ hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED, { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; const hb_ot_face_t *ot_face = ot_font->ot_face; - return ot_face->cmap->get_nominal_glyph (unicode, glyph, ot_font->cmap_cache); + hb_ot_font_cmap_cache_t *cmap_cache = nullptr; +#ifndef HB_NO_OT_FONT_CMAP_CACHE + cmap_cache = ot_font->cmap_cache; +#endif + return ot_face->cmap->get_nominal_glyph (unicode, glyph, cmap_cache); } static unsigned int @@ -151,10 +161,14 @@ hb_ot_get_nominal_glyphs (hb_font_t *font HB_UNUSED, { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; const hb_ot_face_t *ot_face = ot_font->ot_face; + hb_ot_font_cmap_cache_t *cmap_cache = nullptr; +#ifndef HB_NO_OT_FONT_CMAP_CACHE + cmap_cache = ot_font->cmap_cache; +#endif return ot_face->cmap->get_nominal_glyphs (count, first_unicode, unicode_stride, first_glyph, glyph_stride, - ot_font->cmap_cache); + cmap_cache); } static hb_bool_t @@ -167,9 +181,13 @@ hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED, { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; const hb_ot_face_t *ot_face = ot_font->ot_face; + hb_ot_font_cmap_cache_t *cmap_cache = nullptr; +#ifndef HB_NO_OT_FONT_CMAP_CACHE + cmap_cache = ot_font->cmap_cache; +#endif return ot_face->cmap->get_variation_glyph (unicode, variation_selector, glyph, - ot_font->cmap_cache); + cmap_cache); } static void @@ -188,7 +206,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, hb_position_t *orig_first_advance = first_advance; -#ifndef HB_NO_VAR +#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE) const OT::HVAR &HVAR = *hmtx.var_table; const OT::VariationStore &varStore = &HVAR + HVAR.varStore; OT::VariationStore::cache_t *varStore_cache = font->num_coords * count >= 128 ? varStore.create_cache () : nullptr; @@ -212,8 +230,8 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, use_cache = false; goto out; } + new (cache) hb_ot_font_advance_cache_t; - cache->init (); if (unlikely (!ot_font->advance_cache.cmpexch (nullptr, cache))) { hb_free (cache); @@ -237,7 +255,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, { /* Use cache. */ if (ot_font->cached_coords_serial.get_acquire () != (int) font->serial_coords) { - ot_font->advance_cache->init (); + ot_font->advance_cache->clear (); ot_font->cached_coords_serial.set_release (font->serial_coords); } @@ -258,7 +276,7 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, } } -#ifndef HB_NO_VAR +#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE) OT::VariationStore::destroy_cache (varStore_cache); #endif @@ -293,7 +311,7 @@ hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data, if (vmtx.has_data ()) { -#ifndef HB_NO_VAR +#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE) const OT::VVAR &VVAR = *vmtx.var_table; const OT::VariationStore &varStore = &VVAR + VVAR.varStore; OT::VariationStore::cache_t *varStore_cache = font->num_coords ? varStore.create_cache () : nullptr; @@ -308,7 +326,7 @@ hb_ot_get_glyph_v_advances (hb_font_t* font, void* font_data, first_advance = &StructAtOffsetUnaligned (first_advance, advance_stride); } -#ifndef HB_NO_VAR +#if !defined(HB_NO_VAR) && !defined(HB_NO_OT_FONT_ADVANCE_CACHE) OT::VariationStore::destroy_cache (varStore_cache); #endif } @@ -418,8 +436,8 @@ hb_ot_get_glyph_extents (hb_font_t *font, #endif if (ot_face->glyf->get_extents (font, glyph, extents)) return true; #ifndef HB_NO_OT_FONT_CFF - if (ot_face->cff1->get_extents (font, glyph, extents)) return true; if (ot_face->cff2->get_extents (font, glyph, extents)) return true; + if (ot_face->cff1->get_extents (font, glyph, extents)) return true; #endif return false; @@ -507,8 +525,8 @@ hb_ot_draw_glyph (hb_font_t *font, embolden ? &outline : draw_data, font->slant_xy); if (!font->face->table.glyf->get_path (font, glyph, draw_session)) #ifndef HB_NO_CFF - if (!font->face->table.cff1->get_path (font, glyph, draw_session)) if (!font->face->table.cff2->get_path (font, glyph, draw_session)) + if (!font->face->table.cff1->get_path (font, glyph, draw_session)) #endif {} } @@ -547,8 +565,8 @@ hb_ot_paint_glyph (hb_font_t *font, #endif if (font->face->table.glyf->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return; #ifndef HB_NO_CFF - if (font->face->table.cff1->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return; if (font->face->table.cff2->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return; + if (font->face->table.cff1->paint_glyph (font, glyph, paint_funcs, paint_data, foreground)) return; #endif } #endif diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh index 3bfd7550..cbcf6f5f 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hdmx-table.hh @@ -46,21 +46,23 @@ struct DeviceRecord template - bool serialize (hb_serialize_context_t *c, unsigned pixelSize, Iterator it) + bool serialize (hb_serialize_context_t *c, + unsigned pixelSize, + Iterator it, + const hb_vector_t new_to_old_gid_list, + unsigned num_glyphs) { TRACE_SERIALIZE (this); - unsigned length = it.len (); - - if (unlikely (!c->extend (this, length))) return_trace (false); + if (unlikely (!c->extend (this, num_glyphs))) return_trace (false); this->pixelSize = pixelSize; this->maxWidth = + it | hb_reduce (hb_max, 0u); - + it - | hb_sink (widthsZ.as_array (length)); + for (auto &_ : new_to_old_gid_list) + widthsZ[_.first] = *it++; return_trace (true); } @@ -89,7 +91,11 @@ struct hdmx template - bool serialize (hb_serialize_context_t *c, unsigned version, Iterator it) + bool serialize (hb_serialize_context_t *c, + unsigned version, + Iterator it, + const hb_vector_t &new_to_old_gid_list, + unsigned num_glyphs) { TRACE_SERIALIZE (this); @@ -97,10 +103,10 @@ struct hdmx this->version = version; this->numRecords = it.len (); - this->sizeDeviceRecord = DeviceRecord::get_size (it ? (*it).second.len () : 0); + this->sizeDeviceRecord = DeviceRecord::get_size (num_glyphs); for (const hb_item_type& _ : +it) - c->start_embed ()->serialize (c, _.first, _.second); + c->start_embed ()->serialize (c, _.first, _.second, new_to_old_gid_list, num_glyphs); return_trace (c->successful ()); } @@ -110,31 +116,30 @@ struct hdmx { TRACE_SUBSET (this); - hdmx *hdmx_prime = c->serializer->start_embed (); - if (unlikely (!hdmx_prime)) return_trace (false); + auto *hdmx_prime = c->serializer->start_embed (); + unsigned num_input_glyphs = get_num_glyphs (); auto it = + hb_range ((unsigned) numRecords) - | hb_map ([c, this] (unsigned _) + | hb_map ([c, num_input_glyphs, this] (unsigned _) { const DeviceRecord *device_record = &StructAtOffset (&firstDeviceRecord, _ * sizeDeviceRecord); auto row = - + hb_range (c->plan->num_output_glyphs ()) - | hb_map (c->plan->reverse_glyph_map) - | hb_map ([this, c, device_record] (hb_codepoint_t _) + + hb_iter (c->plan->new_to_old_gid_list) + | hb_map ([num_input_glyphs, device_record] (hb_codepoint_pair_t _) { - if (c->plan->is_empty_glyph (_)) - return Null (HBUINT8); - return device_record->widthsZ.as_array (get_num_glyphs ()) [_]; + return device_record->widthsZ.as_array (num_input_glyphs) [_.second]; }) ; return hb_pair ((unsigned) device_record->pixelSize, +row); }) ; - hdmx_prime->serialize (c->serializer, version, it); + hdmx_prime->serialize (c->serializer, version, it, + c->plan->new_to_old_gid_list, + c->plan->num_output_glyphs ()); return_trace (true); } diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh index 835a1a58..89640b43 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-hmtx-table.hh @@ -83,7 +83,7 @@ struct hmtxvmtx bool subset_update_header (hb_subset_context_t *c, unsigned int num_hmetrics, const hb_hashmap_t> *mtx_map, - const hb_map_t *bounds_map) const + const hb_vector_t &bounds_vec) const { hb_blob_t *src_blob = hb_sanitize_context_t ().reference_table (c->plan->source, H::tableTag); hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail (src_blob); @@ -114,6 +114,7 @@ struct hmtxvmtx HB_ADD_MVAR_VAR (HB_OT_METRICS_TAG_VERTICAL_CARET_OFFSET, caretOffset); } + bool empty = true; int min_lsb = 0x7FFF; int min_rsb = 0x7FFF; int max_extent = -0x7FFF; @@ -125,9 +126,10 @@ struct hmtxvmtx int lsb = _.second.second; max_adv = hb_max (max_adv, adv); - if (bounds_map->has (gid)) + if (bounds_vec[gid] != 0xFFFFFFFF) { - unsigned bound_width = bounds_map->get (gid); + empty = false; + unsigned bound_width = bounds_vec[gid]; int rsb = adv - lsb - bound_width; int extent = lsb + bound_width; min_lsb = hb_min (min_lsb, lsb); @@ -137,7 +139,7 @@ struct hmtxvmtx } table->advanceMax = max_adv; - if (!bounds_map->is_empty ()) + if (!empty) { table->minLeadingBearing = min_lsb; table->minTrailingBearing = min_rsb; @@ -156,32 +158,32 @@ struct hmtxvmtx hb_requires (hb_is_iterator (Iterator))> void serialize (hb_serialize_context_t *c, Iterator it, - unsigned num_long_metrics) + const hb_vector_t new_to_old_gid_list, + unsigned num_long_metrics, + unsigned total_num_metrics) { - unsigned idx = 0; - for (auto _ : it) + LongMetric* long_metrics = c->allocate_size (num_long_metrics * LongMetric::static_size); + FWORD* short_metrics = c->allocate_size ((total_num_metrics - num_long_metrics) * FWORD::static_size); + if (!long_metrics || !short_metrics) return; + + short_metrics -= num_long_metrics; + + for (auto _ : new_to_old_gid_list) { - if (idx < num_long_metrics) + hb_codepoint_t gid = _.first; + auto mtx = *it++; + + if (gid < num_long_metrics) { - LongMetric lm; - lm.advance = _.first; - lm.sb = _.second; - if (unlikely (!c->embed (&lm))) return; - } - else if (idx < 0x10000u) - { - FWORD *sb = c->allocate_size (FWORD::static_size); - if (unlikely (!sb)) return; - *sb = _.second; + LongMetric& lm = long_metrics[gid]; + lm.advance = mtx.first; + lm.sb = mtx.second; } + // TODO(beyond-64k): This assumes that maxp.numGlyphs is 0xFFFF. + else if (gid < 0x10000u) + short_metrics[gid] = mtx.second; else - { - // TODO: This does not do tail optimization. - UFWORD *adv = c->allocate_size (UFWORD::static_size); - if (unlikely (!adv)) return; - *adv = _.first; - } - idx++; + ((UFWORD*) short_metrics)[gid] = mtx.first; } } @@ -189,8 +191,7 @@ struct hmtxvmtx { TRACE_SUBSET (this); - T *table_prime = c->serializer->start_embed (); - if (unlikely (!table_prime)) return_trace (false); + auto *table_prime = c->serializer->start_embed (); accelerator_t _mtx (c->plan->source); unsigned num_long_metrics; @@ -199,6 +200,8 @@ struct hmtxvmtx /* Determine num_long_metrics to encode. */ auto& plan = c->plan; + // TODO Don't consider retaingid holes here. + num_long_metrics = hb_min (plan->num_output_glyphs (), 0xFFFFu); unsigned int last_advance = get_new_gid_advance_unscaled (plan, mtx_map, num_long_metrics - 1, _mtx); while (num_long_metrics > 1 && @@ -209,31 +212,36 @@ struct hmtxvmtx } auto it = - + hb_range (c->plan->num_output_glyphs ()) - | hb_map ([c, &_mtx, mtx_map] (unsigned _) + + hb_iter (c->plan->new_to_old_gid_list) + | hb_map ([c, &_mtx, mtx_map] (hb_codepoint_pair_t _) { - if (!mtx_map->has (_)) + hb_codepoint_t new_gid = _.first; + hb_codepoint_t old_gid = _.second; + + hb_pair_t *v = nullptr; + if (!mtx_map->has (new_gid, &v)) { - hb_codepoint_t old_gid; - if (!c->plan->old_gid_for_new_gid (_, &old_gid)) - return hb_pair (0u, 0); int lsb = 0; if (!_mtx.get_leading_bearing_without_var_unscaled (old_gid, &lsb)) (void) _glyf_get_leading_bearing_without_var_unscaled (c->plan->source, old_gid, !T::is_horizontal, &lsb); return hb_pair (_mtx.get_advance_without_var_unscaled (old_gid), +lsb); } - return mtx_map->get (_); + return *v; }) ; - table_prime->serialize (c->serializer, it, num_long_metrics); + table_prime->serialize (c->serializer, + it, + c->plan->new_to_old_gid_list, + num_long_metrics, + c->plan->num_output_glyphs ()); if (unlikely (c->serializer->in_error ())) return_trace (false); // Amend header num hmetrics if (unlikely (!subset_update_header (c, num_long_metrics, mtx_map, - T::is_horizontal ? &c->plan->bounds_width_map : &c->plan->bounds_height_map))) + T::is_horizontal ? c->plan->bounds_width_vec : c->plan->bounds_height_vec))) return_trace (false); return_trace (true); diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh index 8179e5ac..2b7e9e4b 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-base-table.hh @@ -170,8 +170,8 @@ struct FeatMinMaxRecord { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - minCoord.sanitize (c, this) && - maxCoord.sanitize (c, this))); + minCoord.sanitize (c, base) && + maxCoord.sanitize (c, base))); } protected: @@ -187,7 +187,6 @@ struct FeatMinMaxRecord * of MinMax table (may be NULL) */ public: DEFINE_SIZE_STATIC (8); - }; struct MinMax @@ -274,7 +273,7 @@ struct BaseLangSysRecord { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - minMax.sanitize (c, this))); + minMax.sanitize (c, base))); } protected: @@ -297,7 +296,8 @@ struct BaseScript const BaseCoord &get_base_coord (int baseline_tag_index) const { return (this+baseValues).get_base_coord (baseline_tag_index); } - bool has_data () const { return baseValues; } + bool has_values () const { return baseValues; } + bool has_min_max () const { return defaultMinMax; /* TODO What if only per-language is present? */ } bool sanitize (hb_sanitize_context_t *c) const { @@ -383,7 +383,7 @@ struct Axis const BaseCoord **coord) const { const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag); - if (!base_script.has_data ()) + if (!base_script.has_values ()) { *coord = nullptr; return false; @@ -410,7 +410,7 @@ struct Axis const BaseCoord **max_coord) const { const BaseScript &base_script = (this+baseScriptList).get_base_script (script_tag); - if (!base_script.has_data ()) + if (!base_script.has_min_max ()) { *min_coord = *max_coord = nullptr; return false; @@ -425,8 +425,8 @@ struct Axis { TRACE_SANITIZE (this); return_trace (likely (c->check_struct (this) && - (this+baseTagList).sanitize (c) && - (this+baseScriptList).sanitize (c))); + baseTagList.sanitize (c, this) && + baseScriptList.sanitize (c, this))); } protected: @@ -473,14 +473,13 @@ struct BASE return true; } - /* TODO: Expose this separately sometime? */ bool get_min_max (hb_font_t *font, hb_direction_t direction, hb_tag_t script_tag, hb_tag_t language_tag, hb_tag_t feature_tag, hb_position_t *min, - hb_position_t *max) + hb_position_t *max) const { const BaseCoord *min_coord, *max_coord; if (!get_axis (direction).get_min_max (script_tag, language_tag, feature_tag, diff --git a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh index 52b7dc25..2cc50980 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-ot-layout-common.hh @@ -55,19 +55,22 @@ static bool ClassDef_remap_and_serialize ( hb_serialize_context_t *c, const hb_set_t &klasses, bool use_class_zero, - hb_sorted_vector_t> &glyph_and_klass, /* IN/OUT */ + hb_sorted_vector_t &glyph_and_klass, /* IN/OUT */ hb_map_t *klass_map /*IN/OUT*/); struct hb_collect_feature_substitutes_with_var_context_t { const hb_map_t *axes_index_tag_map; - const hb_hashmap_t *axes_location; + const hb_hashmap_t *axes_location; hb_hashmap_t> *record_cond_idx_map; hb_hashmap_t *feature_substitutes_map; + bool& insert_catch_all_feature_variation_record; // not stored in subset_plan hb_set_t *feature_indices; bool apply; + bool variation_applied; + bool universal; unsigned cur_record_idx; hb_hashmap_t, unsigned> *conditionset_map; }; @@ -189,7 +192,7 @@ struct hb_collect_variation_indices_context_t : hb_set_t *layout_variation_indices; hb_hashmap_t> *varidx_delta_map; - hb_font_t *font; + hb_vector_t *normalized_coords; const VariationStore *var_store; const hb_set_t *glyph_set; const hb_map_t *gpos_lookups; @@ -197,14 +200,14 @@ struct hb_collect_variation_indices_context_t : hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_, hb_hashmap_t> *varidx_delta_map_, - hb_font_t *font_, + hb_vector_t *normalized_coords_, const VariationStore *var_store_, const hb_set_t *glyph_set_, const hb_map_t *gpos_lookups_, float *store_cache_) : layout_variation_indices (layout_variation_indices_), varidx_delta_map (varidx_delta_map_), - font (font_), + normalized_coords (normalized_coords_), var_store (var_store_), glyph_set (glyph_set_), gpos_lookups (gpos_lookups_), @@ -807,7 +810,7 @@ struct Feature { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (*this); - if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); out->featureParams.serialize_subset (c, featureParams, this, tag); @@ -981,7 +984,7 @@ struct RecordListOfFeature : RecordListOf { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (*this); - if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + hb_enumerate (*this) | hb_filter (l->feature_index_map, hb_first) @@ -1078,7 +1081,7 @@ struct LangSys { TRACE_SUBSET (this); auto *out = c->serializer->start_embed (*this); - if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); const uint32_t *v; out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex, &v) ? *v : 0xFFFFu; @@ -1188,7 +1191,7 @@ struct Script return false; auto *out = c->serializer->start_embed (*this); - if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); bool defaultLang = false; if (has_default_lang_sys ()) @@ -1247,7 +1250,7 @@ struct RecordListOfScript : RecordListOf

Mo(e)8I{SdOweUF${G+}{c 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�od?R60p_ zQK0Df>N~+RyR`KmFidjBlDfkdUK(M9aa!-q%H93o&ms4?k|;RUiC+(4+uHxV3pf6K zl3j2YU7O^HM9Ti;FR|}m($?AdwWfRLQm+ST1xGw%4qdJ{T6t zt?i;#HpK-}0;$jDpsdZN>CWY??F)P3{h2c=V42L6{@4q9pLk*Sj!y7JuRQm**WKmD z&ODoYxvl`=dv--IgK5k_T582o3⁢zEc#Wh!V^^%CaQDFRh0P(p{B&fZtO7+m;|J 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 diff --git a/examples/widgets/doc/images/itemviewspuzzle-example.png b/examples/widgets/doc/images/itemviewspuzzle-example.png deleted file mode 100644 index aae6a953cab03047022de3e828373646a91eec4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196251 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

-Xc5iDBr`Fu)=kl@3s?AJT`ZJ-Bc+2TR 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%0AcdKnKDKY3 z3h}MqwF5n3KJVSdG`$746K6?W;-U_e*yrELep;Mo8e6t$5wI_Wm&FSdoi_hj4p3ZC zov=0YUw=EbCw>>1C}tjX!Q^_RWJdD|)p6*UHBi;o_Xep#9szd2eY{X8-m!hn#O-&& zb5UCAJ$_x^C>8QkrNFmH$L;CANWs3!qm4J&qH0Q|ef`X>(2}KwkI_G&0|gyp5K_DC zIcA?Ik~8Ffg2amshm1-*v?75E^6N#KN+3R>PzBWXvQB6CT#3xEak@Pr$S!!w5kQ@+ z*FP{R={(o@pdT(Ho-VE#`gCNBo6de2%P6nQgPL{3wG+QHT=(plt=!n(*aDjn5}@CK zkS=Ox^>qNQklKjFunR^rufWTgw%P!8oVKgcru+5B-=)i#5lf8s9RLve8p|`d=jCU< zv&f3+#YnSS-$2ONu>7tUEXN2*JLhWgAU^B=%N6(S4!nT9V=6!=Z3U$3D8KAxd4za5 zLP5gl;-PMeGX?U?mM0K{gJ4F&#Z!@-ZQIpkI?o>bx=C@(#*@qKZYJ1ud6?bZzf!mE#Q}jF7SiPpRq#@F5~+sF!0S@ zs4LhKZDyty>fKX@|4>nA7C^@&*)_rwS8HYRrI3&FnW%p1v?Gk z?cTU3Eal#8QV&J@LMr2ptA7@f2AIsr7%W{*PDA;$At|Ch)~F)>3$c*>2|^db|b*RPU_co7plhuySvB!w~a2!s@oz56u3KK3OHu!8Ym-Lw5fS z%0tSK^$@DJzTw#XtGO@{Vh+?U7nm5b(d1o(St$J!F^^R7*Yk*{#WmIc>5y3*n{Nem zM7J@LXiRI>%5yV=G|_Z_fOo;c-5}nZrd7V-*c#FkhamdEaO9htv>2LRv9=p0c-DXA za{6z9pn7srOexlr)et%$hC7DmxM)fzPwl8eO^A0UE(ro2wazL@mRfU9_slni-YE8j>QBg3Q8Ayv-GDoxJs0Xa}Xn=yqNR!2kU zGI=)awWc1zI_25KqVSZqnIt+Qlt8Q1C9|gP4xqX{tG9UkDOrTDz1fMcPm5>UTi7jr_0tFF5`t54eT;h zawAh3cvLv^Pu+>OE28-k_*ye{tGv8v04PS`3v*O2arXVr z*g99)+Ml6O&?k4%k107>(fp^Xsz?37_*~!$M~SBWrMQ*_=``0~>_NRM4WEE}+dTWz??;uEYLmRY`ONz(lH|Eze*z_ztx7BU;c;sI-DAeuy)*EyuFa;reA^jkxnt zGBuw~(F|V{7cVIayLB8{07%Fx^f>z?Zph82JO9hh1l1$fCsr4kiGdU`?xS<9=`&SO zJe6g*I>^Lxh$rv~v|C}FYd~YN{5?o)WQ%C2uPX9vom_j8a^jD!V$OpQ3(3wFem|Rc z)ny8s*b!rG^?x*PJ?1~v3z&&x@}s*gmYj52a|5KnKrSC$IsAVjeE{F{bL7RgwKjr0 zK#*VOG?#*3mu(3gh_e1?Oez6nQp^-_Ek832BZdn0-FB~=e9-FY1OLZO=LkLyu~Eg0$-?IyHp%@7U+yd*gsdD8{COjyR==E@e8cZ(~Og^$QF?Kb=; z-4$MA=K;3!wBtEn{N&8Z&g~2b*HmoMG99`g;s|+wna%6KGBLb`HUxvIXe0u@{}Fh; zT7=lef2k5QHiEfDvW8U$iSdqLzs&e+O5I!3ic0T3Rir6LNfa<1OaZDlP|^OkSta!t zR*Lz#D>fGd{<;76f3yyVEIJNGv7Z_+B5cNe96D^RI%*Y#U;+AFED&7Wc0@g5ul#R? zw%5G#^0tbSs7yF~$0kTw)u5HQ38BJgk&ls!?qn%;gW{e0K&EjxeFE#kcbuP0!UzFX zbNzGc2oI6ruNjy!5EjrOAuM2I&zmi4Y^29)VJDG|&)VXk_b@U=3+wt5wMud-t}1(aH)!6o$1$a-oRvHnC=D9<5LWd>|HvJ zri7wx2_*4%a4kv1S4y3Hoh{+JAa(#c|0n*P>v++PjN%8?D-4WW&AFeIM%kG_38?w` zzl`-J3_HKxMIONE5Qh$0)07nl+s%8<9@P{nLj_@O#h<5Vwm#G znx$^6zByc(Dagm9#ggfn*~PXM&nxk`xH@RLBcOjzx0PMw<)d8ETtZHP>1yB?v$_bi}e( z5Z0iQ7H8b5|AOyXDMt2YH{AIwAAzX&!9WJGc!9(JH|GWqW(WrTSHR%s{{r~@mwzjj|6lp{p;O-YSplwG zQ^Cn4NF@)_Q<{1qCmRX|-g)aAuo5Mx=*-t^qB0F|v8RyZ8bF;!{3; z9OVCH;DSE)n+E~Y`ZPMJ5FfWn+(v81Sgl*n6%|PW=s2JZFbVhLOtt%syAX0*uz+_u zfIgZ21mqY`s?>exaQ^^U2sLmfX%8zi0Xla6%1AUHX^e32do3(?uz*S+YafI;3W z1|{{g`IRTDP%I9EVMql3m+qWu^imuHyYr^r=88B15Jg9R^*Slkj9@IZBMu|uG9ZC7Br4B zm?Nx1MH;J)Q+agzF`q_T@M5JY*$^h&P543j) zD~Hu-RD<9-m*BDciqp|*Z2A-zqW%8-Ja85tlN7y==bR8S>|Yf~fc2&C`qt^a&CQ_; zXdSs{Z-wOZk!)_(i1Uj`Iy@c@dMd0A)Nw_lyF6jZutLGbgYiiErKM1~ngJsC9q!;_ ziRVNDXJ@}=`VZ@wC|qVZW_0j~rM=ph2iYct!r^Ruj=8&09Mr1tQ`l#>nxvIT-&lpdH#<} zyEh1T{kH&S3~+8s+}4_Q)P8IKV~3V20wM~NW>4FiG5bbmtZ968dD8DQJZWjW440L$ zGadMs>9b|++4?^n0zqa#YbH$Fnmgmh&eK~YtO~CR7~HUXFssDC&YcHyE_#$iFH zRV?973I|Kd7OyXtE?fHh;(ewqU)~>6*>z#vI++XRU6Lh>ii+I z(eC9-<*nQ16j=ZIb!Oczu`llf4zvDxC)4%q@+L8f9QUjX1=kEsI`4i{>EhgyyYR0w zI0_U?9<5rKo3X!G=I^s^E8V}l4KK?-*aA!pd(}Z5nDP_(=XdTo^tbwRe#iW`#>O|^ z*;>@8vjImt_na|u^4JNSBIaDWw4S|fS=H&yLQYF1J;?lqKXaDw}4YSg0nbNYrs5ZbRx_8M0A!lwZ>X9nF5Y}@|*$Q!gXER^*V^VB6 z(#CYf;m^OX%fqaJ>y3n@xdNIMQV*QA2jipcySq5 zkQ&to65y=xK&YhEvWvV+B8`JR5Z0-kPQT_ zEhz$;mJ|+J;KC(f#o4F?Y8=cdPz5bQ3016-G6VZS@?rN1;E3NUrg#_NnkraH)|79r zP<9j)D=aY(ZzPC=3_>gKutgtAbVN6#mOOGXSfIsCnFUG z$u&BS&;SJ`ID|cQOuHU}i&m{>_ZA4FUC9ZWPQVr&k_Z#P?FyC07Q29J#7@oS1N!-M zPXObr%dF?Dw=>)CuU|CjB`|O=Ddbo@mpSw5;q%E3A090}FT-k9_Fwm2-AUD@-n}J% zIj!eTpYNq~>WyZ~!HD(R^VwI*ObZM@RetKdnHA^3^v6qgi_AOJbV^@Gv1KxwV$AX0 z`GR z$ATYuC)w(5wkmkyx}S+NvFD%4bX|sb`(DqEsK1z6QFpDd;K_<36Bh>x9#LL#?z7xv z#pg?2r+jr?afc~o;%cX(xCx>~ng4h_D7&5u~UTsqlG~#kw78&^J9V4gM2ZPmD@*A&pd}t5wNM08evgpseXp3S<4^llOy!81H-3FukA8V>v(jlCPcXLbbf` zrE01nMhflu_e;g?%75pc@Mv_G`!hA2tG^v+kFP9f(VtPs!;L@w|6;fQ-fLnFJP(S2 N!PC{xWt~$(696!B?MeUu diff --git a/examples/widgets/doc/images/imageviewer-fit_to_window_1.png b/examples/widgets/doc/images/imageviewer-fit_to_window_1.png deleted file mode 100644 index 0fe1ba1c62f2de2c29c2c1d55452a9e02e30bb7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84584 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
>YqBZg6KP6%8Ra;S%kwBao_K4_i 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 z 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�$g!r8Q-YxS1;C+3T$YK#j|%ULX!b<-_dUs=U9 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 diff --git a/examples/widgets/doc/images/imageviewer-original_size.png b/examples/widgets/doc/images/imageviewer-original_size.png deleted file mode 100644 index c0443eba25c250383d041fa7f3355293ac12754e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61567 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%0Di|z6a8I1I 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 diff --git a/examples/widgets/doc/images/fademessageeffect-example-faded.png b/examples/widgets/doc/images/fademessageeffect-example-faded.png deleted file mode 100644 index ea66d2c7f00fa5bcd52e2ec033c06ff44a530870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81894 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