)]}'
{
  "log": [
    {
      "commit": "64e2b53235aa33b5bad5442449a092b5729be66a",
      "tree": "2792379de069fcf35353475d9b300e1201ed4d4a",
      "parents": [
        "c5ed3c8da39037e3b379f68a766e2118c84bbaef"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 22:19:47 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 22:19:47 2026 -0600"
      },
      "message": "[glyf] Charge point loading to the work budget before doing the work (#6256)\n\nThe glyf outline budget was only charged after a glyph loaded\nsuccessfully: Glyph::get_points() spent 16 units per node up front, and\nglyf_accelerator_t::get_points() charged one unit per point only after\nthe whole tree came back.  A glyph that loaded ~175K points and then\ntripped a structural cap (HB_GLYF_MAX_POINTS, edge count) paid for the\nnodes but not the points.  Driven from a COLR paint walk through\nhb_font_get_glyph_extents(), one such glyph was loaded and thrown away\nover 8000 times per session within the budget, ~1.4G point loads.\n\nCharge at the point where the work is attempted instead:\n\n- SimpleGlyph::get_contour_points() takes the budget and charges\n  num_points before allocating, clearing, and reading, so truncated or\n  later-rejected glyphs pay for the points they allocate.\n\n- Composite levels charge the component subtree size before\n  transform_points(), since each nesting level transforms every point\n  below it and that multiplication was previously invisible to the\n  budget.\n\nThe terminal per-point charge for path emission is unchanged.\n\nLocal hb-vector-fuzzer run on the testcase: 4.3s -\u003e 0.12s.  Full test\nsuite passes.  The testcase is added as a fuzz seed.\n\nFixes: https://oss-fuzz.com/testcase-detail/5714817420427264\n\n\nClaude-Session: https://claude.ai/code/session_013ksLGe7wUVwbuANqR56YaN\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c5ed3c8da39037e3b379f68a766e2118c84bbaef",
      "tree": "7766fa0251e02be7f5f0e3014e656278fc7c76de",
      "parents": [
        "d60f62df486a60d1c7863d6440df7521342d7d1f"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Sep 10 16:59:38 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 16:59:38 2026 -0600"
      },
      "message": "[perf] Use snprintf to format benchmark-gpu names (#6255)\n\nAvoid potential stack buffer overflow when registering benchmarks\nfrom user-supplied font paths by using snprintf instead of strcat.\n\nAssisted-by: Gemini"
    },
    {
      "commit": "d60f62df486a60d1c7863d6440df7521342d7d1f",
      "tree": "45151e7b4f58132c7adc4196479753feff48c814",
      "parents": [
        "59729dc369d3f80d649651d117c3bfc2e08d5297"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Sep 10 16:45:59 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 16:45:59 2026 -0600"
      },
      "message": "[util/gpu] Avoid use-after-free on current_text in rebuild_buffer (#6253)\n\nIn hb-gpu-web and hb-gpu-web-webgpu, rebuild_buffer() frees current_text\nafter duplicating the input text, but then passes the original text\npointer to demo_buffer_add_text(). When called from web_load_font(),\nweb_set_variations(), web_set_features(), or web_set_palette() with\ncustom text active, text aliases current_text, resulting in a\nuse-after-free read of recently freed heap memory.\n\nFix this by:\n1. Skipping redundant reallocation when text already equals\n   current_text.\n2. Passing current_text to demo_buffer_add_text().\n3. Handling a null text input safely with a default fallback.\n\nAssisted-by: Gemini"
    },
    {
      "commit": "59729dc369d3f80d649651d117c3bfc2e08d5297",
      "tree": "0c5aac7971980849719c68b56207c68adb968168",
      "parents": [
        "863c53818b0ec9df2574497a0da5feec1e706df5"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Sep 10 16:45:41 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 16:45:41 2026 -0600"
      },
      "message": "Fix memory leak in hb_fc_can_render (#6254)\n\nAssisted-by: Gemini"
    },
    {
      "commit": "863c53818b0ec9df2574497a0da5feec1e706df5",
      "tree": "ba33a81e7c9157510955703609ac1e1c7135e143",
      "parents": [
        "d2e24847f679922c3d77a4c48f9030489d61875d"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Sep 10 16:12:36 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 16:12:36 2026 -0600"
      },
      "message": "[directwrite] Fix cluster mapping OOB access, heap overflow, and UAF (#6252)\n\nIn the DirectWrite shaper, vis_clusters was allocated from the scratch\nbuffer with a static size based on Uniscribe scratch math (glyphs_size).\nThis caused three memory safety issues:\n\n1. vis_clusters was indexed using log_clusters, which stores user\n   cluster IDs rather than glyph indices, allowing arbitrary\n   out-of-bounds array access. In DirectWrite, the character-to-glyph\n   mapping is returned in clusterMap, not log_clusters.\n2. If glyphCount exceeded glyphs_size, the initialization loop\n   overwrote past the allocated scratch buffer.\n3. buffer-\u003eensure(glyphCount) could reallocate buffer-\u003epos,\n   invalidating the scratch-allocated vis_clusters before its values\n   were read into info-\u003ecluster (use-after-free).\n\nFix this by allocating vis_clusters dynamically as an hb_vector_t\nsized to glyphCount, and correctly mapping clusters using clusterMap\nwith bounds checks.\n\nAssisted-by: Gemini"
    },
    {
      "commit": "d2e24847f679922c3d77a4c48f9030489d61875d",
      "tree": "4a4c9e0f73e2e8213c0e095fda590de4dc4855e7",
      "parents": [
        "3baafbcb3db1c2d7d407f8ef3a84ce7d6a68ae35"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Sep 10 14:54:07 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 14:54:07 2026 -0600"
      },
      "message": "Add null checking and fix memory leak in hb-coretext.cc (#6250)\n\n* Add null checking and fix memory leak in hb-coretext.cc\n\nAssisted by: Gemini\n\n* Add RAII hb_cf_ptr_t to manage coretext object lifetimes.\n\n* Remove HAVE_CORETEXT guard in hb-coretext.hh\n\nhb-coretext.hh will only be included when HAVE_CORETEXT is defined, so no need for the guard."
    },
    {
      "commit": "3baafbcb3db1c2d7d407f8ef3a84ce7d6a68ae35",
      "tree": "d462f0944755bb4c49026a5672652ae7324d992d",
      "parents": [
        "00f966c719aff270c5e8b6859347a8b94f16683f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 14:30:09 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 14:30:09 2026 -0600"
      },
      "message": "[raster] Clip the edge sweep\u0027s column walk to the surface (#6251)\n\n* [raster] Clip the edge sweep\u0027s column walk to the surface\n\nedge_sweep_row() walked every fixed-point pixel column an edge spans,\neven though columns right of the surface contribute nothing and\ncolumns left of it only contribute a cover delta that telescopes into\ncolumn 0.  A near-horizontal edge with extreme coordinates could span\n~2^24 columns per row, making sweep cost proportional to coordinate\nrange instead of surface width: the ClusterFuzz testcase took 114s in\na plain release build.\n\nFold the left-of-surface portion of the walk into a single column-0\ncover update, skip the right-of-surface portion, and enter/exit the\nper-column loop at the visible window.  Jumping the incremental fy\naccumulator by k*delta_fy is exact, since the increment is constant\nand the running sums are bounded, so output is bit-identical; verified\nby comparing 178 hb-raster renders (draw and paint paths, several\nfonts, sizes, and negative-margin crops that clip edges off-surface)\nbyte-for-byte against the previous code.  The testcase now runs in\n0.17s.  Also add it as a fuzz seed.\n\nFixes https://oss-fuzz.com/testcase-detail/5267980968329216\n\nAssisted-by: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n* [raster] Keep an unclipped fast path in the edge sweep\n\nThe window clipping added in the previous commit made every\nmulti-column edge-row pay for the clip setup, measurable as ~1% more\ninstructions rasterizing all glyphs of NotoSansCJKsc/SourceHanSans-VF\nat 256px with hb-raster-all.  Guard it with a two-compare\nfully-inside-the-surface check and walk such edges with the original\nunclipped code, which is also the everyday case: auto-sized surfaces\nalways contain their edges.\n\nInterleaved perf-stat A/B (5 rounds, all glyphs at 256px): instruction\noverhead drops to +0.24% (CJK) / +0.9% (AwamiNastaliq, tiny workload);\ncycles flat to -1.3%, within noise.  Output remains bit-identical on\nthe 178-render comparison matrix, and the oss-fuzz 5267980968329216\ntestcase stays at 0.19s.\n\nAssisted-by: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n* [raster] Charge column spans in the pixel-work estimate\n\nhb_raster_draw_get_pixel_work() charged each edge only its scanline\nspan, so a nearly-horizontal edge crossing one pixel row but sweeping\nthe full surface width cost up to `width` cells while being charged 2\nunits — the paint path\u0027s pixel-budget precharge could undercharge the\nsweep by a factor of the surface width.  This is the same blind spot\nthat let the previous commits\u0027 column-walk timeout through the paint\npath\u0027s precharge.\n\nCharge each edge its column span too, clipped to the surface width the\nsame way the row span is clipped to its height.  Since an edge is a\nstraight segment, row span plus clipped column span is a true upper\nbound on the post-clipping sweep work.  Normal outlines are barely\naffected: flattening yields short segments whose column spans are\ncommensurate with their row spans, far below the 2^26 budget.\n\nNo rendering change: the 178-render comparison matrix remains\nbit-identical and the full test suite passes.\n\nAssisted-by: Claude Fable 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "00f966c719aff270c5e8b6859347a8b94f16683f",
      "tree": "97e0527dfed67aa8dac8228ab2f1f088ea679218",
      "parents": [
        "f5efbbef3841bdcdc6427bde7c2971f62ac8c8f1",
        "155a9d88e82d0b876c8b6f83ec680592ee6e090a"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 13:53:43 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 13:53:43 2026 -0600"
      },
      "message": "Merge pull request #6210 from harfbuzz/varc-subsetting\n\n[subset] Support VARC tables"
    },
    {
      "commit": "155a9d88e82d0b876c8b6f83ec680592ee6e090a",
      "tree": "97e0527dfed67aa8dac8228ab2f1f088ea679218",
      "parents": [
        "d268a23eebe5a3ed4335fee349f6cb244509033e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 13:24:14 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 13:24:14 2026 -0600"
      },
      "message": "[subset] Address VARC review comments\n\nShort-circuit unchanged-index checks and simplify glyph closure to use\none pending set with the output glyph set tracking visited glyphs.\n\nStrengthen retained-glyph-ID coverage by comparing the source and subset\noutlines using the original glyph ID.\n\nTested with: meson test -C build --print-errorlogs\n\nAssisted-by: OpenAI Codex \u003copenai-codex@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "d268a23eebe5a3ed4335fee349f6cb244509033e",
      "tree": "f6011f0ec8c877978f3f18000d217f05c23c894d",
      "parents": [
        "cfe86ce5e79691b5a208d1382de358e7d1ceefca"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 12:23:33 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 12:23:33 2026 -0600"
      },
      "message": "[subset] Split VARC subsetting into helpers\n\nMove table-specific planning and record rewriting phases out of\nVARC::subset() into a dedicated helper.  This leaves the entry point to\ncoordinate the phases and serialize their results without changing\nsubsetting behavior.\n\nTested with: meson test -C build\n\nAssisted-by: OpenAI Codex \u003copenai-codex@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "cfe86ce5e79691b5a208d1382de358e7d1ceefca",
      "tree": "7a8d49b8064a2e72bd5b7e5e84b20b330c9b8f52",
      "parents": [
        "5343bf4019f17c2bd67218936a85e10a3634e21d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 12:11:13 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 12:11:13 2026 -0600"
      },
      "message": "[subset] Harden VARC closure handling\n\nPropagate allocation and component-decoding failures from VARC closure\ninstead of continuing with an incomplete glyph set. Treat malformed VARC\nrecords as dependency-extraction failures as well.\n\nDocument VARC dependency edges and exercise subset variation-store\nremapping at non-default coordinates.\n\nTested with:\n- meson test -C build\n- standalone lean and world syntax checks\n- CMake harfbuzz-subset build\n\nAssisted-by: OpenAI Codex \u003copenai-codex@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "5343bf4019f17c2bd67218936a85e10a3634e21d",
      "tree": "5405b9f87fff2d350db7289c59afdfc005364694",
      "parents": [
        "9435eaa5fa4d947253ff9464246467d71b44bc7c",
        "f5efbbef3841bdcdc6427bde7c2971f62ac8c8f1"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 11:53:30 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 10 11:53:30 2026 -0600"
      },
      "message": "Merge branch \u0027main\u0027 into varc-subsetting\n\nAssisted-by: OpenAI Codex \u003copenai-codex@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "f5efbbef3841bdcdc6427bde7c2971f62ac8c8f1",
      "tree": "a269e4dad2ae6136d9858ca2b4d33ba0e7394f14",
      "parents": [
        "2724e66e4ddfb67df066b7bb4bc7a9e92238d458"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Sep 09 12:15:31 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 12:15:31 2026 -0600"
      },
      "message": "Reapply \"[rust] Pin skrifa\" (#6248)\n\nThis reverts commit 9279d1d1a16129d45f30c905231dbebf83c5f685."
    },
    {
      "commit": "2724e66e4ddfb67df066b7bb4bc7a9e92238d458",
      "tree": "f4ce30c7fbed334515465d48e7adde6248d4408f",
      "parents": [
        "9279d1d1a16129d45f30c905231dbebf83c5f685"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Sep 09 12:14:52 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 12:14:52 2026 -0600"
      },
      "message": "[ci] Ignore unused apt repositories (#6249)\n\nGitHub\u0027s Ubuntu runner carries Chrome and Microsoft apt sources, but every\npackage installed by these workflows comes from Ubuntu.  A third-party\nrepository publishing while apt refreshes its indexes can therefore fail\notherwise unrelated jobs with a hash-sum mismatch.\n\nRemove both unused sources before updating package indexes in every affected\nworkflow.\n\nAssisted-by: OpenAI Codex \u003copenai-codex@users.noreply.github.com\u003e"
    },
    {
      "commit": "9279d1d1a16129d45f30c905231dbebf83c5f685",
      "tree": "3b497fb65d09c97f936f6c9d1c6faf5ba1b0c122",
      "parents": [
        "b48358db71c63c03ee8d5a6cd558a3dc6ee087a2"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Sep 09 11:57:38 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Sep 09 11:57:38 2026 -0600"
      },
      "message": "Revert \"[rust] Pin skrifa\"\n\nThis reverts commit b48358db71c63c03ee8d5a6cd558a3dc6ee087a2.\n"
    },
    {
      "commit": "b48358db71c63c03ee8d5a6cd558a3dc6ee087a2",
      "tree": "c9f497419cd79597707a837ed7849c62de9f3571",
      "parents": [
        "bc678801ce4be8e83c5b7c013fca805ea71a38e4"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Sep 09 11:53:04 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Sep 09 11:53:21 2026 -0600"
      },
      "message": "[rust] Pin skrifa\n\nBuild was failing otherwise.\n"
    },
    {
      "commit": "bc678801ce4be8e83c5b7c013fca805ea71a38e4",
      "tree": "3b497fb65d09c97f936f6c9d1c6faf5ba1b0c122",
      "parents": [
        "edd4f3b4b912e12bc8fcd1b2625e8e7a39a70448"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Tue Sep 08 12:14:02 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 12:14:02 2026 -0600"
      },
      "message": "[subset] Emit a valid empty shared-tuples offset (#6240)\n\nWhen a gvar table has no shared tuples, point sharedTuplesOffset at the\nend of the glyph-variation offsets array, where the empty shared-tuples\narray resides, instead of emitting a null offset.\n\nThis lets strict consumers retain glyph variations in partially\ninstantiated fonts with no shared tuples.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "9435eaa5fa4d947253ff9464246467d71b44bc7c",
      "tree": "7d753e8fc403c893ced265ffd949f171687859ec",
      "parents": [
        "50046742d7b602ed9d4aae3d853d64ff76af2501",
        "edd4f3b4b912e12bc8fcd1b2625e8e7a39a70448"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Sep 07 14:19:21 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Sep 07 14:19:21 2026 -0600"
      },
      "message": "Merge branch \u0027main\u0027 into varc-subsetting\n"
    },
    {
      "commit": "50046742d7b602ed9d4aae3d853d64ff76af2501",
      "tree": "b0ee4f3f19a3e1d079bc65e012ef8ff7de3a37a8",
      "parents": [
        "74fc05cd14b0a41127871f1d69c6e17cf95f79a4",
        "46ea946ab4ad4d01fd83df7a6add740fd2590a73"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Sep 07 12:16:12 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Sep 07 12:16:12 2026 -0600"
      },
      "message": "Merge branch \u0027main\u0027 into varc-subsetting\n\nResolve the VARC record-decoding conflict by preserving the shared\ndecoder while threading main\u0027s rendering budget through axis and\nvariation work.\n\nTests: meson test -C build (277 passed, 1 skipped)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "74fc05cd14b0a41127871f1d69c6e17cf95f79a4",
      "tree": "de96a5e4cf2cbafaaff637a4e506e47f54a59b43",
      "parents": [
        "4981ead8f973e5cb85acfbd86d1f43d7da643031"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Tue Aug 25 16:27:04 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Sep 07 12:10:33 2026 -0600"
      },
      "message": "[subset] Address VARC review findings\n"
    },
    {
      "commit": "edd4f3b4b912e12bc8fcd1b2625e8e7a39a70448",
      "tree": "a3cdb5d9d40b460ae8502a8a21ca4b41c06d853d",
      "parents": [
        "c7ceca52c05649aca7d91ada378ba77439327543"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Sep 07 12:09:32 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 12:09:32 2026 -0600"
      },
      "message": "[limits] Restore rendering budget test runtime (#6244)\n\nThe unified glyph budget raised outline work limits for VARC, raster,\nvector, and GPU rendering to 1 \u003c\u003c 26.  Pathological fuzz inputs can\nconsume that entire allowance, doubling the full test-suite runtime.\n\nRestore the common outline budget to 1 \u003c\u003c 24 while retaining the\nrasterizer\u0027s separate 1 \u003c\u003c 26 pixel-work floor.  Precharge raster\nscanline work against that pixel budget before rendering so complex\nCOLR masks cannot do unbounded edge sweeps before their mask area is\ncharged.\n\nTests: meson test -C build (276 passed, 1 skipped; 2.82-2.83s)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "c7ceca52c05649aca7d91ada378ba77439327543",
      "tree": "a652fc96f438d61fcf5b60947e3f6f2f147e23f4",
      "parents": [
        "2d5d7fc7f3a48e291fbd83bea1a2096c7db3aeb0"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 07 10:13:34 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Sep 07 16:05:47 2026 +0300"
      },
      "message": "Bump hendrikmuhs/ccache-action from 1.2.23 to 1.2.24\n\nBumps [hendrikmuhs/ccache-action](https://github.com/hendrikmuhs/ccache-action) from 1.2.23 to 1.2.24.\n- [Release notes](https://github.com/hendrikmuhs/ccache-action/releases)\n- [Commits](https://github.com/hendrikmuhs/ccache-action/compare/d62db5f07c26379fc4b4e0916f098a92573c3b03...f09c25b45002a07be2955cbe52e8cee55643f89d)\n\n---\nupdated-dependencies:\n- dependency-name: hendrikmuhs/ccache-action\n  dependency-version: 1.2.24\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "2d5d7fc7f3a48e291fbd83bea1a2096c7db3aeb0",
      "tree": "45f2c5e183c0ae2ffb06779c69cad82fbfc406bd",
      "parents": [
        "768196d9fe1ca4c93bfbf57ab50273c5a93d5bc2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 07 10:13:11 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Sep 07 13:35:01 2026 +0300"
      },
      "message": "Bump fonttools from 4.63.0 to 4.64.0 in /.ci\n\nBumps [fonttools](https://github.com/fonttools/fonttools) from 4.63.0 to 4.64.0.\n- [Release notes](https://github.com/fonttools/fonttools/releases)\n- [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst)\n- [Commits](https://github.com/fonttools/fonttools/compare/4.63.0...4.64.0)\n\n---\nupdated-dependencies:\n- dependency-name: fonttools\n  dependency-version: 4.64.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": "768196d9fe1ca4c93bfbf57ab50273c5a93d5bc2",
      "tree": "4d65d094a094d3eda67618cabefa57f1e57fc3e9",
      "parents": [
        "46ea946ab4ad4d01fd83df7a6add740fd2590a73"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 07 10:12:53 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Sep 07 13:32:22 2026 +0300"
      },
      "message": "Bump ninja from 1.13.0 to 1.13.2 in /.ci\n\nBumps [ninja](https://github.com/ninja-build/ninja) from 1.13.0 to 1.13.2.\n- [Release notes](https://github.com/ninja-build/ninja/releases)\n- [Commits](https://github.com/ninja-build/ninja/compare/v1.13.0...v1.13.2)\n\n---\nupdated-dependencies:\n- dependency-name: ninja\n  dependency-version: 1.13.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": "46ea946ab4ad4d01fd83df7a6add740fd2590a73",
      "tree": "56d8a898ae92a6221945eae0eaa63f2a847a667f",
      "parents": [
        "22fa39d796368eefa66e53323123c091d91467da",
        "e5f260695273a69d90fb0097a8a82448f8db97fc"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Sep 06 16:36:58 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 16:36:58 2026 -0600"
      },
      "message": "Merge pull request #6214 from harfbuzz/rendering-work-budgets\n\n[limits] Add rendering work budgets"
    },
    {
      "commit": "22fa39d796368eefa66e53323123c091d91467da",
      "tree": "cb6ee0c813279c92a1c087d801ef82a3674bb20e",
      "parents": [
        "cdbe72ca8bf2c077e91ae10c4e428e1183d7d5ec"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sun Sep 06 15:22:04 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 15:22:04 2026 -0600"
      },
      "message": "[cmake] Compile core sources individually (#6243)\n\n* [cmake] Compile core sources individually\n\nCMake built libharfbuzz from the amalgamated harfbuzz.cc source,\nplacing all core symbols in one archive member. Static consumers\nlinking an auxiliary library before libharfbuzz then pulled duplicate\ninternal definitions into the final link.\n\nDerive the core source list from harfbuzz.cc and compile each source\nseparately, matching the Meson archive layout.\n\nFixes: https://github.com/harfbuzz/harfbuzz/issues/5683\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n\n* [ci] Make CMake static build explicit\n\nSet BUILD_SHARED_LIBS\u003dOFF on the ARM CMake job so changes to static\narchive construction have intentional CI coverage.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "cdbe72ca8bf2c077e91ae10c4e428e1183d7d5ec",
      "tree": "937d59d8ff763fd6471a037889aaa96854db6bca",
      "parents": [
        "809f903b8a555fbb6d68a0dffce842db0edb2952"
      ],
      "author": {
        "name": "David Corbett",
        "email": "corbett.dav@northeastern.edu",
        "time": "Sun Sep 06 14:55:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 12:55:21 2026 -0600"
      },
      "message": "[USE] Update the data files for Unicode 18.0 (#6242)\n\nThis uses the data files from\n\u003chttps://github.com/microsoft/font-tools/tree/9dcd14bcc9d9bb634b813fe06e1aaa2bc0209a7d/USE\u003e."
    },
    {
      "commit": "809f903b8a555fbb6d68a0dffce842db0edb2952",
      "tree": "9a2419695e332cad25efd383587088a63fd6f95d",
      "parents": [
        "b6f26f5591b3c7942bc65081410ca51eaac44164"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Sep 05 21:09:46 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 21:09:46 2026 -0600"
      },
      "message": "[fontations] Support bitmap glyphs (#6241)\n\nUse Skrifa\u0027s bitmap-strike API to provide glyph extents and paint PNG\nand BGRA images from CBDT and sbix tables. Select strikes using the\nfont\u0027s requested ppem and preserve the OT backend\u0027s table precedence.\n\nKeep the face blob alive through image blobs retained by paint\ncallbacks.\n\nTests: meson test -C build --no-rebuild\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "b6f26f5591b3c7942bc65081410ca51eaac44164",
      "tree": "7a8973a0d44cbfb315105862ef4165460dcdc257",
      "parents": [
        "db981a8baff024ce9a6bf7944bb9dcc8c4d77709"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Sep 05 20:24:18 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 20:24:18 2026 -0600"
      },
      "message": "[fontations] Use COLRv1 clip boxes for glyph extents (#6239)\n\nSkrifa exposes resolved COLRv1 clip boxes independently of outline\nglyph metrics. Use them when present so glyph extents report the clip\nbounds instead of falling back to painted-content bounds.\n\nKeep the existing paint fallback for color glyphs without a clip box.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "db981a8baff024ce9a6bf7944bb9dcc8c4d77709",
      "tree": "9757e6e16e9f4fa33fd259b1d200ed77a6f7ef3a",
      "parents": [
        "92e67ef19f2d595b0fe81f05a80783a321bb918f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Sat Sep 05 14:44:39 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 14:44:39 2026 -0600"
      },
      "message": "[gsubgpos] Preserve concat hazards at end of input (#6238)\n\nThe RuleSet fast paths filtered out rules requiring another glyph when\nthe skipping iterator reached the end of the buffer. Unlike the normal\nrule walk, that early return did not record the resulting\nunsafe-to-concat range.\n\nKeep the end-of-input optimization, but track filtered rules and mark\ntheir concat hazard before returning. Cover both contextual and chained\ncontextual rule sets with a five-rule font that forces the fast paths.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "92e67ef19f2d595b0fe81f05a80783a321bb918f",
      "tree": "4ecc362b9698104eae460b218298a9d7addc2a8d",
      "parents": [
        "2a6c6b9b90b965b1e7fc51ddb6d1b1170a34a8d3"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 19:55:05 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 19:55:47 2026 -0600"
      },
      "message": "[ot] Preserve pair-positioning and ligature concat hazards\n\nA zero-valued PairPos record can select a different, non-zero record\nif the second glyph changes, so keep the pair unsafe to concat even\nwhen no positioning was applied.\n\nLikewise, make the ligature second-glyph digest rejection report the\nsame hazard as the full ligature walk.\n\nTests: meson test -C build\n\nPort of https://github.com/harfbuzz/harfrust/pull/465\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "2a6c6b9b90b965b1e7fc51ddb6d1b1170a34a8d3",
      "tree": "4d8ae289c306ab10f00dbb0f61e99733690b1487",
      "parents": [
        "18d0fd1a6ca8577e1d5688dc90c75342509c344c"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Fri Sep 04 22:39:45 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Fri Sep 04 17:08:08 2026 -0600"
      },
      "message": "Add test for hb_result_t::from() that moves the input.\n"
    },
    {
      "commit": "18d0fd1a6ca8577e1d5688dc90c75342509c344c",
      "tree": "a58243752aac61aa11479dbe9addb5573f3f3d3c",
      "parents": [
        "2f291a46ae7d4a99ff752e23d67313f1264e81d9"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Fri Sep 04 20:54:07 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Fri Sep 04 17:08:08 2026 -0600"
      },
      "message": "Rework TRY macro to work the MSVC:\n\nSplit into one macro for void results, and a new TRY_ASSIGN() for when the Ok() value needs to be assigned.\n"
    },
    {
      "commit": "2f291a46ae7d4a99ff752e23d67313f1264e81d9",
      "tree": "3f9fed69ac25e2f0efe619428c1688d9cc051012",
      "parents": [
        "17a0bdc24581ee90cb81f4a83e97f4ca482a6022"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 17:51:28 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Fri Sep 04 17:08:08 2026 -0600"
      },
      "message": "Convert repacker and graph code to utilize to hb_result_t.\n\nConverts all error handling in the repacker/graph code to use hb_result_t.\n"
    },
    {
      "commit": "17a0bdc24581ee90cb81f4a83e97f4ca482a6022",
      "tree": "67088d597c901a3394195514b3ba25cd4add2bd0",
      "parents": [
        "8a98b8b3abca91591821a25292cd0ca34637bc54"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 15:33:01 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 15:33:01 2026 -0600"
      },
      "message": "[benchmark-shape] Accept multiple font/text pairs\n\nReplace the singular named font and text options with repeated\npositional FONTFILE TEXTFILE pairs. Register every supplied pair and\nreject incomplete input so no requested benchmark is silently omitted.\n\nTested with the full Meson suite and an unfiltered two-pair run.\n\nAssisted-by: Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "8a98b8b3abca91591821a25292cd0ca34637bc54",
      "tree": "75e1be52fd103bee04a05061e6b0b2abca99ea23",
      "parents": [
        "f2d62aaa7d07898780868bac560d27870dfa8e01"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 15:28:29 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 15:28:29 2026 -0600"
      },
      "message": "[benchmark-shape] Accept multiple variations\n\nThe --variations option previously parsed its entire argument as one\nhb_variation_t, so only one axis could be selected. Parse the\ncomma-separated argument into an array and apply all valid axes.\n\nTested with the full Meson suite and a two-axis benchmark-shape run.\n\nAssisted-by: Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "f2d62aaa7d07898780868bac560d27870dfa8e01",
      "tree": "daf3948bd3e3d2c5d335c4dd83082a8c824c3475",
      "parents": [
        "724ef405f3a0a0b2792c7a575d1f3341b41ca950"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 14:14:49 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 14:14:49 2026 -0600"
      },
      "message": "Fix an int overflow\n\nFixes https://oss-fuzz.com/testcase-detail/4709124282318848\n"
    },
    {
      "commit": "724ef405f3a0a0b2792c7a575d1f3341b41ca950",
      "tree": "732107335beae14ecd3c171640de8ff35fc5bffe",
      "parents": [
        "be67d96120ac76bed6255affef49ec0a0626af6d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 04:18:05 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 04:18:05 2026 -0600"
      },
      "message": "OT: Cache first-input classes per contextual RuleSet (#6234)\n\nBuild a compact class digest for every format-2 contextual RuleSet in\nthe subtable\u0027s existing external cache.  Reject a RuleSet before walking\nits rules when the next input glyph cannot match any rule\u0027s first class.\n\nRules without another input position force the digest open.  Digest\ncollisions only cause the normal rule walk, and allocation failure falls\nback to the uncached path.\n\nAssisted-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "be67d96120ac76bed6255affef49ec0a0626af6d",
      "tree": "a70ae935cd1430b531cff7b6bbe092459c319727",
      "parents": [
        "8fa0d5da39ab165c51f9d1cbf035f411de909130"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 03:17:19 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 03:17:19 2026 -0600"
      },
      "message": "OT: Cache contextual input and lookahead classes (#6233)"
    },
    {
      "commit": "8fa0d5da39ab165c51f9d1cbf035f411de909130",
      "tree": "7c9e9c7df7f462509c9709463c7772355316a7b0",
      "parents": [
        "b3e2d4bca4a3fae5da0c4861f42ca96b994d16a5"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 01:03:43 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 01:03:43 2026 -0600"
      },
      "message": "GPOS: Cache second-glyph digests per PairSet\n"
    },
    {
      "commit": "b3e2d4bca4a3fae5da0c4861f42ca96b994d16a5",
      "tree": "99dfa7fae1369a3b2cc67fe540da8bae538b0353",
      "parents": [
        "e7fc9442841aa056c3e27e1c70827cbf1ed7fc9e",
        "087e432312618900f1104ef72683cecebe36da92"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 00:29:06 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 00:29:06 2026 -0600"
      },
      "message": "Merge pull request #6232 from harfbuzz/more-opts\n\nOT: Skip lookups missing possible second glyphs"
    },
    {
      "commit": "087e432312618900f1104ef72683cecebe36da92",
      "tree": "99dfa7fae1369a3b2cc67fe540da8bae538b0353",
      "parents": [
        "943da2a4fbd9bc1778497894f655836db6c94e5d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 00:08:34 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Fri Sep 04 00:08:34 2026 -0600"
      },
      "message": "OT: Add second-glyph lookup digests\n"
    },
    {
      "commit": "943da2a4fbd9bc1778497894f655836db6c94e5d",
      "tree": "8b8d93c4d202f12156d139b44242c9e181a3fd0a",
      "parents": [
        "e42994749c548bb6736e565ec91db59dcbd38560"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:54:38 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:54:38 2026 -0600"
      },
      "message": "Revert \"OT: Cache lookup subtable indices\"\n\nThis reverts commit e42994749c548bb6736e565ec91db59dcbd38560.\n"
    },
    {
      "commit": "e42994749c548bb6736e565ec91db59dcbd38560",
      "tree": "5561cfb40b3e81fd4c9a82711b2706f8927ae809",
      "parents": [
        "2f3c21aae7b3d2967fae74c8d2c5be3597de1f3f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:54:33 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:54:33 2026 -0600"
      },
      "message": "OT: Cache lookup subtable indices\n"
    },
    {
      "commit": "2f3c21aae7b3d2967fae74c8d2c5be3597de1f3f",
      "tree": "8b8d93c4d202f12156d139b44242c9e181a3fd0a",
      "parents": [
        "633af3bd1cc0c6eac01e0dff0f93fc3a642215b9"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:37:29 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:37:29 2026 -0600"
      },
      "message": "Revert \"OT: Hoist lookup apply-function selection\"\n\nThis reverts commit 932aae5e46ed66657b9842c2bcb8cc888a9c1b54.\n"
    },
    {
      "commit": "633af3bd1cc0c6eac01e0dff0f93fc3a642215b9",
      "tree": "bde063df1ca47ec9975d2887497f9d87ba8c634a",
      "parents": [
        "3a565d72bae2b9b1e179cea5176046db001a1ab7"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:37:11 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:37:11 2026 -0600"
      },
      "message": "Revert \"OT: Specialize lookup traversal by apply function\"\n\nThis reverts commit 3a565d72bae2b9b1e179cea5176046db001a1ab7.\n"
    },
    {
      "commit": "3a565d72bae2b9b1e179cea5176046db001a1ab7",
      "tree": "e03cd7129ba8498f98634722c0683089350b352f",
      "parents": [
        "932aae5e46ed66657b9842c2bcb8cc888a9c1b54"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:33:41 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:33:41 2026 -0600"
      },
      "message": "OT: Specialize lookup traversal by apply function\n"
    },
    {
      "commit": "932aae5e46ed66657b9842c2bcb8cc888a9c1b54",
      "tree": "bde063df1ca47ec9975d2887497f9d87ba8c634a",
      "parents": [
        "6bb75765087f18ed0acb6194ba0d7c4122276627"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:23:59 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:23:59 2026 -0600"
      },
      "message": "OT: Hoist lookup apply-function selection\n"
    },
    {
      "commit": "6bb75765087f18ed0acb6194ba0d7c4122276627",
      "tree": "8b8d93c4d202f12156d139b44242c9e181a3fd0a",
      "parents": [
        "e7fc9442841aa056c3e27e1c70827cbf1ed7fc9e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:16:24 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 23:16:24 2026 -0600"
      },
      "message": "[apply] Remove an unused field\n"
    },
    {
      "commit": "e7fc9442841aa056c3e27e1c70827cbf1ed7fc9e",
      "tree": "54b94a8ce9998eda632f0d4033b1659560436096",
      "parents": [
        "80540ed4b1dfa7059339c91758d6868f1829c09e",
        "eed256c0d6f20e9545055fc219f0989842dd8bf0"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 22:56:46 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 22:56:46 2026 -0600"
      },
      "message": "OT: Fuse redundant per-glyph shaping passes (#6231)\n\n* OT: Fuse mask initialization into Unicode properties\n\n* OT: Fuse glyph properties with digest rebuild"
    },
    {
      "commit": "eed256c0d6f20e9545055fc219f0989842dd8bf0",
      "tree": "54b94a8ce9998eda632f0d4033b1659560436096",
      "parents": [
        "a60b48ef09d4cf77c18fbb0df4c27e82ee89cf9e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 22:31:42 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 22:31:42 2026 -0600"
      },
      "message": "OT: Fuse glyph properties with digest rebuild\n"
    },
    {
      "commit": "a60b48ef09d4cf77c18fbb0df4c27e82ee89cf9e",
      "tree": "cdf005e0a4d5628c056ab2dfbc99ffc0a45400b1",
      "parents": [
        "80540ed4b1dfa7059339c91758d6868f1829c09e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 22:30:40 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 22:30:40 2026 -0600"
      },
      "message": "OT: Fuse mask initialization into Unicode properties\n"
    },
    {
      "commit": "80540ed4b1dfa7059339c91758d6868f1829c09e",
      "tree": "cee90a205b35628b776b3e5f6b19513a51ce083c",
      "parents": [
        "62712e7393f1fc880d3b2513f3385f59888e881b"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 19:09:08 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 19:09:08 2026 -0600"
      },
      "message": "[perf] Add public-domain Japanese script-run corpus\n\nAdd a 100,000-character Japanese shaping corpus derived from Natsume\nSoseki\u0027s copyright-expired Wagahai wa Neko de Aru.  Split the sample\ninto pure Han, Hiragana, and Katakana runs, with Inherited characters\nallowed within a run and Common characters omitted.\n\nDocument the Aozora Bunko source, reuse terms, source checksum, and\ntransformations in perf/texts/COPYING.\n\nTesting: meson test -C build (274 tests passed)\n\nAssisted-by: OpenAI Codex\n"
    },
    {
      "commit": "62712e7393f1fc880d3b2513f3385f59888e881b",
      "tree": "27a4d05bdb3c5b04069faf0c663cff8331e2b9de",
      "parents": [
        "c159b544f9c2bd7fc0be1c3f8e1fca259354150d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 19:04:43 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 19:04:43 2026 -0600"
      },
      "message": "Revert \"Add Japanese text corpus for perf testing\"\n\nThis reverts commit c159b544f9c2bd7fc0be1c3f8e1fca259354150d.\n\nReason: Incompatible license of the source.\n"
    },
    {
      "commit": "c159b544f9c2bd7fc0be1c3f8e1fca259354150d",
      "tree": "d5f462cc74edb2b70dfc883a179f6042094fc5e8",
      "parents": [
        "2688e6c579d24a6846f5d3b88472c4733a501bda"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 17:00:01 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Sep 03 17:00:18 2026 -0600"
      },
      "message": "Add Japanese text corpus for perf testing\n"
    },
    {
      "commit": "2688e6c579d24a6846f5d3b88472c4733a501bda",
      "tree": "27a4d05bdb3c5b04069faf0c663cff8331e2b9de",
      "parents": [
        "14e63042fd65eef05be5ca7d4cc11303a6cb6d11"
      ],
      "author": {
        "name": "Dylan Pulver",
        "email": "35541198+dylanpulver@users.noreply.github.com",
        "time": "Fri Sep 04 01:26:30 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 16:26:30 2026 -0600"
      },
      "message": "[unicode] Treat U+180F FVS4 as Default_Ignorable (#6229)\n\nU+180F MONGOLIAN FREE VARIATION SELECTOR FOUR was added in Unicode\n14.0 and has Default_Ignorable_Code_Point\u003dYes, but\nis_default_ignorable() only covered U+180B..180E, so FVS4 was never\nhidden and leaked a .notdef into the output.\n\n8c65442069 (\"[Unicode 14] Handle U+180F FVS4\") added the U+180F case\nto _hb_glyph_info_set_unicode_props() and to the Arabic shaper, but\nthat branch sits inside \"if (unicode-\u003eis_default_ignorable (u))\", so\nit has been unreachable since it was written.  Extending the range to\nU+180B..180F makes it live.\n\nU+180B..180F are all Default_Ignorable_Code_Point per\nDerivedCoreProperties.txt, so the range stays contiguous.\n\nBefore, with a font with no Mongolian coverage:\n\n  $ hb-shape Roboto-Regular.abc.ttf -u U+0061,U+180F\n  [1\u003d0+1114|0\u003d0@-908,0+0]\n\nEvery other default ignorable (U+180B..180E, U+FE00, U+200B) on that\nfont shapes to [1\u003d0+1114].  After the change U+180F matches them.\n\nAdded two cases to mongolian-variation-selector.tests, which already\ncovered FVS1, FVS2, FVS3 and MVS but not FVS4: U+180F, and U+1810\nMONGOLIAN DIGIT ZERO to pin the top of the range so it cannot be\nwidened by accident.\n\nTested with \"meson test -C build\": 254/254 OK, 0 failures.  Restoring\nthe old U+180B..180E fails in-house 6174/6176, and widening it to\nU+180B..1810 fails the same way.\n\nAssisted-by: claude-opus-5\n\nCo-authored-by: Dylan Pulver \u003cdylanpulver@users.noreply.github.com\u003e"
    },
    {
      "commit": "14e63042fd65eef05be5ca7d4cc11303a6cb6d11",
      "tree": "5bcad0cd7c9589b3810f2320761bf56dab688df2",
      "parents": [
        "2093bb59bc66bd971d93d70747963aa30e216961"
      ],
      "author": {
        "name": "Qunxin Liu",
        "email": "qxliu@google.com",
        "time": "Thu Sep 03 12:40:09 2026 -0700"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Sep 03 14:23:05 2026 -0600"
      },
      "message": "[subset] bug fix for BASE table\n\nEmbed VarStore offset field when table version is 1.1\n"
    },
    {
      "commit": "2093bb59bc66bd971d93d70747963aa30e216961",
      "tree": "3643e359a9b7f4e3681f1148fec47980486ef700",
      "parents": [
        "1b229922dbba6960420930e8c031e6f52138357c"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 20:17:12 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Add HB_NODISCARD_STRUCT which doesn\u0027t generate compiler warnings when used in \u003c c++17.\n"
    },
    {
      "commit": "1b229922dbba6960420930e8c031e6f52138357c",
      "tree": "5eb59a826197d030134690518dbbf83dc927b8b3",
      "parents": [
        "5c5dad4659662f3c3654eaffee1316ac015b03a3"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 20:03:35 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Restrict direct value construction of hb_result_t to cases where neither T nor E can convert to the other.\n\nThis eliminates potential ambiguity in selecting the error or ok type.\n"
    },
    {
      "commit": "5c5dad4659662f3c3654eaffee1316ac015b03a3",
      "tree": "751ae9d9ce2939c966030afe80589f9b824b4657",
      "parents": [
        "9afe31f17c364d5d308aa44d411d0acacc274543"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 18:42:33 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Add value_or_default()\n"
    },
    {
      "commit": "9afe31f17c364d5d308aa44d411d0acacc274543",
      "tree": "1a488407993c89b1a5b22a3b511e4f919b5ae90f",
      "parents": [
        "acc9e6406545871361633d859026cbe2b3493183"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 18:34:05 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Assign is_ok_ in init().\n"
    },
    {
      "commit": "acc9e6406545871361633d859026cbe2b3493183",
      "tree": "003cd579dc4c15c1ded8461e08703fdefaf5fe3b",
      "parents": [
        "9d25eeab63adeb989118fcee700d24fa98fdb9e8"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 18:31:55 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Add unlikely () for error branch of TRY()\n"
    },
    {
      "commit": "9d25eeab63adeb989118fcee700d24fa98fdb9e8",
      "tree": "fe2071638d421b098a159a09348953a811028440",
      "parents": [
        "eca9f9f910957f33c8f9cda0d1db1dcbee303da2"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 17:33:14 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Add no discard to hb_result_t so that it must be used when returned.\n\n- Also adds a helper to convert containers with in_error() into a hb_result_t\u0027s.\n"
    },
    {
      "commit": "eca9f9f910957f33c8f9cda0d1db1dcbee303da2",
      "tree": "42ac4bf971aa225de7563665e55664dfb443923f",
      "parents": [
        "46644f885d39c7c18975dd2abc525e3734b109e7"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 23:23:19 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Sep 02 16:30:59 2026 -0600"
      },
      "message": "Add hb_result_t\u003cOkVal, ErrVal\u003e\n\nError handling in repacker is in rough shape. Many of the methods are fallible, but often the return values aren\u0027t being checked for error state.\n\nTo help address this I thought it might be useful to introduce a result type similar to Result\u003c\u003e in rust (or std::expected) that would force callers to deal with errors in the returns.\n\nThis PR introduces hb_result_t\u003cOkVal, ErrVal\u003e.\n\nAssisted by: Gemini\n"
    },
    {
      "commit": "46644f885d39c7c18975dd2abc525e3734b109e7",
      "tree": "b233f4c81a85094841e739e89c6b94c613cb9b81",
      "parents": [
        "5c21cb464737c8fd5f7856d4d435d65f2b757dbc"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Aug 31 12:19:10 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 12:19:10 2026 -0600"
      },
      "message": "[ft] Serialize access to the static FreeType library (#6225)\n\nFreeType requires face creation and destruction on a shared\nFT_Library to be serialized. Protect the lazily-created static library,\nits reference count, and its internally-owned faces with a lazy mutex.\n\nKeep caller-owned FT_Library instances outside the new lock, and add a\nmultithreaded regression test for blob-backed faces and font funcs.\n\nTests: meson test -C build (272/272 passed)\n\nFixes: https://github.com/harfbuzz/harfbuzz/issues/6224\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "5c21cb464737c8fd5f7856d4d435d65f2b757dbc",
      "tree": "46f589e984a9637eaaed04df6638da5a820ee934",
      "parents": [
        "e17de4dc14480d7bd7ead6d43fd409548fc21d5c"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Aug 31 11:31:32 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Mon Aug 31 11:54:42 2026 -0600"
      },
      "message": "[script] Remove archaic aliases\n\nSee https://github.com/harfbuzz/harfrust/pull/458\n"
    },
    {
      "commit": "e17de4dc14480d7bd7ead6d43fd409548fc21d5c",
      "tree": "cf99a349e17d37d74e4db79367c210eb1100b991",
      "parents": [
        "36d1ca50a2834f5ec042896f690409f84699b8cb"
      ],
      "author": {
        "name": "Sylvestre Ledru",
        "email": "sylvestre@debian.org",
        "time": "Mon Aug 31 19:30:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 11:30:45 2026 -0600"
      },
      "message": "Merge pull request #6222 from sylvestre/init-accelerator-pointers\n\n[subset] Initialize the accelerator pointers in hb_subset_plan_t"
    },
    {
      "commit": "36d1ca50a2834f5ec042896f690409f84699b8cb",
      "tree": "477d24dba12fc3ce9f7630a5e4ca5cb7fb48cf40",
      "parents": [
        "e8905fb3b3d9e9a06f3a9aab0459e67c1e08cdac"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Aug 31 10:13:36 2026 +0000"
      },
      "committer": {
        "name": "Khaled Hosny",
        "email": "khaled@aliftype.com",
        "time": "Mon Aug 31 16:30:27 2026 +0300"
      },
      "message": "Bump github/codeql-action/upload-sarif from 4.37.8 to 4.37.9\n\nBumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.8 to 4.37.9.\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/db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28...cdf488f595d80d6e07e03d4674febd5ab45fa938)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/upload-sarif\n  dependency-version: 4.37.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "e5f260695273a69d90fb0097a8a82448f8db97fc",
      "tree": "63016454c37c6628d1ba9d2efd47245572c2edcd",
      "parents": [
        "7eec305e71d7d4735b9c5cd0f6121dc72734078c"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 17:59:50 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 17:59:50 2026 -0600"
      },
      "message": "[vector] Drop the vestigial path-command byte-accounting hook\n\nbegin_path_command()/end_path_command() (and the path-sink\nbegin_command()/end_command()) took a `before` out-parameter that captured\nthe output buffer length so end could charge the emitted bytes to the work\nbudget.  That byte charge is gone -- output is bounded by the document-size\ncap now -- so the parameter and its per-call-site local were dead plumbing.\nRemove them; begin is now a plain guard and end a plain finalize.  Internal\nhelpers only; no API change.\n\nTests: meson test -C build (275/275 passed).\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7eec305e71d7d4735b9c5cd0f6121dc72734078c",
      "tree": "ea1c8726644f5636552495452f313c34abbc3767",
      "parents": [
        "76eccd5f2771b94e401e629098c2d9b52abff7bf"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 17:31:18 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 17:38:30 2026 -0600"
      },
      "message": "[vector] Cap serialized document size; un-conflate output from outline\n\nThe vector work budget charged both outline traversal and serialized\noutput bytes, and left embedded bitmaps entirely uncharged -- so a COLR\nwalk with many sweep-gradient or image layers could emit output that the\noutline budget never sees, bounded only by the structural per-node caps\ntimes the node count.\n\nBound the output with a flat document-size cap instead: hb_vector_buf_t\nrefuses to grow past HB_VECTOR_MAX_DOCUMENT_SIZE (16 MB) and folds that\ninto in_error(), so every emission site that already checks it -- path\ncommands, gradient meshes -- stops cleanly, and image embedding is bounded\nfor the first time.  clear() resets the sticky flag so a context reused\nacross renders (the documented clear -\u003e paint -\u003e render loop) recovers\nafter one over-cap glyph.  vector is one glyph per context, so a flat cap\nsuffices; SVG\u0027s whole document and PDF\u0027s (assembled through the same\nhb_vector_buf_t) share it.\n\nWith output bounded structurally, the work budget goes back to pure\noutline traversal: drop the per-command byte charge and the sweep-patch\ncharge so it no longer conflates two different resources.  It is still\nneeded on its own -- a CFF charstring can do a lot of work while emitting\nlittle output.\n\nOnce the cap trips, remaining appends are dropped, so a truncated document\nis malformed; render returns it (or null) rather than looping to build\ngigabytes, which is the point.\n\nAdd a regression test that paints an oversized image and confirms the\ndocument stays bounded and the context recovers on reuse; it fails if the\ncap is removed.\n\nTests: meson test -C build (275/275 passed); the vector COLR regression\nseed completes in 0.85s.\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "76eccd5f2771b94e401e629098c2d9b52abff7bf",
      "tree": "6c330dbb80f140bd38ebeba4327c2e2a236539e5",
      "parents": [
        "dfee0d4380277f989906e86b8c80beb9e4dc9e2d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 17:00:41 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 17:00:41 2026 -0600"
      },
      "message": "[gpu] Share the work budget through the public draw API\n\nhb_gpu_paint reached into the scratch encoder by writing its\nexternal_budget pointer directly, so a whole paint session could share\none work counter.  Drive that sharing through the public draw-budget API\ninstead: seed the scratch encoder with hb_draw_set_budget() before each\nclip glyph (and before a client-drawn clip path) and read the remainder\nback with hb_draw_get_budget_remaining(), so the COLR walk aggregates its\nwork without touching encoder internals.  The transforming pen now exposes\nthe scratch encoder\u0027s own live counter rather than the paint session\u0027s.\n\nUnlike the rasterizer, the GPU backend never rasterizes -- it emits slug\ncurves for the GPU to fill later -- so all of its work is outline-derived\n(traversal plus the curves generated from it) and one budget suffices; no\nseparate pixel budget applies here.  Remove the now-unused external_budget\nfield and its write-through in hb_gpu_draw_set_budget().\n\nTests: meson test -C build (275/275 passed); the CFF/COLR gpu-fuzzer\nregression seed completes in 0.46s.  The existing budget test already\ncovers both the identity and transforming-pen clip paths.\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "dfee0d4380277f989906e86b8c80beb9e4dc9e2d",
      "tree": "14e1f217e4c77efbc52c1c9a47a837dffc816016",
      "parents": [
        "83eafa8ca679f06f0364434bdb11bd3e6dca034f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 16:45:02 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 16:53:55 2026 -0600"
      },
      "message": "[raster] Split outline and pixel budgets; drive them via public API\n\nraster-paint reached into the rasterizer through two internal functions:\nhb_raster_draw_set_external_work() to inject a shared work counter and\nhb_raster_draw_get_edge_work() to read scanline cost back.  Both are gone.\n\nThe paint session now carries two budgets for two different resources:\n\n - The outline budget bounds glyph outline traversal and curve\n   flattening.  It is the public draw/paint budget: raster-paint seeds the\n   rasterizer with hb_draw_set_budget() before each glyph and reads the\n   remainder back with hb_draw_get_budget_remaining(), so a whole COLR\n   walk shares one budget without touching rasterizer internals.\n\n - The pixel budget bounds scanline and fill work, which scales with\n   surface area, not outline complexity.  It is charged from the public\n   extents of the rendered mask (and other pixel areas) and keeps its\n   surface-sized default.  An unlimited outline policy disables it too.\n\nFolding pixel work into the outline budget was why the default had to be\ninflated by the surface passes; the two now live apart, so HB_BUDGET_GLYPH\nis a pure outline budget and the surface scaling belongs to the pixel\nbudget.  Standalone hb_raster_draw is unchanged: it draws once, so its\nscanline work needs no session budget, only its structural caps.\n\nCOLR drives only push_clip_glyph, whose seed/emit/readback is a single\nself-contained step, so the aggregate outline budget is always conserved\nacross a COLR walk.  The push_clip_path_start/end pair spans client draw\ncalls; like push/pop it must be balanced by the client for the outline\nbudget to reconcile, and each render is still bounded by the rasterizer\u0027s\nstructural caps regardless.  hb_draw_set_budget() clamps a negative seed\nto zero, so outline exhaustion does not latch across glyphs; an empty\nmask can then be rendered once more, but that path is bounded by the\npixel budget.\n\nAdd a regression test that paints a real multi-layer COLR glyph into a\n1x1 surface (unbounded pixel budget) and checks the outline budget both\naggregates the layers\u0027 work and bounds the walk.\n\nTests: meson test -C build (275/275 passed); the raster and gpu COLR\nregression seeds complete in 0.40s and 0.44s.\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "83eafa8ca679f06f0364434bdb11bd3e6dca034f",
      "tree": "8fa26223eac1f3a6771966d47bbffdce1e759c68",
      "parents": [
        "148fcb3c7998713a5e6b239f526e9194c8905ad7"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 16:23:30 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 16:34:19 2026 -0600"
      },
      "message": "[CFF] Bound charstring operators by the live work budget\n\nThe per-operator budget spend added a check to the charstring\ninterpreter\u0027s innermost loop.  The loop already counts operators through\nmax_ops, so cap max_ops by the caller\u0027s remaining budget and charge the\nconsumed operators back after the loop.  A single counter then enforces\nboth the structural HB_CFF_MAX_OPS limit and the live work budget, with\nno budget check in the hot loop, and the operator count can never\novershoot the remaining budget.\n\nThis bounds the real quantity a COLR or VARC driver multiplies: executed\noperator count, which a small charstring can drive up to HB_CFF_MAX_OPS\nvia subroutine reuse regardless of its byte length -- so charging the\ncharstring\u0027s length instead would badly undercount.  CFF2 blend still\ncharges its proportional work in place.\n\nTests: meson test -C build (275/275 passed); the CFF/COLR gpu-fuzzer\nregression seed completes in 0.45s.\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e8905fb3b3d9e9a06f3a9aab0459e67c1e08cdac",
      "tree": "4b874b7b5d4b28dfeae1bc27ede4cecd4471b3d6",
      "parents": [
        "79f8c3d53b7d7bab0406b9e638480212c291a3fb",
        "8d08f87417f0b34b9ffb90d9aa3db5b02a3ae888"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 16:02:16 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 16:02:16 2026 -0600"
      },
      "message": "Merge pull request #6218 from harfbuzz/repacker_error_handling\n\nMore fixes for repacker error handling"
    },
    {
      "commit": "148fcb3c7998713a5e6b239f526e9194c8905ad7",
      "tree": "91f1971f438fe007be697c89fa7cf624837dff78",
      "parents": [
        "565cbc3768a2668c90acee9963a117066c0e2fbe"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 15:42:37 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 15:42:37 2026 -0600"
      },
      "message": "[NEWS] Restore the trailing blank line at end of file\n\nKeep the rendering-work-budget NEWS edit to its intended additions and\ndrop the incidental end-of-file whitespace change.\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "565cbc3768a2668c90acee9963a117066c0e2fbe",
      "tree": "477dcf37e6faf94093fd615dec31b4b3ae8b64a6",
      "parents": [
        "115c3c0028dc2146963360b1fd9c99cccee04f60"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 15:42:37 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 15:42:37 2026 -0600"
      },
      "message": "[limits] Compute the budget spend product in 64-bit\n\nhb_budget_spend() evaluated COST * MULT in unsigned int, so the product\nwrapped at 2^32 before widening to the int64_t counter.  No current\ncharge site can reach that (the largest, VARC\u0027s axisValues x coords, is\n~2.7e8), but this primitive exists to harden against adversarial fonts,\nand one cast removes the reasoning burden permanently.\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "115c3c0028dc2146963360b1fd9c99cccee04f60",
      "tree": "effc4d896a79ab5488378c96fc359ebacf806bac",
      "parents": [
        "68641b2aed872e4d30ff8e74b6b5a3287259a33e"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 15:42:29 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Thu Aug 27 15:42:29 2026 -0600"
      },
      "message": "[CFF] Hoist the per-op budget charge out of the interpret loop\n\nThe charstring interpreter charged every operator by branching on the\nopcode to pick HB_BUDGET_8 for callsubr/callgsubr and HB_BUDGET_1\notherwise -- two comparisons and a branch added to the innermost loop,\non the normal rendering path for every CFF font, not just adversarial\nones.\n\nCharge one unit unconditionally in the loop and add the remaining call\nweight inside the callsubr/callgsubr handlers, where a branch on the\nopcode already exists.  The total per-call-operator charge is unchanged\n(1 + 7 \u003d 8), the subroutine is still not entered once the budget is\nexhausted, and the hot loop is now branch-free.\n\nTests: meson test -C build (275/275 passed)\n\nAssisted-by: Claude \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "8d08f87417f0b34b9ffb90d9aa3db5b02a3ae888",
      "tree": "4b874b7b5d4b28dfeae1bc27ede4cecd4471b3d6",
      "parents": [
        "367657d74dbce2e3818b7b7266d1f5120fadc7eb"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 21:00:15 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 21:11:10 2026 +0000"
      },
      "message": "Fix possible memory leak in coverage-graph.hh\n"
    },
    {
      "commit": "367657d74dbce2e3818b7b7266d1f5120fadc7eb",
      "tree": "22247ecc0a909dc83105189c261e19beb0d5fc0d",
      "parents": [
        "15fe46ee2892aea7067ef065febe86b9caa45260"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 20:49:32 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 21:11:10 2026 +0000"
      },
      "message": "Add some missing checks for alloc failure in repacker.\n"
    },
    {
      "commit": "15fe46ee2892aea7067ef065febe86b9caa45260",
      "tree": "0e3b73fb28503027082d3b7f9cf82426ea7ac509",
      "parents": [
        "79f8c3d53b7d7bab0406b9e638480212c291a3fb"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 20:38:36 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 21:11:10 2026 +0000"
      },
      "message": "Use value instead of pointer in overflow record dedup.\n\nAvoids issues with ownership of pointer memory.\n"
    },
    {
      "commit": "79f8c3d53b7d7bab0406b9e638480212c291a3fb",
      "tree": "20cc3eaae374b802b524f8884b6624533142491a",
      "parents": [
        "e67dee3f3a076f80b5d9890c9ba331be40adba7f"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 01:24:45 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 15:10:38 2026 -0600"
      },
      "message": "Re-implement bit set\u0027s next_range()/previous_range() to utilize zero counting.\n\nPrior implementation was checking each bit manually. This improves efficiency by checking ranges of bits in one go using zero counting.\n"
    },
    {
      "commit": "e67dee3f3a076f80b5d9890c9ba331be40adba7f",
      "tree": "cc47e67617f919231d5ede08bb1c05fb45604403",
      "parents": [
        "a897489430ee356032ea72601546fafb8d0c14c4"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Wed Aug 26 20:48:12 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 15:10:38 2026 -0600"
      },
      "message": "Add tests and benchmarks for hb_set_t next_range().\n"
    },
    {
      "commit": "a897489430ee356032ea72601546fafb8d0c14c4",
      "tree": "71c6168354a35d7e62e37573e72b05473956cf22",
      "parents": [
        "7eac03d53c432945c28addc2e162e405e2071e6f"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 19:58:03 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 14:22:26 2026 -0600"
      },
      "message": "Add HB_GRAPH_INVALID constant for marking error results in graph/repacker code.\n"
    },
    {
      "commit": "7eac03d53c432945c28addc2e162e405e2071e6f",
      "tree": "4defb66af43ce1c48b892c8145fa8869673f6277",
      "parents": [
        "eca91585cc1459df59b05baf8c28238c3e1370cb"
      ],
      "author": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 17:06:44 2026 +0000"
      },
      "committer": {
        "name": "Garret Rieger",
        "email": "grieger@google.com",
        "time": "Thu Aug 27 14:22:26 2026 -0600"
      },
      "message": "Add missing error handling for fallible operations in the repacker.\n"
    },
    {
      "commit": "eca91585cc1459df59b05baf8c28238c3e1370cb",
      "tree": "0b75a560e7dce8f4798b6247ea99985c70e53ead",
      "parents": [
        "5f16f4ba68adba3a5f126ac84a5cdd335dcd34bd"
      ],
      "author": {
        "name": "nussaibah shaikh",
        "email": "nussaibah@bugqore.com",
        "time": "Thu Aug 27 23:29:53 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 11:59:53 2026 -0600"
      },
      "message": "[util] parse numeric options in the C locale (#6216)\n\nsscanf(\"%lf\") for --font-size, --embolden, --font-extents and\n--margin follows the environment LC_NUMERIC set by setlocale(LC_ALL,\n\"\"), so \"10.5\" parses as 10 under a comma-radix locale. Force\nLC_NUMERIC to C after the environment locale is applied so these\noptions use a \u0027.\u0027 radix, like g_ascii_strtod already does for --width."
    },
    {
      "commit": "68641b2aed872e4d30ff8e74b6b5a3287259a33e",
      "tree": "adb44493d823b7c3e88e5df527ea724946f845b8",
      "parents": [
        "7eab9be0244ed2690d3173139ec4d6b9c0c44b5f"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 18:34:31 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 18:34:31 2026 -0600"
      },
      "message": "[limits] Consolidate rendering work budgets\n\nUse HB_BUDGET_GLYPH as the common finite default for VARC and the\nin-house draw and paint backends. Raster paint retains its surface-size\nscaling so large targets still permit a small number of full passes.\n\nRemove redundant exhaustion checks around hb_budget_spend(). A spend\nthat lands exactly on zero succeeds; only a negative live value latches\nexhaustion. Apply the same boundary consistently to postcharged\nrenderer work and cover the next positive-cost attempt in tests.\n\nThe full Meson suite passes, as do the full TSan suite and the three\nrendering regression seeds under ASan and UBSan.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "7eab9be0244ed2690d3173139ec4d6b9c0c44b5f",
      "tree": "5f1826b0981aa1e4556c5ac52355bcc049d32140",
      "parents": [
        "08e080b13076fda4b716e16b6e82d126a51ba25c"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 18:34:02 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 18:34:02 2026 -0600"
      },
      "message": "[cairo] Skip external lock inversion under TSan\n\nCairo\u0027s user-font rendering acquires two internal locks in both\norders. The new nested-rendering regression test exposes that existing\nlock-order inversion under ThreadSanitizer, including when run against\nan unmodified HarfBuzz.\n\nKeep the end-to-end test enabled normally, but skip that workload when\ncompiled with TSan instead of suppressing deadlock detection globally.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "08e080b13076fda4b716e16b6e82d126a51ba25c",
      "tree": "34746f1194f4f51b153d07f0784615ea509d9f3d",
      "parents": [
        "15a523bd87c303d847e177ce5186ee6eaae4b682"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 18:13:42 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 18:13:42 2026 -0600"
      },
      "message": "[limits] Rely on the common integer definitions\n\nhb-limits.hh already includes hb.hh, which reaches hb-common.h and its\nportable fixed-width integer definitions.  Avoid a redundant direct\nstdint.h include.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "15a523bd87c303d847e177ce5186ee6eaae4b682",
      "tree": "d74b5dc44f5648cf1d7b5a74a8a098d318ccafff",
      "parents": [
        "8f3ab5ab87ca45fd0c4529f51599fb9db15b6f3d"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:54:45 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:54:45 2026 -0600"
      },
      "message": "[CFF] Test nested outline budget charges\n\nExercise CFF work accounting through the public draw-budget callbacks.\nUse lower bounds above each parent charstring\u0027s flat operator cost so the\nCFF1 assertion covers both seac children and the CFF2 assertion covers\nproportional blend work.\n\nKeep the interpreter\u0027s local cost type consistent with the unsigned spend\ninterface.\n\nTests: meson test -C build (275/275 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "8f3ab5ab87ca45fd0c4529f51599fb9db15b6f3d",
      "tree": "7890575d0fe58cb2ebc628115e0afb47002078f6",
      "parents": [
        "a38e2831c0aadd202b8fea74418c54f4fd573093"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:51:34 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:51:34 2026 -0600"
      },
      "message": "[cairo] Share work across nested glyph rendering\n\nCairo\u0027s draw callbacks previously received a raw cairo_t, so paint-driven\noutline traversals could not share a renderer budget.  Nested color glyphs\nalso construct fresh HarfBuzz paint contexts while populating the same\nscaled-font glyph cache.\n\nAttach a finite budget owner to the scaled font and let each draw/paint\ncontext borrow it.  Recharge only for the outermost glyph callback, expose\nthe budget callbacks on both function sets, and charge emitted path and\nnested color-glyph work.  Exercise the original vector timeout seed through\nthe Cairo user-font renderer.\n\nTests: meson test -C build (275/275 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "a38e2831c0aadd202b8fea74418c54f4fd573093",
      "tree": "a37f37da65ed1381b378019aa5eba6df61cd26e9",
      "parents": [
        "5be2bffb7c80a8665f873c552bd9d3c066eeb1a5"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:42:23 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:42:23 2026 -0600"
      },
      "message": "[draw] Forward budgets through synthetic outlines\n\nSynthetic slant and emboldening first render into an outline recorder.\nThat adapter previously hid the renderer\u0027s live budget, allowing the\nunderlying outline traversal to use a fresh per-glyph allowance.\n\nForward the destination draw data\u0027s remaining-budget pointer through\nthe recorder.  Add a regression test proving an exhausted synthetic\ndraw fails against the caller\u0027s budget.\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "5be2bffb7c80a8665f873c552bd9d3c066eeb1a5",
      "tree": "28548de54c82bcc56caed6585df7116e89032b7f",
      "parents": [
        "c06b7d4d5b3a37ab1beb203f717b0fd9d3903886"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:39:46 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:39:46 2026 -0600"
      },
      "message": "[VARC] Thread the renderer work budget\n\nMake VARC record traversal, variation processing, and all glyf/CFF\nleaves consume the renderer-owned live counter. Forward that counter\nthrough the transforming pen and make leaf traversal obtain it from\nthe active draw session.\n\nKeep a finite standalone allowance for extents, charge records even\nwhen conditions suppress their components, and add public-callback\ncoverage for cumulative depletion and exhaustion.\n\nTests: meson test -C build (274/274 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "c06b7d4d5b3a37ab1beb203f717b0fd9d3903886",
      "tree": "cc34003e0a4d7bc677904650bf977674abfb8995",
      "parents": [
        "9a424f180808b62fd1260ccb4baf9c24e9f79d64"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:35:23 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:35:23 2026 -0600"
      },
      "message": "[paint] Share the paint-extents work budget\n\nGive the paint-extents context finite budget policy and live state, and\nmake its stack-local draw sink expose that live counter to outline\ntraversal. Charge emitted segments in place instead of debiting only\nafter an entire glyph draw has completed.\n\nHandle COLR\u0027s zero-allocated scratch context explicitly without\nconfusing uninitialized storage with a client-selected zero budget.\nAdd focused coverage for scratch initialization, propagation, clear,\nzero, and unlimited policies.\n\nTests: meson test -C build (274/274 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "9a424f180808b62fd1260ccb4baf9c24e9f79d64",
      "tree": "c982e369b0da8043f5b30e52b7c50f3308c65541",
      "parents": [
        "c7797701c0ac002993511d350c8128c1ea31f02a"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:28:03 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:28:03 2026 -0600"
      },
      "message": "[gpu] Share rendering work budgets\n\nStore finite budget policy and live state on GPU draw and paint\ncontexts. Charge generated curves against the draw context and make\npaint-owned scratch draws borrow the paint session\u0027s counter.\n\nPropagate the same live counter through both identity clip extraction\nand the transforming forwarding pen. Preserve policy across clear and\nrestore DEFAULT on reset, with focused lifecycle and propagation tests.\n\nThe ClusterFuzz GPU timeout seed completes in 0.11 seconds in the\noptimized build.\n\nTests: meson test -C build (273/273 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "c7797701c0ac002993511d350c8128c1ea31f02a",
      "tree": "2115649432b22a80eb81fa7b7f7df8942e0b76cd",
      "parents": [
        "b0606f9d8abaf6dcc0659d5fefa361339b295c35"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:22:05 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:22:05 2026 -0600"
      },
      "message": "[raster] Share rendering work budgets\n\nStore budget policy and live state on raster draw and paint contexts.\nMake outline traversal and curve flattening borrow the paint session\u0027s\nlive counter, while standalone draw keeps its own finite session counter.\n\nPreserve raster\u0027s dynamic surface-sized default, resolving it only after\ninitialization and never replacing concrete or unlimited client policy.\nRecharge on clear and restore DEFAULT on reset. Add lifecycle and lazy\ndefault coverage.\n\nTests: meson test -C build (273/273 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "b0606f9d8abaf6dcc0659d5fefa361339b295c35",
      "tree": "8d43e6d166084f7b9ff77f556200aa3bcf74dde1",
      "parents": [
        "472c3e0fd35f9d7cd944ef6d07b8dffba66bd701"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:17:20 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:17:20 2026 -0600"
      },
      "message": "[vector] Share rendering work budgets\n\nStore budget policy and live state on vector draw and paint contexts.  Path\nsinks borrow the owning context\u0027s live counter, making glyph traversal,\nserialized path commands, and sweep-gradient patches consume one aggregate\nbudget throughout a clear-to-render session.\n\nRecharge the configured policy on clear, restore the finite default on\nreset, and expose the generic draw and paint budget callbacks for SVG and\nPDF contexts.  Add lifecycle and traversal-depletion coverage for both\nformats.\n\nTests: meson test -C build (273/273 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "472c3e0fd35f9d7cd944ef6d07b8dffba66bd701",
      "tree": "f35d6e47e99753425d0eb10cc06eacd49f0ac91c",
      "parents": [
        "a1fa46cbde3cb6d8238a7d27c8b78a3fb41c85a8"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:11:21 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:11:21 2026 -0600"
      },
      "message": "[draw] Add rendering work-budget API\n\nExpose budget policy and remaining-work callbacks on draw and paint function\nobjects.  The public setters clamp invalid negative caps, distinguish finite\ndefaults from explicit unlimited operation, and report whether a backend\nparticipates in accounting.\n\nLet draw sessions borrow the live counter owned by draw_data.  OpenType glyf\nand CFF traversal then debit the same counter in place, while unsupported\nbackends retain a finite per-glyph fallback.  Forward budget access through\nthe parent-font draw adaptor.\n\nDocument the new API and cover nil, default, unlimited, clamped, concrete,\nand live-depletion behavior.\n\nTests: meson test -C build (272/272 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "a1fa46cbde3cb6d8238a7d27c8b78a3fb41c85a8",
      "tree": "8c8b7ccedde71f4c0b2e9e409e92fb45dec31831",
      "parents": [
        "037aa79451dc7870d07d07f719c5e09693e80cea"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:09:22 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 17:09:22 2026 -0600"
      },
      "message": "[limits] Streamline work-budget spending\n\nKeep the hot spend primitive always-inline and branch-free.  Budget costs\nand multipliers are unsigned and structurally bounded by their callers, so\nthe primitive only needs to debit the live counter and report exhaustion.\n\nMove hb-limits.hh alongside the shared internal headers, after the paired\ninline/noinline attribute definitions it now depends on.\n\nTests: meson test -C build (272/272 passed)\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "037aa79451dc7870d07d07f719c5e09693e80cea",
      "tree": "e6c5f1b99f7528bd33401f5df32199587816a4a8",
      "parents": [
        "074b486d2141a7affbad1611557bbd3055eb0359"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 16:41:49 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 16:41:49 2026 -0600"
      },
      "message": "[fuzzing] Add rendering budget timeout seeds\n\nAdd the minimized vector, raster, and GPU testcases that exercise the\naggregate outline-expansion timeout.  Keeping the OSS-Fuzz testcase IDs\nin their filenames makes each regression directly traceable.\n\nThe current leaf-level limits allow all three inputs to complete in the\noptimized test build; later aggregate accounting will reduce their work\nfurther.\n\nTests: meson test -C build\n\nAssisted-by: OpenAI Codex \u003ccodex@openai.com\u003e\n"
    },
    {
      "commit": "074b486d2141a7affbad1611557bbd3055eb0359",
      "tree": "4d261d5dfc92e7ec15675615b5cdeef245041cdd",
      "parents": [
        "3f84c51ede3a97560f195bc388c3ab4a6e0916f0"
      ],
      "author": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 16:34:38 2026 -0600"
      },
      "committer": {
        "name": "Behdad Esfahbod",
        "email": "behdad@behdad.org",
        "time": "Wed Aug 26 16:34:38 2026 -0600"
      },
      "message": "[limits] Add weighted outline work accounting\n\nCOLR can repeatedly request expensive glyf or CFF outlines, multiplying\ntheir per-glyph structural limits.  Make both outline implementations\nconsume a caller-provided weighted budget so a later paint-session\ncounter can aggregate that work.\n\nAdd checked precharge arithmetic with stable exhaustion, charge glyf\nloads, terminal points, and gvar tuples, and charge CFF operators,\nsubroutine calls, CFF2 blends, and both CFF1 seac outlines.  Keep a\ngenerous local fallback for callers that do not yet provide a session\nbudget.\n\nTests: meson test -C build\n\nAssisted-by: Codex \u003ccodex@openai.com\u003e\n"
    }
  ],
  "next": "5f16f4ba68adba3a5f126ac84a5cdd335dcd34bd"
}
