diff --git a/.clang-format b/.clang-format index 0edf4cae..33679382 100644 --- a/.clang-format +++ b/.clang-format @@ -163,7 +163,7 @@ IndentAccessModifiers: true IndentCaseBlocks: false IndentCaseLabels: true IndentExportBlock: true -IndentExternBlock: AfterExternBlock +IndentExternBlock: NoIndent IndentGotoLabels: true IndentPPDirectives: None IndentRequiresClause: true diff --git a/.gitignore b/.gitignore index f9c4d00c..c63bb139 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,7 @@ **/ui/build **/ui/.dart_tool **/.flutter-plugins -**/.flutter-plugins-dependencies \ No newline at end of file +**/.flutter-plugins-dependencies + +# macos files +**/.DS_Store \ No newline at end of file diff --git a/LICENSE b/LICENSE.md similarity index 82% rename from LICENSE rename to LICENSE.md index cb08057b..57b50e0f 100644 --- a/LICENSE +++ b/LICENSE.md @@ -6,4 +6,12 @@ Unauthorized copying, modification, distribution, or use of the Software is stri 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. -For licensing information, please contact: [YOUR CONTACT EMAIL OR ADDRESS] \ No newline at end of file +For licensing information, please contact: [YOUR CONTACT EMAIL OR ADDRESS] + +
+ +| Previous | Next | +|:------------------|----------------------------------:| +| [API Reference](docs/api_overview.md) | | + +
\ No newline at end of file diff --git a/MODULE.bazel b/MODULE.bazel index db9aaee4..8ff586ac 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,7 +10,7 @@ module( # Import external dependencies bazel_dep(name = "rules_cc", version = "0.1.0") bazel_dep(name = "rules_foreign_cc", version = "0.11.1") -bazel_dep(name = "rules_python", version = "0.37.2") +bazel_dep(name = "rules_python", version = "0.40.0") bazel_dep(name = "platforms", version = "0.0.10") bazel_dep(name = "googletest", version = "1.15.2") bazel_dep(name = "apple_support", version = "1.17.1", repo_name = "build_bazel_apple_support") @@ -18,6 +18,7 @@ bazel_dep(name = "curl", version = "8.8.0") bazel_dep(name = "nlohmann_json", version = "3.11.3") bazel_dep(name = "hedron_compile_commands", dev_dependency = True) bazel_dep(name = "flatbuffers", version = "24.3.25") +bazel_dep(name = "opentelemetry-cpp", version = "1.19.0") # Hedron's Compile Commands Extractor for Bazel git_override( diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index f210eeb0..fe44bb0a 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -8,6 +8,9 @@ "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.0/MODULE.bazel": "98dc378d64c12a4e4741ad3362f87fb737ee6a0886b2d90c3cdbb4d93ea3e0bf", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16", "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/source.json": "750d5e29326fb59cbe61116a7b803c8a1d0a7090a9c8ed89888d188e3c473fc7", "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85", @@ -28,11 +31,17 @@ "https://bcr.bazel.build/modules/aspect_rules_ts/1.4.5/MODULE.bazel": "9e6520f1aa823e7f707968124e1bbe87598ec5495df3162d0749fa19a29973bb", "https://bcr.bazel.build/modules/aspect_rules_ts/1.4.5/source.json": "40b03d827dd656b775318fe205a54481219d4729a67bf8293e6706a8a41ab2cd", "https://bcr.bazel.build/modules/bazel_features/0.1.0/MODULE.bazel": "47011d645b0f949f42ee67f2e8775188a9cf4a0a1528aa2fa4952f2fd00906fd", + "https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b", "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", "https://bcr.bazel.build/modules/bazel_features/1.19.0/source.json": "d7bf14517c1b25b9d9c580b0f8795fceeae08a7590f507b76aace528e941375d", + "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", @@ -43,35 +52,72 @@ "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", "https://bcr.bazel.build/modules/boringssl/0.0.0-20211025-d4f1ab9/MODULE.bazel": "6ee6353f8b1a701fe2178e1d925034294971350b6d3ac37e67e5a7d463267834", - "https://bcr.bazel.build/modules/boringssl/0.0.0-20211025-d4f1ab9/source.json": "323bafff99739f6aba35b69a84f0bc04ddb4540a46c1694355f60f073dff3001", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20230215-5c22014/MODULE.bazel": "4b03dc0d04375fa0271174badcd202ed249870c8e895b26664fd7298abea7282", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20240530-2db0eb3/MODULE.bazel": "d0405b762c5e87cd445b7015f2b8da5400ef9a8dbca0bfefa6c1cea79d528a97", + "https://bcr.bazel.build/modules/boringssl/0.0.0-20240530-2db0eb3/source.json": "0d413869349e82e5d679802abe9ce23e0326bbf56daa97ae9e7dbdcec72982fc", "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", "https://bcr.bazel.build/modules/c-ares/1.15.0/MODULE.bazel": "ba0a78360fdc83f02f437a9e7df0532ad1fbaa59b722f6e715c11effebaa0166", "https://bcr.bazel.build/modules/c-ares/1.15.0/source.json": "5e3ed991616c5ec4cc09b0893b29a19232de4a1830eb78c567121bfea87453f7", + "https://bcr.bazel.build/modules/civetweb/1.16/MODULE.bazel": "46a38f9daeb57392e3827fce7d40926be0c802bd23cdd6bfd3a96c804de42fae", + "https://bcr.bazel.build/modules/civetweb/1.16/source.json": "ba8b9585adb8355cb51b999d57172fd05e7a762c56b8d4bac6db42c99de3beb7", + "https://bcr.bazel.build/modules/curl/8.4.0/MODULE.bazel": "0bc250aa1cb69590049383df7a9537c809591fcf876c620f5f097c58fdc9bc10", + "https://bcr.bazel.build/modules/curl/8.7.1/MODULE.bazel": "088221c35a2939c555e6e47cb31a81c15f8b59f4daa8009b1e9271a502d33485", "https://bcr.bazel.build/modules/curl/8.8.0/MODULE.bazel": "7da3b3e79b0b4ee8f8c95d640bc6ad7b430ce66ef6e9c9d2bc29b3b5ef85f6fe", "https://bcr.bazel.build/modules/curl/8.8.0/source.json": "d7d138b6878cf38891692fee0649ace35357fd549b425614d571786f054374d4", "https://bcr.bazel.build/modules/flatbuffers/24.3.25/MODULE.bazel": "2794b084ee385ecd08a22fd90614b93851508ceb7a97e63da399886dedbc696c", "https://bcr.bazel.build/modules/flatbuffers/24.3.25/source.json": "0cea4d62612a34154ffe0208a85f9f197edbb1f8f37a8855ec4aa722fea69276", "https://bcr.bazel.build/modules/gazelle/0.26.0/MODULE.bazel": "6bf5f61b15648e7e35db25fb23cef6b4164fc71c3064ac42ecacafcb6d02abe6", + "https://bcr.bazel.build/modules/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996", + "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b", "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", - "https://bcr.bazel.build/modules/gazelle/0.32.0/source.json": "ef7e2d5194a004d902f5a745eb8f466c90b63a539e9d59311197b87e4d1caee7", + "https://bcr.bazel.build/modules/gazelle/0.33.0/MODULE.bazel": "a13a0f279b462b784fb8dd52a4074526c4a2afe70e114c7d09066097a46b3350", + "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a", + "https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0", + "https://bcr.bazel.build/modules/gazelle/0.36.0/source.json": "0823f097b127e0201ae55d85647c94095edfe27db0431a7ae880dcab08dfaa04", "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/google_benchmark/1.8.4/MODULE.bazel": "c6d54a11dcf64ee63545f42561eda3fd94c1b5f5ebe1357011de63ae33739d5e", + "https://bcr.bazel.build/modules/google_benchmark/1.8.4/source.json": "84590f7bc5a1fd99e1ef274ee16bb41c214f705e62847b42e705010dfa81fe53", + "https://bcr.bazel.build/modules/googleapis/0.0.0-20240326-1c8d509c5/MODULE.bazel": "a4b7e46393c1cdcc5a00e6f85524467c48c565256b22b5fae20f84ab4a999a68", + "https://bcr.bazel.build/modules/googleapis/0.0.0-20240819-fe8ba054a/MODULE.bazel": "117b7c7be7327ed5d6c482274533f2dbd78631313f607094d4625c28203cacdf", + "https://bcr.bazel.build/modules/googleapis/0.0.0-20240819-fe8ba054a/source.json": "b31fc7eb283a83f71d2e5bfc3d1c562d2994198fa1278409fbe8caec3afc1d3e", "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108", "https://bcr.bazel.build/modules/googletest/1.15.2/source.json": "dbdda654dcb3a0d7a8bc5d0ac5fc7e150b58c2a986025ae5bc634bb2cb61f470", + "https://bcr.bazel.build/modules/grpc-java/1.62.2/MODULE.bazel": "99b8771e8c7cacb130170fed2a10c9e8fed26334a93e73b42d2953250885a158", + "https://bcr.bazel.build/modules/grpc-java/1.66.0/MODULE.bazel": "86ff26209fac846adb89db11f3714b3dc0090fb2fb81575673cc74880cda4e7e", + "https://bcr.bazel.build/modules/grpc-java/1.66.0/source.json": "f841b339ff8516c86c3a5272cd053194dd0cb2fdd63157123835e1157a28328d", + "https://bcr.bazel.build/modules/grpc-proto/0.0.0-20240627-ec30f58/MODULE.bazel": "88de79051e668a04726e9ea94a481ec6f1692086735fd6f488ab908b3b909238", + "https://bcr.bazel.build/modules/grpc-proto/0.0.0-20240627-ec30f58/source.json": "5035d379c61042930244ab59e750106d893ec440add92ec0df6a0098ca7f131d", "https://bcr.bazel.build/modules/grpc/1.41.0/MODULE.bazel": "5bcbfc2b274dabea628f0649dc50c90cf36543b1cfc31624832538644ad1aae8", "https://bcr.bazel.build/modules/grpc/1.48.1/MODULE.bazel": "3ca31ff176210449f280cb7765b59f3c6497abe10fa6f888de7b7bf00de53176", - "https://bcr.bazel.build/modules/grpc/1.48.1/source.json": "fb95df9c53c0a004f6681fa0e4a87d7b8c85c2182a73ada28c06339dbee78e42", + "https://bcr.bazel.build/modules/grpc/1.56.3.bcr.1/MODULE.bazel": "cd5b1eb276b806ec5ab85032921f24acc51735a69ace781be586880af20ab33f", + "https://bcr.bazel.build/modules/grpc/1.63.1.bcr.1/MODULE.bazel": "d7b9fef03bd175e6825237b521b18a3c29f1ac15f8aa52c8a1a0f3bd8f33d54b", + "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.2/MODULE.bazel": "0fa2b0fd028ce354febf0fe90f1ed8fecfbfc33118cddd95ac0418cc283333a0", + "https://bcr.bazel.build/modules/grpc/1.66.0.bcr.2/source.json": "d2b273a925507d47b5e2d6852f194e70d2991627d71b13793cc2498400d4f99e", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/libpfm/4.11.0/source.json": "caaffb3ac2b59b8aac456917a4ecf3167d40478ee79f15ab7a877ec9273937c9", "https://bcr.bazel.build/modules/mbedtls/3.6.0/MODULE.bazel": "8e380e4698107c5f8766264d4df92e36766248447858db28187151d884995a09", "https://bcr.bazel.build/modules/mbedtls/3.6.0/source.json": "1dbe7eb5258050afcc3806b9d43050f71c6f539ce0175535c670df606790b30c", "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/MODULE.bazel": "87023db2f55fc3a9949c7b08dc711fae4d4be339a80a99d04453c4bb3998eefc", "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/source.json": "296c63a90c6813e53b3812d24245711981fc7e563d98fe15625f55181494488a", + "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.14.2/MODULE.bazel": "089a5613c2a159c7dfde098dabfc61e966889c7d6a81a98422a84c51535ed17d", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.19.0/MODULE.bazel": "3455326c08b28415648a3d60d8e3c811847ebdbe64474f75b25878f25585aea1", + "https://bcr.bazel.build/modules/opentelemetry-cpp/1.19.0/source.json": "4e48137e4c3ecb99401ff99876df8fa330598d7da051869bec643446e8a8ff95", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.1.0/MODULE.bazel": "a49f406e99bf05ab43ed4f5b3322fbd33adfd484b6546948929d1316299b68bf", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.5.0/MODULE.bazel": "7543d91a53b98e7b5b37c5a0865b93bff12c1ee022b1e322cd236b968894b030", + "https://bcr.bazel.build/modules/opentelemetry-proto/1.5.0/source.json": "046b721ce203e88cdaad44d7dd17a86b7200eab9388b663b234e72e13ff7b143", + "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/MODULE.bazel": "b3925269f63561b8b880ae7cf62ccf81f6ece55b62cd791eda9925147ae116ec", + "https://bcr.bazel.build/modules/opentracing-cpp/1.6.0/source.json": "da1cb1add160f5e5074b7272e9db6fd8f1b3336c15032cd0a653af9d2f484aed", "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", "https://bcr.bazel.build/modules/platforms/0.0.10/source.json": "f22828ff4cf021a6b577f1bf6341cb9dcd7965092a439f64fc1bb3b7a5ae4bd5", "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", @@ -80,10 +126,19 @@ "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/prometheus-cpp/1.2.4/MODULE.bazel": "0fbe5dcff66311947a3f6b86ebc6a6d9328e31a28413ca864debc4a043f371e5", + "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/MODULE.bazel": "ce82e086bbc0b60267e970f6a54b2ca6d0f22d3eb6633e00e2cc2899c700f3d8", + "https://bcr.bazel.build/modules/prometheus-cpp/1.3.0/source.json": "8cb66b4e535afc718e9d104a3db96ccb71a42ee816a100e50fd0d5ac843c0606", "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a", - "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12", - "https://bcr.bazel.build/modules/protobuf/24.4/source.json": "ace4b8c65d4cfe64efe544f09fc5e5df77faf3a67fbb29c5341e0d755d9b15d6", + "https://bcr.bazel.build/modules/protobuf/26.0.bcr.1/MODULE.bazel": "8f04d38c2da40a3715ff6bdce4d32c5981e6432557571482d43a62c31a24c2cf", + "https://bcr.bazel.build/modules/protobuf/26.0.bcr.2/MODULE.bazel": "62e0b84ca727bdeb55a6fe1ef180e6b191bbe548a58305ea1426c158067be534", + "https://bcr.bazel.build/modules/protobuf/26.0/MODULE.bazel": "8402da964092af40097f4a205eec2a33fd4a7748dc43632b7d1629bfd9a2b856", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", @@ -94,73 +149,121 @@ "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa", "https://bcr.bazel.build/modules/re2/2024-07-02/source.json": "547d0111a9d4f362db32196fef805abbf3676e8d6afbe44d395d87816c1130ca", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_apple/3.5.1/MODULE.bazel": "3d1bbf65ad3692003d36d8a29eff54d4e5c1c5f4bfb60f79e28646a924d9101c", + "https://bcr.bazel.build/modules/rules_apple/3.5.1/source.json": "e7593cdf26437d35dbda64faeaf5b82cbdd9df72674b0f041fdde75c1d20dda7", "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.5/MODULE.bazel": "be41f87587998fe8890cd82ea4e848ed8eb799e053c224f78f3ff7fe1a1d9b74", "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", "https://bcr.bazel.build/modules/rules_cc/0.1.0/MODULE.bazel": "2fef03775b9ba995ec543868840041cc69e8bc705eb0cb6604a36eee18c87d8b", "https://bcr.bazel.build/modules/rules_cc/0.1.0/source.json": "8a4e832d75e073ab56c74dd77008cf7a81e107dec4544019eb1eefc1320d55be", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", "https://bcr.bazel.build/modules/rules_go/0.33.0/MODULE.bazel": "a2b11b64cd24bf94f57454f53288a5dacfe6cb86453eee7761b7637728c1910c", "https://bcr.bazel.build/modules/rules_go/0.34.0/MODULE.bazel": "20240361d6ff5cb752121af8c64aa41adc5a72ade59c90040606070e1690be09", + "https://bcr.bazel.build/modules/rules_go/0.38.1/MODULE.bazel": "fb8e73dd3b6fc4ff9d260ceacd830114891d49904f5bda1c16bc147bcc254f71", + "https://bcr.bazel.build/modules/rules_go/0.39.1/MODULE.bazel": "d34fb2a249403a5f4339c754f1e63dc9e5ad70b47c5e97faee1441fc6636cd61", "https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8", - "https://bcr.bazel.build/modules/rules_go/0.41.0/source.json": "a46e5f523176e3bd60b1c9cfdcb6c878b9cd14c21fe1a563c4ba0e6d0e7c4dd8", + "https://bcr.bazel.build/modules/rules_go/0.42.0/MODULE.bazel": "8cfa875b9aa8c6fce2b2e5925e73c1388173ea3c32a0db4d2b4804b453c14270", + "https://bcr.bazel.build/modules/rules_go/0.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd", + "https://bcr.bazel.build/modules/rules_go/0.48.0/MODULE.bazel": "d00ebcae0908ee3f5e6d53f68677a303d6d59a77beef879598700049c3980a03", + "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0", + "https://bcr.bazel.build/modules/rules_go/0.50.1/source.json": "205765fd30216c70321f84c9a967267684bdc74350af3f3c46c857d9f80a4fa2", "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", "https://bcr.bazel.build/modules/rules_java/5.1.0/MODULE.bazel": "324b6478b0343a3ce7a9add8586ad75d24076d6d43d2f622990b9c1cfd8a1b15", "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963", - "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.12.2/source.json": "b0890f9cda8ff1b8e691a3ac6037b5c14b7fd4134765a3946b89f31ea02e5884", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.4.0/MODULE.bazel": "a592852f8a3dd539e82ee6542013bf2cadfc4c6946be8941e189d224500a8934", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", - "https://bcr.bazel.build/modules/rules_java/7.6.5/source.json": "a805b889531d1690e3c72a7a7e47a870d00323186a9904b36af83aa3d053ee8d", "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/source.json": "10572111995bc349ce31c78f74b3c147f6b3233975c7fa5eff9211f6db0d34d9", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.0/MODULE.bazel": "37c93a5a78d32e895d52f86a8d0416176e915daabd029ccb5594db422e87c495", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/0.0.7/source.json": "355cc5737a0f294e560d52b1b7a6492d4fff2caf0bef1a315df5a298fca2d34a", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/MODULE.bazel": "6bc03c8f37f69401b888023bf511cb6ee4781433b0cb56236b2e55a21e3a026a", "https://bcr.bazel.build/modules/rules_nodejs/5.8.3/MODULE.bazel": "9fac1897d2067a37693e47f48e11cdb386a455902313c85e9e46fe0aaaa2e4e1", "https://bcr.bazel.build/modules/rules_nodejs/5.8.3/source.json": "adc580471187345e43dd874d951a84d2256455fbeaedca539174f1e4ab49f9a4", "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/source.json": "c2557066e0c0342223ba592510ad3d812d4963b9024831f7f66fd0584dd8c66c", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483", - "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/source.json": "8d8448e71706df7450ced227ca6b3812407ff5e2ccad74a43a9fbe79c84e34e0", + "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.29.0/MODULE.bazel": "2ac8cd70524b4b9ec49a0b8284c79e4cd86199296f82f6e0d5da3f783d660c82", "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937", - "https://bcr.bazel.build/modules/rules_python/0.37.2/MODULE.bazel": "b5ffde91410745750b6c13be1c5dc4555ef5bc50562af4a89fd77807fdde626a", - "https://bcr.bazel.build/modules/rules_python/0.37.2/source.json": "af5c224d27ec98a612b4dcbdc481e02502cd5a4b49d87f0093200a10a35383e9", "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95", + "https://bcr.bazel.build/modules/rules_swift/1.18.0/MODULE.bazel": "a6aba73625d0dc64c7b4a1e831549b6e375fbddb9d2dde9d80c9de6ec45b24c9", + "https://bcr.bazel.build/modules/rules_swift/1.18.0/source.json": "9e636cabd446f43444ea2662341a9cbb74ecd87ab0557225ae73f1127cb7ff52", "https://bcr.bazel.build/modules/rules_swift/1.2.0/MODULE.bazel": "9559e7b880723a274845b92bc760bb2d4c9f9f562388155e357f05932b941789", - "https://bcr.bazel.build/modules/rules_swift/1.2.0/source.json": "c9344551abbd8544e128be8130277da6cd2f54a7a40182700b15c1fb8adb9f81", "https://bcr.bazel.build/modules/stardoc/0.5.0/MODULE.bazel": "f9f1f46ba8d9c3362648eea571c6f9100680efc44913618811b58cc9c02cd678", "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", "https://bcr.bazel.build/modules/stardoc/0.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4", - "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd", - "https://bcr.bazel.build/modules/stardoc/0.6.2/source.json": "d2ff8063b63b4a85e65fe595c4290f99717434fa9f95b4748a79a7d04dfed349", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", "https://bcr.bazel.build/modules/upb/0.0.0-20211020-160625a/MODULE.bazel": "6cced416be2dc5b9c05efd5b997049ba795e5e4e6fafbe1624f4587767638928", "https://bcr.bazel.build/modules/upb/0.0.0-20220602-e5f2601/MODULE.bazel": "84a1b5fc76719c2841759d150637cca2fdc19abccc680d6d02614def044379de", "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9", - "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/source.json": "b2150404947339e8b947c6b16baa39fa75657f4ddec5e37272c7b11c7ab533bc", + "https://bcr.bazel.build/modules/upb/0.0.0-20230907-e7430e6/MODULE.bazel": "3a7dedadf70346e678dc059dbe44d05cbf3ab17f1ce43a1c7a42edc7cbf93fd9", "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.2.13/MODULE.bazel": "aa6deb1b83c18ffecd940c4119aff9567cd0a671d7bba756741cb2ef043a29d5", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.1/MODULE.bazel": "6a9fe6e3fc865715a7be9823ce694ceb01e364c35f7a846bf0d2b34762bc066b", "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d" + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198", + "https://bcr.bazel.build/modules/zlib/1.3/MODULE.bazel": "6a9c02f19a24dcedb05572b2381446e27c272cd383aed11d41d99da9e3167a72" }, "selectedYankedVersions": {}, "moduleExtensions": { "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { "general": { "bzlTransitiveDigest": "7ii+gFxWSxHhQPrBxfMEHhtrGvHmBTvsh+KOyGunP/s=", - "usagesDigest": "R8xslr59tZnVLqBbEpbunVi3NfM8lkJZstFJkVyW4qk=", + "usagesDigest": "uBH3M1O9OWATP04UnJEyViDgJn/DL5ytqfStUlKN20o=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -12103,68 +12206,6 @@ ] } }, - "@@rules_go~//go:extensions.bzl%go_sdk": { - "general": { - "bzlTransitiveDigest": "6OpUR/yglzmu6OR0l9BvoXNEmRETCk2i9/mg6yhIbMA=", - "usagesDigest": "d+jWsKUXmjXLstb8Ps8lKcqQSS92aURSbdbgcoFp7Ao=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "go_default_sdk": { - "bzlFile": "@@rules_go~//go/private:sdk.bzl", - "ruleClassName": "go_download_sdk_rule", - "attributes": { - "goos": "", - "goarch": "", - "sdks": {}, - "urls": [ - "https://dl.google.com/go/{}" - ], - "version": "1.20.2" - } - }, - "go_host_compatible_sdk_label": { - "bzlFile": "@@rules_go~//go/private:extensions.bzl", - "ruleClassName": "host_compatible_toolchain", - "attributes": { - "toolchain": "@go_default_sdk//:ROOT" - } - }, - "go_toolchains": { - "bzlFile": "@@rules_go~//go/private:sdk.bzl", - "ruleClassName": "go_multiple_toolchains", - "attributes": { - "prefixes": [ - "_0000_go_default_sdk_" - ], - "geese": [ - "" - ], - "goarchs": [ - "" - ], - "sdk_repos": [ - "go_default_sdk" - ], - "sdk_types": [ - "remote" - ], - "sdk_versions": [ - "1.20.2" - ] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_go~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, "@@rules_jvm_external~//:extensions.bzl%maven": { "general": { "bzlTransitiveDigest": "ZZwUwwzxkACVpF3u5nup1ClQKp1WEF5TLy//fGjPiKU=", @@ -13372,6 +13413,75 @@ ] } }, + "@@rules_kotlin~//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "fus14IFJ/1LGWWGKPH/U18VnJCoMjfDt1ckahqCnM0A=", + "usagesDigest": "aJF6fLy82rR95Ff5CZPAqxNoFgOMLMN5ImfBS0nhnkg=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", + "ruleClassName": "kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", + "ruleClassName": "kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:ksp.bzl", + "ruleClassName": "ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_kotlin~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, "@@rules_nodejs~//nodejs:extensions.bzl%node": { "general": { "bzlTransitiveDigest": "KOk+Te5m8n3d0B9F5+lgyrzLbtEzqeqWset0MugBbOY=", diff --git a/README.md b/README.md index 868dd0fc..77ec7d4f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,16 @@ -# CoreVX Project +# What is CoreVX ? +![](https://img.shields.io/badge/OpenVX-1.3.1-blue) +![Linux](https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black) +![macOS](https://img.shields.io/badge/macOS-000000?logo=apple&logoColor=F0F0F0) +![Windows](https://custom-icon-badges.demolab.com/badge/Windows-0078D6?logo=windows11&logoColor=white) +[TOC] This project is an implementation of the OpenVX specification version 1.3.1, with various extensions and features enabled. The project is built using Google's Bazel build system and is validated by unit tests, integration tests, and the OpenVX conformance tests. +- [Installation](./docs/install.md) +- [API Reference](./docs/api_overview.md) +- [Licenses](LICENSE.md) + ## Project Structure ``` .bazelrc @@ -75,4 +84,12 @@ The following extensions are conditionally enabled for ARM and ARM64 architectur The project includes conformance tests to verify the implementation against the OpenVX standard. The test data path is set using the VX_TEST_DATA_PATH environment variable. ## License -This project is of confidental and propreitary material. See the LICENSE file for more details. +This project is of confidental and propreitary material. See the [LICENSE](LICENSE.md) file for more details. + +
+ +| Previous | Next | +|:------------------|----------------------------------:| +| | [Installation](docs/install.md) | + +
\ No newline at end of file diff --git a/docs/Doxyfile b/docs/Doxyfile index f133be42..57013e7e 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -74,7 +74,7 @@ PROJECT_ICON = # entered, it will be relative to the location where Doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = /Users/Andrew/Projects/coreVX/docs +OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -615,7 +615,7 @@ HIDE_UNDOC_CLASSES = NO # option has no effect if EXTRACT_ALL is enabled. # The default value is: YES. -HIDE_UNDOC_NAMESPACES = YES +HIDE_UNDOC_NAMESPACES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the @@ -732,7 +732,7 @@ SORT_MEMBERS_CTORS_1ST = NO # appear in their defined order. # The default value is: NO. -SORT_GROUP_NAMES = NO +SORT_GROUP_NAMES = YES # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will @@ -752,13 +752,13 @@ SORT_BY_SCOPE_NAME = NO # accept a match between prototype and implementation in such cases. # The default value is: NO. -STRICT_PROTO_MATCHING = NO +STRICT_PROTO_MATCHING = YES # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. -GENERATE_TODOLIST = YES +GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. @@ -770,7 +770,7 @@ GENERATE_TESTLIST = YES # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. -GENERATE_BUGLIST = YES +GENERATE_BUGLIST = NO # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in @@ -815,7 +815,7 @@ SHOW_FILES = YES # Folder Tree View (if specified). # The default value is: YES. -SHOW_NAMESPACES = YES +SHOW_NAMESPACES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # Doxygen should invoke to get the current version for each file (typically from @@ -949,7 +949,7 @@ WARN_LAYOUT_FILE = YES # Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. -WARN_AS_ERROR = NO +WARN_AS_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that Doxygen # can produce. The string should contain the $file, $line, and $text tags, which @@ -991,7 +991,11 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = /Users/Andrew/Projects/coreVX +INPUT = /Users/Andrew/Projects/coreVX \ + /Users/Andrew/Projects/coreVX/README.md \ + /Users/Andrew/Projects/coreVX/docs/install.md \ + /Users/Andrew/Projects/coreVX/docs/api_overview.md \ + /Users/Andrew/Projects/coreVX/LICENSE.md # This tag can be used to specify the character encoding of the source files # that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses @@ -1112,10 +1116,17 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = */tests/* \ +EXCLUDE_PATTERNS = */bazel-*/* \ + */build/* \ */cts/* \ + */external/* \ */kernels/NNEF-Tools/* \ - */kernels/utils/half/* + */kernels/utils/half/* \ + *.md \ + /private/var/tmp/_bazel* \ + */tests/* \ + */third_party/* \ + */ui/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -1210,7 +1221,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the Doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = ../README.md # If the IMPLICIT_DIR_DOCS tag is set to YES, any README.md file found in sub- # directories of the project's root, is used as the documentation for that sub- @@ -1379,7 +1390,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank Doxygen will generate a standard @@ -1389,7 +1400,7 @@ HTML_HEADER = # that Doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1419,7 +1430,9 @@ HTML_STYLESHEET = # documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = doxygen-awesome.css \ + doxygen-awesome-sidebar-only.css \ + doxygen-awesome-sidebar-only-darkmode-toggle.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1429,7 +1442,12 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = doxygen-awesome-darkmode-toggle.js \ + doxygen-awesome-fragment-copy-button.js \ + doxygen-awesome-interactive-toc.js \ + doxygen-awesome-paragraph-link.js \ + expand-all-sidebar.js \ + custom-sidebar-links.js # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. @@ -1442,7 +1460,7 @@ HTML_EXTRA_FILES = # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE = LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1531,7 +1549,7 @@ HTML_PROJECT_COOKIE = # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_INDEX_NUM_ENTRIES = 100 +HTML_INDEX_NUM_ENTRIES = 0 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development @@ -1648,7 +1666,7 @@ BINARY_TOC = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -TOC_EXPAND = NO +TOC_EXPAND = YES # The SITEMAP_URL tag is used to specify the full URL of the place where the # generated documentation will be placed on the server by the user during the @@ -1856,7 +1874,7 @@ FORMULA_MACROFILE = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = YES # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. # Note that the different versions of MathJax have different requirements with @@ -2544,7 +2562,7 @@ ALLEXTERNALS = NO # listed. # The default value is: YES. -EXTERNAL_GROUPS = YES +EXTERNAL_GROUPS = NO # If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will @@ -2869,7 +2887,7 @@ PLANTUMLFILE_DIRS = # Minimum value: 0, maximum value: 10000, default value: 50. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_GRAPH_MAX_NODES = 100 +DOT_GRAPH_MAX_NODES = 500 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs # generated by dot. A depth value of 3 means that only nodes reachable from the @@ -2926,3 +2944,11 @@ MSCGEN_TOOL = # command). MSCFILE_DIRS = + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member include a list of all files that are member of the same group +# (e.g. class, group or namespace) to the documentation. The default value is: +# NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +SHOW_GROUPED_MEMB_INC = YES diff --git a/docs/DoxygenLayout.xml b/docs/DoxygenLayout.xml new file mode 100644 index 00000000..bf9b08da --- /dev/null +++ b/docs/DoxygenLayout.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/api_overview.md b/docs/api_overview.md new file mode 100644 index 00000000..d55d46c0 --- /dev/null +++ b/docs/api_overview.md @@ -0,0 +1,15 @@ +# API Reference +[TOC] + +## [CoreVX Modules](group__group__extensions.html) +## [CoreVX Functions](group__group__all__kernels.html) +## [CoreVX APIs](group__group__external.html) +## [CoreVX Files](files.html) + +
+ +| Previous | Next | +|:------------------|----------------------------------:| +| [Installation](install.md) | [Licenses](../LICENSE.md) | + +
\ No newline at end of file diff --git a/docs/custom-sidebar-links.js b/docs/custom-sidebar-links.js new file mode 100644 index 00000000..f3321514 --- /dev/null +++ b/docs/custom-sidebar-links.js @@ -0,0 +1,330 @@ +/** + * Custom Sidebar Link Resolver for Doxygen + * Directly modifies href attributes for sidebar links that should point to external pages + * Also expands all sidebar sections by default + */ + +class CustomSidebarLinks { + static init() { + // Run immediately when DOM is ready, don't wait for window.load + const runScript = () => { + console.log("=== Custom Sidebar Links Script Starting ==="); + + // Map of sidebar link text to target URLs + const sidebarLinkMap = { + "CoreVX Modules": "group__group__extensions.html", + "CoreVX Functions": "group__group__all__kernels.html", + "CoreVX APIs": "group__group__external.html", + "CoreVX Files": "files.html", + // Add more mappings here as needed: + }; + + let isUpdating = false; // Flag to prevent recursive calls + + // Function to restore highlighting state + const restoreHighlighting = () => { + const selectedLinkText = sessionStorage.getItem("selectedSidebarLink"); + if (selectedLinkText) { + const allSidebarLinks = sidebar.querySelectorAll("a"); + allSidebarLinks.forEach(sidebarLink => { + if (sidebarLink.textContent.trim() === selectedLinkText) { + // Remove highlighting from all other links + allSidebarLinks.forEach(link => { + link.parentElement.classList.remove("selected"); + }); + // Add highlighting to the correct link + sidebarLink.parentElement.classList.add("selected"); + } + }); + } + }; + + // Function to update sidebar links + const updateSidebarLinks = () => { + if (isUpdating) { + return; + } + + isUpdating = true; + + let sidebar = document.getElementById("side-nav"); + if (!sidebar) { + sidebar = document.querySelector(".side-nav-resizable"); + } + if (!sidebar) { + sidebar = document.querySelector("nav"); + } + if (!sidebar) { + sidebar = document.querySelector("aside"); + } + if (!sidebar) { + console.log("Sidebar not found."); + isUpdating = false; + return; + } + + // Find all sidebar links that point to anchors or contain anchor fragments + const links = sidebar.querySelectorAll("a[href*='#']"); + if (links.length === 0) { + isUpdating = false; + return; // No links to process + } + + console.log("Found", links.length, "anchor links in sidebar"); + + // Get all sidebar links to exclude them from searches + const sidebarLinks = sidebar.querySelectorAll("a[href]"); + const sidebarHrefs = new Set(); + sidebarLinks.forEach(link => { + sidebarHrefs.add(link.getAttribute("href")); + }); + + // Get all links on the page + const allPageLinks = Array.from(document.querySelectorAll("a[href]")); + + // Get all headings on the page + const headings = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); + + for (let link of links) { + const linkText = link.textContent.trim(); + const originalHref = link.getAttribute("href"); + + // Skip if already processed + if (link.classList.contains("custom-sidebar-link")) { + continue; + } + + let targetUrl = null; + + // Look for a heading with the exact same text that contains a link + for (let heading of headings) { + const headingText = heading.textContent.trim(); + + if (headingText === linkText) { + // Check if the heading itself is a link + let headingLink = null; + if (heading.tagName === 'A' && heading.hasAttribute('href')) { + headingLink = heading; + } else { + // Check for direct child links (not nested) + headingLink = heading.querySelector(":scope > a[href]"); + } + + if (headingLink) { + const href = headingLink.getAttribute("href"); + if (href && !href.startsWith("#")) { + targetUrl = href; + break; + } + } + } + } + + // If no heading match found, check if this link should point to a different page + if (!targetUrl) { + // Check if there are any links in the page that point to external pages with similar text + for (let pageLink of allPageLinks) { + const pageLinkHref = pageLink.getAttribute("href"); + const pageLinkText = pageLink.textContent.trim(); + + // Skip if this link is already in the sidebar + if (sidebarHrefs.has(pageLinkHref)) { + continue; + } + + // Check if text matches and link doesn't contain anchor fragments + if (pageLinkText === linkText && pageLinkHref && !pageLinkHref.includes("#")) { + targetUrl = pageLinkHref; + break; + } + } + } + + // If still no target found, try to find a link with the same text that points to a different page + if (!targetUrl && originalHref.includes("#")) { + const basePage = originalHref.split("#")[0]; + + for (let pageLink of allPageLinks) { + const pageLinkHref = pageLink.getAttribute("href"); + const pageLinkText = pageLink.textContent.trim(); + + // Skip if this link is already in the sidebar + if (sidebarHrefs.has(pageLinkHref)) { + continue; + } + + // Check if text matches and link points to a different page + if (pageLinkText === linkText && pageLinkHref && + pageLinkHref !== basePage && !pageLinkHref.includes("#")) { + targetUrl = pageLinkHref; + break; + } + } + } + + // If still no match found, check the sidebar link map + if (!targetUrl) { + if (sidebarLinkMap[linkText]) { + const mappedUrl = sidebarLinkMap[linkText]; + + // First try to find this URL in the page links + for (let pageLink of allPageLinks) { + const pageLinkHref = pageLink.getAttribute("href"); + if (pageLinkHref === mappedUrl) { + targetUrl = pageLinkHref; + break; + } + } + + // If not found in page links, use the mapped URL directly + if (!targetUrl) { + console.log("Using mapped target for", linkText + ":", mappedUrl); + targetUrl = mappedUrl; + } + } + } + + // If still no target found, try to find a link to the same base page without anchor + if (!targetUrl && originalHref.includes("#")) { + const basePage = originalHref.split("#")[0]; + + // Skip if this is a pure anchor link (no base page) + if (basePage) { + for (let pageLink of allPageLinks) { + const pageLinkHref = pageLink.getAttribute("href"); + + // Check if this link points to the same base page without anchor + if (pageLinkHref === basePage) { + targetUrl = pageLinkHref; + break; + } + } + } + } + + if (targetUrl) { + // Simply update the href attribute + link.href = targetUrl; + link.classList.add("custom-sidebar-link"); + console.log("Updated sidebar link:", linkText, "->", targetUrl); + + // Add click handler to manage highlighting for external links + link.addEventListener("click", (e) => { + // Remove highlighting from all other links + const allSidebarLinks = sidebar.querySelectorAll("a"); + allSidebarLinks.forEach(sidebarLink => { + sidebarLink.parentElement.classList.remove("selected"); + }); + + // Add highlighting to the clicked link + link.parentElement.classList.add("selected"); + + // Store the selected state in sessionStorage for persistence + sessionStorage.setItem("selectedSidebarLink", linkText); + }); + } + } + + isUpdating = false; // Reset flag when done + }; + + // Set up MutationObserver to watch for changes to the sidebar + const observer = new MutationObserver((mutations) => { + let shouldUpdate = false; + mutations.forEach((mutation) => { + if (mutation.type === 'childList') { + // Check if any links were added + mutation.addedNodes.forEach((node) => { + if (node.nodeType === Node.ELEMENT_NODE) { + if (node.matches && node.matches("a[href*='#']")) { + shouldUpdate = true; + } + if (node.querySelectorAll) { + const anchorLinks = node.querySelectorAll("a[href*='#']"); + if (anchorLinks.length > 0) { + shouldUpdate = true; + } + } + } + }); + } + }); + + if (shouldUpdate) { + setTimeout(updateSidebarLinks, 50); // Small delay to ensure DOM is stable + } + }); + + // Start observing the sidebar + let sidebar = document.getElementById("side-nav"); + if (!sidebar) { + sidebar = document.querySelector(".side-nav-resizable"); + } + if (!sidebar) { + sidebar = document.querySelector("nav"); + } + if (!sidebar) { + sidebar = document.querySelector("aside"); + } + + if (sidebar) { + observer.observe(sidebar, { + childList: true, + subtree: true + }); + + // Also listen for click events on expand/collapse toggles + sidebar.addEventListener("click", (e) => { + // Check if the click is on an expand/collapse toggle + const target = e.target; + if (target.classList.contains("arrow") || + target.classList.contains("arrow-open") || + target.classList.contains("arrow-closed") || + target.closest(".arrow") || + target.closest(".arrow-open") || + target.closest(".arrow-closed")) { + + setTimeout(updateSidebarLinks, 100); // Slightly longer delay for expand/collapse + } + }); + } + + // Initial expansion and update + updateSidebarLinks(); + restoreHighlighting(); + + // Also run after a short delay to catch any late-loading content + setTimeout(() => { + updateSidebarLinks(); + restoreHighlighting(); + }, 500); + + // Add CSS for custom sidebar links + const style = document.createElement('style'); + style.textContent = ` + .custom-sidebar-link { + color: #4ea1f7 !important; + font-weight: bold; + } + .custom-sidebar-link:hover { + text-decoration: underline; + } + `; + document.head.appendChild(style); + + console.log("=== Custom Sidebar Links Script Finished ==="); + }; + + // Run immediately if DOM is already ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', runScript); + } else { + runScript(); + } + + // Also run after window load to catch any content that loads after DOMContentLoaded + window.addEventListener('load', () => { + setTimeout(runScript, 100); + }); + } +} \ No newline at end of file diff --git a/docs/doxygen-awesome-darkmode-toggle.js b/docs/doxygen-awesome-darkmode-toggle.js new file mode 100644 index 00000000..40fe2d38 --- /dev/null +++ b/docs/doxygen-awesome-darkmode-toggle.js @@ -0,0 +1,157 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +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. + +*/ + +class DoxygenAwesomeDarkModeToggle extends HTMLElement { + // SVG icons from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static lightModeIcon = `` + static darkModeIcon = `` + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle') + toggleButton.title = DoxygenAwesomeDarkModeToggle.title + toggleButton.updateIcon() + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + toggleButton.updateIcon() + }) + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + toggleButton.updateIcon() + } + }); + + $(document).ready(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + $(window).resize(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || + (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) + } + + static set userPreference(userPreference) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference + if(!userPreference) { + if(DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if(!DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) + } + } + DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() + } + + static enableDarkMode(enable) { + if(enable) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + } + + static onSystemPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference + this.updateIcon() + } + + updateIcon() { + if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) { + this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon + } else { + this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon + } + } +} + +customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/docs/doxygen-awesome-fragment-copy-button.js b/docs/doxygen-awesome-fragment-copy-button.js new file mode 100644 index 00000000..86c16fd9 --- /dev/null +++ b/docs/doxygen-awesome-fragment-copy-button.js @@ -0,0 +1,85 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +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. + +*/ + +class DoxygenAwesomeFragmentCopyButton extends HTMLElement { + constructor() { + super(); + this.onclick=this.copyContent + } + static title = "Copy to clipboard" + static copyIcon = `` + static successIcon = `` + static successDuration = 980 + static init() { + $(function() { + $(document).ready(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const fragmentWrapper = document.createElement("div") + fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" + const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") + fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title + + fragment.parentNode.replaceChild(fragmentWrapper, fragment) + fragmentWrapper.appendChild(fragment) + fragmentWrapper.appendChild(fragmentCopyButton) + + } + } + }) + }) + } + + + copyContent() { + const content = this.previousSibling.cloneNode(true) + // filter out line number from file listings + content.querySelectorAll(".lineno, .ttc").forEach((node) => { + node.remove() + }) + let textContent = content.textContent + // remove trailing newlines that appear in file listings + let numberOfTrailingNewlines = 0 + while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { + numberOfTrailingNewlines++; + } + textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) + navigator.clipboard.writeText(textContent); + this.classList.add("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon + window.setTimeout(() => { + this.classList.remove("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + }, DoxygenAwesomeFragmentCopyButton.successDuration); + } +} + +customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/docs/doxygen-awesome-interactive-toc.js b/docs/doxygen-awesome-interactive-toc.js new file mode 100644 index 00000000..240e9f60 --- /dev/null +++ b/docs/doxygen-awesome-interactive-toc.js @@ -0,0 +1,91 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +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. + +*/ + +class DoxygenAwesomeInteractiveToc { + static topOffset = 38 + static hideMobileMenu = true + static headers = [] + + static init() { + window.addEventListener("load", () => { + let toc = document.querySelector(".contents > .toc") + if (toc) { + toc.classList.add("interactive") + if (!DoxygenAwesomeInteractiveToc.hideMobileMenu) { + toc.classList.add("open") + } + document.querySelector(".contents > .toc > h3")?.addEventListener("click", () => { + if (toc.classList.contains("open")) { + toc.classList.remove("open") + } else { + toc.classList.add("open") + } + }) + + document.querySelectorAll(".contents > .toc > ul a").forEach((node) => { + let id = node.getAttribute("href").substring(1) + DoxygenAwesomeInteractiveToc.headers.push({ + node: node, + headerNode: document.getElementById(id) + }) + + document.getElementById("doc-content")?.addEventListener("scroll", this.throttle(DoxygenAwesomeInteractiveToc.update, 100)) + }) + DoxygenAwesomeInteractiveToc.update() + } + }) + } + + static update() { + let active = DoxygenAwesomeInteractiveToc.headers[0]?.node + DoxygenAwesomeInteractiveToc.headers.forEach((header) => { + let position = header.headerNode.getBoundingClientRect().top + header.node.classList.remove("active") + header.node.classList.remove("aboveActive") + if (position < DoxygenAwesomeInteractiveToc.topOffset) { + active = header.node + active?.classList.add("aboveActive") + } + }) + active?.classList.add("active") + active?.classList.remove("aboveActive") + } + + static throttle(func, delay) { + let lastCall = 0; + return function (...args) { + const now = new Date().getTime(); + if (now - lastCall < delay) { + return; + } + lastCall = now; + return setTimeout(() => { func(...args) }, delay); + }; + } +} diff --git a/docs/doxygen-awesome-paragraph-link.js b/docs/doxygen-awesome-paragraph-link.js new file mode 100644 index 00000000..e53d132c --- /dev/null +++ b/docs/doxygen-awesome-paragraph-link.js @@ -0,0 +1,51 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 - 2023 jothepro + +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. + +*/ + +class DoxygenAwesomeParagraphLink { + // Icon from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static icon = `` + static title = "Permanent Link" + static init() { + $(function() { + $(document).ready(function() { + document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { + let anchorlink = document.createElement("a") + anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) + anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) + anchorlink.classList.add("anchorlink") + node.classList.add("anchor") + anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon + node.parentElement.appendChild(anchorlink) + }) + }) + }) + } +} diff --git a/docs/doxygen-awesome-sidebar-only-darkmode-toggle.css b/docs/doxygen-awesome-sidebar-only-darkmode-toggle.css new file mode 100644 index 00000000..d207446e --- /dev/null +++ b/docs/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -0,0 +1,40 @@ + +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +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. + +*/ + +@media screen and (min-width: 768px) { + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height)); + } +} diff --git a/docs/doxygen-awesome-sidebar-only.css b/docs/doxygen-awesome-sidebar-only.css new file mode 100644 index 00000000..853f6d69 --- /dev/null +++ b/docs/doxygen-awesome-sidebar-only.css @@ -0,0 +1,116 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +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. + + */ + +html { + /* side nav width. MUST be = `TREEVIEW_WIDTH`. + * Make sure it is wide enough to contain the page title (logo + title + version) + */ + --side-nav-fixed-width: 335px; + --menu-display: none; + + --top-height: 120px; + --toc-sticky-top: -25px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 25px); +} + +#projectname { + white-space: nowrap; +} + + +@media screen and (min-width: 768px) { + html { + --searchbar-background: var(--page-background-color); + } + + #side-nav { + min-width: var(--side-nav-fixed-width); + max-width: var(--side-nav-fixed-width); + top: var(--top-height); + overflow: visible; + } + + #nav-tree, #side-nav { + height: calc(100vh - var(--top-height)) !important; + } + + #nav-tree { + padding: 0; + } + + #top { + display: block; + border-bottom: none; + height: var(--top-height); + margin-bottom: calc(0px - var(--top-height)); + max-width: var(--side-nav-fixed-width); + overflow: hidden; + background: var(--side-nav-background); + } + #main-nav { + float: left; + padding-right: 0; + } + + .ui-resizable-handle { + cursor: default; + width: 1px !important; + background: var(--separator-color); + box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); + } + + #nav-path { + position: fixed; + right: 0; + left: var(--side-nav-fixed-width); + bottom: 0; + width: auto; + } + + #doc-content { + height: calc(100vh - 31px) !important; + padding-bottom: calc(3 * var(--spacing-large)); + padding-top: calc(var(--top-height) - 80px); + box-sizing: border-box; + margin-left: var(--side-nav-fixed-width) !important; + } + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium))); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px); + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: auto; + } +} diff --git a/docs/doxygen-awesome.css b/docs/doxygen-awesome.css new file mode 100644 index 00000000..e51bb4ff --- /dev/null +++ b/docs/doxygen-awesome.css @@ -0,0 +1,2683 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2023 jothepro + +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. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + --on-primary-color: #ffffff; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, search result, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --toc-font-size: 13.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1050px; + --table-line-height: 24px; + --toc-sticky-top: var(--spacing-medium); + --toc-width: 200px; + --toc-max-height: calc(100vh - 2 * var(--spacing-medium) - 85px); + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #faf3d8; + --warning-color-dark: #f3a600; + --warning-color-darker: #5f4204; + --note-color: #e4f3ff; + --note-color-dark: #1879C4; + --note-color-darker: #274a5c; + --todo-color: #e4dafd; + --todo-color-dark: #5b2bdd; + --todo-color-darker: #2a0d72; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #f8d1cc; + --bug-color-dark: #b61825; + --bug-color-darker: #75070f; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--on-primary-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsible table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); + + --animation-duration: .12s +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --toc-font-size: 15px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #3b2e04; + --warning-color-dark: #f1b602; + --warning-color-darker: #ceb670; + --note-color: #163750; + --note-color-dark: #1982D2; + --note-color-darker: #dcf0fa; + --todo-color: #2a2536; + --todo-color-dark: #7661b3; + --todo-color-darker: #ae9ed6; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2e1917; + --bug-color-dark: #ad2617; + --bug-color-darker: #f5b1aa; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, +.sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, +.SelectItem, #MSearchField, .navpath li.navelem a, +.navpath li.navelem a:hover, p.reference, p.definition, div.toc li, div.toc h3 { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: 1em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl, p.reference, p.definition { + font-size: var(--page-font-size); +} + +p.reference, p.definition { + color: var(--page-secondary-foreground-color); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; + background: none; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); + display: block; +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +.main-menu-btn-icon, .main-menu-btn-icon:before, .main-menu-btn-icon:after { + background: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +/* until Doxygen 1.9.4 */ +.left img#MSearchSelect { + left: 0; + user-select: none; + padding-left: 8px; +} + +/* Doxygen 1.9.5 */ +.left span#MSearchSelect { + left: 0; + user-select: none; + margin-left: 8px; + padding: 0; +} + +.left #MSearchSelect[src$=".png"] { + padding-left: 0 +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; + background-image: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchResults .SRPage { + background-color: transparent; +} + +#MSearchResults .SRPage .SREntry { + font-size: 10pt; + padding: var(--spacing-small) var(--spacing-medium); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + width: auto !important; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); + min-width: 8px; + max-width: 50vw; +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; + margin-right: 1px; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); + overflow: hidden; + text-overflow: ellipsis; +} + +#nav-tree .item > a:focus { + outline: none; +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; + color: var(--primary-color) !important; + font-weight: 500; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); + background: none; +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + width: 4px; + background: transparent; + box-shadow: inset -1px 0 0 0 var(--separator-color); +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +@media screen and (min-width: 1000px) { + #doc-content > div > div.contents, + .PageDoc > div.contents { + display: flex; + flex-direction: row-reverse; + flex-wrap: nowrap; + align-items: flex-start; + } + + div.contents .textblock { + min-width: 200px; + flex-grow: 1; + } +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 225%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + color: var(--on-primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents > table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe, + html:not(.light-mode) div.contents .dotgraph iframe { + filter: brightness(89%) hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents > table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe, +html.dark-mode div.contents .dotgraph iframe + { + filter: brightness(89%) hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 900px 0 var(--page-background-color), + -900px 0 var(--page-background-color), + 900px 0.75px var(--separator-color), + -900px 0.75px var(--separator-color), + 1400px 0 var(--page-background-color), + -1400px 0 var(--page-background-color), + 1400px 0.75px var(--separator-color), + -1400px 0.75px var(--separator-color), + 1900px 0 var(--page-background-color), + -1900px 0 var(--page-background-color), + 1900px 0.75px var(--separator-color), + -1900px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname, .paramname em { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); + line-height: var(--table-line-height); +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--primary-light-color); +} + +.alphachar a { + color: var(--page-foreground-color); +} + +.dotgraph { + max-width: 100%; + overflow-x: scroll; +} + +.dotgraph .caption { + position: sticky; + left: 0; +} + +/* Wrap Graphviz graphs with the `interactive_dotgraph` class if `INTERACTIVE_SVG = YES` */ +.interactive_dotgraph .dotgraph iframe { + max-width: 100%; +} + +/* + Table of Contents + */ + +div.contents .toc { + max-height: var(--toc-max-height); + min-width: var(--toc-width); + border: 0; + border-left: 1px solid var(--separator-color); + border-radius: 0; + background-color: var(--page-background-color); + box-shadow: none; + position: sticky; + top: var(--toc-sticky-top); + padding: 0 var(--spacing-large); + margin: var(--spacing-small) 0 var(--spacing-large) var(--spacing-large); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0 var(--spacing-medium) 0; +} + +div.toc li { + padding: 0; + background: none; + line-height: var(--toc-font-size); + margin: var(--toc-font-size) 0 0 0; +} + +div.toc li::before { + display: none; +} + +div.toc ul { + margin-top: 0 +} + +div.toc li a { + font-size: var(--toc-font-size); + color: var(--page-foreground-color) !important; + text-decoration: none; +} + +div.toc li a:hover, div.toc li a.active { + color: var(--primary-color) !important; +} + +div.toc li a.aboveActive { + color: var(--page-secondary-foreground-color) !important; +} + + +@media screen and (max-width: 999px) { + div.contents .toc { + max-height: 45vh; + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + position: relative; + top: 0; + position: relative; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + background-color: var(--toc-background); + box-shadow: var(--box-shadow); + } + + div.contents .toc.interactive { + max-height: calc(var(--navigation-font-size) + 2 * var(--spacing-large)); + overflow: hidden; + } + + div.contents .toc > h3 { + -webkit-tap-highlight-color: transparent; + cursor: pointer; + position: sticky; + top: 0; + background-color: var(--toc-background); + margin: 0; + padding: var(--spacing-large) 0; + display: block; + } + + div.contents .toc.interactive > h3::before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + display: inline-block; + margin-right: var(--spacing-small); + margin-bottom: calc(var(--navigation-font-size) / 4); + transform: rotate(-90deg); + transition: transform var(--animation-duration) ease-out; + } + + div.contents .toc.interactive.open > h3::before { + transform: rotate(0deg); + } + + div.contents .toc.interactive.open { + max-height: 45vh; + overflow: auto; + transition: max-height 0.2s ease-in-out; + } + + div.contents .toc a, div.contents .toc a.active { + color: var(--primary-color) !important; + } + + div.contents .toc a:hover { + text-decoration: underline; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .textblock > .tabbed > ul > li > div.fragment, + .textblock > .tabbed > ul > li > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .tabbed > ul > li > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment > .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); + background-color: var(--fragment-linenumber-background) !important; +} + +div.line { + border-radius: var(--border-radius-small); +} + +div.line.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.post, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); + text-shadow: none; +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; + text-shadow: none; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname), +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: inline-block; + max-width: 100%; +} + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.fieldtable, +table.markdownTable tbody, +table.doxtable tbody { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.markdownTable, table.doxtable, table.fieldtable { + padding: 1px; +} + +table.doxtable caption { + display: block; +} + +table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +th.markdownTableHeadLeft, +th.markdownTableHeadRight, +th.markdownTableHeadCenter, +th.markdownTableHeadNone, +table.doxtable th { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, +th.markdownTableHeadRight:first-child, +th.markdownTableHeadCenter:first-child, +th.markdownTableHeadNone:first-child, +table.doxtable tr th:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, +th.markdownTableHeadRight:last-child, +th.markdownTableHeadCenter:last-child, +th.markdownTableHeadNone:last-child, +table.doxtable tr th:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, +table.markdownTable th, +table.fieldtable td, +table.fieldtable th, +table.doxtable td, +table.doxtable th { + border: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, +table.markdownTable th:last-child, +table.fieldtable td:last-child, +table.fieldtable th:last-child, +table.doxtable td:last-child, +table.doxtable th:last-child { + border-right: none; +} + +table.markdownTable td:first-child, +table.markdownTable th:first-child, +table.fieldtable td:first-child, +table.fieldtable th:first-child, +table.doxtable td:first-child, +table.doxtable th:first-child { + border-left: none; +} + +table.markdownTable tr:first-child td, +table.markdownTable tr:first-child th, +table.fieldtable tr:first-child td, +table.fieldtable tr:first-child th, +table.doxtable tr:first-child td, +table.doxtable tr:first-child th { + border-top: none; +} + +table.markdownTable tr:last-child td, +table.markdownTable tr:last-child th, +table.fieldtable tr:last-child td, +table.fieldtable tr:last-child th, +table.doxtable tr:last-child td, +table.doxtable tr:last-child th { + border-bottom: none; +} + +table.markdownTable tr, table.doxtable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.doxtable tr:last-child { + border-bottom: none; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: block; +} + +.full_width_table table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody { + display: table; + width: 100%; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); +} + +table.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit, .fieldtable td.fielddoc, .fieldtable th { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +table.fieldtable tr:last-child td:first-child { + border-bottom-left-radius: var(--border-radius-small); +} + +table.fieldtable tr:last-child td:last-child { + border-bottom-right-radius: var(--border-radius-small); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: none; +} + +table.memberdecls { + display: block; + -webkit-tap-highlight-color: transparent; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); + white-space: normal; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: var(--spacing-small); +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-left: 0; + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memItemLeft, +table.memberdecls .memTemplItemLeft { + padding-right: var(--spacing-medium); +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + color: var(--page-secondary-foreground-color); +} + +table.memberdecls img[src="closed.png"], +table.memberdecls img[src="open.png"], +div.dynheader img[src="open.png"], +div.dynheader img[src="closed.png"] { + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 5px solid var(--primary-color); + margin-top: 8px; + display: block; + float: left; + margin-left: -10px; + transition: transform var(--animation-duration) ease-out; +} + +table.memberdecls img { + margin-right: 10px; +} + +table.memberdecls img[src="closed.png"], +div.dynheader img[src="closed.png"] { + transform: rotate(-90deg); + +} + +.compoundTemplParams { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--code-font-size); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + white-space: normal; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-bottom: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 var(--separator-color), + -100px 0 var(--separator-color), + 500px 0 var(--separator-color), + -500px 0 var(--separator-color), + 900px 0 var(--separator-color), + -900px 0 var(--separator-color), + 1400px 0 var(--separator-color), + -1400px 0 var(--separator-color), + 1900px 0 var(--separator-color), + -1900px 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry, table.directory td.desc { + padding: calc(var(--spacing-small) / 2) var(--spacing-small); + line-height: var(--table-line-height); +} + +table.directory tr.even td:last-child { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; +} + +table.directory tr.even td:first-child { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); +} + +table.directory tr.even:last-child td:last-child { + border-radius: 0 var(--border-radius-small) 0 0; +} + +table.directory tr.even:last-child td:first-child { + border-radius: var(--border-radius-small) 0 0 0; +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +table.directory tr.odd { + background-color: transparent; +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + border-radius: var(--border-radius-small); + font-size: var(--page-font-size); + padding: calc(var(--page-font-size) / 5); + line-height: var(--page-font-size); + transform: scale(0.8); + height: auto; + width: var(--page-font-size); + user-select: none; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; + height: var(--table-line-height); +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +.classindex dl.even { + background-color: transparent; +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar, +div.contents .toc::-webkit-scrollbar, +.contents .dotgraph::-webkit-scrollbar, +.contents .tabs-overview-container::-webkit-scrollbar { + background: transparent; + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-thumb, +div.contents .toc::-webkit-scrollbar-thumb, +.contents .dotgraph::-webkit-scrollbar-thumb, +.contents .tabs-overview-container::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody:hover::-webkit-scrollbar-thumb, +div.contents .toc:hover::-webkit-scrollbar-thumb, +.contents .dotgraph:hover::-webkit-scrollbar-thumb, +.contents .tabs-overview-container:hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody::-webkit-scrollbar-track, +div.contents .toc::-webkit-scrollbar-track, +.contents .dotgraph::-webkit-scrollbar-track, +.contents .tabs-overview-container::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) tbody, +div.contents .toc, +.contents .dotgraph, +.contents .tabs-overview-container { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform var(--animation-duration) ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity var(--animation-duration) ease-in-out, color var(--animation-duration) ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} + +/* + Optional tab feature +*/ + +.tabbed > ul { + padding-inline-start: 0px; + margin: 0; + padding: var(--spacing-small) 0; +} + +.tabbed > ul > li { + display: none; +} + +.tabbed > ul > li.selected { + display: block; +} + +.tabs-overview-container { + overflow-x: auto; + display: block; + overflow-y: visible; +} + +.tabs-overview { + border-bottom: 1px solid var(--separator-color); + display: flex; + flex-direction: row; +} + +@media screen and (max-width: 767px) { + .tabs-overview-container { + margin: 0 calc(0px - var(--spacing-large)); + } + .tabs-overview { + padding: 0 var(--spacing-large) + } +} + +.tabs-overview button.tab-button { + color: var(--page-foreground-color); + margin: 0; + border: none; + background: transparent; + padding: calc(var(--spacing-large) / 2) 0; + display: inline-block; + font-size: var(--page-font-size); + cursor: pointer; + box-shadow: 0 1px 0 0 var(--separator-color); + position: relative; + + -webkit-tap-highlight-color: transparent; +} + +.tabs-overview button.tab-button .tab-title::before { + display: block; + content: attr(title); + font-weight: 600; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.tabs-overview button.tab-button .tab-title { + float: left; + white-space: nowrap; + font-weight: normal; + padding: calc(var(--spacing-large) / 2) var(--spacing-large); + border-radius: var(--border-radius-medium); + transition: background-color var(--animation-duration) ease-in-out, font-weight var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button:not(:last-child) .tab-title { + box-shadow: 8px 0 0 -7px var(--separator-color); +} + +.tabs-overview button.tab-button:hover .tab-title { + background: var(--separator-color); + box-shadow: none; +} + +.tabs-overview button.tab-button.active .tab-title { + font-weight: 600; +} + +.tabs-overview button.tab-button::after { + content: ''; + display: block; + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 0; + width: 0%; + margin: 0 auto; + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + background-color: var(--primary-color); + transition: width var(--animation-duration) ease-in-out, height var(--animation-duration) ease-in-out; +} + +.tabs-overview button.tab-button.active::after { + width: 100%; + box-sizing: border-box; + height: 3px; +} + + +/* + Navigation Buttons +*/ + +.section_buttons:not(:empty) { + margin-top: calc(var(--spacing-large) * 3); +} + +.section_buttons table.markdownTable { + display: block; + width: 100%; +} + +.section_buttons table.markdownTable tbody { + display: table !important; + width: 100%; + box-shadow: none; + border-spacing: 10px; +} + +.section_buttons table.markdownTable td { + padding: 0; +} + +.section_buttons table.markdownTable th { + display: none; +} + +.section_buttons table.markdownTable tr.markdownTableHead { + border: none; +} + +.section_buttons tr th, .section_buttons tr td { + background: none; + border: none; + padding: var(--spacing-large) 0 var(--spacing-small); +} + +.section_buttons a { + display: inline-block; + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + color: var(--page-secondary-foreground-color) !important; + text-decoration: none; + transition: color var(--animation-duration) ease-in-out, background-color var(--animation-duration) ease-in-out; +} + +.section_buttons a:hover { + color: var(--page-foreground-color) !important; + background-color: var(--odd-color); +} + +.section_buttons tr td.markdownTableBodyLeft a { + padding: var(--spacing-medium) var(--spacing-large) var(--spacing-medium) calc(var(--spacing-large) / 2); +} + +.section_buttons tr td.markdownTableBodyRight a { + padding: var(--spacing-medium) calc(var(--spacing-large) / 2) var(--spacing-medium) var(--spacing-large); +} + +.section_buttons tr td.markdownTableBodyLeft a::before, +.section_buttons tr td.markdownTableBodyRight a::after { + color: var(--page-secondary-foreground-color) !important; + display: inline-block; + transition: color .08s ease-in-out, transform .09s ease-in-out; +} + +.section_buttons tr td.markdownTableBodyLeft a::before { + content: '〈'; + padding-right: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyRight a::after { + content: '〉'; + padding-left: var(--spacing-large); +} + + +.section_buttons tr td.markdownTableBodyLeft a:hover::before { + color: var(--page-foreground-color) !important; + transform: translateX(-3px); +} + +.section_buttons tr td.markdownTableBodyRight a:hover::after { + color: var(--page-foreground-color) !important; + transform: translateX(3px); +} + +@media screen and (max-width: 450px) { + .section_buttons a { + width: 100%; + box-sizing: border-box; + } + + .section_buttons tr td:nth-of-type(1).markdownTableBodyLeft a { + border-radius: var(--border-radius-medium) 0 0 var(--border-radius-medium); + border-right: none; + } + + .section_buttons tr td:nth-of-type(2).markdownTableBodyRight a { + border-radius: 0 var(--border-radius-medium) var(--border-radius-medium) 0; + } +} diff --git a/docs/expand-all-sidebar.js b/docs/expand-all-sidebar.js new file mode 100644 index 00000000..badb4232 --- /dev/null +++ b/docs/expand-all-sidebar.js @@ -0,0 +1,57 @@ +console.log('[expand-all-sidebar] Script loaded'); +(function () { + function expandAllSidebarSectionsRecursive(maxTries, delayMs) { + let tries = 0; + function expandStep() { + let arrows = Array.from(document.querySelectorAll('span.arrow')); + let collapsedArrows = arrows.filter(arrow => arrow.textContent.trim() === '►'); + console.log(`[expand-all-sidebar] Iteration ${tries + 1}: Found ${collapsedArrows.length} collapsed arrows`); + collapsedArrows.forEach((arrow, idx) => { + console.log(`[expand-all-sidebar] Clicking collapsed arrow #${idx}`, arrow); + arrow.click(); + }); + // Set all arrows to ▼ for consistency + arrows.forEach((arrow, idx) => { + if (arrow.textContent.trim() === '►' || arrow.textContent.trim() === '▼') { + arrow.textContent = '▼'; + } + }); + tries++; + if (collapsedArrows.length > 0 && tries < maxTries) { + setTimeout(expandStep, delayMs); + } else { + console.log('[expand-all-sidebar] Expansion complete or max tries reached'); + } + } + expandStep(); + } + + function waitForSidebarAndExpand(maxWaitMs) { + var waited = 0; + var interval = setInterval(function () { + var navTree = document.getElementById('nav-tree'); + var arrows = document.querySelectorAll('span.arrow'); + if (navTree && arrows.length > 0) { + clearInterval(interval); + console.log('[expand-all-sidebar] Sidebar detected, running recursive expansion logic'); + expandAllSidebarSectionsRecursive(10, 200); + } else { + waited += 100; + if (waited >= maxWaitMs) { + clearInterval(interval); + console.log('[expand-all-sidebar] Timeout: Sidebar not detected after', maxWaitMs, 'ms'); + } + } + }, 100); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function () { + console.log('[expand-all-sidebar] DOMContentLoaded'); + waitForSidebarAndExpand(5000); // Wait up to 5 seconds + }); + } else { + console.log('[expand-all-sidebar] Document already loaded'); + waitForSidebarAndExpand(5000); + } +})(); \ No newline at end of file diff --git a/docs/footer.html b/docs/footer.html new file mode 100644 index 00000000..e6e167bc --- /dev/null +++ b/docs/footer.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/header.html b/docs/header.html new file mode 100644 index 00000000..36e300b1 --- /dev/null +++ b/docs/header.html @@ -0,0 +1,102 @@ + + + + + + + + + + + $projectname: $title + + $title + + + + + + + + + + + + + + + $treeview + $search + $mathjax + $darkmode + + $extrastylesheet + + + + + + + + + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
$projectname $projectnumber +
+ +
$projectbrief
+
+
$projectbrief
+
$searchbox
$searchbox
+
+ + \ No newline at end of file diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 00000000..24c0c698 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,20 @@ +# Installation +[TOC] + +Instructions for installing coreVX... + +## Prerequisites + +... + +## Steps + +... + +
+ +| Previous | Next | +|:------------------|----------------------------------:| +| [Home](../README.md) | [API Reference](api_overview.md) | + +
\ No newline at end of file diff --git a/framework/include/vx_context.h b/framework/include/vx_context.h index 047d5e60..f8e4531a 100644 --- a/framework/include/vx_context.h +++ b/framework/include/vx_context.h @@ -29,7 +29,7 @@ * * \defgroup group_int_context Internal Context API * \ingroup group_internal - * \brief Internal Context API + * \brief The Internal Context API */ /*! \brief The implementation string which is of the format "." */ diff --git a/framework/include/vx_event_queue.hpp b/framework/include/vx_event_queue.hpp index c75f5e10..8d3b1637 100644 --- a/framework/include/vx_event_queue.hpp +++ b/framework/include/vx_event_queue.hpp @@ -85,7 +85,7 @@ class EventQueue * @param type Event type * @param data Optional event value * @param info Optional event info pointer - * @param reg Optional vx_reference used to look up additional registration data + * @param ref Optional vx_reference used to look up additional registration data * @return true if successful * @return false if failed */ diff --git a/framework/include/vx_internal.h b/framework/include/vx_internal.h index 3b7b81e9..c9a0835a 100644 --- a/framework/include/vx_internal.h +++ b/framework/include/vx_internal.h @@ -38,6 +38,10 @@ * \defgroup group_int_defines Internal Defines * \ingroup group_internal * \brief Limitations on Sizes, Ranges, Values. + * + * \defgroup group_implementation Internal Kernel Implementations + * \ingroup group_internal + * \brief Implementation entry points in targets */ #include @@ -432,7 +436,7 @@ using vx_error = Error*; * \param [in] worker The per-thread worker data structure. * \retval false_e Indicates that the worker failed to process data or had some other * error. - * \ingroup group_threadpools + * \ingroup group_int_osal */ typedef vx_bool (*vx_threadpool_f)(struct vx_threadpool_worker_t *worker); @@ -495,7 +499,7 @@ typedef struct vx_work_t { }; /*! \brief An internal enum for notating which sort of reference type we need. - * \ingroup group_int_type + * \ingroup group_int_types */ typedef enum vx_reftype_e { VX_INTERNAL = 1, @@ -552,9 +556,9 @@ typedef struct vx_kernel_attr_t { }; /*! -* \brief The pointer to the kernel object deinitializer. -* \param [in] kernel object local ptr. -*/ + * \brief The pointer to the kernel object deinitializer. + * \param [in] nn_kernel object local ptr. + */ typedef vx_status(VX_CALLBACK *vx_kernel_object_deinitialize_f)(vx_kernel nn_kernel); /*! \brief The function which initializes the target @@ -721,7 +725,7 @@ typedef struct vx_module_t { }; /*! \brief The framework's internal-external memory tracking structure. - * \ingroup group_int_context. + * \ingroup group_int_context */ typedef struct vx_external_t { /*! \brief The pointer associated with the reference. */ @@ -761,7 +765,7 @@ typedef union vx_memory_map_extra }; /*! \brief The framework's mapping memory tracking structure. - * \ingroup group_int_context. + * \ingroup group_int_context */ typedef struct vx_memory_map_t { diff --git a/framework/include/vx_reference.h b/framework/include/vx_reference.h index 70d790ea..ffc9cb8f 100644 --- a/framework/include/vx_reference.h +++ b/framework/include/vx_reference.h @@ -33,7 +33,7 @@ /*! \brief The most basic type in the OpenVX system. Any type that inherits * from vx_reference must have a vx_reference as its first memeber * to allow casting to this type. - * \ingroup group_int_refererence + * \ingroup group_int_reference */ class Reference { public: diff --git a/framework/src/vx_context.cpp b/framework/src/vx_context.cpp index 1953f73c..92809e91 100644 --- a/framework/src/vx_context.cpp +++ b/framework/src/vx_context.cpp @@ -1311,7 +1311,7 @@ VX_API_ENTRY vx_status VX_API_CALL vxHint(vx_reference reference, vx_enum hint, switch (hint) { - /*! @TODO add hints to the implementation */ + /*! @todo add hints to the implementation */ default: status = VX_ERROR_NOT_SUPPORTED; break; diff --git a/framework/src/vx_helper.cpp b/framework/src/vx_helper.cpp index 4061b993..be7e2c10 100644 --- a/framework/src/vx_helper.cpp +++ b/framework/src/vx_helper.cpp @@ -27,10 +27,8 @@ /*! \file vx_helper.cpp * \brief The OpenVX Helper Implementation. * \author Erik Rainey - * \example vx_helper.c */ - // no clue if this belongs here, but i don't know where better to put it. needed by c_scale.c and vx_scale.c uint32_t math_gcd(uint32_t a, uint32_t b) { diff --git a/include/COREVX/circular_queue.hpp b/include/COREVX/circular_queue.hpp index c20ddc63..23f371ea 100644 --- a/include/COREVX/circular_queue.hpp +++ b/include/COREVX/circular_queue.hpp @@ -5,7 +5,7 @@ * @date 2025-05-13 * * @copyright Copyright (c) 2025 - * + * @ingroup group_corevx_ext */ #include #include @@ -16,7 +16,7 @@ * * @tparam T Type of elements in the queue * @tparam MaxDepth Maximum depth of the queue - * @ingroup group_int_corevx + * @ingroup group_corevx_ext */ template class CircularQueue @@ -24,7 +24,7 @@ class CircularQueue public: /** * @brief Construct a new Circular Queue object - * + * @see group_corevx_ext */ CircularQueue() : head_(0), tail_(0) {} diff --git a/include/COREVX/execution_queue.hpp b/include/COREVX/execution_queue.hpp index a3f6b62a..73f59db5 100644 --- a/include/COREVX/execution_queue.hpp +++ b/include/COREVX/execution_queue.hpp @@ -5,13 +5,20 @@ * @date 2025-05-16 * * @copyright Copyright (c) 2025 - * + * @ingroup group_corevx_ext */ #include #include #include "circular_queue.hpp" +/** + * @brief Execution queue implementation + * + * @tparam T queue type + * @tparam MaxDepth depth of queue + * @ingroup group_corevx_ext + */ template class ExecutionQueue { diff --git a/include/VX/vx_api.h b/include/VX/vx_api.h index 0068d177..fe3267b1 100644 --- a/include/VX/vx_api.h +++ b/include/VX/vx_api.h @@ -177,8 +177,8 @@ VX_API_ENTRY vx_enum VX_API_CALL vxRegisterUserStructWithName(vx_context context /*! * \brief Returns the name of the user-defined structure associated with the enumeration given. * \param [in] context The reference to the implementation context. - * \param [in] type_name The enumeration value of the user struct - * \param [out] name_size Name of the user struct + * \param [in] user_struct_type The enumeration value of the user struct + * \param [out] type_name Name of the user struct * \param [in] name_size The size of allocated buffer pointed to by type_name * \return A \ref vx_status_e enumeration. * \retval VX_SUCCESS user_struct_type was valid, and name was found and returned @@ -1415,7 +1415,7 @@ VX_API_ENTRY vx_status VX_API_CALL vxQueryParameter(vx_parameter parameter, vx_e SCALAR =============================================================================*/ -/*! \brief Creates a reference to a scalar object. Also see \ref sub_node_parameters. +/*! \brief Creates a reference to a scalar object. Also see ref sub_node_parameters. * \param [in] context The reference to the system context. * \param [in] data_type The type of data to hold. Must be greater than * \ref VX_TYPE_INVALID and less than or equal to \ref VX_TYPE_VENDOR_STRUCT_END. @@ -1428,7 +1428,7 @@ VX_API_ENTRY vx_status VX_API_CALL vxQueryParameter(vx_parameter parameter, vx_e */ VX_API_ENTRY vx_scalar VX_API_CALL vxCreateScalar(vx_context context, vx_enum data_type, const void *ptr); -/*! \brief Creates a reference to a scalar object. Also see \ref sub_node_parameters. +/*! \brief Creates a reference to a scalar object. Also see ref sub_node_parameters. * \param [in] context The reference to the system context. * \param [in] data_type The type of data to hold. Must be greater than * \ref VX_TYPE_INVALID and less than or equal to \ref VX_TYPE_VENDOR_STRUCT_END. @@ -3141,33 +3141,38 @@ VX_API_ENTRY vx_status VX_API_CALL vxQueryMetaFormatAttribute(vx_meta_format met =============================================================================*/ /*! \brief Creates an opaque reference to a tensor data buffer. - * \details Not guaranteed to exist until the \ref vx_graph containing it has been verified. - * Since functions using tensors, need to understand the context of each dimension. We describe a layout of the dimensions in each function using tensors. - * That layout is not mandatory. It is done specifically to explain the functions and not to mandate layout. Different implementation may have different layout. - * Therefore the layout description is logical and not physical. It refers to the order of dimensions given in this function. + * \details Not guaranteed to exist until the \ref vx_graph containing it has been + * verified. Since functions using tensors, need to understand the context of each dimension. We + * describe a layout of the dimensions in each function using tensors. That layout is not mandatory. + * It is done specifically to explain the functions and not to mandate layout. Different + * implementation may have different layout. Therefore the layout description is logical and not + * physical. It refers to the order of dimensions given in this function. * \param [in] context The reference to the implementation context. * \param [in] number_of_dims The number of dimensions. * \param [in] dims Dimensions sizes in elements. - * \param [in] data_type The \ref vx_type_e that represents the data type of the tensor data elements. - * \param [in] fixed_point_position Specifies the fixed point position when the input element type is integer. if 0, calculations are performed in integer math. + * \param [in] data_type The \ref vx_type_e that represents the data type of the tensor + * data elements. + * \param [in] fixed_point_position Specifies the fixed point position when the input element type + * is integer. if 0, calculations are performed in integer math. * \return A tensor data reference. Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateTensor(vx_context context, vx_size number_of_dims, const vx_size * dims, vx_enum data_type,vx_int8 fixed_point_position); -/*! \brief Creates an array of images into the multi-dimension data, this can be adjacent 2D images or not depending on the stride value. - * The stride value is representing bytes in the third dimension. - * The OpenVX image object that points to a three dimension data and access it as an array of images. - * This has to be portion of the third lowest dimension, and the stride correspond to that third dimension. - * The returned Object array is an array of images. Where the image data is pointing to a specific memory in the input tensor. +/*! \brief Creates an array of images into the multi-dimension data, this can be adjacent 2D images + * or not depending on the stride value. The stride value is representing bytes in the third + * dimension. The OpenVX image object that points to a three dimension data and access it as an + * array of images. This has to be portion of the third lowest dimension, and the stride correspond + * to that third dimension. The returned Object array is an array of images. Where the image data is + * pointing to a specific memory in the input tensor. * \param [in] tensor The tensor data from which to extract the images. Has to be a 3d tensor. * \param [in] rect Image coordinates within tensor data. * \param [in] array_size Number of images to extract. * \param [in] jump Delta between two images in the array. * \param [in] image_format The requested image format. Should match the tensor data's data type. * \return An array of images pointing to the tensor data's data. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_object_array VX_API_CALL vxCreateImageObjectArrayFromTensor(vx_tensor tensor, const vx_rectangle_t *rect, vx_size array_size, vx_size jump, vx_df_image image_format); @@ -3176,13 +3181,14 @@ VX_API_ENTRY vx_object_array VX_API_CALL vxCreateImageObjectArrayFromTensor(vx_t * updates the parent tensor data. The view must be defined within the dimensions * of the parent tensor data. * \param [in] tensor The reference to the parent tensor data. - * \param [in] number_of_dims Number of dimensions in the view. Error return if 0 or greater than number of - * tensor dimensions. If smaller than number of tensor dimensions, the lower dimensions are assumed. + * \param [in] number_of_dims Number of dimensions in the view. Error return if 0 or greater than + * number of tensor dimensions. If smaller than number of tensor dimensions, the lower dimensions + * are assumed. * \param [in] view_start View start coordinates * \param [in] view_end View end coordinates * \return The reference to the sub-tensor. Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateTensorFromView(vx_tensor tensor, vx_size number_of_dims, const vx_size * view_start, const vx_size * view_end); @@ -3196,18 +3202,22 @@ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateTensorFromView(vx_tensor tensor, vx_s * in particular allows the user to define the tensor data format of the data without * requiring the exact dimensions. Virtual objects are scoped within the graph * they are declared a part of, and can't be shared outside of this scope. - * Since functions using tensors, need to understand the context of each dimension. We describe a layout of the dimensions in each function. - * That layout is not mandated. It is done specifically to explain the functions and not to mandate layout. Different implementation may have different layout. - * Therfore the layout description is logical and not physical. It refers to the order of dimensions given in \ref vxCreateTensor and \ref vxCreateVirtualTensor. + * Since functions using tensors, need to understand the context of each dimension. We describe a + * layout of the dimensions in each function. That layout is not mandated. It is done specifically + * to explain the functions and not to mandate layout. Different implementation may have different + * layout. Therfore the layout description is logical and not physical. It refers to the order of + * dimensions given in \ref vxCreateTensor and \ref vxCreateVirtualTensor. * \param [in] graph The reference to the parent graph. * \param [in] number_of_dims The number of dimensions. * \param [in] dims Dimensions sizes in elements. - * \param [in] data_type The \ref vx_type_e that represents the data type of the tensor data elements. - * \param [in] fixed_point_position Specifies the fixed point position when the input element type is integer. If 0, calculations are performed in integer math. + * \param [in] data_type The \ref vx_type_e that represents the data type of the tensor + * data elements. + * \param [in] fixed_point_position Specifies the fixed point position when the input element type + * is integer. If 0, calculations are performed in integer math. * \return A tensor data reference.Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. * \note Passing this reference to \ref vxCopyTensorPatch will return an error. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateVirtualTensor(vx_graph graph, vx_size number_of_dims, const vx_size *dims, vx_enum data_type, vx_int8 fixed_point_position); @@ -3215,25 +3225,29 @@ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateVirtualTensor(vx_graph graph, vx_size * \param [in] context The reference to the implementation context. * \param [in] number_of_dims The number of dimensions. * \param [in] dims Dimensions sizes in elements. - * \param [in] data_type The \ref vx_type_e that represents the data type of the tensor data elements. - * \param [in] fixed_point_position Specifies the fixed point position when the input element type is integer. if 0, calculations are performed in integer math. - * \param [in] stride An array of stride in all dimensions in bytes. The stride value at index 0 must be size of the tensor data element type. + * \param [in] data_type The \ref vx_type_e that represents the data type of the tensor + * data elements. + * \param [in] fixed_point_position Specifies the fixed point position when the input element type + * is integer. if 0, calculations are performed in integer math. + * \param [in] stride An array of stride in all dimensions in bytes. The stride value at index 0 + * must be size of the tensor data element type. * \param [in] ptr The platform-defined reference to tensor. See note below. - * \param [in] memory_type \ref vx_memory_type_e. When giving \ref VX_MEMORY_TYPE_HOST - * the \a ptr is assumed to be HOST accessible pointer to memory. + * \param [in] memory_type \ref vx_memory_type_e. When giving \ref + * VX_MEMORY_TYPE_HOST the \a ptr is assumed to be HOST accessible pointer to memory. * \return A tensor data reference. Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. - * \note The user must call vxMapTensorPatch prior to accessing the elements of a tensor, even if the - * tensor was created via \ref vxCreateTensorFromHandle. Reads or writes to memory referenced - * by ptr after calling \ref vxCreateTensorFromHandle without first calling + * \note The user must call vxMapTensorPatch prior to accessing the elements of a tensor, even if + * the tensor was created via \ref vxCreateTensorFromHandle. Reads or writes to memory + * referenced by ptr after calling \ref vxCreateTensorFromHandle without first calling * \ref vxMapTensorPatch will result in undefined behavior. * The property of stride[] and ptr is kept by the caller (It means that the implementation will - * make an internal copy of the provided information. \a stride and \a ptr can then simply be application's - * local variables). + * make an internal copy of the provided information. \a stride and \a ptr can then simply be + * application's local variables). * - * In order to release the tensor back to the application we should use \ref vxSwapTensorHandle. + * In order to release the tensor back to the application we should use \ref + * vxSwapTensorHandle. * - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateTensorFromHandle(vx_context context, vx_size number_of_dims, const vx_size *dims, vx_enum data_type, vx_int8 fixed_point_position, const vx_size * stride, void * ptr, vx_enum memory_type); @@ -3274,7 +3288,6 @@ VX_API_ENTRY vx_tensor VX_API_CALL vxCreateTensorFromHandle(vx_context context, */ VX_API_ENTRY vx_status VX_API_CALL vxSwapTensorHandle(vx_tensor tensor, void* new_ptr, void** prev_ptr); - /*! \brief Allows the application to copy a view patch from/into an tensor object . * \param [in] tensor The reference to the tensor object that is the source or the * destination of the copy. @@ -3287,12 +3300,15 @@ VX_API_ENTRY vx_status VX_API_CALL vxSwapTensorHandle(vx_tensor tensor, void* ne * if the copy was requested in read mode, or from where to get the data to store into the tensor * object if the copy was requested in write mode. The accessible memory must be large enough * to contain the specified patch with the specified layout:\n - * accessible memory in bytes >= (end[last_dimension] - start[last_dimension]) * stride[last_dimension].\n - * The layout of the user memory must follow a row major order. + * accessible memory in bytes >= (end[last_dimension] - start[last_dimension]) * + * stride[last_dimension].\n The layout of the user memory must follow a row major order. * \param [in] usage This declares the effect of the copy with regard to the tensor object - * using the \ref vx_accessor_e enumeration. Only \ref VX_READ_ONLY and \ref VX_WRITE_ONLY are supported: - * \arg \ref VX_READ_ONLY means that data is copied from the tensor object into the application memory - * \arg \ref VX_WRITE_ONLY means that data is copied into the tensor object from the application memory + * using the \ref vx_accessor_e enumeration. Only \ref VX_READ_ONLY and \ref + * VX_WRITE_ONLY are supported: + * \arg \ref VX_READ_ONLY means that data is copied from the tensor object into the + * application memory + * \arg \ref VX_WRITE_ONLY means that data is copied into the tensor object from the + * application memory * \param [in] user_memory_type A \ref vx_memory_type_e enumeration that specifies * the memory type of the memory referenced by the user_addr. * \return A \ref vx_status_e enumeration. @@ -3300,7 +3316,7 @@ VX_API_ENTRY vx_status VX_API_CALL vxSwapTensorHandle(vx_tensor tensor, void* ne * accessed by the application. * \retval VX_ERROR_INVALID_REFERENCE The tensor reference is not actually an tensor reference. * \retval VX_ERROR_INVALID_PARAMETERS An other parameter is incorrect. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_status VX_API_CALL vxCopyTensorPatch(vx_tensor tensor, vx_size number_of_dims, const vx_size * view_start, const vx_size * view_end, const vx_size * user_stride, void * user_ptr, vx_enum usage, vx_enum user_memory_type); @@ -3371,7 +3387,7 @@ VX_API_ENTRY vx_status VX_API_CALL vxUnmapTensorPatch(vx_tensor tensor, const vx * \retval VX_SUCCESS No errors. * \retval VX_ERROR_INVALID_REFERENCE If data is not a \ref vx_tensor. * \retval VX_ERROR_INVALID_PARAMETERS If any of the other parameters are incorrect. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_status VX_API_CALL vxQueryTensor(vx_tensor tensor, vx_enum attribute, void *ptr, vx_size size); @@ -3382,7 +3398,7 @@ VX_API_ENTRY vx_status VX_API_CALL vxQueryTensor(vx_tensor tensor, vx_enum attri * \return A \ref vx_status_e enumeration. * \retval VX_SUCCESS No errors; all other values indicate failure * \retval * An error occurred. See \ref vx_status_e. - * \ingroup group_object_tensor + * \ingroup group_tensor */ VX_API_ENTRY vx_status VX_API_CALL vxReleaseTensor(vx_tensor *tensor); diff --git a/include/VX/vx_corevx_ext.h b/include/VX/vx_corevx_ext.h index 7e0dee01..57de24de 100644 --- a/include/VX/vx_corevx_ext.h +++ b/include/VX/vx_corevx_ext.h @@ -12,6 +12,184 @@ #include #include +#include + +/*! + * \defgroup group_extensions All OpenVX Extensions + * \brief A comprehensive collection of all OpenVX extensions implemented. + * + * \defgroup group_all_kernels All OpenVX Kernel Functions + * \brief A comprehensive collection of all OpenVX kernel functions available. + * + * \defgroup group_external OpenVX User Facing Implementation + * \brief The OpenVX User Facing Implementation. + * \details A proprietary, Closed Source implementation of the OpenVX implementation + * + * \defgroup group_adv_array User Facing Custom Struct API + * \ingroup group_external + * \brief The Public User Struct API + * + * \defgroup group_adv_node User Facing Custom Node API + * \ingroup group_external + * \brief The Public Generic Node API + * + * \defgroup group_array User Facing Array API + * \ingroup group_external + * \brief The Public Array API + * + * \defgroup group_basic_features User Facing Basic Features API + * \ingroup group_external + * \brief The Public Basic Features API + * + * \defgroup group_borders User Facing Borders API + * \ingroup group_external + * \brief The Public Borders API + * + * \defgroup group_context User Facing Context API + * \ingroup group_external + * \brief The Public Context API + * + * \defgroup group_convolution User Facing Convolution API + * \ingroup group_external + * \brief The Public Convolution API + * + * \defgroup group_delay User Facing Delay API + * \ingroup group_external + * \brief The Public Delay API + * + * \defgroup group_directive User Facing Directive API + * \ingroup group_external + * \brief The Public Directive API + * + * \defgroup group_distribution User Facing Distribution API + * \ingroup group_external + * \brief The Public API + * + * \defgroup group_graph User Facing Graph API + * \ingroup group_external + * \brief The Public Graph API + * + * \defgroup group_graph_parameters User Facing Graph Parameters API + * \ingroup group_external + * \brief The Public Graph Parameters API + * + * \defgroup group_hint User Facing Hint API + * \ingroup group_external + * \brief The Public Hint API + * + * \defgroup group_image User Facing Image API + * \ingroup group_external + * \brief The Public Image API + * + * \defgroup group_import User Facing Import API + * \ingroup group_external + * \brief The Public Import API + * + * \defgroup group_import_kernel User Facing Import Kernel API + * \ingroup group_external + * \brief The Public Import Kernel API + * + * \defgroup group_kernel User Facing Kernel API + * \ingroup group_external + * \brief The Public Kernel API + * + * \defgroup group_log User Facing Log API + * \ingroup group_external + * \brief The Public Log API + * + * \defgroup group_lut User Facing LUT API + * \ingroup group_external + * \brief The Public LUT API + * + * \defgroup group_matrix User Facing Matrix API + * \ingroup group_external + * \brief The Public Matrix API + * + * \defgroup group_meta_format User Facing Meta Format API + * \ingroup group_external + * \brief The Public Meta Format API + * + * \defgroup group_node User Facing Node API + * \ingroup group_external + * \brief The Public Node API + * + * \defgroup group_node_callback User Facing Node Callback API + * \ingroup group_external + * \brief The Public Node Callback API + * + * \defgroup group_object_array User Facing Object Array API + * \ingroup group_external + * \brief The Public Object Array API + * + * \defgroup group_osal User Facing OS Abstratction Layer API + * \ingroup group_external + * \brief The Public OSAL API + * + * \defgroup group_parameter User Facing Parameter API + * \ingroup group_external + * \brief The Public API + * + * \defgroup group_performance User Facing Performance API + * \ingroup group_external + * \brief The Public Performance API + * + * \defgroup group_pyramid User Facing Pyramid API + * \ingroup group_external + * \brief The Public Pyramid API + * + * \defgroup group_reference User Facing Reference API + * \ingroup group_external + * \brief The Public Reference API + * + * \defgroup group_remap User Facing Remap API + * \ingroup group_external + * \brief The Public Remap API + * + * \defgroup group_scalar User Facing Scalar API + * \ingroup group_external + * \brief The Public Scalar API + * + * \defgroup group_target User Facing Target API + * \ingroup group_external + * \brief The Public Target API + * + * \defgroup group_tensor User Facing Tensor API + * \ingroup group_external + * \brief The Public Tensor API + * + * \defgroup group_threshold User Facing Threshold API + * \ingroup group_external + * \brief The Public Threshold API + * + * \defgroup group_user_data_object User Facing User Data Object API + * \ingroup group_external + * \brief The Public User Data Object API + * + * \defgroup group_user_kernels User Facing User Kernels API + * \ingroup group_external + * \brief The Public User Kernels API + */ + +/*! + * \brief The OpenVX CoreVX Vendor Extension. + * \defgroup group_corevx_ext Extension: CoreVX + * \ingroup group_extensions + * + * \defgroup group_ort_function_cpu_inference Kernel: ORT Inference + * \ingroup group_all_kernels + * \brief An ONNX Runtime Inference Implementation + * + * \defgroup group_ai_function_chatbot Kernel: AI Chatbot + * \ingroup group_all_kernels + * + * \defgroup group_litert_function_cpu_inference Kernel: LiteRT Inference + * \ingroup group_all_kernels + * \brief A LiteRT (Formerly TFLite) Inference Implementation + * + * \defgroup group_torch_function_cpu_inference Kernel: Executorch Inference + * \ingroup group_all_kernels + * \brief An Executorch Inference Implementation + */ #ifdef __cplusplus #include @@ -21,6 +199,8 @@ * \ingroup group_basic_features */ using vx_string = std::string; +#else +typedef vx_char* vx_string; #endif /* __cplusplus */ /*! \brief The type enumeration lists additional types to extend the known types in OpenVX. @@ -40,30 +220,45 @@ enum vx_vendor_id_ext_e }; /*! \brief Define Edge AI Kernels - * \ingroup group_kernel + * \ingroup group_corevx_ext */ enum vx_kernel_ext_e { /*! * \brief The ONNX Runtime CPU Inference kernel. + * \param [in] vx_array The input char array. + * \param [in] vx_object_array The input tensor object array. + * \param [out] vx_object_array The output tensor object array. + * \see group_ort_function_cpu_inference */ VX_KERNEL_ORT_CPU_INF = VX_KERNEL_BASE(VX_ID_EDGE_AI, VX_LIBRARY_KHR_BASE) + 0x1, /*! * \brief The AI Model Server Chatbot kernel. + * \param [in] vx_array The input char array. + * \param [out] vx_array The output char array. + * \see group_ai_function_chatbot */ VX_KERNEL_AIS_CHATBOT = VX_KERNEL_BASE(VX_ID_EDGE_AI, VX_LIBRARY_KHR_BASE) + 0x2, /*! * \brief The LiteRT CPU Inference kernel. + * \param [in] vx_array The input char array. + * \param [in] vx_object_array The input tensor object array. + * \param [out] vx_object_array The output tensor object array. + * \see group_litert_function_cpu_inference */ VX_KERNEL_LITERT_CPU_INF = VX_KERNEL_BASE(VX_ID_EDGE_AI, VX_LIBRARY_KHR_BASE) + 0x3, /*! * \brief The Torch CPU Inference kernel. + * \param [in] vx_array The input char array. + * \param [in] vx_object_array The input tensor object array. + * \param [out] vx_object_array The output tensor object array. + * \see group_torch_function_cpu_inference */ VX_KERNEL_TORCH_CPU_INF = VX_KERNEL_BASE(VX_ID_EDGE_AI, VX_LIBRARY_KHR_BASE) + 0x4, }; /*! \brief addtitional tensor attributes. - * \ingroup group_object_tensor + * \ingroup group_int_tensor */ enum vx_tensor_attribute_ext_e { diff --git a/include/VX/vx_helper.h b/include/VX/vx_helper.h index 0afea154..9d88c596 100644 --- a/include/VX/vx_helper.h +++ b/include/VX/vx_helper.h @@ -23,7 +23,8 @@ /*! \file * \brief The OpenVX Helper Library Interface. * - * \defgroup group_helper OpenVX Helper + * \defgroup group_helper Extension: OpenVX Helper + * \ingroup group_extensions * \brief The helper is an non-standardized set of convenience constructs for OpenVX. * \details These functions use only the OpenVX API in order to implement their * functionality. As such structures, objects, defines, typedefs and functions diff --git a/include/VX/vx_import.h b/include/VX/vx_import.h index 3ba736bb..4045d150 100644 --- a/include/VX/vx_import.h +++ b/include/VX/vx_import.h @@ -26,9 +26,9 @@ extern "C" { * and also part of the OpenVX SC deployment feature set. */ - /*! \brief An enumeration of export uses. See \ref vxExportObjectsToMemory and +/*! \brief An enumeration of export uses. See \ref vxExportObjectsToMemory and * \ref vxImportObjectsFromMemory - * \ingroup vx_enum_e + * \ingroup group_basic_features */ #define VX_ENUM_IX_USE 0x18 /*! \brief How to export and import an object diff --git a/include/VX/vx_kernels.h b/include/VX/vx_kernels.h index 6bb392d5..fc12edca 100644 --- a/include/VX/vx_kernels.h +++ b/include/VX/vx_kernels.h @@ -26,6 +26,125 @@ extern "C" { #endif +/*! + * \defgroup group_vision_function_colorconvert Kernel: Color Convert + * \ingroup group_all_kernels + * \defgroup group_vision_function_channelextract Kernel: Channel Extract + * \ingroup group_all_kernels + * \defgroup group_vision_function_channelcombine Kernel: Channel Combine + * \ingroup group_all_kernels + * \defgroup group_vision_function_sobel3x3 Kernel: Sobel 3x3 + * \ingroup group_all_kernels + * \defgroup group_vision_function_magnitude Kernel: Magnitude + * \ingroup group_all_kernels + * \defgroup group_vision_function_phase Kernel: Phase + * \ingroup group_all_kernels + * \defgroup group_vision_function_scale_image Kernel: Scale Image + * \ingroup group_all_kernels + * \defgroup group_vision_function_lut Kernel: Table Lookup + * \ingroup group_all_kernels + * \defgroup group_vision_function_histogram Kernel: Histogram + * \ingroup group_all_kernels + * \defgroup group_vision_function_equalize_hist Kernel: Equalize Histogram + * \ingroup group_all_kernels + * \defgroup group_vision_function_absdiff Kernel: Absolute Difference + * \ingroup group_all_kernels + * \defgroup group_vision_function_meanstddev Kernel: Mean and Standard Deviation + * \ingroup group_all_kernels + * \defgroup group_vision_function_threshold Kernel: Threshold + * \ingroup group_all_kernels + * \defgroup group_vision_function_integral_image Kernel: Integral Image + * \ingroup group_all_kernels + * \defgroup group_vision_function_dilate_image Kernel: Dilate 3x3 + * \ingroup group_all_kernels + * \defgroup group_vision_function_erode_image Kernel: Erode 3x3 + * \ingroup group_all_kernels + * \defgroup group_vision_function_median_image Kernel: Median 3x3 + * \ingroup group_all_kernels + * \defgroup group_vision_function_box_image Kernel: Box 3x3 + * \ingroup group_all_kernels + * \defgroup group_vision_function_gaussian_image Kernel: Gaussian 3x3 + * \ingroup group_all_kernels + * \defgroup group_vision_function_custom_convolution Kernel: Custom Convolution + * \ingroup group_all_kernels + * \defgroup group_vision_function_gaussian_pyramid Kernel: Gaussian Pyramid + * \ingroup group_all_kernels + * \defgroup group_vision_function_minmaxloc Kernel: MinMaxLoc + * \ingroup group_all_kernels + * \defgroup group_vision_function_convertdepth Kernel: Convert Depth + * \ingroup group_all_kernels + * \defgroup group_vision_function_canny Kernel: Canny Edge Detector + * \ingroup group_all_kernels + * \defgroup group_vision_function_and Kernel: Bitwise And + * \ingroup group_all_kernels + * \defgroup group_vision_function_or Kernel: Bitwise Or + * \ingroup group_all_kernels + * \defgroup group_vision_function_xor Kernel: Bitwise Xor + * \ingroup group_all_kernels + * \defgroup group_vision_function_not Kernel: Bitwise Not + * \ingroup group_all_kernels + * \defgroup group_vision_function_mult Kernel: Multiply + * \ingroup group_all_kernels + * \defgroup group_vision_function_add Kernel: Add + * \ingroup group_all_kernels + * \defgroup group_vision_function_sub Kernel: Subtract + * \ingroup group_all_kernels + * \defgroup group_vision_function_warp_affine Kernel: Warp Affine + * \ingroup group_all_kernels + * \defgroup group_vision_function_warp_perspective Kernel: Warp Perspective + * \ingroup group_all_kernels + * \defgroup group_vision_function_harris Kernel: Harris Corners + * \ingroup group_all_kernels + * \defgroup group_vision_function_fast Kernel: FAST Corners + * \ingroup group_all_kernels + * \defgroup group_vision_function_opticalflowpyrlk Kernel: Optical Flow PyrLK + * \ingroup group_all_kernels + * \defgroup group_vision_function_remap Kernel: Remap + * \ingroup group_all_kernels + * \defgroup group_vision_function_laplacian_pyramid Kernel: Laplacian Pyramid + * \ingroup group_all_kernels + * \defgroup group_vision_function_laplacian_reconstruct Kernel: Laplacian Reconstruct + * \ingroup group_all_kernels + * \defgroup group_vision_function_nonlinear_filter Kernel: Non Linear Filter + * \ingroup group_all_kernels + * \defgroup group_vision_function_match_template Kernel: Match Template + * \ingroup group_all_kernels + * \defgroup group_vision_function_lbp Kernel: LBP + * \ingroup group_all_kernels + * \defgroup group_vision_function_hough_lines_p Kernel: Hough Lines P + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_multiply Kernel: Tensor Multiply + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_add Kernel: Tensor Add + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_subtract Kernel: Tensor Subtract + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_tablelookup Kernel: Tensor Table Lookup + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_transpose Kernel: Tensor Transpose + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_convert_depth Kernel: Tensor Convert Depth + * \ingroup group_all_kernels + * \defgroup group_vision_function_tensor_matrix_multiply Kernel: Tensor Matrix Multiply + * \ingroup group_all_kernels + * \defgroup group_vision_function_copy Kernel: Copy + * \ingroup group_all_kernels + * \defgroup group_vision_function_nms Kernel: Non-Max Suppression + * \ingroup group_all_kernels + * \defgroup group_control_flow Kernel: Control Flow + * \ingroup group_all_kernels + * \defgroup group_vision_function_hog Kernel: HOG Features/Cells + * \ingroup group_all_kernels + * \defgroup group_vision_function_bilateral_filter Kernel: Bilateral Filter + * \ingroup group_all_kernels + * \defgroup group_vision_function_max Kernel: Max + * \ingroup group_all_kernels + * \defgroup group_vision_function_min Kernel: Min + * \ingroup group_all_kernels + * \defgroup group_vision_function_weighted_average Kernel: Weighted Average + * \ingroup group_all_kernels + */ + /*! * \brief The standard list of available libraries * \ingroup group_kernel @@ -47,7 +166,8 @@ enum vx_library_e { * \arg \ref VX_TYPE_IMAGE for a \ref vx_image in the size field of \ref vxGetParameterByIndex or \ref vxSetParameterByIndex * \arg \ref VX_TYPE_ARRAY for a \ref vx_array in the size field of \ref vxGetParameterByIndex or \ref vxSetParameterByIndex * \arg or other appropriate types in \ref vx_type_e. * \ingroup group_kernel */ -enum vx_kernel_e { +enum vx_kernel_e +{ /*! * \brief The Color Space conversion kernel. @@ -262,18 +382,18 @@ enum vx_kernel_e { /* kernel added in OpenVX 1.1 */ /*! \brief The Laplacian Image Pyramid Kernel. - * \see group_vision_function_laplacian_pyramid - */ + * \see group_vision_function_laplacian_pyramid + */ VX_KERNEL_LAPLACIAN_PYRAMID = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x2A, /*! \brief The Laplacian Pyramid Reconstruct Kernel. - * \see group_vision_function_laplacian_pyramid - */ + * \see group_vision_function_laplacian_reconstruct + */ VX_KERNEL_LAPLACIAN_RECONSTRUCT = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x2B, /*! \brief The Non Linear Filter Kernel. - * \see group_vision_function_nonlinear_filter - */ + * \see group_vision_function_nonlinear_filter + */ VX_KERNEL_NON_LINEAR_FILTER = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x2C, VX_KERNEL_MAX_1_1, /*!< \internal Used for VX1.1 bounds checking in the conformance test. */ @@ -281,99 +401,99 @@ enum vx_kernel_e { /* kernel added in OpenVX 1.2 */ /*! \brief The Match Template Kernel. - * \see group_vision_match_template - */ + * \see group_vision_function_match_template + */ VX_KERNEL_MATCH_TEMPLATE = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x2D, /*! \brief The LBP Kernel. - * \see group_lbp - */ + * \see group_vision_function_lbp + */ VX_KERNEL_LBP = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x2E, /*! \brief The hough lines probability Kernel. - * \see group_vision_hough_lines_p - */ + * \see group_vision_function_hough_lines_p + */ VX_KERNEL_HOUGH_LINES_P = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x2F, /*! \brief The tensor multiply Kernel. - * \see group_vision_function_tensor_multiply - */ + * \see group_vision_function_tensor_multiply + */ VX_KERNEL_TENSOR_MULTIPLY = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x30, /*! \brief The tensor add Kernel. - * \see group_vision_function_tensor_add - */ + * \see group_vision_function_tensor_add + */ VX_KERNEL_TENSOR_ADD = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x31, /*! \brief The tensor subtract Kernel. - * \see group_vision_function_tensor_subtract - */ + * \see group_vision_function_tensor_subtract + */ VX_KERNEL_TENSOR_SUBTRACT = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x32, /*! \brief The tensor table look up Kernel. - * \see group_vision_function_tensor_tablelookup - */ + * \see group_vision_function_tensor_tablelookup + */ VX_KERNEL_TENSOR_TABLE_LOOKUP = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x33, /*! \brief The tensor transpose Kernel. - * \see group_vision_function_tensor_transpose - */ + * \see group_vision_function_tensor_transpose + */ VX_KERNEL_TENSOR_TRANSPOSE = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x34, /*! \brief The tensor convert depth Kernel. - * \see group_vision_function_tensor_convert_depth - */ + * \see group_vision_function_tensor_convert_depth + */ VX_KERNEL_TENSOR_CONVERT_DEPTH = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x35, /*! \brief The tensor matrix multiply Kernel. - * \see group_vision_function_tensor_matrix_multiply - */ + * \see group_vision_function_tensor_matrix_multiply + */ VX_KERNEL_TENSOR_MATRIX_MULTIPLY = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x36, /*! \brief The data object copy kernel. - * \see group_vision_function_copy - */ + * \see group_vision_function_copy + */ VX_KERNEL_COPY = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x37, /*! \brief The non-max suppression kernel. - * \see group_vision_function_nms - */ + * \see group_vision_function_nms + */ VX_KERNEL_NON_MAX_SUPPRESSION = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x38, /*! \brief The scalar operation kernel. - * \see group_control_flow - */ + * \see group_control_flow + */ VX_KERNEL_SCALAR_OPERATION = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x39, /*! \brief The HOG features kernel. - * \see group_vision_function_hog - */ + * \see group_vision_function_hog + */ VX_KERNEL_HOG_FEATURES = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x3A, /*! \brief The HOG Cells kernel. - * \see group_vision_function_hog - */ + * \see group_vision_function_hog + */ VX_KERNEL_HOG_CELLS = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x3B, /*! \brief The bilateral filter kernel. - * \see group_vision_function_bilateral_filter - */ + * \see group_vision_function_bilateral_filter + */ VX_KERNEL_BILATERAL_FILTER = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x3C, /*! \brief The select kernel. - * \see group_control_flow - */ + * \see group_control_flow + */ VX_KERNEL_SELECT = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x3D, /* insert new kernels here */ VX_KERNEL_MAX_1_2, /*!< \internal Used for VX1.2 bounds checking in the conformance test. */ /*! \brief The max kernel. - * \see group_vision_function_max - */ + * \see group_vision_function_max + */ VX_KERNEL_MAX = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x3E, /*! \brief The min kernel. - * \see group_vision_function_min - */ + * \see group_vision_function_min + */ VX_KERNEL_MIN = VX_KERNEL_BASE(VX_ID_KHRONOS, VX_LIBRARY_KHR_BASE) + 0x3F, /*! \brief The weigthed average kernel. diff --git a/include/VX/vx_khr_buffer_aliasing.h b/include/VX/vx_khr_buffer_aliasing.h index 9c90f9cd..500a1455 100644 --- a/include/VX/vx_khr_buffer_aliasing.h +++ b/include/VX/vx_khr_buffer_aliasing.h @@ -19,6 +19,8 @@ /*! * \file + * \defgroup group_buffer_aliasing Extension: Buffer Aliasing API + * \ingroup group_extensions * \brief The OpenVX User Kernel Buffer Aliasing extension API. */ @@ -66,29 +68,31 @@ enum vx_buffer_aliasing_processing_type_e { /*! \brief Notifies framework that the kernel supports buffer aliasing of specified parameters * * This is intended to be called from within the vx_publish_kernels_f callback, for applicable - * kernels in between the call to the \ref vxAddUserKernel function and the \ref vxFinalizeKernel(kernel) - * function for the corresponding kernel. + * kernels in between the call to the \ref vxAddUserKernel function and the \ref + * vxFinalizeKernel function for the corresponding kernel. * * If a kernel can not support buffer aliasing of its parameters (for in-place processing), * then it should not call this function. However, if a kernel can support buffer aliasing of - * a pair of its parameters, then it may call this function with the appropriate parameter indices and - * priority value. + * a pair of its parameters, then it may call this function with the appropriate parameter indices + * and priority value. * * Note that calling this function does not guarantee that the buffers will ultimatly be aliased by * the framework. The framework may consider this hint as part of performance or memory optimization - * logic along with other factors such as graph topology, other competing hints, and if the parameters - * are virtual objects or not. + * logic along with other factors such as graph topology, other competing hints, and if the + * parameters are virtual objects or not. * * \param [in] kernel Kernel reference * \param [in] parameter_index_a Index of a kernel parameter to request for aliasing - * \param [in] parameter_index_b Index of another kernel paramter to request to alias with parameter_index_a + * \param [in] parameter_index_b Index of another kernel paramter to request to alias with + * parameter_index_a * \param [in] processing_type Indicate the type of processing on this buffer from the kernel * (See \ref vx_buffer_aliasing_processing_type_e) * * \return A \ref vx_status_e enumeration. * \retval VX_SUCCESS No errors. * \retval VX_ERROR_INVALID_REFERENCE kernel is not a valid reference - * \retval VX_ERROR_INVALID_PARAMETERS parameter_index_a or parameter_index_b is NOT a valid kernel parameter index + * \retval VX_ERROR_INVALID_PARAMETERS parameter_index_a or parameter_index_b is NOT a valid kernel + * parameter index * \retval VX_FAILURE priority is not a supported enumeration value. * * \ingroup group_buffer_aliasing diff --git a/include/VX/vx_khr_class.h b/include/VX/vx_khr_class.h index 6e88bf34..cd70ebce 100644 --- a/include/VX/vx_khr_class.h +++ b/include/VX/vx_khr_class.h @@ -18,9 +18,14 @@ #define _VX_KHR_CLASSIFIER_H_ /*! - * \file - * \brief The Khronos Extension for general classification. + * \file vx_khr_class.h + * \defgroup group_classifier Extension: General Classification + * \ingroup group_extensions + * \brief The Khronos Extension for General Classification. * + * \defgroup group_object_classifier_model Classifier Model + * \ingroup group_classifier + * \defgroup group_vision_function_classifier Kernel: Classifier */ #define OPENVX_KHR_CLASS "vx_khr_class" @@ -102,33 +107,43 @@ VX_API_ENTRY vx_classifier_model VX_API_CALL vxImportClassifierModel(vx_context * count is zero. After returning from this function the reference is zeroed/cleared. * \param [in] model The pointer to the ClassifierModel to release. * \return A \ref vx_status_e enumeration. - * \retval \ref VX_SUCCESS No errors; all other values indicate failure - * \retval * An error occurred. See vx_status_e. + * \retval VX_SUCCESS No errors; all other values indicate failure + * \retval An error occurred. See \ref vx_status_e. * \ingroup group_object_classifier_model */ VX_API_ENTRY vx_status VX_API_CALL vxReleaseClassifierModel(vx_classifier_model* model); -/*! \brief [Graph] Scans a feature-map (input_feature_map) and detect the classification for each scan-window. +/*! \brief [Graph] Scans a feature-map (input_feature_map) and detect the classification for each + * scan-window. * \param [in] graph The reference to the graph - * \param [in] input_feature_map The Feature-map, example is the output of \ref vxHOGFeaturesNode. - * \param [in] model The pre-trained model loaded. Loaded using \ref vxImportClassifierModel + * \param [in] input_feature_map The Feature-map, example is the output of \ref + * vxHOGFeaturesNode. + * \param [in] model The pre-trained model loaded. Loaded using \ref + * vxImportClassifierModel * \param [in] scan_window_width Width of the scan window * \param [in] scan_window_height Height of the scan window * \param [in] step_x Horizontal step-size (along x-axis) * \param [in] step_y Vertical step-size (along y-axis) - * \param [out] object_confidences [Optional] An array of confidences measure, the measure is of type \ref VX_TYPE_UINT16. The confidence measure is defined by the extensions which define classification model with defined binary format. - * This output can be used as class index as well. In case we detect several different classes in single execution. The output will be an array of indexes of the classes. + * \param [out] object_confidences [Optional] An array of confidences measure, the measure is of + * type \ref VX_TYPE_UINT16. The confidence measure is defined by the extensions which + * define classification model with defined binary format. This output can be used as class index as + * well. In case we detect several different classes in single execution. The output will be an + * array of indexes of the classes. * \param [out] object_rectangles An array of object positions, in \ref VX_TYPE_RECTANGLE - * \param [out] num_objects [optional] The number of object detected in a \ref VX_SIZE scalar - * \note The border mode \ref VX_NODE_BORDER value \ref VX_BORDER_UNDEFINED is supported. + * \param [out] num_objects [optional] The number of object detected in a \ref vx_size + * scalar + * \note The border mode \ref VX_NODE_BORDER value \ref VX_BORDER_UNDEFINED is + * supported. * \ingroup group_vision_function_classifier * \return \ref vx_node. - * \retval vx_node A node reference. Any possible errors preventing a successful creation should be checked using \ref vxGetStatus + * \retval vx_node A node reference. Any possible errors preventing a successful creation should be + * checked using \ref vxGetStatus */ -VX_API_ENTRY vx_node VX_API_CALL vxScanClassifierNode(vx_graph graph,vx_tensor input_feature_map, vx_classifier_model model, vx_int32 scanwindow_width, vx_int32 scanwindow_height, vx_int32 step_x, vx_int32 step_y, - vx_array object_confidences, vx_array object_rectangles, vx_scalar num_objects); - +VX_API_ENTRY vx_node VX_API_CALL vxScanClassifierNode( + vx_graph graph, vx_tensor input_feature_map, vx_classifier_model model, + vx_int32 scan_window_width, vx_int32 scan_window_height, vx_int32 step_x, vx_int32 step_y, + vx_array object_confidences, vx_array object_rectangles, vx_scalar num_objects); #ifdef __cplusplus } diff --git a/include/VX/vx_khr_dot.h b/include/VX/vx_khr_dot.h index 9912e7b5..581a517c 100644 --- a/include/VX/vx_khr_dot.h +++ b/include/VX/vx_khr_dot.h @@ -30,7 +30,7 @@ extern "C" { * \param [in] showData If true, data objects will be listed in the graph too. * \see http://www.graphviz.com */ -vx_status vxExportGraphToDot(vx_graph g, vx_char dotfile[], vx_bool showData); +vx_status vxExportGraphToDot(vx_graph graph, vx_char dotfile[], vx_bool showData); #ifdef __cplusplus } diff --git a/include/VX/vx_khr_icd.h b/include/VX/vx_khr_icd.h index d95e32f7..1ba7634e 100644 --- a/include/VX/vx_khr_icd.h +++ b/include/VX/vx_khr_icd.h @@ -15,9 +15,12 @@ */ /*! \file - * \defgroup group_icd OpenVX ICD Loader API + * \defgroup group_icd Extension: OpenVX ICD Loader API + * \ingroup group_extensions * \brief The OpenVX Installable Client Driver (ICD) Loader API. - * \details The vx_khr_icd extension provides a mechanism for vendors to implement Installable Client Driver (ICD) for OpenVX. The OpenVX ICD Loader API provides a mechanism for applications to access these vendor implementations. + * \details The vx_khr_icd extension provides a mechanism for vendors to implement Installable + * Client Driver (ICD) for OpenVX. The OpenVX ICD Loader API provides a mechanism for applications + * to access these vendor implementations. */ #ifndef _VX_KHR_ICD_H_ diff --git a/include/VX/vx_khr_interp.h b/include/VX/vx_khr_interp.h index fc6184f6..87bb005a 100644 --- a/include/VX/vx_khr_interp.h +++ b/include/VX/vx_khr_interp.h @@ -16,8 +16,11 @@ #ifndef _VX_KHR_INTERP_H_ #define _VX_KHR_INTERP_H_ -/*! \brief The Interpolation Type Query Extension. - * \file +/*! + * \file vx_khr_interp.h + * \defgroup group_interp_ext Extension: Interpolation Type Query + * \ingroup group_extensions + * \brief The Interpolation Type Query Extension. */ #define OPENVX_KHR_INTERP "vx_khr_interpolation" @@ -25,10 +28,15 @@ #include /*! \brief Additional interpolation types */ -enum vx_interpolation_type_ext_e { - /*! \brief Bicubic interpolation method */ +enum vx_interpolation_type_ext_e +{ + /*! \brief Bicubic interpolation method + * \see group_interp_ext + */ VX_INTERPOLATION_BICUBIC = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_INTERPOLATION) + 0x3, - /*! \brief Mipmapping interpolation method */ + /*! \brief Mipmapping interpolation method + * \see group_interp_ext + */ VX_INTERPOLATION_MIPMAP = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_INTERPOLATION) + 0x4, }; diff --git a/include/VX/vx_khr_nn.h b/include/VX/vx_khr_nn.h index 707c3298..9af5bd88 100644 --- a/include/VX/vx_khr_nn.h +++ b/include/VX/vx_khr_nn.h @@ -22,6 +22,7 @@ * \brief The Khronos Extension for Deep Convolutional Networks Functions. * * \defgroup group_cnn Extension: Deep Convolutional Networks API + * \ingroup group_extensions * \brief Convolutional Network Nodes. */ @@ -214,36 +215,53 @@ typedef struct _vx_nn_roi_pool_params_t =============================================================================*/ /*! \brief [Graph] Creates a Convolutional Network Convolution Layer Node. * \details This function implement Convolutional Network Convolution layer. - * For fixed-point data types, a fixed point calculation is performed with round and saturate according to the number of accumulator bits. The number of the accumulator bits are implementation defined, - * and should be at least 16.\n - * round: rounding according the vx_round_policy_e enumeration. \n - * saturate: A saturation according the vx_convert_policy_e enumeration. - * The following equation is implemented: \n - * \f$ outputs[j,k,i] = saturate(round(\sum_{l} (\sum_{m,n} inputs[j+m,k+n,l] \times weights[m,n,l,i])+biasses[j,k,i])) \f$\n - * Where \f$m,n\f$ are indexes on the convolution matrices. \f$ l\f$ is an index on all the convolutions per input.\f$ i\f$ is an index per output. + * For fixed-point data types, a fixed point calculation is performed with round and saturate + * according to the number of accumulator bits. The number of the accumulator bits are + * implementation defined, and should be at least 16.\n round: rounding according the + * vx_round_policy_e enumeration. \n saturate: A saturation according the + * vx_convert_policy_e enumeration. The following equation is implemented: \n + * \f$ outputs[j,k,i] = saturate(round(\sum_{l} (\sum_{m,n} inputs[j+m,k+n,l] \times + * weights[m,n,l,i])+biasses[j,k,i])) \f$\n Where \f$m,n\f$ are indexes on the convolution matrices. + * \f$ l\f$ is an index on all the convolutions per input.\f$ i\f$ is an index per output. * \f$ j,k \f$ are the inputs/outputs spatial indexes. - * Convolution is done on the width and height dimensions of the \ref vx_tensor. Therefore, we use here the term x for index along the width dimension and y for index along the height dimension.\n - * before the Convolution is done, a padding with zeros of the width and height input dimensions is performed. - * Then down scale is done by picking the results according to a skip jump. The skip in the x and y is determined by the output size dimensions. - * The relation between input to output is as follows: \n - * \f$ width_{output} = round(\frac{(width_{input} + 2 * padding_x - kernel_x - (kernel_x -1) * dilation_x)}{skip_x} + 1) \f$\n - * and \n - * \f$ height_{output} = round(\frac{(height + 2 * padding_y - kernel_y - (kernel_y -1) * dilation_y)}{skip_y} + 1) \f$\n - * where \f$width\f$ is the size of the input width dimension. \f$height\f$ is the size of the input height dimension. - * \f$width_{output}\f$ is the size of the output width dimension. \f$height_{output}\f$ is the size of the output height dimension. + * Convolution is done on the width and height dimensions of the \ref vx_tensor. Therefore, + * we use here the term x for index along the width dimension and y for index along the height + * dimension.\n before the Convolution is done, a padding with zeros of the width and height input + * dimensions is performed. Then down scale is done by picking the results according to a skip jump. + * The skip in the x and y is determined by the output size dimensions. The relation between input + * to output is as follows: \n + * \f$ width_{output} = round(\frac{(width_{input} + 2 * padding_x - kernel_x - (kernel_x -1) * + * dilation_x)}{skip_x} + 1) \f$\n and \n + * \f$ height_{output} = round(\frac{(height + 2 * padding_y - kernel_y - (kernel_y -1) * + * dilation_y)}{skip_y} + 1) \f$\n where \f$width\f$ is the size of the input width dimension. + * \f$height\f$ is the size of the input height dimension. + * \f$width_{output}\f$ is the size of the output width dimension. \f$height_{output}\f$ is the size + * of the output height dimension. * \f$kernel_x\f$ and \f$kernel_y\f$ are the convolution sizes in width and height dimensions. - * skip is calculated by the relation between input and output. In case of ambiguity in the inverse calculation of the skip. The minimum solution is chosen. Skip must be a positive non zero integer. - * rounding is done according to \ref vx_nn_rounding_type_e. - * Notice that this node creation function has more parameters than the corresponding kernel. Numbering of kernel parameters (required if you create this node using the generic interface) is explicitly specified here. + * skip is calculated by the relation between input and output. In case of ambiguity in the inverse + * calculation of the skip. The minimum solution is chosen. Skip must be a positive non zero + * integer. rounding is done according to \ref vx_nn_rounding_type_e. Notice that this node + * creation function has more parameters than the corresponding kernel. Numbering of kernel + * parameters (required if you create this node using the generic interface) is explicitly specified + * here. * \param [in] graph The handle to the graph. - * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, all following dimensions represent number of batches, possibly nested. - * The dimension order is [width, height, #IFM, #batches]\n. Implementations must support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. (Kernel parameter #0) - * \param [in] weights [static] Weights are 4d tensor with dimensions [kernel_x, kernel_y, #IFM, #OFM]. see \ref vxCreateTensor and \ref vxCreateVirtualTensor \n Weights data type must match the data type of the inputs. (Kernel parameter #1) - * \param [in] biases [static] Optional, ignored if NULL. The biases, which may be shared (one per ofm) or unshared (one per ofm * output location). The possible layouts are - * either [#OFM] or [width, height, #OFM]. Biases data type must match the data type of the inputs. (Kernel parameter #2) - * \param [in] convolution_params [static] Pointer to parameters of type \ref vx_nn_convolution_params_t. (Kernel parameter #3) - * \param [in] size_of_convolution_params [static] Size in bytes of convolution_params. Note that this parameter is not counted as one of the kernel parameters. - * \param [out] outputs The output tensor data. Output will have the same number and structure of dimensions as input. Output tensor data type must be same as the inputs. (Kernel parameter #4) + * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, all + * following dimensions represent number of batches, possibly nested. The dimension order is [width, + * height, IFM, batches]\n. Implementations must support input tensor data types indicated by the + * extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. (Kernel parameter #0) + * \param [in] weights [static] Weights are 4d tensor with dimensions [kernel_x, kernel_y, IFM, + * OFM]. see \ref vxCreateTensor and \ref vxCreateVirtualTensor \n Weights data + * type must match the data type of the inputs. (Kernel parameter #1) + * \param [in] biases [static] Optional, ignored if NULL. The biases, which may be shared (one per + * ofm) or unshared (one per ofm * output location). The possible layouts are either [OFM] or + * [width, height, OFM]. Biases data type must match the data type of the inputs. (Kernel + * parameter #2) + * \param [in] convolution_params [static] Pointer to parameters of type \ref + * vx_nn_convolution_params_t. (Kernel parameter #3) + * \param [in] size_of_convolution_params [static] Size in bytes of convolution_params. Note that + * this parameter is not counted as one of the kernel parameters. + * \param [out] outputs The output tensor data. Output will have the same number and structure of + * dimensions as input. Output tensor data type must be same as the inputs. (Kernel parameter #4) * \return vx_node. * \returns A node reference \ref vx_node. Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. @@ -253,25 +271,35 @@ VX_API_ENTRY vx_node VX_API_CALL vxConvolutionLayer(vx_graph graph, vx_tensor in /*! \brief [Graph] Creates a Fully connected Convolutional Network Layer Node. * \details This function implement Fully connected Convolutional Network layers. - * For fixed-point data types, a fixed point calculation is performed with round and saturate according to the number of accumulator bits. The number of the accumulator bits are implementation defined, - * and should be at least 16.\n - * round: rounding according the vx_round_policy_e enumeration. \n - * saturate: A saturation according the vx_convert_policy_e enumeration. - * The equation for Fully connected layer:\n + * For fixed-point data types, a fixed point calculation is performed with round and saturate + * according to the number of accumulator bits. The number of the accumulator bits are + * implementation defined, and should be at least 16.\n round: rounding according the + * vx_round_policy_e enumeration. \n saturate: A saturation according the + * vx_convert_policy_e enumeration. The equation for Fully connected layer:\n * \f$ outputs[i] = saturate(round(\sum_{j} (inputs[j] \times weights[j,i])+biasses[i])) \f$\n * Where \f$j\f$ is a index on the input feature and \f$i\f$ is a index on the output. * \param [in] graph The handle to the graph. * \param [in] inputs The input tensor data. There two possible input layouts: - * 1. [#IFM, #batches]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor. - * 2. [width, height, #IFM, #batches]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor\n - * In both cases number of batches are optional and may be multidimensional. - * The second option is a special case to deal with convolution layer followed by fully connected. - * The dimension order is [#IFM, #batches]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor. Note that batch may be multidimensional. Implementations must support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. - * \param [in] weights [static] Number of dimensions is 2. Dimensions are [#IFM, #OFM]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor.\n Implementations must support input tensor data type same as the inputs. - * \param [in] biases [static] Optional, ignored if NULL. The biases have one dimension [#OFM]. Implementations must support input tensor data type same as the inputs. - * \param [in] overflow_policy [static] A VX_TYPE_ENUM of the vx_convert_policy_e enumeration. - * \param [in] rounding_policy [static] A VX_TYPE_ENUM of the vx_round_policy_e enumeration. - * \param [out] outputs The output tensor data. Output dimension layout is [#OFM,#batches]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor, where #batches may be multidimensional. Output tensor data type must be same as the inputs. + * 1. [IFM, batches]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor. + * 2. [width, height, IFM, batches]. See \ref vxCreateTensor and \ref + * vxCreateVirtualTensor\n In both cases number of batches are optional and may be + * multidimensional. The second option is a special case to deal with convolution layer followed by + * fully connected. The dimension order is [IFM, batches]. See \ref vxCreateTensor and + * \ref vxCreateVirtualTensor. Note that batch may be multidimensional. Implementations + * must support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 + * KHR_NN_16'. + * \param [in] weights [static] Number of dimensions is 2. Dimensions are [IFM, OFM]. See \ref + * vxCreateTensor and \ref vxCreateVirtualTensor.\n Implementations must support input + * tensor data type same as the inputs. + * \param [in] biases [static] Optional, ignored if NULL. The biases have one dimension [OFM]. + * Implementations must support input tensor data type same as the inputs. + * \param [in] overflow_policy [static] A VX_TYPE_ENUM of the + * vx_convert_policy_e enumeration. + * \param [in] rounding_policy [static] A VX_TYPE_ENUM of the vx_round_policy_e + * enumeration. + * \param [out] outputs The output tensor data. Output dimension layout is [OFM,batches]. See + * \ref vxCreateTensor and \ref vxCreateVirtualTensor, where batches may be + * multidimensional. Output tensor data type must be same as the inputs. * \return vx_node. * \returns A node reference \ref vx_node. Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. @@ -279,26 +307,30 @@ VX_API_ENTRY vx_node VX_API_CALL vxConvolutionLayer(vx_graph graph, vx_tensor in */ VX_API_ENTRY vx_node VX_API_CALL vxFullyConnectedLayer(vx_graph graph, vx_tensor inputs, vx_tensor weights, vx_tensor biases, vx_enum overflow_policy, vx_enum rounding_policy, vx_tensor outputs); - /*! \brief [Graph] Creates a Convolutional Network Pooling Layer Node. - * \details Pooling is done on the width and height dimensions of the \ref vx_tensor. Therefore, we use here the term x for the width dimension and y for the height dimension.\n - * Pooling operation is a function operation over a rectangle size and then a nearest neighbour down scale. - * Here we use pooling_size_x and pooling_size_y to specify the rectangle size on which the operation - * is performed. \n - * before the operation is done (average or maximum value). the data is padded with zeros in width and height dimensions . - * The down scale is done by picking the results according to a skip jump. The skip in the x and y dimension is determined by the output size dimensions. - * The first pixel of the down scale output is the first pixel in the input. + * \details Pooling is done on the width and height dimensions of the \ref vx_tensor. + * Therefore, we use here the term x for the width dimension and y for the height dimension.\n + * Pooling operation is a function operation over a rectangle size and then a nearest neighbour down + * scale. Here we use pooling_size_x and pooling_size_y to specify the rectangle size on which the + * operation is performed. \n before the operation is done (average or maximum value). the data is + * padded with zeros in width and height dimensions . The down scale is done by picking the results + * according to a skip jump. The skip in the x and y dimension is determined by the output size + * dimensions. The first pixel of the down scale output is the first pixel in the input. * \param [in] graph The handle to the graph. - * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, 4th dimension for batch of inputs is optional.Dimension layout is [width, height, #IFM, #batches]. - * See \ref vxCreateTensor and \ref vxCreateVirtualTensor - * Implementations must support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. - * \param [in] pooling_type [static] Either max pooling or average pooling (see \ref vx_nn_pooling_type_e). + * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, 4th + * dimension for batch of inputs is optional.Dimension layout is [width, height, IFM, batches]. See + * \ref vxCreateTensor and \ref vxCreateVirtualTensor Implementations must support + * input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. + * \param [in] pooling_type [static] Either max pooling or average pooling (see \ref + * vx_nn_pooling_type_e). * \param [in] pooling_size_x [static] Size of the pooling region in the x dimension * \param [in] pooling_size_y [static] Size of the pooling region in the y dimension. * \param [in] pooling_padding_x [static] Padding size in the x dimension. * \param [in] pooling_padding_y [static] Padding size in the y dimension. - * \param [in] rounding [static] Rounding method for calculating output dimensions. See \ref vx_nn_rounding_type_e - * \param [out] outputs The output tensor data. Output will have the same number of dimensions as input. Output tensor data type must be same as the inputs. + * \param [in] rounding [static] Rounding method for calculating output dimensions. See \ref + * vx_nn_rounding_type_e + * \param [out] outputs The output tensor data. Output will have the same number of dimensions as + * input. Output tensor data type must be same as the inputs. * \return vx_node. * \returns A node reference \ref vx_node. Any possible errors preventing a * successful creation should be checked using \ref vxGetStatus. @@ -333,20 +365,30 @@ VX_API_ENTRY vx_node VX_API_CALL vxPoolingLayer(vx_graph graph, vx_tensor inputs VX_API_ENTRY vx_node VX_API_CALL vxSoftmaxLayer(vx_graph graph, vx_tensor inputs, vx_tensor outputs); -/*! \brief [Graph] Creates a Convolutional Network Local Response Normalization Layer Node. This function is optional for 8-bit extension with the extension string 'KHR_NN_8'. - * \details Normalizing over local input regions. Each input value is divided by \f$ (\bias+\frac{\alpha}{n}\sum_i x^2_i)^\beta \f$ , where n is the number of elements to normalize across. - * and the sum is taken over a rectangle region centred at that value (zero padding is added where necessary). +/*! \brief [Graph] Creates a Convolutional Network Local Response Normalization Layer Node. This + * function is optional for 8-bit extension with the extension string 'KHR_NN_8'. + * \details Normalizing over local input regions. Each input value is divided by \f$ + * (\bias+\frac{\alpha}{n}\sum_i x^2_i)^\beta \f$ , where n is the number of elements to normalize + * across. and the sum is taken over a rectangle region centred at that value (zero padding is added + * where necessary). * \param [in] graph The handle to the graph. - * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, 4th dimension for batch of inputs is optional. Dimension layout is [width, height, IFM, #batches]. - * See \ref vxCreateTensor and \ref vxCreateVirtualTensor. - * Implementations must support input tensor data types indicated by the extension strings 'KHR_NN_8 KHR_NN_16'. - * Since this function is optional for 'KHR_NN_8', so implementations only must support VX_TYPE_INT16 with fixed_point_position 8. + * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, 4th + * dimension for batch of inputs is optional. Dimension layout is [width, height, IFM, batches]. See + * \ref vxCreateTensor and \ref vxCreateVirtualTensor. Implementations must + * support input tensor data types indicated by the extension strings 'KHR_NN_8 KHR_NN_16'. Since + * this function is optional for 'KHR_NN_8', so implementations only must support + * VX_TYPE_INT16 with fixed_point_position 8. * \param [in] type [static] Either same map or across maps (see \ref vx_nn_norm_type_e). - * \param [in] normalization_size [static] Number of elements to normalize across. Must be a positive odd number with maximum size of 7 and minimum of 3. - * \param [in] alpha [static] Alpha parameter in the local response normalization equation. must be positive. - * \param [in] beta [static] Beta parameter in the local response normalization equation. must be positive. - * \param [in] bias [static] Bias parameter in the local response normalization equation. must be positive. - * \param [out] outputs The output tensor data. Output will have the same number of dimensions as input. + * \param [in] normalization_size [static] Number of elements to normalize across. Must be a + * positive odd number with maximum size of 7 and minimum of 3. + * \param [in] alpha [static] Alpha parameter in the local response normalization equation. must be + * positive. + * \param [in] beta [static] Beta parameter in the local response normalization equation. must be + * positive. + * \param [in] bias [static] Bias parameter in the local response normalization equation. must be + * positive. + * \param [out] outputs The output tensor data. Output will have the same number of dimensions as + * input. * \ingroup group_cnn * \return vx_node. * \returns A node reference \ref vx_node. Any possible errors preventing a @@ -378,19 +420,30 @@ VX_API_ENTRY vx_node VX_API_CALL vxLocalResponseNormalizationLayer(vx_graph grap VX_API_ENTRY vx_node VX_API_CALL vxActivationLayer(vx_graph graph, vx_tensor inputs, vx_enum function, vx_float32 a,vx_float32 b, vx_tensor outputs); /*! \brief [Graph] Creates a Convolutional Network ROI pooling node - * \details Pooling is done on the width and height dimensions of the \ref vx_tensor. The ROI Pooling get an array of roi rectangles, and an input tensor. - * The kernel crop the width and height dimensions of the input tensor with the ROI rectangles and down scale the result to the size of the output tensor. The output tensor width and height are the pooled width and pooled height. - * The down scale method is determined by the pool_type. - * Notice that this node creation function has more parameters than the corresponding kernel. Numbering of kernel parameters (required if you create this node using the generic interface) is explicitly specified here. + * \details Pooling is done on the width and height dimensions of the \ref vx_tensor. The + * ROI Pooling get an array of roi rectangles, and an input tensor. The kernel crop the width and + * height dimensions of the input tensor with the ROI rectangles and down scale the result to the + * size of the output tensor. The output tensor width and height are the pooled width and pooled + * height. The down scale method is determined by the pool_type. Notice that this node creation + * function has more parameters than the corresponding kernel. Numbering of kernel parameters + * (required if you create this node using the generic interface) is explicitly specified here. * \param [in] graph The handle to the graph. - * \param [in] inputs The input tensor data. 3 lower dimensions represent a single input, 4th dimension for batch of inputs is optional. Dimension layout is [width, height, #IFM, #batches]. - * See \ref vxCreateTensor and \ref vxCreateVirtualTensor. - * Implementations must support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. (Kernel parameter #0) - * \param [in] inputs_rois The roi array tensor. ROI array with dimensions [4, roi_count, #batches] where the first dimension represents 4 coordinates of the top left and bottom right corners of the roi rectangles, based on the input tensor width and height. - * #batches is optional and must be the same as in inputs. roi_count is the number of ROI rectangles. (Kernel parameter #1) - * \param [in] pool_type [static] Of type \ref vx_nn_pooling_type_e. Only \ref VX_NN_POOLING_MAX pooling is supported. (Kernel parameter #2) - * \param [in] size_of_roi_params [static] Size in bytes of roi_pool_params. Note that this parameter is not counted as one of the kernel parameters. - * \param [out] output_arr The output tensor. Output will have [output_width, output_height, #IFM, #batches] dimensions. #batches is optional and must be the same as in inputs. (Kernel parameter #3) + * \param [in] input_data The input tensor data. 3 lower dimensions represent a single input, 4th + * dimension for batch of inputs is optional. Dimension layout is [width, height, IFM, batches]. See + * \ref vxCreateTensor and \ref vxCreateVirtualTensor. Implementations must + * support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 + * KHR_NN_16'. (Kernel parameter #0) + * \param [in] input_rois The roi array tensor. ROI array with dimensions [4, roi_count, batches] + * where the first dimension represents 4 coordinates of the top left and bottom right corners of + * the roi rectangles, based on the input tensor width and height. batches is optional and must be + * the same as in inputs. roi_count is the number of ROI rectangles. (Kernel parameter #1) + * \param [in] roi_pool_params [static] Of type \ref vx_nn_pooling_type_e. Only \ref + * VX_NN_POOLING_MAX pooling is supported. (Kernel parameter #2) + * \param [in] size_of_roi_params [static] Size in bytes of roi_pool_params. Note that this + * parameter is not counted as one of the kernel parameters. + * \param [out] output_arr The output tensor. Output will have [output_width, output_height, IFM, + * batches] dimensions. batches is optional and must be the same as in inputs. (Kernel parameter + * #3) * \ingroup group_cnn * \return vx_node. * \returns A node reference \ref vx_node. Any possible errors preventing a @@ -398,46 +451,61 @@ VX_API_ENTRY vx_node VX_API_CALL vxActivationLayer(vx_graph graph, vx_tensor inp */ VX_API_ENTRY vx_node VX_API_CALL vxROIPoolingLayer(vx_graph graph, vx_tensor input_data, vx_tensor input_rois, const vx_nn_roi_pool_params_t *roi_pool_params, vx_size size_of_roi_params, vx_tensor output_arr); - /*! \brief [Graph] Creates a Convolutional Network Deconvolution Layer Node. - * \details Deconvolution denote a sort of reverse convolution, which importantly and confusingly is not actually a proper mathematical deconvolution. - * Convolutional Network Deconvolution is up-sampling of an image by learned Deconvolution coefficients. - * The operation is similar to convolution but can be implemented by up-sampling the inputs with zeros insertions between the inputs, - * and convolving the Deconvolution kernels on the up-sampled result. - * For fixed-point data types, a fixed point calculation is performed with round and saturate according to the number of accumulator bits. The number of the accumulator bits are implementation defined, - * and should be at least 16.\n - * round: rounding according the vx_round_policy_e enumeration. \n - * saturate: A saturation according the vx_convert_policy_e enumeration. - * The following equation is implemented: \n - * \f$ outputs[j,k,i] = saturate(round(\sum_{l} \sum_{m,n}(inputs_{upscaled}[j+m,k+n,l] \times weights[m,n,l,i])+biasses[j,k,i])) \f$\n - * Where \f$m,n\f$ are indexes on the convolution matrices. \f$ l\f$ is an index on all the convolutions per input.\f$ i\f$ is an index per output. + * \details Deconvolution denote a sort of reverse convolution, which importantly and confusingly + * is not actually a proper mathematical deconvolution. Convolutional Network Deconvolution is + * up-sampling of an image by learned Deconvolution coefficients. The operation is similar to + * convolution but can be implemented by up-sampling the inputs with zeros insertions between the + * inputs, and convolving the Deconvolution kernels on the up-sampled result. For fixed-point data + * types, a fixed point calculation is performed with round and saturate according to the number of + * accumulator bits. The number of the accumulator bits are implementation defined, and should be at + * least 16.\n round: rounding according the vx_round_policy_e enumeration. \n saturate: A + * saturation according the vx_convert_policy_e enumeration. The following equation is + * implemented: \n + * \f$ outputs[j,k,i] = saturate(round(\sum_{l} \sum_{m,n}(inputs_{upscaled}[j+m,k+n,l] \times + * weights[m,n,l,i])+biasses[j,k,i])) \f$\n Where \f$m,n\f$ are indexes on the convolution matrices. + * \f$ l\f$ is an index on all the convolutions per input.\f$ i\f$ is an index per output. * \f$ j,k \f$ are the inputs/outputs spatial indexes. - * Deconvolution is done on the width and height dimensions of the \ref vx_tensor. Therefore, we use here the term x for the width dimension and y for the height dimension.\n - * before the Deconvolution is done, up-scaling the width and height dimensions with zeros is performed. - * The relation between input to output is as follows: \n + * Deconvolution is done on the width and height dimensions of the \ref vx_tensor. + * Therefore, we use here the term x for the width dimension and y for the height dimension.\n + * before the Deconvolution is done, up-scaling the width and height dimensions with zeros is + * performed. The relation between input to output is as follows: \n * \f$ width_{output} = (width_{input} -1) * upscale_x - 2 * padding_x + kernel_x + a_x \f$\n * and \n * \f$ height_{output} = (height_{input} - 1) * upscale_y - 2 * padding_y + kernel_y + a_y \f$\n - * where \f$width_{input}\f$ is the size of the input width dimension. \f$height_{input}\f$ is the size of the input height dimension. - * \f$width_{output}\f$ is the size of the output width dimension. \f$height_{output}\f$ is the size of the output height dimension. - * \f$kernel_x\f$ and \f$kernel_y\f$ are the convolution sizes in width and height. \f$a_x\f$ and \f$a_y\f$ are user-specified quantity used to distinguish between the \f$upscale_x\f$ and \f$upscale_y\f$ different possible output sizes. + * where \f$width_{input}\f$ is the size of the input width dimension. \f$height_{input}\f$ is the + * size of the input height dimension. + * \f$width_{output}\f$ is the size of the output width dimension. \f$height_{output}\f$ is the size + * of the output height dimension. + * \f$kernel_x\f$ and \f$kernel_y\f$ are the convolution sizes in width and height. \f$a_x\f$ and + * \f$a_y\f$ are user-specified quantity used to distinguish between the \f$upscale_x\f$ and + * \f$upscale_y\f$ different possible output sizes. * \f$upscale_x\f$ and \f$upscale_y\f$ are calculated by the relation between input and output. - * \f$a_x\f$ and \f$a_y\f$ must be positive and smaller then \f$upscale_x\f$ and \f$upscale_y\f$ respectively. - * Since the padding parameter is on the output. The effective input padding is: \n + * \f$a_x\f$ and \f$a_y\f$ must be positive and smaller then \f$upscale_x\f$ and \f$upscale_y\f$ + * respectively. Since the padding parameter is on the output. The effective input padding is: \n * \f$ padding_{input_x} = kernel_x -padding_x -1\f$ \n * \f$ padding_{input_y} = kernel_y -padding_y -1\f$ \n - * Therfore the following constarints apply : \f$kernel_x >= padding_x - 1\f$ and \f$kernel_y >= padding_y - 1\f$. - * rounding is done according to \ref vx_nn_rounding_type_e. - * Notice that this node creation function has more parameters than the corresponding kernel. Numbering of kernel parameters (required if you create this node using the generic interface) is explicitly specified here. + * Therfore the following constarints apply : \f$kernel_x >= padding_x - 1\f$ and \f$kernel_y >= + * padding_y - 1\f$. rounding is done according to \ref vx_nn_rounding_type_e. Notice that + * this node creation function has more parameters than the corresponding kernel. Numbering of + * kernel parameters (required if you create this node using the generic interface) is explicitly + * specified here. * \param [in] graph The handle to the graph. - * \param [in] inputs The input tensor. 3 lower dimensions represent a single input, and an optional 4th dimension for batch of inputs. Dimension layout is [width, height, #IFM, #batches]. - * See \ref vxCreateTensor and \ref vxCreateVirtualTensor. - * Implementations must support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 KHR_NN_16'. (Kernel parameter #0) - * \param [in] weights [static] The 4d weights with dimensions [width, height, #IFM, #OFM]. See \ref vxCreateTensor and \ref vxCreateVirtualTensor. (Kernel parameter #1) - * \param [in] biases [static] Optional, ignored if NULL. The biases have one dimension [#OFM]. Implementations must support input tensor data type same as the inputs. (Kernel parameter #2) - * \param [in] deconvolution_params [static] Pointer to parameters of type \ref vx_nn_deconvolution_params_t (Kernel parameter #3) - * \param [in] size_of_deconv_params [static] Size in bytes of deconvolution_params. Note that this parameter is not counted as one of the kernel parameters. - * \param [out] outputs The output tensor. The output has the same number of dimensions as the input. (Kernel parameter #4) + * \param [in] inputs The input tensor. 3 lower dimensions represent a single input, and an optional + * 4th dimension for batch of inputs. Dimension layout is [width, height, IFM, batches]. See + * \ref vxCreateTensor and \ref vxCreateVirtualTensor. Implementations must + * support input tensor data types indicated by the extension strings 'KHR_NN_8' or 'KHR_NN_8 + * KHR_NN_16'. (Kernel parameter #0) + * \param [in] weights [static] The 4d weights with dimensions [width, height, IFM, OFM]. See + * \ref vxCreateTensor and \ref vxCreateVirtualTensor. (Kernel parameter #1) + * \param [in] biases [static] Optional, ignored if NULL. The biases have one dimension [OFM]. + * Implementations must support input tensor data type same as the inputs. (Kernel parameter #2) + * \param [in] deconvolution_params [static] Pointer to parameters of type \ref + * vx_nn_deconvolution_params_t (Kernel parameter #3) + * \param [in] size_of_deconv_params [static] Size in bytes of deconvolution_params. Note that this + * parameter is not counted as one of the kernel parameters. + * \param [out] outputs The output tensor. The output has the same number of dimensions as the + * input. (Kernel parameter #4) * \ingroup group_cnn * \return vx_node. * \returns A node reference \ref vx_node. Any possible errors preventing a diff --git a/include/VX/vx_khr_opencl.h b/include/VX/vx_khr_opencl.h index b36d0019..98eeda56 100644 --- a/include/VX/vx_khr_opencl.h +++ b/include/VX/vx_khr_opencl.h @@ -18,34 +18,44 @@ #include -/*! \file +/*! \file vx_khr_opencl.h + * \defgroup group_opencl_ext Extension: The OpenCL Extension + * \ingroup group_extensions * \brief The OpenVX to OpenCL Inter-op Extension Header. * * \defgroup group_cl_api API + * \ingroup group_opencl_ext * \brief The API used by Clients to add OpenCL Kernels as vx_kernel. * \details * - * \defgroup group_cl_def Extension Defines + * \defgroup group_cl_def OpenCL Extension Defines + * \ingroup group_opencl_ext * \brief The Extension defines and constants. * * \defgroup group_cl_image Images - * \brief OpenVX Images + * \ingroup group_opencl_ext + * \brief OpenCL backed OpenVX Images * \details Depending on whether the OpenCL implementation supports images, vx_image * may map to an image2d_t or a OpenCL buffer. * * \defgroup group_cl_array Arrays - * \brief OpenVX Arrays + * \ingroup group_opencl_ext + * \brief OpenCL backed OpenVX Arrays * * \defgroup group_cl_convolution Convolutions - * \brief OpenVX Convolutions + * \ingroup group_opencl_ext + * \brief OpenCL backed OpenVX Convolutions * * \defgroup group_cl_distribution Distributions - * \brief OpenVX Distributions + * \ingroup group_opencl_ext + * \brief OpenCL backed OpenVX Distributions * * \defgroup group_cl_matrix Matricies - * \brief OpenVX Matrix + * \ingroup group_opencl_ext + * \brief OpenCL backed OpenVX Matricies * * \defgroup group_cl_types OpenVX to OpenCL Atomic Types + * \ingroup group_opencl_ext * \brief Atomic Types * \details OpenVX types map to OpenCL types through this table: * | VX | OpenCL| diff --git a/include/VX/vx_khr_opencl_interop.h b/include/VX/vx_khr_opencl_interop.h index d0ad5f4f..35b1b1f0 100644 --- a/include/VX/vx_khr_opencl_interop.h +++ b/include/VX/vx_khr_opencl_interop.h @@ -25,7 +25,9 @@ #endif /*! - * \file + * \file vx_khr_opencl_interop.h + * \defgroup group_opencl_interop Extension: OpenCL Interoperability + * \ingroup group_extensions * \brief The OpenVX OpenCL interop extension API. */ #define OPENVX_KHR_OPENCL_INTEROP "vx_khr_opencl_interop" diff --git a/include/VX/vx_khr_pipelining.h b/include/VX/vx_khr_pipelining.h index 586c5065..968e1d79 100644 --- a/include/VX/vx_khr_pipelining.h +++ b/include/VX/vx_khr_pipelining.h @@ -18,8 +18,18 @@ #define _OPENVX_PIPELINING_H_ /*! - * \file + * \file vx_khr_pipelining.h * \brief The OpenVX Pipelining, Streaming and Batch Processing extension API. + * + * \defgroup group_pipelining Extension: Pipelining and Batch Processing API + * \ingroup group_extensions + * \brief The Pipelining and Batch Processing Extension + * \defgroup group_streaming Extension: Streaming API + * \ingroup group_extensions + * \brief The Streaming Extension + * \defgroup group_event Extension: Events Handling API + * \ingroup group_extensions + * \brief The Event Handling Extension */ #define OPENVX_KHR_PIPELINING "vx_khr_pipelining" diff --git a/include/VX/vx_khr_tiling.h b/include/VX/vx_khr_tiling.h index ce7c2877..fb0afce9 100644 --- a/include/VX/vx_khr_tiling.h +++ b/include/VX/vx_khr_tiling.h @@ -22,6 +22,7 @@ * \brief The Khronos Extension for User Tiling Functions. * * \defgroup group_tiling Extension: User Tiling API + * \ingroup group_extensions * \brief The Khronos Extension for User Tiling Functions. */ diff --git a/include/VX/vx_khr_xml.h b/include/VX/vx_khr_xml.h index e69fdea2..c42b64a5 100644 --- a/include/VX/vx_khr_xml.h +++ b/include/VX/vx_khr_xml.h @@ -21,6 +21,7 @@ * \brief The OpenVX XML Schema Extension Header. * * \defgroup group_xml Extension: XML API + * \ingroup group_extensions * \brief The Khronos Extension for OpenVX XML Import and Export Support. */ diff --git a/include/VX/vx_lib_debug.h b/include/VX/vx_lib_debug.h index 7f653bf0..15bd9db8 100644 --- a/include/VX/vx_lib_debug.h +++ b/include/VX/vx_lib_debug.h @@ -19,18 +19,34 @@ #include /*! - * \file + * \file vx_lib_debug.h + * \defgroup group_debug_ext Extension: Debugging + * \ingroup group_extensions * \brief The OpenVX Debugging Extension. - * \defgroup group_debug_ext Debugging Extension * \defgroup group_vision_function_copy_image Kernel: Copy Image + * \ingroup group_all_kernels * \defgroup group_vision_function_copy_array Kernel: Copy Array + * \ingroup group_all_kernels + * \defgroup group_vision_function_fread_image Kernel: File Read Image + * \ingroup group_all_kernels + * \defgroup group_vision_function_fread_array Kernel: File Read Array + * \ingroup group_all_kernels * \defgroup group_vision_function_fwrite_image Kernel: File Write Image + * \ingroup group_all_kernels * \defgroup group_vision_function_fwrite_array Kernel: File Write Array + * \ingroup group_all_kernels * \defgroup group_vision_function_plus1 Kernel: Plus One Image + * \ingroup group_all_kernels * \defgroup group_vision_function_fill_image Kernel: Fill Image + * \ingroup group_all_kernels * \defgroup group_vision_function_check_image Kernel: Check Image + * \ingroup group_all_kernels * \defgroup group_vision_function_check_array Kernel: Check Array - * \defgroup group_vision_function_compare_images Kernel: Compare Images + * \ingroup group_all_kernels + * \defgroup group_vision_function_compare_image Kernel: Compare Images + * \ingroup group_all_kernels + * \defgroup group_vision_function_copy_ptr Kernel: Copy Pointer + * \ingroup group_all_kernels */ /*! \brief The maximum filepath name length. @@ -273,6 +289,7 @@ vx_node vxCopyImageFromPtrNode(vx_graph graph, void *ptr, vx_image output); /******************************************************************************/ /*! \brief [Immediate] Copies the source image to the destination image. + * \param [in] context The handle to the context. * \param [in] src The input image. * \param [in] dst The output image. * \note Immediate Mode Function. @@ -281,6 +298,7 @@ vx_node vxCopyImageFromPtrNode(vx_graph graph, void *ptr, vx_image output); vx_status vxuCopyImage(vx_context context, vx_image src, vx_image dst); /*! \brief [Immediate] Copies the source array to the destination array. + * \param [in] context The handle to the context. * \param [in] src The input array. * \param [in] dst The output array. * \note Immediate Mode Function. @@ -289,6 +307,7 @@ vx_status vxuCopyImage(vx_context context, vx_image src, vx_image dst); vx_status vxuCopyArray(vx_context context, vx_array src, vx_array dst); /*! \brief [Immediate] Writes the source image to the file. + * \param [in] context The handle to the context. * \param [in] image The input array. * \param [in] name The name of the file. * \note Immediate Mode Function. @@ -297,6 +316,7 @@ vx_status vxuCopyArray(vx_context context, vx_array src, vx_array dst); vx_status vxuFWriteImage(vx_context context, vx_image image, vx_char name[VX_MAX_FILE_NAME]); /*! \brief [Immediate] Writes the source array to the file. + * \param [in] context The handle to the context. * \param [in] array The input array. * \param [in] name The name of the file. * \note Immediate Mode Function. @@ -305,14 +325,16 @@ vx_status vxuFWriteImage(vx_context context, vx_image image, vx_char name[VX_MAX vx_status vxuFWriteArray(vx_context context, vx_array array, vx_char name[VX_MAX_FILE_NAME]); /*! \brief [Immediate] Reads the source image from the file. + * \param [in] context The handle to the context. * \param [in] name The name of the file. * \param [out] image The output image. - * \note Immediate Mode Function. + * \note Immediate Mode Function. * \ingroup group_vision_function_fread_image */ vx_status vxuFReadImage(vx_context context, vx_char name[VX_MAX_FILE_NAME], vx_image image); /*! \brief [Immediate] Reads the source array from the file. + * \param [in] context The handle to the context. * \param [in] name The name of the file. * \param [out] array The output array. * \note Immediate Mode Function. @@ -321,6 +343,7 @@ vx_status vxuFReadImage(vx_context context, vx_char name[VX_MAX_FILE_NAME], vx_i vx_status vxuFReadArray(vx_context context, vx_char name[VX_MAX_FILE_NAME], vx_array array); /*! \brief [Immediate] Adds 1 to each uint8 pixel. This will clamp at 255. + * \param [in] context The handle to the context. * \param [in,out] image The image to increment. * \note Immediate Mode Function * \ingroup group_vision_function_plus1 @@ -329,6 +352,7 @@ vx_node vxuPlusOneNode(vx_context context, vx_image image); /*! * \brief [Immediate] Fills an image with a known value. + * \param [in] context The handle to the context. * \param [in] value The known value to fill the image with. * \param [out] output The image to fill. * \note Immediate Mode Function @@ -338,7 +362,8 @@ vx_status vxuFillImage(vx_context context, vx_uint32 value, vx_image output); /*! * \brief [Immediate] Checks an image against a known value. - * \param [in] output The image to check. + * \param [in] context The handle to the context. + * \param [in] input The image to check. * \param [in] value The known value to check the image against. * \param [out] numErrors The handle to the number of errors found. * \note Immediate Mode Function @@ -348,6 +373,7 @@ vx_status vxuCheckImage(vx_context context, vx_image input, vx_uint32 value, vx_ /*! * \brief [Immediate] Checks a array for a known value. + * \param [in] context The handle to the context. * \param [in] input The array to check. * \param [in] value The known value to check against. * \param [out] numErrors An output of the number of errors. @@ -359,6 +385,7 @@ vx_status vxuCheckArray(vx_context context, vx_array input, vx_uint8 value, vx_u /*! * \brief [Immediate] Compares two images and returns the number of pixel sub-channels * which are different. + * \param [in] context The handle to the context. * \param [in] a The first image. * \param [in] b The second image. * \param [out] numDiffs The handle to scalar to hold the number of differences. @@ -368,6 +395,7 @@ vx_status vxuCheckArray(vx_context context, vx_array input, vx_uint8 value, vx_u vx_status vxuCompareImages(vx_context context, vx_image a, vx_image b, vx_uint32 *numDiffs); /*! \brief [Immediate] Copies a HOST memory area into an image. + * \param [in] context The handle to the context. * \param [in] ptr The input pointer to the memory area to copy. * \param [out] output The output image. * \note Immediate Mode Function diff --git a/include/VX/vx_lib_extras.h b/include/VX/vx_lib_extras.h index 97f1314f..f959a42a 100644 --- a/include/VX/vx_lib_extras.h +++ b/include/VX/vx_lib_extras.h @@ -16,10 +16,11 @@ #ifndef _VX_EXT_EXTRAS_H_ #define _VX_EXT_EXTRAS_H_ -/*! \file +/*! \file vx_lib_extras.h * \brief Extras Extension. * - * \defgroup group_extras_ext Khronos Extras Extension. + * \defgroup group_extras_ext Extension: Khronos Extras + * \ingroup group_extensions * \brief A Set of Kernels which extend OpenVX. * * \defgroup group_vision_function_laplacian_image Kernel: Laplacian Filter @@ -52,6 +53,13 @@ \f] * + * \defgroup group_vision_function_nonmaxsuppression Kernel: Non-Maximum Suppression (Canny) + * \defgroup group_vision_function_harris_score Kernel: Harris Score + * \defgroup group_vision_function_sobelmxn Kernel: Sobel MxN + * \defgroup group_vision_function_image_lister Kernel: Image Lister + * \defgroup group_vision_function_euclidean_nonmax Kernel: Euclidean Non-Maximum Suppression + * \defgroup group_vision_function_elementwise_norm Kernel: Elementwise Norm + * \defgroup group_vision_function_edge_trace Kernel: Edge Trace */ /*! \brief The Khronos Extras Library @@ -166,6 +174,7 @@ vx_node vxNonMaxSuppressionCannyNode(vx_graph graph, vx_image mag, vx_image phas vx_node vxLaplacian3x3Node(vx_graph graph, vx_image input, vx_image output); /*! \brief [Immediate] Computes a laplacian filter on the image by a 3x3 window. + * \param [in] context The handle to the context. * \param [in] input The input image in VX_DF_IMAGE_U8 format. * \param [out] output The output image in VX_DF_IMAGE_U8 format. * \ingroup group_vision_function_laplacian_image @@ -175,22 +184,51 @@ vx_status vxuLaplacian3x3(vx_context context, vx_image input, vx_image output); /*! \brief [Graph] Creates a Scharr Filter Node. * \param [in] graph The handle to the graph. * \param [in] input The input image in VX_DF_IMAGE_U8 format. - * \param [out] output The output image in VX_DF_IMAGE_U8 format. + * \param [out] output1 The VX_DF_IMAGE_S16 output gradient x image. + * \param [out] output2 The VX_DF_IMAGE_S16 output gradient y image. * \ingroup group_vision_function_laplacian_image */ vx_node vxScharr3x3Node(vx_graph graph, vx_image input, vx_image output1, vx_image output2); /*! \brief [Immediate] Computes a Scharr filter on the image by a 3x3 window. + * \param [in] context The handle to the context. * \param [in] input The input image in VX_DF_IMAGE_U8 format. - * \param [out] output The output image in VX_DF_IMAGE_U8 format. + * \param [out] output1 The VX_DF_IMAGE_S16 output gradient x image. + * \param [out] output2 The VX_DF_IMAGE_S16 output gradient y image. * \ingroup group_vision_function_laplacian_image */ vx_status vxuScharr3x3(vx_context context, vx_image input, vx_image output1, vx_image output2); +/*! \brief [Graph] Creates a Sobel MxN Node. + * \param [in] graph The handle to the graph. + * \param [in] input The VX_DF_IMAGE_U8 input image. + * \param [in] win Window Size (3,5,7) + * \param [out] gx The VX_DF_IMAGE_S16 output gradient x image. + * \param [out] gy The VX_DF_IMAGE_S16 output gradient y image. + * \ingroup group_vision_function_sobelmxn + */ vx_node vxSobelMxNNode(vx_graph graph, vx_image input, vx_scalar win, vx_image gx, vx_image gy); +/*! \brief [Immediate] Computes a Sobel filter on an MxN window. + * \param [in] context The handle to the context. + * \param [in] input The VX_DF_IMAGE_U8 input image. + * \param [in] win Window Size (3,5,7) + * \param [out] gx The VX_DF_IMAGE_S16 output gradient x image. + * \param [out] gy The VX_DF_IMAGE_S16 output gradient y image. + * \ingroup group_vision_function_sobelmxn + */ vx_status vxuSobelMxN(vx_context context, vx_image input, vx_scalar win, vx_image gx, vx_image gy); +/*! \brief [Graph] Creates a Harris Score Node. + * \param [in] graph The handle to the graph. + * \param [in] gx A VX_DF_IMAGE_S16 X Gradient + * \param [in] gy A VX_DF_IMAGE_S16 Y Gradient + * \param [in] sensitivity sensitivity + * \param [in] grad_size A gradient size. + * \param [in] block_size A block size. + * \param [out] score A VX_DF_IMAGE_S32 corner score per pixel. + * \ingroup group_vision_function_harris_score + */ vx_node vxHarrisScoreNode(vx_graph graph, vx_image gx, vx_image gy, @@ -199,6 +237,16 @@ vx_node vxHarrisScoreNode(vx_graph graph, vx_scalar block_size, vx_image score); +/*! \brief [Immediate] Computes a Harris Score. + * \param [in] context The handle to the context. + * \param [in] gx A VX_DF_IMAGE_S16 X Gradient + * \param [in] gy A VX_DF_IMAGE_S16 Y Gradient + * \param [in] sensitivity sensitivity + * \param [in] grad_size A gradient size. + * \param [in] block_size A block size. + * \param [out] score A VX_DF_IMAGE_S32 corner score per pixel. + * \ingroup group_vision_function_harris_score + */ vx_status vxuHarrisScore(vx_context context, vx_image gx, vx_image gy, vx_scalar sensitivity, @@ -206,24 +254,69 @@ vx_status vxuHarrisScore(vx_context context, vx_image gx, vx_scalar block_size, vx_image score); +/*! \brief [Graph] Creates a Euclidean Non-Maximum Suppression Node for Harris Corners. + * \param [in] graph The handle to the graph. + * \param [in] input The VX_DF_IMAGE_F32 image. + * \param [in] strength_thresh The minimum threshold + * \param [in] min_distance The euclidean distance from the considered pixel. + * \param [out] output The VX_DF_IMAGE_F32 image. + * \ingroup group_vision_function_euclidean_nonmax + */ vx_node vxEuclideanNonMaxHarrisNode(vx_graph graph, vx_image input, vx_scalar strength_thresh, vx_scalar min_distance, vx_image output); +/*! \brief [Immediate] Computes Euclidean Non-Maximum Suppression for Harris Corners. + * \param [in] context The handle to the context. + * \param [in] input The VX_DF_IMAGE_F32 image. + * \param [in] strength_thresh The minimum threshold + * \param [in] min_distance The euclidean distance from the considered pixel. + * \param [out] output The VX_DF_IMAGE_F32 image. + * \ingroup group_vision_function_euclidean_nonmax + */ vx_status vxuEuclideanNonMaxHarris(vx_context context, vx_image input, vx_scalar strength_thresh, vx_scalar min_distance, vx_image output); +/*! \brief [Graph] Creates an image to list converter Node. + * \param [in] graph The handle to the graph. + * \param [in] input The VX_DF_IMAGE_U8 or VX_DF_IMAGE_S32 image. + * \param [out] arr The array of output + * \param [out] num_points The total number of non zero points in image (optional) + * \ingroup group_vision_function_image_lister + */ vx_node vxImageListerNode(vx_graph graph, vx_image input, vx_array arr, vx_scalar num_points); +/*! \brief [Immediate] Computes image to list conversion. + * \param [in] context The handle to the context. + * \param [in] input The VX_DF_IMAGE_U8 or VX_DF_IMAGE_S32 image. + * \param [out] arr The array of output + * \param [out] num_points The total number of non zero points in image (optional) + * \ingroup group_vision_function_image_lister + */ vx_status vxuImageLister(vx_context context, vx_image input, vx_array arr, vx_scalar num_points); +/*! \brief [Graph] Creates an Elementwise binary norm Node. + * \param [in] graph The handle to the graph. + * \param [in] input_x Left image (VX_DF_IMAGE_S16). + * \param [in] input_y Right image (VX_DF_IMAGE_S16). + * \param [in] norm_type Norm type (vx_norm_type_e). + * \param [in] output Output image (VX_DF_IMAGE_U16). + * \ingroup group_vision_function_elementwise_norm + */ vx_node vxElementwiseNormNode(vx_graph graph, vx_image input_x, vx_image input_y, vx_scalar norm_type, vx_image output); +/*! \brief [Graph] Creates an Edge tracing Node. + * \param [in] graph The handle to the graph. + * \param [in] norm Norm image (VX_DF_IMAGE_U16). + * \param [in] threshold Threshold (VX_THRESHOLD_TYPE_RANGE). + * \param [out] output Output binary image (VX_DF_IMAGE_U8). + * \ingroup group_vision_function_edge_trace + */ vx_node vxEdgeTraceNode(vx_graph graph, vx_image norm, vx_threshold threshold, vx_image output); #ifdef __cplusplus diff --git a/include/VX/vx_lib_xyz.h b/include/VX/vx_lib_xyz.h index 08557013..e4de50e8 100644 --- a/include/VX/vx_lib_xyz.h +++ b/include/VX/vx_lib_xyz.h @@ -21,14 +21,17 @@ * \file * \brief An example of how to wrap a User Extension Kernel. * - * \defgroup group_xyz_ext The Example User Kernel Extension - * + * \defgroup group_xyz_ext Extension: Example User Kernel + * \ingroup group_extensions + * \brief The Example User Kernel Extension + * \defgroup group_example_kernel Kernel: Example + * \ingroup group_all_kernels */ #include /*! - * \file vx_ext_xyz.h + * \file vx_lib_xyz.h * \brief The example header for how to write a user mode extension to OpenVX. */ diff --git a/include/VX/vx_types.h b/include/VX/vx_types.h index 8f4d515e..5b6d8904 100644 --- a/include/VX/vx_types.h +++ b/include/VX/vx_types.h @@ -371,9 +371,9 @@ using vx_object_array = ObjectArray*; typedef struct ObjectArray* vx_object_array; #endif - /*! \brief The multidimensional data object (Tensor). +/*! \brief The multidimensional data object (Tensor). * \see vxCreateTensor - * \ingroup group_object_tensor + * \ingroup group_tensor * \extends vx_reference */ #ifdef __cplusplus @@ -1270,7 +1270,7 @@ enum vx_object_array_attribute_e { VX_OBJECT_ARRAY_NUMITEMS = VX_ATTRIBUTE_BASE(VX_ID_KHRONOS, VX_TYPE_OBJECT_ARRAY) + 0x1, }; /*! \brief tensor Data attributes. - * \ingroup group_object_tensor + * \ingroup group_tensor */ enum vx_tensor_attribute_e { @@ -1612,8 +1612,9 @@ enum vx_comp_metric_e * logically adjacent pixel in the positive x or y direction. * \arg scale - The relationship of scaling from the primary plane (typically * the zero indexed plane) to this plane. An integer down-scaling factor of \f$ f \f$ shall be - * set to a value equal to \f$ scale = \frac{unity}{f} \f$ and an integer up-scaling factor of \f$ f \f$ - * shall be set to a value of \f$ scale = unity * f \f$. \f$ unity \f$ is defined as \ref VX_SCALE_UNITY. + * set to a value equal to \f$ scale = \frac{unity}{f} \f$ and an integer up-scaling factor of \f$ f + * \f$ shall be set to a value of \f$ scale = unity * f \f$. \f$ unity \f$ is defined as \ref + * VX_SCALE_UNITY. * \arg step - The step is the number of logical pixel units to skip to * arrive at the next physically unique pixel. For example, on a plane that is * half-scaled in a dimension, the step in that dimension is 2 to indicate that @@ -1621,15 +1622,16 @@ enum vx_comp_metric_e * where iteration over unique pixels is required, such as in serializing * or de-serializing the image patch information. * \see \ref vxMapImagePatch - * \note For \ref VX_DF_IMAGE_U1 images it is defined that \a stride_x == 0 since it is less than one byte. - * The least significant bit (bit number 0, value 1) in the first byte in the image, - * is the left-most pixel in the upper left corner, i.e. origo. A \ref VX_DF_IMAGE_U1 image always - * start on a byte boundary and each row has a \a stride_y that is a multiple of whole bytes, which means padding - * bits of undefined value may be present at the end of each row. - * Imagepatches can only be accessed at a multiple of eight pixels: the x-coordinate must be a multiple of eight. - * Individual pixel access is also different: the byte at the imagepatch-calculated pointer value is a collection of eight pixels. - * Each byte can then be masked with the bit-mask 1 << (x % 8) to get individual pixel values (shifted x times). - * See \ref sub_image_access for an example. + * \note For \ref VX_DF_IMAGE_U1 images it is defined that \a stride_x == 0 since it is + * less than one byte. The least significant bit (bit number 0, value 1) in the first byte in the + * image, is the left-most pixel in the upper left corner, i.e. origo. A \ref + * VX_DF_IMAGE_U1 image always start on a byte boundary and each row has a \a stride_y that is + * a multiple of whole bytes, which means padding bits of undefined value may be present at the end + * of each row. Imagepatches can only be accessed at a multiple of eight pixels: the x-coordinate + * must be a multiple of eight. Individual pixel access is also different: the byte at the + * imagepatch-calculated pointer value is a collection of eight pixels. Each byte can then be masked + * with the bit-mask 1 << (x % 8) to get individual pixel values (shifted x + * times). See ref sub_image_access for an example. * \ingroup group_image */ typedef struct _vx_imagepatch_addressing_t { @@ -1714,7 +1716,7 @@ typedef struct _vx_tensor_matrix_multiply_params_t{ } vx_tensor_matrix_multiply_params_t; /*! \brief Initializes a \ref vx_perf_t on the stack. - * \ingroup group performance + * \ingroup group_performance */ #define VX_PERF_INIT {0ul, 0ul, 0ul, 0ul, 0ul, 0ul} diff --git a/kernels/liteRT/tflite.hpp b/kernels/liteRT/tflite.hpp index c6c24e2b..ae42859f 100644 --- a/kernels/liteRT/tflite.hpp +++ b/kernels/liteRT/tflite.hpp @@ -192,8 +192,6 @@ class TFLiteRunner /** * @brief Run the kernel (execute the model) - * @param inputTensors Input tensors - * @param outputTensosrs Output tensors * @return VX_SUCCESS on success, VX_FAILURE otherwise */ vx_status run() diff --git a/kernels/onnxRT/ort_runner.hpp b/kernels/onnxRT/ort_runner.hpp index 679013e2..d84deb2c 100644 --- a/kernels/onnxRT/ort_runner.hpp +++ b/kernels/onnxRT/ort_runner.hpp @@ -14,6 +14,8 @@ #include #include +#include +#include #include /** @@ -57,6 +59,17 @@ class OnnxRuntimeRunner session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(ORT_ENABLE_ALL); +#if defined(__linux__) || defined(_WIN32) || defined(UNDER_CE) + // Register TensorRT Execution Provider + // @todo investigate why ort tensorrt is not working + // OrtSessionOptionsAppendExecutionProvider_Tensorrt( + // session_options.operator OrtSessionOptions*(), 0); +#endif +#if defined(__APPLE__) + // Register CoreML Execution Provider + OrtSessionOptionsAppendExecutionProvider_CoreML(session_options, 0); +#endif + // Load the model session = std::make_unique(getEnv(), model_path.c_str(), session_options); model_loaded = true; @@ -173,7 +186,7 @@ class OnnxRuntimeRunner /** * @brief Run the kernel (execute the model) * @param inputTensors Input tensors - * @param outputTensosrs Output tensors + * @param outputTensors Output tensors * @return VX_SUCCESS on success, VX_FAILURE otherwise */ vx_status run(std::vector>& inputTensors, std::vector>& outputTensors) diff --git a/kernels/tiling/tiling.h b/kernels/tiling/tiling.h index 61d6b73f..f43ddb8d 100644 --- a/kernels/tiling/tiling.h +++ b/kernels/tiling/tiling.h @@ -154,6 +154,7 @@ extern "C" { * \param [in] context The handle to the implementation context. * \param [in] name The string to be used to match the kernel. * \param [in] enumeration The enumerated value of the kernel to be used by clients. + * \param [in] function The kernel function pointer to be invoked. * \param [in] flexible_func_ptr The process-local flexible function pointer to be invoked. * \param [in] fast_func_ptr The process-local fast function pointer to be invoked. * \param [in] num_params The number of parameters for this kernel. diff --git a/kernels/venum/venum_convolve.cpp b/kernels/venum/venum_convolve.cpp index 9183f9de..95407523 100644 --- a/kernels/venum/venum_convolve.cpp +++ b/kernels/venum/venum_convolve.cpp @@ -21,10 +21,10 @@ #include /**============================================================================= -@function +function u32Tou8 -@description +description algorithm implementation of unint32 to unint8 =============================================================================**/ static vx_uint8 u32Tou8(vx_uint32 x) diff --git a/targets/debug/vx_check.cpp b/targets/debug/vx_check.cpp index 3c90f596..36e86f72 100644 --- a/targets/debug/vx_check.cpp +++ b/targets/debug/vx_check.cpp @@ -19,7 +19,7 @@ * \file * \brief The Check Object Kernels. * \author Erik Rainey - * \defgroup group_debug_ext Debugging Extension + * \defgroup group_debug_ext Extension: Debugging */ #include diff --git a/targets/debug/vx_compare.cpp b/targets/debug/vx_compare.cpp index b52a3b9d..ae47c794 100644 --- a/targets/debug/vx_compare.cpp +++ b/targets/debug/vx_compare.cpp @@ -18,7 +18,7 @@ * \file * \brief The Compare Object Kernels. * \author Erik Rainey - * \defgroup group_debug_ext Debugging Extension + * \defgroup group_debug_ext Extension: Debugging */ #include diff --git a/targets/debug/vx_copy.cpp b/targets/debug/vx_copy.cpp index 2721da0e..e5f1b4d9 100644 --- a/targets/debug/vx_copy.cpp +++ b/targets/debug/vx_copy.cpp @@ -18,7 +18,7 @@ * \file * \brief The Copy Object Kernels. * \author Erik Rainey - * \defgroup group_debug_ext Debugging Extension + * \defgroup group_debug_ext Extension: Debugging */ #include diff --git a/targets/debug/vx_debug_module.cpp b/targets/debug/vx_debug_module.cpp index a5b9354b..7ee1f9b1 100644 --- a/targets/debug/vx_debug_module.cpp +++ b/targets/debug/vx_debug_module.cpp @@ -18,7 +18,7 @@ * \file * \brief The internal implementation of the debug kernels. * \author Erik Rainey - * \defgroup group_debug_ext Debugging Extension + * \defgroup group_debug_ext Extension: Debugging */ #include diff --git a/targets/debug/vx_file.cpp b/targets/debug/vx_file.cpp index b0887582..f32b1d21 100644 --- a/targets/debug/vx_file.cpp +++ b/targets/debug/vx_file.cpp @@ -18,7 +18,7 @@ * \file * \brief The File IO Object Kernels. * \author Erik Rainey - * \defgroup group_debug_ext Debugging Extension + * \defgroup group_debug_ext Extension: Debugging */ #include diff --git a/targets/debug/vx_fill.cpp b/targets/debug/vx_fill.cpp index 8ca256a9..41011604 100644 --- a/targets/debug/vx_fill.cpp +++ b/targets/debug/vx_fill.cpp @@ -18,7 +18,7 @@ * \file * \brief The Fill Object Kernels. * \author Erik Rainey - * \defgroup group_debug_ext Debugging Extension + * \defgroup group_debug_ext Extension: Debugging */ #include diff --git a/tests/integration_test/test_advanced_api.cpp b/tests/integration_test/test_advanced_api.cpp index 3c5fc717..711b5e17 100644 --- a/tests/integration_test/test_advanced_api.cpp +++ b/tests/integration_test/test_advanced_api.cpp @@ -82,11 +82,11 @@ class AdvancedIntegrationTest : public ::testing::Test vx_action action = VX_ACTION_ABANDON; vx_size expected = 2; vx_parameter param = vxGetParameterByIndex(node, 1); // copied Value - if (param) + if (vxGetStatus(param) == VX_SUCCESS) { vx_scalar scalar = nullptr; vxQueryParameter(param, VX_PARAMETER_REF, &scalar, sizeof(scalar)); - if (scalar) + if (vxGetStatus(scalar) == VX_SUCCESS) { vx_uint8 value = 0u; vxCopyScalar(scalar, &value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST); @@ -94,9 +94,7 @@ class AdvancedIntegrationTest : public ::testing::Test { action = VX_ACTION_CONTINUE; } - vxReleaseScalar(&scalar); } - vxReleaseParameter(¶m); } return action; }