)]}'
{
  "log": [
    {
      "commit": "da577bc545b1282f003b579189a6dcfb5a1eb6b1",
      "tree": "9addee2fd4ed79704583768498c868d683f46123",
      "parents": [
        "5062828615b3115787d024b5d4c6b05b976af51a"
      ],
      "author": {
        "name": "parasol-aser",
        "email": "3848358+parasol-aser@users.noreply.github.com",
        "time": "Wed May 06 18:27:10 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 17:27:10 2026 -0600"
      },
      "message": "test: strengthen buffer and map API coverage (#5979)\n\nAdd focused API tests for hb_buffer_create_similar() and buffer\nconfiguration persistence across clear/reset. Also exercise public hb_map\ncopy, equality, hash, update, iteration, keys, and values paths with\norder-independent assertions.\n\nValidation:\nmeson test -C build-tgl-precheck --print-errorlogs --suite api test-buffer\nmeson test -C build-tgl-precheck --print-errorlogs --suite api test-map\nmeson test -C build-tgl-precheck --print-errorlogs --suite api test-buffer test-map\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n\nCo-authored-by: jeffhuang \u003cjeff@docker.xydrsucermoubd24xgo33yhsgd.bx.internal.cloudapp.net\u003e"
    },
    {
      "commit": "5062828615b3115787d024b5d4c6b05b976af51a",
      "tree": "3f2618f2c862d796a6040b88b870f8c913d658b3",
      "parents": [
        "de7742614737849c0dbd126435ca33ecfcb9b6bb"
      ],
      "author": {
        "name": "Metaspook",
        "email": "metaspook@gmail.com",
        "time": "Wed May 06 10:34:40 2026 +0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 22:34:40 2026 -0600"
      },
      "message": "Add Flutter to list of users in README.md (#5978)"
    },
    {
      "commit": "de7742614737849c0dbd126435ca33ecfcb9b6bb",
      "tree": "ced47d1f534c1c7afafb001ce5a5ec1ed927b8e9",
      "parents": [
        "5ee942feb6f7158f1f07e968c4d9b3adb5be07f9"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Tue May 05 10:10:08 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Tue May 05 10:10:08 2026 -0600"
      },
      "message": "[gpu-paint] Limit clip rasterization ops\n\nFixes timeout https://oss-fuzz.com/testcase-detail/4582727033880576\n"
    },
    {
      "commit": "5ee942feb6f7158f1f07e968c4d9b3adb5be07f9",
      "tree": "4793eeab6833dad8af2a9987a17b1864bcb962fd",
      "parents": [
        "8aaa51013bad859f462f14716ce5743d9a066f7c"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon May 04 09:58:05 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon May 04 09:58:05 2026 -0600"
      },
      "message": "[gpu_demo] Fix web demo build\n"
    },
    {
      "commit": "8aaa51013bad859f462f14716ce5743d9a066f7c",
      "tree": "1852b3cea48eb39bb2d18a79f8f96e1d27f390c2",
      "parents": [
        "a45382c12ccca487d248b07b03223c1ab7925be4"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon May 04 09:49:46 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon May 04 09:50:11 2026 -0600"
      },
      "message": "[gpu_demo] Silence compiler warnings\n"
    },
    {
      "commit": "a45382c12ccca487d248b07b03223c1ab7925be4",
      "tree": "064ceb6054d78d75286f41d9f0f3b8f05d08e2f6",
      "parents": [
        "9a3a13c2c115ce3041fc39874e08f5fa49739be9"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon May 04 09:43:24 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon May 04 09:50:11 2026 -0600"
      },
      "message": "[gpu_demo] Fix build in Windows\n\nDon\u0027t use std::min/std::max.\n\nFixes https://github.com/harfbuzz/harfbuzz/issues/5971\n"
    },
    {
      "commit": "9a3a13c2c115ce3041fc39874e08f5fa49739be9",
      "tree": "aa39d8433d863421a38cb203f9b77ed6d2d3d79c",
      "parents": [
        "f90bc293e0fcf05124fd7679a9a5242aeeb7c9c8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 12:26:04 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon May 04 18:42:04 2026 +0300"
      },
      "message": "Bump github/codeql-action from 4.35.2 to 4.35.3\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.2 to 4.35.3.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/95e58e9a2cdfd71adc6e0353d5c52f41a045d225...e46ed2cbd01164d986452f91f178727624ae40d7)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.35.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "f90bc293e0fcf05124fd7679a9a5242aeeb7c9c8",
      "tree": "6fde650559d248e629d39ddcc7f05d45587271a0",
      "parents": [
        "209a7237b959f70f48b6515ba1b4774dc49410be",
        "09795f3215944b5d7f242fa29dd24d7571ad0643"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 12:37:43 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 12:37:43 2026 -0600"
      },
      "message": "Merge pull request #5973 from harfbuzz/no-std-sort\n\nRevert back from using std::sort"
    },
    {
      "commit": "09795f3215944b5d7f242fa29dd24d7571ad0643",
      "tree": "6fde650559d248e629d39ddcc7f05d45587271a0",
      "parents": [
        "58deffd897b2e717bae93a2416bdf0efedce55b0"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 12:08:21 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 12:08:21 2026 -0600"
      },
      "message": "[post] Fix flipped glyph-name sort comparator on macOS\n\nThe std::sort revert (d3a1de25e3) inadvertently inverted the\npost-table glyph-name sort.  hb_array_t::cmp has reversed\nargument order — x.cmp(y) returns the sign of (y - x), not\n(x - y) — so dropping the `\u003e 0` from the bool-returning\nlambda turned ascending into descending order.\n\nOn Linux the quicksort happened to leave the array in an\norder that bsearch could still find names; on macOS, where\nthe system sort behaves differently, this exposed the bug.\n\nPass (b, a) to find_glyph_name(...).cmp(...) to recover the\nintended ascending order.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "58deffd897b2e717bae93a2416bdf0efedce55b0",
      "tree": "ef5cfd19821a37381b0918be429247484bd45d93",
      "parents": [
        "e064b9f79de024fc8646323caa5618fbad830f50"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:59:22 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:59:22 2026 -0600"
      },
      "message": "[qsort] Lower threshold from 32 to 24\n"
    },
    {
      "commit": "e064b9f79de024fc8646323caa5618fbad830f50",
      "tree": "68fcce8ef8bb2bb112224dbfda8cfccbcf76b4d7",
      "parents": [
        "691033793afc4d70b561c8e03dbb2d2f87a56d8c"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:56:14 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:56:14 2026 -0600"
      },
      "message": "[algs] Defer insertion sort to single final pass; bump threshold to 32\n\nRestructure hb_qsort_inline so the recursive partitioning loop\nstops at subranges of size \u003c\u003d threshold without sorting them,\nand the entry point runs one insertion sort over the entire\narray at the end.  After the partitioning loop, every element\nis within the threshold of its sorted position, so the final\npass is O(n * threshold) — cache-friendlier than a per-leaf\ninsertion sort, which is what libstdc++\u0027s std::sort does too.\n\nAlso bump the threshold from 16 to 32, which the deferred\nscheme prefers (per-leaf insertion sort prefers 16; the\ndeferred form amortizes a larger threshold better).\n\nBench (NotoSansCJK GPU encode, smaller is better):\n  std::sort baseline:                                570 ms\n  per-leaf insertion sort, threshold 16 (parent):    613 ms\n  per-leaf insertion sort, threshold 32:             623 ms\n  deferred insertion sort, threshold 16:             620 ms\n  deferred insertion sort, threshold 32 (this):      610 ms\n  deferred insertion sort, threshold 64:             610 ms\n  deferred insertion sort, threshold 96:             620 ms\n\nTested: 240/240 tests pass; nm -D libharfbuzz.so shows zero\nremaining _ZSt sort weak symbols.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "691033793afc4d70b561c8e03dbb2d2f87a56d8c",
      "tree": "7b74cc081e1618c14dedeb4a6d704d9e13d39faf",
      "parents": [
        "d3a1de25e33ca1cfb99c3efdfc6dfb6e462946ea"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:45:28 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:45:28 2026 -0600"
      },
      "message": "[algs] Replace byte-based sort with typed two-way quicksort\n\nRewrite the internal qsort used by hb_array_t::qsort(Compar) as a\ntyped template hb_qsort_inline\u003cT, Compar\u003e:\n\n  * Operates on T* directly, so swap is T-typed (one move per\n    half-element instead of a per-byte loop).  hb_swap is used,\n    which uses ADL std::swap.\n  * Two-way Hoare partition instead of three-way Bentley-McIlroy.\n    The previous three-way scheme paid extra branch overhead in\n    the inner partition loop without payoff on the typical\n    HarfBuzz workload (sorting unique curve indices, glyph IDs,\n    feature tags, etc).\n  * Median-of-three pivot, parked at last-1.\n  * Tail-call elimination on the larger partition; recurse only\n    on the smaller.  Bounds stack depth at O(log n).\n  * Insertion-sort threshold bumped from 10 to 16, matching\n    libstdc++\u0027s std::sort.\n\nThe byte-based sort_r_simple (and helpers SORT_R_SWAP, sort_r_swap,\nsort_r_cmpswap, sort_r_swap_blocks) is removed; nothing else used\nit.  hb_qsort still forwards to system qsort.\n\nBench (NotoSansCJK GPU encode, smaller is better):\n  std::sort baseline:                 570 ms\n  byte-based sort_r_simple (step 1):  650 ms (+14%)\n  three-way typed quicksort:          640 ms\n  two-way typed quicksort (this):     613 ms (+7.5% vs baseline)\n\nABI: zero std:: weak symbols leak from libharfbuzz.so, same as\nstep 1.\n\nTested: 240/240 tests pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d3a1de25e33ca1cfb99c3efdfc6dfb6e462946ea",
      "tree": "d1f47b5ef916eafeaf04fa94a14ac9ff14ff2380",
      "parents": [
        "209a7237b959f70f48b6515ba1b4774dc49410be"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:32:17 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat May 02 11:32:17 2026 -0600"
      },
      "message": "[array] Replace std::sort with internal sort_r_simple\n\nstd::sort instantiates several internal STL helpers\n(__introsort_loop, __insertion_sort, __adjust_heap, __heap_select,\n__unguarded_linear_insert) as weak symbols in the std:: namespace.\nThese leaked into libharfbuzz.so for every distinct (T, Compar)\npair, polluting the public ABI surface.\n\nRoute hb_array_t::qsort(Compar) through our existing templated\nsort_r_simple instead.  The comparator is still inlined into the\nsort body (sort_r_simple has been comparator-templated since\n05762b2fac).\n\nDrop the bool-returning comparator overload in favor of a single\nint-sign convention; convert the call sites added during the\nstd::sort migration back to int-sign comparators.\n\nStep 1 of two: this restores ABI hygiene at the cost of typed-\nelement swap (sort_r_simple swaps byte-by-byte).  A follow-up\nwill introduce a typed sort to recover that perf.\n\nTested: 240/240 tests pass; nm -D libharfbuzz.so shows zero\nremaining _ZSt sort weak symbols.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "209a7237b959f70f48b6515ba1b4774dc49410be",
      "tree": "07d61c302539f72251e239fdd29dea58715568f4",
      "parents": [
        "ef1b37502ac9f277bcb59acebc16b6c025242f7d"
      ],
      "author": {
        "name": "Qunxin Liu",
        "email": "48925186+qxliu76@users.noreply.github.com",
        "time": "Fri May 01 13:50:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 14:50:05 2026 -0600"
      },
      "message": "[repacker] fuzzer fix: duplicate shared liga_sets before splitting (#5972)\n\nfix for: https://oss-fuzz.com/testcase-detail/5291844211900416"
    },
    {
      "commit": "ef1b37502ac9f277bcb59acebc16b6c025242f7d",
      "tree": "f7f1a727bce7c1b067c020b467a8f3c888c7bd14",
      "parents": [
        "ab6aa4f449457be45e8e0218f7a8de271fb19967"
      ],
      "author": {
        "name": "Sergei Lopatin",
        "email": "magist3r@gmail.com",
        "time": "Thu Apr 30 15:39:29 2026 +0200"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Thu Apr 30 19:29:02 2026 +0300"
      },
      "message": "[ft] Bump minimum freetype version to 2.8.0 (20.0.14)\n\ne31ea830c8dbcbc9e81772e8113a9f9f8418f2ce added use of FT_Set_Default_Properties,\nwhich was introduced in FreeType 2.8.\n\nReference: https://freetype.org/freetype2/docs/reference/ft2-module_management.html#ft_set_default_properties\n"
    },
    {
      "commit": "ab6aa4f449457be45e8e0218f7a8de271fb19967",
      "tree": "b7bc141b5cbb3b7dd7a717b292eb048d79c80de3",
      "parents": [
        "e6741e2205309752839da60ff075b7fa2e7cddd3"
      ],
      "author": {
        "name": "Andrew Tribick",
        "email": "ajtribick@googlemail.com",
        "time": "Tue Apr 28 21:59:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 13:59:28 2026 -0600"
      },
      "message": "Allow line-ending changes in gen-gpu-shader-artifacts.py (#5968)"
    },
    {
      "commit": "e6741e2205309752839da60ff075b7fa2e7cddd3",
      "tree": "5e4034c5c9ac066f14eee7e1fac93e3c8abfef97",
      "parents": [
        "79784ef4db05f38468230b83b30d340c908e3a0b"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Apr 27 19:30:28 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Tue Apr 28 15:52:29 2026 +0300"
      },
      "message": "[harfbuzz-world] Fix macros\n\nFixes https://github.com/harfbuzz/uharfbuzz/pull/289#discussion_r3149665614\n"
    },
    {
      "commit": "79784ef4db05f38468230b83b30d340c908e3a0b",
      "tree": "f754fdc1a702f5a7b8b47a6a0a0f0040b189470f",
      "parents": [
        "00cbd9850a3208c0d80624002ef89653ab163efd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 27 12:01:28 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 27 19:10:07 2026 +0300"
      },
      "message": "Bump meson from 1.11.0 to 1.11.1 in /.ci\n\nBumps [meson](https://github.com/mesonbuild/meson) from 1.11.0 to 1.11.1.\n- [Release notes](https://github.com/mesonbuild/meson/releases)\n- [Commits](https://github.com/mesonbuild/meson/compare/1.11.0...1.11.1)\n\n---\nupdated-dependencies:\n- dependency-name: meson\n  dependency-version: 1.11.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "00cbd9850a3208c0d80624002ef89653ab163efd",
      "tree": "29c754b21604b551b672a6f49726604915c26163",
      "parents": [
        "73db8cc1a5fe1febc2cddb33fbd9ba301a92ce2f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 27 12:00:44 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 27 19:09:33 2026 +0300"
      },
      "message": "Bump hendrikmuhs/ccache-action from 1.2.22 to 1.2.23\n\nBumps [hendrikmuhs/ccache-action](https://github.com/hendrikmuhs/ccache-action) from 1.2.22 to 1.2.23.\n- [Release notes](https://github.com/hendrikmuhs/ccache-action/releases)\n- [Commits](https://github.com/hendrikmuhs/ccache-action/compare/33522472633dbd32578e909b315f5ee43ba878ce...d62db5f07c26379fc4b4e0916f098a92573c3b03)\n\n---\nupdated-dependencies:\n- dependency-name: hendrikmuhs/ccache-action\n  dependency-version: 1.2.23\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "73db8cc1a5fe1febc2cddb33fbd9ba301a92ce2f",
      "tree": "47176d4512ac9691d9bb54b82252c5a7824755f1",
      "parents": [
        "f7511709eeab90175d862b6be283975b192d4dbb"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Apr 23 03:18:15 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Apr 23 03:18:15 2026 -0600"
      },
      "message": "[gpu] Fix HLSL paint fragment compile error\n\nAt least on wine this was needed.\n"
    },
    {
      "commit": "f7511709eeab90175d862b6be283975b192d4dbb",
      "tree": "0cbe93f4ba90255d3608539bde480720299a704d",
      "parents": [
        "1b9c0c9dd6ea76ad797cb9f841c315c109506ba3"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Apr 23 02:40:49 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Apr 23 02:40:49 2026 -0600"
      },
      "message": "[gpu] Remove outdated comment\n"
    },
    {
      "commit": "1b9c0c9dd6ea76ad797cb9f841c315c109506ba3",
      "tree": "61c78862d557b7c8b073a812a15aae4b1e67778c",
      "parents": [
        "74396731ad4ed1fa23330bb81c120dabc73c623b"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Apr 22 13:17:59 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Apr 22 13:17:59 2026 -0600"
      },
      "message": "[subset/gvar] Protect against overflow on 32bit systems\n"
    },
    {
      "commit": "74396731ad4ed1fa23330bb81c120dabc73c623b",
      "tree": "c179bb9c2705d5406057e392758094a10b82e356",
      "parents": [
        "0091ae360e5999bb0dc322cbee3babb0746d80a7"
      ],
      "author": {
        "name": "璀境石",
        "email": "git@chuikingshek.com",
        "time": "Wed Apr 22 11:33:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 21:33:16 2026 -0600"
      },
      "message": "[cmake] Fix missing hb-static.cc in gpu target (#5960)"
    },
    {
      "commit": "0091ae360e5999bb0dc322cbee3babb0746d80a7",
      "tree": "06a8525668d40589cfc0452802d46e1e53401b0f",
      "parents": [
        "14d1d035cc48307943e587c513effa2aeab0b64c"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Tue Apr 21 10:08:32 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Wed Apr 22 00:30:35 2026 +0200"
      },
      "message": "[hb-config.hh] Tweak HB_TINY / HB_NO_DRAW / HB_NO_CFF relationship\n\nFixes https://github.com/harfbuzz/harfbuzz/issues/5955\n"
    },
    {
      "commit": "14d1d035cc48307943e587c513effa2aeab0b64c",
      "tree": "715d26f73415679f76935ff93aa777e9c9e486f8",
      "parents": [
        "d25e93036480603563b9bfdcbd153e8d16379089"
      ],
      "author": {
        "name": "璀境石",
        "email": "git@chuikingshek.com",
        "time": "Tue Apr 21 22:56:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 08:56:46 2026 -0600"
      },
      "message": "[cmake] Add a .gitignore file to build directory (inspired by Meson) (#5957)"
    },
    {
      "commit": "d25e93036480603563b9bfdcbd153e8d16379089",
      "tree": "523e4c65ee9120ac4ee224fc6491c942707727ca",
      "parents": [
        "e8fbf406c41ae9169f7e7e937404677a6efb17ce"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 20 11:46:37 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Tue Apr 21 02:09:46 2026 +0200"
      },
      "message": "Bump meson from 1.10.2 to 1.11.0 in /.ci\n\nBumps [meson](https://github.com/mesonbuild/meson) from 1.10.2 to 1.11.0.\n- [Release notes](https://github.com/mesonbuild/meson/releases)\n- [Commits](https://github.com/mesonbuild/meson/compare/1.10.2...1.11.0)\n\n---\nupdated-dependencies:\n- dependency-name: meson\n  dependency-version: 1.11.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "e8fbf406c41ae9169f7e7e937404677a6efb17ce",
      "tree": "a4362a68ec95ab8c49024ff95a462b43000e116e",
      "parents": [
        "b0ffab42d473eb380ad0fcf42730e0f1868cbc97"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 20 11:45:56 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 15:27:05 2026 +0200"
      },
      "message": "Bump github/codeql-action from 4.35.1 to 4.35.2\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.1 to 4.35.2.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/c10b8064de6f491fea524254123dbe5e09572f13...95e58e9a2cdfd71adc6e0353d5c52f41a045d225)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.35.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "b0ffab42d473eb380ad0fcf42730e0f1868cbc97",
      "tree": "20dfbf1ee5c28916fad25b2c11d5ecc1aeb1918c",
      "parents": [
        "6988bda8acf238f136eb2fd46593a8160cca53a6"
      ],
      "author": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 05:10:06 2026 +0200"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 05:10:48 2026 +0200"
      },
      "message": "14.2.0\n"
    },
    {
      "commit": "6988bda8acf238f136eb2fd46593a8160cca53a6",
      "tree": "5230a50acecf95b89ce12551b4dc0d8a93293487",
      "parents": [
        "98202cd72feabee326a217b07245d2df9d242114"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:49:53 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[gpu] Move blob-recycling from gpu to blob.hh\n"
    },
    {
      "commit": "98202cd72feabee326a217b07245d2df9d242114",
      "tree": "7d87e1d7bae07ba793deb32149ac471f8f3c7de4",
      "parents": [
        "90ba85bebc3204f8500ae5f4e1f34b4515d49760"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:39:56 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[gpu-paint] Cosmetic\n"
    },
    {
      "commit": "90ba85bebc3204f8500ae5f4e1f34b4515d49760",
      "tree": "9290329958477f3cdc7fc49f777d3b580bf4a93e",
      "parents": [
        "d26e90c6c8a2df9f5cba0c53f8a0d5b25be7b37f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:37:10 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[gpu-draw] Cosmetic\n"
    },
    {
      "commit": "d26e90c6c8a2df9f5cba0c53f8a0d5b25be7b37f",
      "tree": "987d5eafd73a4f81e9217334caaf13739fa1659e",
      "parents": [
        "521d7b2e99aeec67211c4d994e520e96dd9dd247"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:33:46 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[gpu] Add HB_GPU_SHADER_LANG_INVALID\n"
    },
    {
      "commit": "521d7b2e99aeec67211c4d994e520e96dd9dd247",
      "tree": "1f2238d4c8ef32b5f0014a36bf7144a30765f270",
      "parents": [
        "1ae32fb6a769db7a964a5c3ab93fa4315f56fc91"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:23:33 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[vector] Approximate a couple of Porter-Duff modes\n\nThe rest need structural change.\n"
    },
    {
      "commit": "1ae32fb6a769db7a964a5c3ab93fa4315f56fc91",
      "tree": "15895b1eb5f128bb056e5749d7004c6df222bd8c",
      "parents": [
        "f433a59dac28b382a4ef690938ba6c785505a287"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:17:40 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[vector-pdf] Clean up color-stop passing around\n"
    },
    {
      "commit": "f433a59dac28b382a4ef690938ba6c785505a287",
      "tree": "bd3a7b603009b5454fd8fb981fe7b6d4e01c7fa3",
      "parents": [
        "0b718a9f098a859fdc4eed6bf7ef16b5aeda6ba6"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:14:34 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[vector-svg] Cosmetic\n"
    },
    {
      "commit": "0b718a9f098a859fdc4eed6bf7ef16b5aeda6ba6",
      "tree": "219770399ed2d828dfee88f68a7fbea53170028e",
      "parents": [
        "74514fc7d681470f2371bf1bece1cda22ed4eb09"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 14:10:25 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[raster/vector/gpu] Streamline color-stop fetching\n"
    },
    {
      "commit": "74514fc7d681470f2371bf1bece1cda22ed4eb09",
      "tree": "460ddca936dd50ea668eb3c979ad7f35c7114c31",
      "parents": [
        "6ef43b340d4ab1d0aaabc7b9954c26a365bdec77"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 13:59:23 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[vector-svg] Streamline set_svg_prefix()\n"
    },
    {
      "commit": "6ef43b340d4ab1d0aaabc7b9954c26a365bdec77",
      "tree": "147e33c14ceda103d73bbf76f683199c2c0302e9",
      "parents": [
        "067539a45dd06b511a2b7735e8a4b1781833772e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 13:51:19 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[hb-vector] Touchups\n"
    },
    {
      "commit": "067539a45dd06b511a2b7735e8a4b1781833772e",
      "tree": "02aa584a37f1e183dbde4584b1455ecc2fa2026d",
      "parents": [
        "7a7fbdd173ce44edffbfef3be3e934e738cc4175"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 13:16:35 2026 -0600"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Apr 20 01:29:49 2026 +0200"
      },
      "message": "[raster] Rename hb-raster-utils.hh to hb-raster.hh\n"
    },
    {
      "commit": "7a7fbdd173ce44edffbfef3be3e934e738cc4175",
      "tree": "bc9a1245a8fdde68989edbea827b2518d25fa16c",
      "parents": [
        "a7bcaac21a18ab45e40c0dec25786c7c7412ac83"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 13:08:19 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 13:08:19 2026 -0600"
      },
      "message": "[NEWS] Typos\n"
    },
    {
      "commit": "a7bcaac21a18ab45e40c0dec25786c7c7412ac83",
      "tree": "37e3d785c7a649e23cd2f4ba4fe097a195c653ca",
      "parents": [
        "1ea68a9f57d4d9aaccad1109573dbf8e515b3d9b",
        "e5755c82747d9839a545b14be2be548e762cc058"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 12:55:24 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 19 12:55:24 2026 -0600"
      },
      "message": "Merge pull request #5948 from harfbuzz/vector-no-reuse-no-pen\n\n[vector/raster] Simplify draw/paint API"
    },
    {
      "commit": "e5755c82747d9839a545b14be2be548e762cc058",
      "tree": "70c87eaf9fbab32a1bd24865728b838dbd033c4c",
      "parents": [
        "e134bb760e41bd4559cd91a7678cd09a31995286"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 12:52:17 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Apr 19 12:52:17 2026 -0600"
      },
      "message": "[raster/vector] Address review feedback\n"
    },
    {
      "commit": "1ea68a9f57d4d9aaccad1109573dbf8e515b3d9b",
      "tree": "1d73572964059c100d3512a2f86ee166e68aa93d",
      "parents": [
        "27f1be922e56633526e4b963b69b2a60628b258d"
      ],
      "author": {
        "name": "parasol-aser",
        "email": "3848358+parasol-aser@users.noreply.github.com",
        "time": "Sat Apr 18 20:54:54 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 18 19:54:54 2026 -0600"
      },
      "message": "[fontations] Fix OOB write on glyph-name callback with size \u003d\u003d 0 (#5946) (#5947)\n\n* [fontations] Fix OOB write on glyph-name callback with size \u003d\u003d 0\n\nThe Rust `_hb_fontations_glyph_name()` callback computed\n`glyph_name.len().min(size as usize - 1)`. When a caller passed\n`size \u003d\u003d 0`, `size as usize - 1` underflowed a `usize` to\n`usize::MAX`, the `min()` clamp collapsed to `glyph_name.len()`,\nand the subsequent `copy_nonoverlapping` / trailing NUL wrote\n`glyph_name.len() + 1` bytes into a zero-capacity caller buffer.\nThis is an out-of-bounds write reachable from the public API\nwhenever the build was configured with `-Dfontations\u003denabled`\nand the application had called `hb_fontations_font_set_funcs()`.\n\nShort-circuit the `size \u003d\u003d 0` case before the subtraction.\nReturn `true` in that case to match the existing post and CFF1\nbackends (`hb-ot-post-table.hh`, `hb-ot-cff1-table.hh`), which\nboth early-out with `return true` on `!buf_len` — the glyph\ndoes have a name; we simply had no buffer to write it into.\n\nRegression tests added in `test/api/test-glyph-names.c` cover\nthe zero-size path on post and CFF1 backends, a sub-font, a\nNULL buffer, and `size \u003d\u003d 1` / small-buffer / exact-fit cases\nso the truncation path does not silently regress.\n\nFixes: https://github.com/harfbuzz/harfbuzz/issues/5946\nAssisted-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* [font] Reject glyph-name lookups with size \u003d\u003d 0 at the wrapper\n\n`hb_font_t::get_glyph_name()` previously pre-wrote the trailing\nNUL only when `size !\u003d 0` but still dispatched to the backend\ncallback with `size \u003d\u003d 0`. Every current glyph-name backend has\nto re-validate that argument: `post` and `cff1` short-circuit\nwith `return true`, the new Rust `fontations` callback now\nshort-circuits too (prior commit), and the CoreText callback in\n`hb-coretext-font.cc` has a structurally similar `(CFIndex)size\n- 1` pattern.\n\nNormalize this at the wrapper layer: return `false` immediately\non `size \u003d\u003d 0`, before any backend dispatch and before the\n`*name \u003d \u0027\\0\u0027` write. This makes the zero-size case a single,\nauditable no-op for every glyph-name provider (native or Rust,\ncurrent or future) and removes the CoreText underflow from the\nreachable surface through the same chokepoint.\n\nObservable change: callers that invoked\n`hb_font_get_glyph_name(font, gid, buf, 0)` on post/cff1 backed\nfonts used to get `true` back; they now get `false`. `size \u003d\u003d 0`\nqueries carry no useful information for the caller, so this is\nconsidered a safe hardening rather than a contract break.\n\nAssisted-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* [font] Preserve glyph-name zero-size probe semantics\n\nKeep `hb_font_get_glyph_name(..., NULL, 0)` as a valid\nreturn-value-only probe instead of rejecting `size \u003d\u003d 0` in the\nwrapper.\n\nFix the remaining backend-specific zero-size paths in hb-ft and\nhb-coretext-font so they answer the probe without dereferencing the\ncaller buffer, and update the API tests to assert the preserved\nbehavior.\n\nTesting: CCACHE_DISABLE\u003d1 meson test -C build test-glyph-names\nTesting: CCACHE_DISABLE\u003d1 meson test -C build test-ft\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n\n---------\n\nCo-authored-by: jeffhuang \u003cjeff@docker.xydrsucermoubd24xgo33yhsgd.bx.internal.cloudapp.net\u003e"
    },
    {
      "commit": "27f1be922e56633526e4b963b69b2a60628b258d",
      "tree": "4747d96d238ad7812a8820e69318ae4415d706cc",
      "parents": [
        "edc8c18ef88262fc467a30ab74f05080d6aea6cf"
      ],
      "author": {
        "name": "David Corbett",
        "email": "corbett.dav@northeastern.edu",
        "time": "Sat Apr 18 21:54:27 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 18 19:54:27 2026 -0600"
      },
      "message": "[indic] Categorize U+1CF5 and U+1CF6 as CS (#5949)"
    },
    {
      "commit": "e134bb760e41bd4559cd91a7678cd09a31995286",
      "tree": "1c84625e6603d75dd0fa9d1f6bade1d0f9a5f937",
      "parents": [
        "e5c87cf0421436d33b641ff5d9d3b85f1ff8475a"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 13:07:05 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 13:07:05 2026 -0600"
      },
      "message": "[vector] Strip clip-glyph dedup in SVG paint\n\npush_clip_glyph kept a hash + linear-scan cache of emitted\nclip paths to dedup repeated clip-glyph uses within a single\nCOLRv1 paint tree.  With paint contexts being one-glyph per\nuse, the cache mostly churned; it also made hb_memcmp trip\non sanitizer-null when an empty path matched an equally-empty\nexisting entry (fuzzer-reached null-deref).\n\nDrop the cache: always emit a fresh \u003cpath\u003e + \u003cclipPath\u003e pair\nper push_clip_glyph.  Removes defined_paths / content_entry_t\nfrom the paint struct.\n\nRegenerate the two handwriting COLR expected SVGs whose\nclip-reuse now produces distinct path defs.\n\nAssisted-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e5c87cf0421436d33b641ff5d9d3b85f1ff8475a",
      "tree": "88b7e4e3074c9b2362fab4e7d68cff7efeb5eede",
      "parents": [
        "99ffe47b10966d8e3eb6f91b4ae14f8ee9a5d1bf"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 12:48:23 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 12:48:23 2026 -0600"
      },
      "message": "[util/vector] Produce Y-up extents for auto-fit box\n\ninclude_point used to flip Y so the computed line-box extents\nmatched the old Y-down internal model.  With the library now\ntracking extents in Y-up (font) space and wrapping SVG body\nin \u003cg transform\u003d\"scale(1,-1)\"\u003e, that flip sent the auto-fit\nviewBox above the glyph ink instead of around it.\n\nRegenerate the vector expected SVGs that had captured the\nshifted viewBox.\n\nAssisted-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "99ffe47b10966d8e3eb6f91b4ae14f8ee9a5d1bf",
      "tree": "ccb63ef2a1b38e09699b6420ee4676b1b929fcec",
      "parents": [
        "b3c3e6a818ebade6a6ecf7eed15738d6cac7600f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 12:48:13 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 12:48:13 2026 -0600"
      },
      "message": "[vector] Normalize extents in set_extents\n\nAccept caller-supplied extents in any orientation and\nnormalize to min-corner origin with positive width/height.\nLets callers use the glyph-extents-style {top, -height} form\nmatching hb_glyph_extents_t convention, and brings set_extents\nin line with the Y-up internal model the paint/draw contexts\nnow use.\n\nAssisted-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b3c3e6a818ebade6a6ecf7eed15738d6cac7600f",
      "tree": "4dca0f9062ccfef1b33577c8505725ea2e78daf1",
      "parents": [
        "750df72e2be2704d01ff217d0c1fa47d8ba37764"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:41:44 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:41:44 2026 -0600"
      },
      "message": "[vector] Add public hb_vector_draw_new_path() API\n\nExposes the path separation as a public function so callers\nusing the draw funcs directly can separate glyph outlines.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "750df72e2be2704d01ff217d0c1fa47d8ba37764",
      "tree": "311f2b44b6b7952bf1ea9bacea751c702a85b1f2",
      "parents": [
        "31c518df7a474fb417138c2c4dc87f05a0bb2c33"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:36:05 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:36:05 2026 -0600"
      },
      "message": "[NEWS/docs] Update for vector API changes\n\n- Remove draw svg_prefix from New API list and sections.txt\n- Document pen_x/pen_y removal, dedup removal, _glyph\n  simplification in the Vector library section\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "31c518df7a474fb417138c2c4dc87f05a0bb2c33",
      "tree": "e70ea290348a626251f4cee3a29493dc42e9eb04",
      "parents": [
        "36174584ba6b5fe33086a1cac9818f31a8b01977"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:29:04 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:31:12 2026 -0600"
      },
      "message": "[raster] Push/pop transform in paint _glyph_impl, not ensure_initialized\n\nRemove the initial base_transform push from ensure_initialized.\nInstead, _glyph_impl pushes/pops the positioning transform via\nthe paint funcs, matching the vector paint model.\n\ncurrent_transform() returns identity when the stack is empty.\npop_transform allows popping to empty (for the final glyph-level\npop).\n\nThis makes changing set_transform between glyph calls work\ncorrectly — the transform is applied fresh for each glyph.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "36174584ba6b5fe33086a1cac9818f31a8b01977",
      "tree": "aa59c28d2f1e13680186407363fb4ef090992b42",
      "parents": [
        "cf57fa72a77c9d3ad4b13228cc1049138ba7f731"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:19:55 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:19:55 2026 -0600"
      },
      "message": "[vector/raster/gpu] Document _glyph functions as convenience\n\nEach _glyph_or_fail function now documents what it is\nequivalent to in terms of the underlying font draw/paint\nAPI + the context\u0027s own funcs.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cf57fa72a77c9d3ad4b13228cc1049138ba7f731",
      "tree": "ce2cc544a35f6f625f3ee993b56bcfea759698e8",
      "parents": [
        "127f06068195640857553e39c92440dddb7846d1"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:10:40 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 11:13:12 2026 -0600"
      },
      "message": "[vector] Unify ensure_initialized, remove PDF duplicate\n\nRemove hb_pdf_paint_ensure_initialized — it was identical to\npaint-\u003eensure_initialized().  All PDF callbacks now call the\ncommon method.  Remove redundant call from _glyph_impl since\npaint callbacks handle it.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "127f06068195640857553e39c92440dddb7846d1",
      "tree": "bf1a75cc95c17d95473382251352dfb9db530fd2",
      "parents": [
        "57e056a22c59149455a889556bee873bf4e05d43"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 10:58:44 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 10:58:44 2026 -0600"
      },
      "message": "[raster] Move decl around\n"
    },
    {
      "commit": "57e056a22c59149455a889556bee873bf4e05d43",
      "tree": "799cd9ea74b2087252c5577166341c6d8c48d1b1",
      "parents": [
        "dfef3f33ae422e67f8bce7760bf3a96e9f450ee7"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 10:54:56 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 10:58:31 2026 -0600"
      },
      "message": "[vector] Return nullptr from paint get_funcs for invalid format\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "dfef3f33ae422e67f8bce7760bf3a96e9f450ee7",
      "tree": "cc713730deb5800b133e1670fdeabb04bae47c4d",
      "parents": [
        "2be60ac235d6d02b5b0a7ab3302712fc2aa0f030"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:50:21 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:50:21 2026 -0600"
      },
      "message": "[vector] Global Y-flip in SVG render, eliminate per-glyph flips\n\nSVG render now wraps all body content in a single\n\u003cg transform\u003d\"scale(1,-1)\"\u003e.  All coordinates inside are\nin Y-up (font) space.  The viewBox maps the flipped range.\n\nThis eliminates:\n- Per-path scale(1,-1) wrappers in draw flush_path_svg\n- Per-glyph Y-flip in paint _glyph_impl\u0027s push_transform\n- The {-xy, -yy, -ty} negation in extents transforms\n- Format switch in paint _glyph_impl\n\npaint _glyph_impl now passes the raw transform to\npush_transform — no format knowledge needed.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "2be60ac235d6d02b5b0a7ab3302712fc2aa0f030",
      "tree": "f945dc647f3f5566855b91238fe910451110cf5d",
      "parents": [
        "bc3713f5f52d2039f4f7de330620b51339abd00a"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:26:07 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:40:39 2026 -0600"
      },
      "message": "[vector] Strip paint SVG dedup, simplify paint _glyph_impl\n\nRemove content-based color glyph dedup from paint — no more\n\u003cdefs\u003e/\u003cuse\u003e for color glyphs.  Each glyph\u0027s paint output is\nemitted inline, wrapped by push_transform/pop_transform from\nthe paint funcs (which emit \u003cg transform\u003d\"...\"\u003e for SVG and\nq cm ... Q for PDF).\n\n_glyph_impl is now format-agnostic: extend extents,\npush_transform, paint, pop_transform.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bc3713f5f52d2039f4f7de330620b51339abd00a",
      "tree": "55d415ea92b16163203aca859c8617380e1c9071",
      "parents": [
        "82734f4ce56b6975bb06d675608c35ff2155eb08"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:14:34 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:14:34 2026 -0600"
      },
      "message": "[vector] Add new_path(), make _glyph_or_fail trivially thin\n\n_glyph_or_fail is now: extend extents, new_path, draw.\nNo format switch, no flush — just accumulate.\n\nnew_path() flushes any pending path and starts a fresh one,\nseparating glyph outlines so they don\u0027t interact under fill\nrules.\n\nFlush also happens on foreground change and at render time,\nso the last pending path is always emitted.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "82734f4ce56b6975bb06d675608c35ff2155eb08",
      "tree": "b3a8efa0fa3ba98a25ab1d802b55eedbb775abde",
      "parents": [
        "992835a182ae2202fa6299031ff7ac8151b6a63f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:06:26 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 04:06:26 2026 -0600"
      },
      "message": "[vector] Simplify draw _glyph_or_fail to just draw + flush\n\nRemove format switch from _glyph_or_fail — it now just extends\nextents, calls hb_font_draw_glyph with the context\u0027s own funcs,\nand flushes.  All format-specific work is in flush_path() and\nthe draw callbacks.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "992835a182ae2202fa6299031ff7ac8151b6a63f",
      "tree": "8c9b56a6a0e64c604da8726491cd7945e9dc3950",
      "parents": [
        "786bf59b95ca793c97248f1696644acad7cb86de"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:53:18 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:56:32 2026 -0600"
      },
      "message": "[vector] Strip SVG dedup from draw, remove svg_prefix API\n\nDraw SVG output is now flat inline \u003cpath\u003e elements — no\n\u003cdefs\u003e, no \u003cuse\u003e, no id references.  Each glyph is an\nindependent \u003cpath d\u003d\"...\" transform\u003d\"...\" fill\u003d\"...\"/\u003e.\n\nRemove hb_vector_draw_set_svg_prefix / get_svg_prefix since\ndraw output no longer emits any ids.  Paint keeps svg_prefix\nfor gradient and clip ids which SVG requires.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "786bf59b95ca793c97248f1696644acad7cb86de",
      "tree": "14a20d0fc650933a1c105b3ca43477c322fe1ab8",
      "parents": [
        "f469f05a40fede86d659e03772edb78e61f283a4"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:46:30 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:46:30 2026 -0600"
      },
      "message": "[vector] Remove global transform wrapper from SVG paint render\n\nThe transform is transient per _glyph call, not a global\nstate for the entire document.  Each glyph\u0027s \u003cuse\u003e already\ncarries its own transform from the caller\u0027s set_transform.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f469f05a40fede86d659e03772edb78e61f283a4",
      "tree": "eceb672f25403bd9c1d6fe6caf0c639e2921d4ab",
      "parents": [
        "c76b3a29a942c8965b8d174ecb3b52d87c38fe52"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:32:33 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:32:33 2026 -0600"
      },
      "message": "[vector/raster] Remove pen_x/pen_y from _glyph APIs\n\nThese are convenience APIs, not typesetting APIs — positioning\nis the caller\u0027s responsibility via set_transform().  This\nmatches the GPU API which never had pen parameters.\n\nAll callers updated to use set_transform with pen position\nbefore each _glyph call.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c76b3a29a942c8965b8d174ecb3b52d87c38fe52",
      "tree": "502050c3a4f91528d446ae40af43f4827654652d",
      "parents": [
        "edc8c18ef88262fc467a30ab74f05080d6aea6cf"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:09:35 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Apr 18 03:09:35 2026 -0600"
      },
      "message": "[vector] Content-based dedup, remove font reference caching\n\nReplace glyph-ID-based dedup with content-based dedup for SVG\npath definitions and color glyph groups.  Path/paint output is\nhashed and compared byte-for-byte against existing defs;\nidentical content reuses the same def regardless of glyph ID.\n\nThis eliminates the font reference held by draw/paint contexts\n(cached_font + hb_font_reference), which was keeping the font\nand its face alive longer than the caller expected.  No font\npointer is stored at all now.\n\nAlso removes changed() — with content-based dedup, foreground\nand palette changes produce different content that naturally\nwon\u0027t match cached entries.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "edc8c18ef88262fc467a30ab74f05080d6aea6cf",
      "tree": "07f4c4c7868d1adb49586c7f468816aafe1a4c7e",
      "parents": [
        "0830c4b44929c641b3cf43c3f248827a4e672869"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 21:01:25 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 21:01:25 2026 -0600"
      },
      "message": "Link to harfbuzz-world.cc playground in README\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0830c4b44929c641b3cf43c3f248827a4e672869",
      "tree": "6d1ad5fd5319ccfdda0d2c23aa8b0f988ae55f09",
      "parents": [
        "036a5ad86f84b68fadb44a1217035fbcbb457f37"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 20:19:02 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 20:19:02 2026 -0600"
      },
      "message": "[gpu/demo] Use union of ink + logical extents for autofit\n\nNastaliq and other deep-descender scripts were clipped because\nthe fit used only logical extents (one em height).  Now uses\nthe union of ink and logical extents so all ink is visible.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "036a5ad86f84b68fadb44a1217035fbcbb457f37",
      "tree": "c0e4b362af1d69638b1b238cf1b0fa393c40d040",
      "parents": [
        "fd0a18dcc20d0a3b47a2c6590b6b16440799895d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 20:05:43 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 20:05:43 2026 -0600"
      },
      "message": "[gpu] Add font feature support to demo\n\n- demo_buffer_set_features() sets global features for hb_shape\n- web_set_features() wasm export parses comma-separated features\n- Shell message handler accepts { kind: \"features\", value }\n- Features applied to all shape calls in demo_buffer_add_text\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "fd0a18dcc20d0a3b47a2c6590b6b16440799895d",
      "tree": "3b709bdb8991756629d43d61799d280e67c19c66",
      "parents": [
        "b2a09c29487079b2cedbcc17ed048832afb31316"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 18:37:15 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 18:59:43 2026 -0600"
      },
      "message": "[gpu/web] Add key message handler for embed mode\n\nAllows the host page to simulate keypresses (e.g. \u0027b\u0027 for\ndark mode toggle) via postMessage { kind: \u0027key\u0027, value }.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b2a09c29487079b2cedbcc17ed048832afb31316",
      "tree": "c023c0bbc8ae1488019e7dfab12d69887d5ce404",
      "parents": [
        "77b0369078b4858cfcea169d65f249b0b99cf829",
        "bb2b4bfbc2c6203377a142c3ebb7cd84a4d78e2a"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:53:00 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 16:53:00 2026 -0600"
      },
      "message": "Merge pull request #5945 from harfbuzz/fuzzer-fixes-apr17\n\nFuzzer fixes apr17"
    },
    {
      "commit": "77b0369078b4858cfcea169d65f249b0b99cf829",
      "tree": "b576f1b73b7ed3ca50b4ea723245045e0bedeb54",
      "parents": [
        "d689790d5da963051df951255bffe46c052df348"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:50:36 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:50:36 2026 -0600"
      },
      "message": "[hb-vector.png] Fixup\n"
    },
    {
      "commit": "bb2b4bfbc2c6203377a142c3ebb7cd84a4d78e2a",
      "tree": "bbfde90b3921c9bee9b64b14b85671e5b8211111",
      "parents": [
        "e4d1127676fcc4938e13a4e67509d64e1aa2e808"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:29:06 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:29:06 2026 -0600"
      },
      "message": "[fuzzing] Cap font scale in raster fuzzer to avoid OOM\n\nMalicious fonts with extreme scale values cause huge pixel\nbuffer allocations across multiple push_group surfaces.  The\nlibrary correctly bounds individual surfaces at 1 GB, but\nstacked group surfaces can exceed the fuzzer RSS limit.\n\nCap the font scale to 1000 in the harness so the exercised\nsurface stays within fuzzer memory constraints.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e4d1127676fcc4938e13a4e67509d64e1aa2e808",
      "tree": "92aac1a35a9300b594dc305670eff020247b43e5",
      "parents": [
        "0f9e0ba2a5f9c916c0242454cf9bbde41a4f8e92"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:23:42 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:23:42 2026 -0600"
      },
      "message": "[test] Add one more fuzzer font\n"
    },
    {
      "commit": "0f9e0ba2a5f9c916c0242454cf9bbde41a4f8e92",
      "tree": "0b7c415bce75e294eff11ba918efafc89208ba2e",
      "parents": [
        "82cba446444c982229ed41f0a6f4bf44d8e234e2"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:19:47 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:20:14 2026 -0600"
      },
      "message": "[gpu] Fix signed integer overflow in extents computation\n\nGlyph extents from malicious fonts can have extreme values\nthat overflow when computing x_bearing + width or the\nwidth/height deltas in hb_gpu_paint_encode.  Widen to int64_t\nbefore the arithmetic.\n\nFixes: https://oss-fuzz.com/testcase-detail/crash-8a9ba2164fd1e6a6fd7a8ed566cf4d0350c1357e\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "82cba446444c982229ed41f0a6f4bf44d8e234e2",
      "tree": "b53204e448f7eee425a0d7f4aa27dee5d440bb96",
      "parents": [
        "d689790d5da963051df951255bffe46c052df348"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:15:46 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 16:17:42 2026 -0600"
      },
      "message": "[gpu] Fix out-of-bounds read in emit_all_clip_sub_blobs\n\nWhen clip nesting exceeds HB_GPU_PAINT_MAX_CLIP_DEPTH (3),\npush_clip_glyph sets unsupported\u003dtrue but still increments\nclip_depth.  emit_all_clip_sub_blobs then iterated clip_depth\nwithout capping, reading past the fixed-size clip_stack array.\n\nCap the iteration at HB_GPU_PAINT_MAX_CLIP_DEPTH.\n\nFixes: https://oss-fuzz.com/testcase-detail/6573156621156352\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d689790d5da963051df951255bffe46c052df348",
      "tree": "c7f7cbec0f07aea3353f2262c355a3177084928c",
      "parents": [
        "d5819716b353461e950ec37d340ce57ac48c260f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:58:27 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:58:27 2026 -0600"
      },
      "message": "hb-shape.png: Optimize\n"
    },
    {
      "commit": "d5819716b353461e950ec37d340ce57ac48c260f",
      "tree": "1ce181d6d8d733d0d900ce7fbee777acd2f0fd72",
      "parents": [
        "e9c62e1ad3d2684cf881ee7e5ebe21fa3d9c1ac1"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:53:57 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:53:57 2026 -0600"
      },
      "message": "Add hb-shape.png\n"
    },
    {
      "commit": "e9c62e1ad3d2684cf881ee7e5ebe21fa3d9c1ac1",
      "tree": "d359cf046b3bd6be1c7feaeaf7ec56acff2abd25",
      "parents": [
        "13cac4f57ecaaffe76373e7edfec1c915dfe288e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:43:28 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:43:28 2026 -0600"
      },
      "message": "[vector] Center logo to match others\n"
    },
    {
      "commit": "13cac4f57ecaaffe76373e7edfec1c915dfe288e",
      "tree": "a557f99ab48a7d85be527b0cd5a01c43142038d7",
      "parents": [
        "af73332390fa347b1d9dd64ed13f01a52a5d476b"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:18:58 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:18:58 2026 -0600"
      },
      "message": "[NEWS] Document GPU shader API changes\n\nCoverage out parameter, premultiplied gradient interpolation,\nforeground alpha fix, and the shader signature change.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "af73332390fa347b1d9dd64ed13f01a52a5d476b",
      "tree": "51932007276cd0a9141d20c223058cc5691ddce5",
      "parents": [
        "43b8568139325659c82fa4c539cd8bd3c20afba3",
        "86eab665a8ea0ebf3a0b6c0bf0a87d656f6d8ed1"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 15:17:29 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 15:17:29 2026 -0600"
      },
      "message": "Merge pull request #5943 from harfbuzz/gpu-gamma\n\nFix hb-gpu gamma / stem-darkening interaction with color glyphs"
    },
    {
      "commit": "86eab665a8ea0ebf3a0b6c0bf0a87d656f6d8ed1",
      "tree": "51932007276cd0a9141d20c223058cc5691ddce5",
      "parents": [
        "d8b1d6bb57486c5accbbf3d50127dff8a71280a5"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 14:11:46 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 14:13:00 2026 -0600"
      },
      "message": "[gpu] Update hb_gpu_paint() docs for coverage out parameter\n\nUpdate the signature, parameter documentation, and sample code\nto reflect the new edge coverage out parameter.  Stem darkening\nexample now shows the coverage-based correction pattern.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d8b1d6bb57486c5accbbf3d50127dff8a71280a5",
      "tree": "f69408355a2c2ebf973f08731bd8e127b933da64",
      "parents": [
        "43b8568139325659c82fa4c539cd8bd3c20afba3"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 14:09:34 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 14:09:34 2026 -0600"
      },
      "message": "[gpu] Return edge coverage from hb_gpu_paint(); apply stem darkening and gamma to it\n\nhb_gpu_paint() now takes an out float coverage parameter that\nreceives the maximum slug coverage across all paint layers.\nThis lets the caller apply stem darkening and gamma correction\nto edge antialiasing only, without distorting interior paint\ncolors (gradients, semi-transparent layers).\n\nThe demo shaders (GLSL, MSL, HLSL, WGSL) use the new parameter\nto share a single coverage-correction block between draw and\npaint paths.  Also fixes the blend func to GL_ONE for correct\npremultiplied compositing.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "43b8568139325659c82fa4c539cd8bd3c20afba3",
      "tree": "802892ec42edc5e1d2462104f546914cbdc7e83e",
      "parents": [
        "a5bd4455789b4fa2c7a8e96c9900373a0032bcfc"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:43:21 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:43:21 2026 -0600"
      },
      "message": "[vector] Fix potential use-after-free in check_font()\n\nReference the new font before destroying the old one, in case\nboth pointers are the same object.  In practice the caller always\nholds its own reference so this cannot trigger, but the pattern\nis safer and silences Coverity CID 503195/503196.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "a5bd4455789b4fa2c7a8e96c9900373a0032bcfc",
      "tree": "df741239df754f0277d2e60ec7ef6b2f61965576",
      "parents": [
        "ba66cfcc0b218009ae99e22ad3df7df43deb5858"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:36:15 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:36:57 2026 -0600"
      },
      "message": "[vector] Expand section docs with usage examples and caveats\n\nAdd sample code for both draw and paint contexts, note that\nrender clears accumulated content (get extents first), and\ndocument the semi-transparent overlap compositing behavior.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ba66cfcc0b218009ae99e22ad3df7df43deb5858",
      "tree": "f6083e63472688c45c85ce08cbaed802a9a4c33a",
      "parents": [
        "0272f02af744f4f7756e794d88a151789d4e54e5"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:26:54 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:36:57 2026 -0600"
      },
      "message": "[util] Document --background\u003dnone in help string\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0272f02af744f4f7756e794d88a151789d4e54e5",
      "tree": "fa74cc3b1beb6f9290d5f1e9d90b5be12e479db4",
      "parents": [
        "15a451c20541049b754c98f0b90c09342728b5b4"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:25:10 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:36:57 2026 -0600"
      },
      "message": "[vector] Adjust duplicate header and improve docs\n"
    },
    {
      "commit": "15a451c20541049b754c98f0b90c09342728b5b4",
      "tree": "6bd0f60f2aa79ba103f8b6143b73edd35e1d89af",
      "parents": [
        "9fc44028fe28b46e0694e15f425b3b023895473e",
        "3c9fe077b114ba5aa03332201e68a686b2a48e52"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 13:35:54 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 13:35:54 2026 -0600"
      },
      "message": "Merge pull request #5941 from harfbuzz/vector-touchups\n\nvector touchups"
    },
    {
      "commit": "3c9fe077b114ba5aa03332201e68a686b2a48e52",
      "tree": "6bd0f60f2aa79ba103f8b6143b73edd35e1d89af",
      "parents": [
        "178402d7b4ff1dcff2f54abaded8f68a4ca24868"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:57:17 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:57:17 2026 -0600"
      },
      "message": "[gpu] Interpolate gradient color stops in premultiplied space\n\nThe OpenType COLR spec requires gradient interpolation in\npremultiplied space.  The shader was interpolating unpremultiplied\nstop colors directly, which produced washed-out transitions when\na stop fades toward transparency (e.g. opaque red to transparent\ngives desaturated pink instead of red at decreasing opacity).\n\nPremultiply stop colors before mix(), unpremultiply the result.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "178402d7b4ff1dcff2f54abaded8f68a4ca24868",
      "tree": "dd61d4930abd416eced6cb0089b1a8a6c9efd9ce",
      "parents": [
        "af21e3c2270a599780daea732e0060f6cbb8ae16"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:42:55 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:42:55 2026 -0600"
      },
      "message": "[gpu/demo] Fix blend func for premultiplied paint output\n\nhb_gpu_paint() returns premultiplied RGBA, as documented in\nhb-gpu.cc.  The GL demo was using GL_SRC_ALPHA which\ndouble-applied alpha, darkening semi-transparent colors.\n\nUse GL_ONE as the API docs prescribe.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "af21e3c2270a599780daea732e0060f6cbb8ae16",
      "tree": "0cc1f1ea2d5bee5393628927fd45706630b5ad46",
      "parents": [
        "dba796ff28bfea53025c49e9bf235d6d34e05a60"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:35:29 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:35:29 2026 -0600"
      },
      "message": "[vector/raster] Remove is_foreground substitution; pass foreground directly\n\nThese backends use immediate-mode foreground: they pass their\nforeground color to hb_font_paint_glyph() and use the resolved\ncolor from the callback directly.  The is_foreground substitution\nwas redundant (a no-op when foreground alpha is 255) and prevented\nsemi-transparent foreground alpha from working correctly.\n\nNow the foreground is passed as-is (including its alpha) to\nhb_font_paint_glyph(), and the color callback ignores\nis_foreground — the color already carries the correct value.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "dba796ff28bfea53025c49e9bf235d6d34e05a60",
      "tree": "b5fe68d30fa7baedb0987754701ed19c96d0a840",
      "parents": [
        "9031600cc251eb6cba31cab4a158e55a5fb5beda"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:24:30 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:24:30 2026 -0600"
      },
      "message": "[gpu] Fix foreground alpha: only modulate alpha channel, not RGB\n\nThe previous commit scaled all four components of the foreground\nuniform by the baked paint-tree alpha, which darkened the RGB\ntowards black.  The foreground is unpremultiplied, so only the\nalpha channel should be modulated; the shader\u0027s later premultiply\nstep handles the rest.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9031600cc251eb6cba31cab4a158e55a5fb5beda",
      "tree": "f8f58016f3ae1edefdb7f9838b46f1226701f671",
      "parents": [
        "f546f73b1f93e42d2c3e4e9e7ab16eee0f7a5eaf"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:17:50 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:17:50 2026 -0600"
      },
      "message": "[paint] Document is_foreground semantics on color callback and color stops\n\nExplain the two valid usage modes: immediate (use @color directly)\nand deferred (substitute own foreground RGB, combine alpha).  Note\nthat deferred mode requires passing an opaque foreground to\nhb_font_paint_glyph().\n\nhb_color_stop_t defers to hb_paint_color_func_t for the\nis_foreground/color contract.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f546f73b1f93e42d2c3e4e9e7ab16eee0f7a5eaf",
      "tree": "49b9d1005eae5a8a625744fcbf9a5a27ca3576e3",
      "parents": [
        "7f333335b12f32258e7e0bfcdf59e3c0306bfd6f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:11:59 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 03:11:59 2026 -0600"
      },
      "message": "[gpu] Preserve paint-tree alpha for foreground entries in shaders\n\nWhen is_foreground was set, the shader replaced the entire baked\ncolor with the foreground uniform, discarding the paint-tree alpha\nencoded in the color\u0027s alpha channel.  This meant COLRv1 glyphs\nwith a separate alpha on their foreground color sentinel would\nlose that alpha at render time.\n\nNow the shader multiplies the foreground uniform by the baked alpha\n(ct.a / 32767 for LAYER_SOLID, b.a / 32767 for gradient stops),\npreserving the paint-tree modulation.\n\nUpdated all four shader languages (GLSL, HLSL, MSL, WGSL) and\nregenerated the .hh artifacts.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7f333335b12f32258e7e0bfcdf59e3c0306bfd6f",
      "tree": "123369210dac459113d9b10830950fdb401e9e40",
      "parents": [
        "d17dbe74d1dd3cec94018611d97671817f1cd96a"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:43:15 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:44:20 2026 -0600"
      },
      "message": "[font] Synthesized mono paint: pass is_foreground\u003dtrue, alpha\u003d255\n\nThe synthesized fallback should signal is_foreground\u003dtrue so\nbackends like cairo that handle foreground specially can detect\nit.  Pass alpha\u003d255 since the caller passes opaque foreground\nto paint_glyph; backends that care about foreground will apply\ntheir own alpha.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d17dbe74d1dd3cec94018611d97671817f1cd96a",
      "tree": "e4b1a2d879d76563a698b02488fca2f6fda7ee59",
      "parents": [
        "4e2a9b0c585d5c35675b73909be54faecde40481"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:40:19 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:40:19 2026 -0600"
      },
      "message": "Revert \"[vector] Remove is_foreground substitution from paint backends\"\n\nThis reverts commit 9d1ce8c942c477e1f7db88fd5afcd6ceaecd7335.\n"
    },
    {
      "commit": "4e2a9b0c585d5c35675b73909be54faecde40481",
      "tree": "146880369b788275d8a6b33ba6e44b23cde9ad9c",
      "parents": [
        "e76163ebc85ba6e7bf5f74402b047e7708be1a73"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:29:27 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:29:27 2026 -0600"
      },
      "message": "[vector/raster] Pass opaque foreground to paint_glyph\n\nThe COLR walker\u0027s get_color bakes foreground_alpha into\nthe returned color.  Since our backends don\u0027t substitute\npaint-\u003eforeground in their callbacks (they trust the walker\u0027s\nresolved color), passing foreground with its own alpha would\ndouble-count it.\n\nForce alpha\u003d255 when passing foreground to hb_font_paint_glyph\nand _or_fail, matching what cairo does.  The backend applies\nforeground alpha through its own mechanisms (draw fill-opacity,\nraster compositing).\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e76163ebc85ba6e7bf5f74402b047e7708be1a73",
      "tree": "d9221da47746fb849817842f65cafe98b41113ea",
      "parents": [
        "9d1ce8c942c477e1f7db88fd5afcd6ceaecd7335"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:18:47 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:18:47 2026 -0600"
      },
      "message": "[vector-draw] Add PDF fill opacity via inline ExtGState\n\nThe PDF draw context was dropping foreground alpha because\nit had no resource dict for ExtGState.  Semi-transparent\nfills (e.g. --rainbow) rendered fully opaque.\n\nAdd a per-flush ExtGState with /ca (fill opacity) when\nalpha \u003c 255.  The ExtGState entries are inlined in the\npage\u0027s resource dict — no separate PDF objects needed.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9d1ce8c942c477e1f7db88fd5afcd6ceaecd7335",
      "tree": "aa8a815be1887c06b58fc50c68a7a25d9c6c375e",
      "parents": [
        "7b82745f2886d3a91ea7b214ca64f997031ad872"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:06:40 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:14:41 2026 -0600"
      },
      "message": "[vector] Remove is_foreground substitution from paint backends\n\nThe SVG and PDF paint_color callbacks were substituting\npaint-\u003eforeground when is_foreground\u003dtrue, ignoring the\ncolor the COLR walker already resolved.  The original paint\nAPI contract is: if is_foreground, the color IS the\nforeground — use it directly.\n\nSame fix for gradient color stops: the color line already\nhas foreground colors resolved by the walker.  Drop the\nredundant substitution + alpha multiplication.\n\nThis removes the dependency on paint-\u003eforeground in the\npaint callbacks, eliminating the dual-foreground path.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7b82745f2886d3a91ea7b214ca64f997031ad872",
      "tree": "f3c4df90f8f3676dada12278e0b8f216535b1d4b",
      "parents": [
        "14c789de8d69d1af93da842a44ca5f8cfd0fc688"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:42:11 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 02:01:51 2026 -0600"
      },
      "message": "[font] Fix synthesized mono paint: pass foreground as literal color\n\nThe synthesized mono fallback was passing is_foreground\u003dtrue,\nwhich caused the backend to modulate the foreground alpha\nwith the color\u0027s alpha — squaring the alpha when the color\nwas the foreground itself.\n\nInstead, pass the foreground as a literal color (is_foreground\u003d\nfalse).  This avoids any interaction with the backend\u0027s own\nforeground state and passes the caller\u0027s foreground value\nstraight through.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "14c789de8d69d1af93da842a44ca5f8cfd0fc688",
      "tree": "f2963a11b6dcfd7e04cdca84fa75e4ab54f75d7b",
      "parents": [
        "f3dc6876201c7339dbce2e775011bfc9324e8cf9"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:38:12 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:38:12 2026 -0600"
      },
      "message": "[vector-paint] Don\u0027t clear output buffers on changed()\n\nchanged() was clearing defs, path, and group_stack (the\naccumulated output) in addition to the glyph caches.  When\nset_foreground was called per-glyph (e.g. --rainbow), each\ncolor change wiped all previous glyphs — only the last one\nsurvived in the rendered output.\n\nOnly clear the caches (defined_outlines, defined_clips,\nactive_color_glyphs, defined_color_glyphs).  Leave the\noutput buffers and counters intact.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f3dc6876201c7339dbce2e775011bfc9324e8cf9",
      "tree": "d07f5ef2d85fcbb73b232acba95bf086563df7cf",
      "parents": [
        "370ed58a705e46d64838790a2f8f847929230844"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:32:59 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:33:11 2026 -0600"
      },
      "message": "[util] Semi-retire --stroke; hide from --help\n\nThe recently added --stroke option is only meaningful in\nhb-view (cairo rendering).  The experimental utils\n(hb-raster, hb-vector, hb-gpu) don\u0027t support stroked\noutline rendering.  Hide from --help but keep functional;\n--rainbow still enables it implicitly.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "370ed58a705e46d64838790a2f8f847929230844",
      "tree": "7138df505855c54f1583b7043ddd86c053563c60",
      "parents": [
        "9dfd7aa5a5ace762afd5e9d8c0a47e5d4d249de5"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:30:02 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:30:02 2026 -0600"
      },
      "message": "[vector-paint-pdf] Use scale_precision for transform matrix entries\n\nThe PDF push_transform and per-glyph cm were emitting\nmatrix entries (xx, yx, xy, yy) at default precision\u003d2.\nFor small values like 1/31.25 \u003d 0.032, this rounded to\n0.03 — a 6.25% error that accumulated through nested\ntransforms, visibly distorting color emoji rendering.\n\nUse scale_precision (min 7) for matrix entries, matching\nthe SVG paint backend.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9dfd7aa5a5ace762afd5e9d8c0a47e5d4d249de5",
      "tree": "cb931321784e7349bb3de6c4776f82cb9f05c5a1",
      "parents": [
        "bc1346db0d19a98b2b0a51404dcf2837b00d0041"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:22:56 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Apr 17 01:22:56 2026 -0600"
      },
      "message": "[vector] Fix global paint transform for output-space\n\nThe SVG global transform prefix emitted x0/y0 raw without\ndividing by scale_factor.  The PDF per-glyph cm was reduced\nto identity + translation, losing the matrix entries from\npaint-\u003etransform when non-identity.\n\nFix: divide x0/y0 by sf in SVG; emit full matrix in PDF cm.\nUpdate stale comment.\n\nAssisted-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    }
  ],
  "next": "bc1346db0d19a98b2b0a51404dcf2837b00d0041"
}
