)]}'
{
  "commit": "9f448d3f4e744d2b7de4d72929320e071934be79",
  "tree": "5835641cf7ba58eb2c1bb0d81ec317ec99566bb4",
  "parents": [
    "b1751088c7e98c217d8a1357ea8b76d9134b99b2"
  ],
  "author": {
    "name": "Jonah Williams",
    "email": "jonahwilliams@google.com",
    "time": "Mon May 27 23:08:05 2024 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue May 28 06:08:05 2024 +0000"
  },
  "message": "[Impeller] Use scaled font to determine bounds, match Skia position rounding behavior, add subpixel X/Y/All/None positioning. (#53042)\n\nMultiple fixes to text rendering that match skia behavior on almost all bugs I\u0027ve found, except for the glyphs are still _slightly_ too fine for some CJK text. The fixes are:\r\n\r\n1. Compute the gylph size in the typographer context, using text size * scale factor text, instead of computing smaller bounds and scaling it up. This was not accurate and as a result we would positon glyphs incorrect by multiple pixels sometimes, causing uneven rows.\r\n\r\n2. Match Skia\u0027s rounding behavior. previously we were rounding in multiple places, Skia rounds once. This is important to prevent jumping.\r\n\r\n3. Use 4 subpixel X positions for rendering. This is the big one that ensures the visible layout matches exactly. Adds support for Y, both, and none positioning too. I couldn\u0027t find any examples of just Y or both. Some fonts may specify that have no subpixel positioning. So we don\u0027t bother to compute it for those.\r\n\r\nFixes https://github.com/flutter/flutter/issues/138386 / mostly, except slightly not bold enough.\r\nFixes https://github.com/flutter/flutter/issues/147577 / mostly, except slightly not bold enough.\r\nFixes https://github.com/flutter/flutter/issues/140475\r\nFixes https://github.com/flutter/flutter/issues/141467 \r\nFixes https://github.com/flutter/flutter/issues/135523\r\nFixes https://github.com/flutter/flutter/issues/127815",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "de607be256c54a5027bf727e71c30910708486c7",
      "old_mode": 33188,
      "old_path": "impeller/aiks/aiks_unittests.cc",
      "new_id": "01f5a296a235eb6fa7333e941017ab2ac7da0696",
      "new_mode": 33188,
      "new_path": "impeller/aiks/aiks_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "66434505986073e8182b592cf9ebf7c53e0d715d",
      "old_mode": 33188,
      "old_path": "impeller/aiks/canvas.cc",
      "new_id": "9f243ea8e043707bea5d75989c382e1824978550",
      "new_mode": 33188,
      "new_path": "impeller/aiks/canvas.cc"
    },
    {
      "type": "modify",
      "old_id": "f62aeab1c23b001919b2760908a7915116a2b85f",
      "old_mode": 33188,
      "old_path": "impeller/display_list/dl_dispatcher.cc",
      "new_id": "75fabadd11fdc5c125cbfb8ecee81c717a113d58",
      "new_mode": 33188,
      "new_path": "impeller/display_list/dl_dispatcher.cc"
    },
    {
      "type": "modify",
      "old_id": "eb9a1c739f4de9bfdbf104670822648bd36eeffa",
      "old_mode": 33188,
      "old_path": "impeller/entity/contents/text_contents.cc",
      "new_id": "d4b0d813a2510b02a1e6f8a68844a42f88576f44",
      "new_mode": 33188,
      "new_path": "impeller/entity/contents/text_contents.cc"
    },
    {
      "type": "modify",
      "old_id": "1df495af357346680ff95b2e18c6b587b4919f7d",
      "old_mode": 33188,
      "old_path": "impeller/entity/contents/text_contents.h",
      "new_id": "f076e09f37b9e1fdc4666e6ba76aead9e405a9ef",
      "new_mode": 33188,
      "new_path": "impeller/entity/contents/text_contents.h"
    },
    {
      "type": "modify",
      "old_id": "3d739d0373b23f40ffacb0404b123e2af813573c",
      "old_mode": 33188,
      "old_path": "impeller/entity/entity_unittests.cc",
      "new_id": "3025eec1d9364136d8e62327394cad8042b10430",
      "new_mode": 33188,
      "new_path": "impeller/entity/entity_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "e2a7e04e265eee4828ab48a9da96eac8377c7354",
      "old_mode": 33188,
      "old_path": "impeller/entity/shaders/glyph_atlas.vert",
      "new_id": "75a8d2fa8a36148e3fdc63c9dd8ae06612e5467e",
      "new_mode": 33188,
      "new_path": "impeller/entity/shaders/glyph_atlas.vert"
    },
    {
      "type": "modify",
      "old_id": "47994f75c0f565423d0649f0c3c54d048e5a84bc",
      "old_mode": 33188,
      "old_path": "impeller/tools/malioc.json",
      "new_id": "f156b6c8fefc9243cfec0168414798ee518f1efe",
      "new_mode": 33188,
      "new_path": "impeller/tools/malioc.json"
    },
    {
      "type": "modify",
      "old_id": "5167cdd6803023e7c2a56ffa5b3a19f29e75dcf2",
      "old_mode": 33188,
      "old_path": "impeller/typographer/backends/skia/text_frame_skia.cc",
      "new_id": "cd79684c7baffb4e83caddcf5afac03420e481f9",
      "new_mode": 33188,
      "new_path": "impeller/typographer/backends/skia/text_frame_skia.cc"
    },
    {
      "type": "modify",
      "old_id": "9586fcb24b2985df68f60ecbe7f35f3cd9d91d06",
      "old_mode": 33188,
      "old_path": "impeller/typographer/backends/skia/text_frame_skia.h",
      "new_id": "99ff93f854f7a3b5df3f8c0564200dc665fd39a4",
      "new_mode": 33188,
      "new_path": "impeller/typographer/backends/skia/text_frame_skia.h"
    },
    {
      "type": "modify",
      "old_id": "96027ea9906d4fa1d91338c245f3659f70b513eb",
      "old_mode": 33188,
      "old_path": "impeller/typographer/backends/skia/typographer_context_skia.cc",
      "new_id": "5002c67df569d87598553594b3bd8318925e0286",
      "new_mode": 33188,
      "new_path": "impeller/typographer/backends/skia/typographer_context_skia.cc"
    },
    {
      "type": "modify",
      "old_id": "d4e3985ab67eddf2239f238fe85ec843a1c4f6ee",
      "old_mode": 33188,
      "old_path": "impeller/typographer/backends/stb/text_frame_stb.cc",
      "new_id": "5ec1defc9756a2a65c42d799c8b9ba228758ae4f",
      "new_mode": 33188,
      "new_path": "impeller/typographer/backends/stb/text_frame_stb.cc"
    },
    {
      "type": "modify",
      "old_id": "c8d6affcbd84e98c496039b972643f64722e3eaf",
      "old_mode": 33188,
      "old_path": "impeller/typographer/backends/stb/typographer_context_stb.cc",
      "new_id": "75f5e2c2df49920933551c676d9c63b160302d39",
      "new_mode": 33188,
      "new_path": "impeller/typographer/backends/stb/typographer_context_stb.cc"
    },
    {
      "type": "modify",
      "old_id": "75ba05f9774f5f08638b337eb6a39ba9b4e87eeb",
      "old_mode": 33188,
      "old_path": "impeller/typographer/font.cc",
      "new_id": "06aad9ad479f592d1ca262b28a759c47ccdefaed",
      "new_mode": 33188,
      "new_path": "impeller/typographer/font.cc"
    },
    {
      "type": "modify",
      "old_id": "9140d756a1a565b5b351adc6fd283e75785cad47",
      "old_mode": 33188,
      "old_path": "impeller/typographer/font.h",
      "new_id": "a48f8822dc243bd5bb76a2e6592003d028ab0b3f",
      "new_mode": 33188,
      "new_path": "impeller/typographer/font.h"
    },
    {
      "type": "modify",
      "old_id": "01767fbebeb9d88f05dbe2f35edde1eb967a6af9",
      "old_mode": 33188,
      "old_path": "impeller/typographer/font_glyph_pair.h",
      "new_id": "2e79ade5350940923c7c0e67fd299de47d03f228",
      "new_mode": 33188,
      "new_path": "impeller/typographer/font_glyph_pair.h"
    },
    {
      "type": "modify",
      "old_id": "6736f302e2c5c3bdf45623e3f9bbf03e4687d5f9",
      "old_mode": 33188,
      "old_path": "impeller/typographer/glyph.h",
      "new_id": "3a1b813da734567227ed3b12ccadf38cf15cc17a",
      "new_mode": 33188,
      "new_path": "impeller/typographer/glyph.h"
    },
    {
      "type": "modify",
      "old_id": "6e9b46a4e273033586ef36f8cf4f78d091cef4d5",
      "old_mode": 33188,
      "old_path": "impeller/typographer/glyph_atlas.cc",
      "new_id": "59a3f3276b889fca2fa4543ae79e99f5022edd99",
      "new_mode": 33188,
      "new_path": "impeller/typographer/glyph_atlas.cc"
    },
    {
      "type": "modify",
      "old_id": "605e70d753f37c3d08afc39d03c2c9f9d198981f",
      "old_mode": 33188,
      "old_path": "impeller/typographer/glyph_atlas.h",
      "new_id": "98a6556da2fdef24238c54c759ee1863fc3f1213",
      "new_mode": 33188,
      "new_path": "impeller/typographer/glyph_atlas.h"
    },
    {
      "type": "modify",
      "old_id": "839625be47f61b11f8aab0fea8d43704f9148820",
      "old_mode": 33188,
      "old_path": "impeller/typographer/lazy_glyph_atlas.cc",
      "new_id": "5e6c164e9ab6f6f5eaa879517cb9c4c73840310a",
      "new_mode": 33188,
      "new_path": "impeller/typographer/lazy_glyph_atlas.cc"
    },
    {
      "type": "modify",
      "old_id": "921e9141c19559f9688963a23d887d0b130ed6d6",
      "old_mode": 33188,
      "old_path": "impeller/typographer/lazy_glyph_atlas.h",
      "new_id": "6fa2e543ee3c9ff443062744b1b898c25424a400",
      "new_mode": 33188,
      "new_path": "impeller/typographer/lazy_glyph_atlas.h"
    },
    {
      "type": "modify",
      "old_id": "e597e54b7c840dd09dcfb024220f202b9b5be073",
      "old_mode": 33188,
      "old_path": "impeller/typographer/text_frame.cc",
      "new_id": "a209647d338ba0ffc2a1fef9f2b01a101676a24f",
      "new_mode": 33188,
      "new_path": "impeller/typographer/text_frame.cc"
    },
    {
      "type": "modify",
      "old_id": "97cf52b37ab8fbe90c2b8a4087539a3cc7227b19",
      "old_mode": 33188,
      "old_path": "impeller/typographer/text_frame.h",
      "new_id": "7a9b89017d544abe4651e181e003b0eea64abd11",
      "new_mode": 33188,
      "new_path": "impeller/typographer/text_frame.h"
    },
    {
      "type": "modify",
      "old_id": "37f53c4350778b04a6b6bb010006dfd1a7e3a744",
      "old_mode": 33188,
      "old_path": "impeller/typographer/typographer_unittests.cc",
      "new_id": "a2d1813d37009671f9bde4255aa41fe724d84b44",
      "new_mode": 33188,
      "new_path": "impeller/typographer/typographer_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "c02b8169c0d71916cd4c717ce6c07286b3e8900a",
      "old_mode": 33188,
      "old_path": "testing/impeller_golden_tests_output.txt",
      "new_id": "8adb5b267b375b68e7394c20e0bf43fdb4eafbd3",
      "new_mode": 33188,
      "new_path": "testing/impeller_golden_tests_output.txt"
    },
    {
      "type": "modify",
      "old_id": "2c3b588ad1f86b320d14d100f4de528a25465332",
      "old_mode": 33188,
      "old_path": "third_party/txt/src/skia/paragraph_skia.cc",
      "new_id": "90193bd33dbfe08aae32c328fba4fe59e51b6f06",
      "new_mode": 33188,
      "new_path": "third_party/txt/src/skia/paragraph_skia.cc"
    }
  ]
}
