diff --git a/Draw-List.md b/Draw-List.md
index cd4ea15..2485d18 100644
--- a/Draw-List.md
+++ b/Draw-List.md
@@ -1,6 +1,7 @@
# ImDrawList Vector Rendering Reference
β οΈ This documentation is valid for 1.93.0+ which will implement several ImDrawList improvements. The code is available for testing in the [features/drawlist_193](https://github.com/ocornut/imgui/tree/features/drawlist_193) branch. Some features and aspects of this document may not be valid for <1.93.0.
+
π§΅ Discussion thread: [#9504](https://github.com/ocornut/imgui/issues/9504). Please open new issues to diagnose your problems!
Related: [[Pixel Perfect Anti-aliased Rendering|Pixel-Perfect-Rendering]] and [[How Anti-aliased Polyline Rendering is Implemented|Polyline-Rendering]] guides.
@@ -87,18 +88,13 @@ The Default Stroke Position may be overidden by passing one of the dedicated `Im
- **ImDrawFlags_UseTexForRoundCorners**: Enable using textures instead of strokes to draw rounded corners/circles where possible (faster). Used by default unless 'ImFontAtlasFlags_NoBakedRoundCorners' is enabled in the font atlas.
-
-π§ Changes from versions < 1.93
-
-π¨ **Version 1.93.0**
-
-- Renamed `ImDrawListFlags_AntiAliasedLines` to `ImDrawFlags_AAStrokes`.
-- Renamed `ImDrawListFlags_AntiAliasedFill` to `ImDrawFlags_AAFill`.
-- Renamed `ImDrawListFlags_AllowVtxOffset` to `ImDrawFlags_UseVtxOffset`.
-- Renamed `ImDrawListFlags_TextNoPixelSnap` to `ImDrawFlags_TextNoPixelSnap`.
-- Obsoleted `ImDrawListFlags_AntiAliasedLinesUseTex` (always used).
-
-
+> [!WARNING]
+> π§ Changes in version 1.93.0: merged `ImDrawListFlags` into `ImDrawFlags`.
+> - Renamed `ImDrawListFlags_AntiAliasedLines` to `ImDrawFlags_AAStrokes`.
+> - Renamed `ImDrawListFlags_AntiAliasedFill` to `ImDrawFlags_AAFill`.
+> - Renamed `ImDrawListFlags_AllowVtxOffset` to `ImDrawFlags_UseVtxOffset`.
+> - Renamed `ImDrawListFlags_TextNoPixelSnap` to `ImDrawFlags_TextNoPixelSnap`.
+> - Obsoleted `ImDrawListFlags_AntiAliasedLinesUseTex` (always used).
# Primitives
@@ -112,10 +108,11 @@ Draws line from **p1** to **p2** with specified color and thickness. Default thi
If you need to draw a continuous line, prefer to use `AddPolyline()` or `PathStroke()` instead as they will join the lines together. For strictly horizontal or vertical lines, prefer to use `AddLineH()` and `AddLineV()`. They have additional optimizations for the cases when you are drawing pixel perfect lines.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.93.0**
+
+π§ Changes in version 1.93.0: removed +0.5px offset from `AddLine()` + how to switch to `AddLineH()/`AddLineV()`
Before: `AddLine()` used to have 0.5px offset applied to the end points. Together with no-AA line ends, the line would render as if the points were pixel center coordinates. Sometime it worked, and sometimes it did not and it was hard to reason why.
@@ -162,6 +159,8 @@ E) AddLineH( {1,5}, 2)
+----
+
### `AddLineH(min_x, max_x, y, col, thickness, flags)`

@@ -172,12 +171,13 @@ The "inside" of the shape below the line. You can think the horizontal line as t
Optimized rendering is used, if the horizontal line is drawn on integer coordinates, integer thickness, and the stroke offset is Inside or Outside.
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
+
-π§ Changes from versions < 1.93
+π§ Changes in version 1.93.0
-π¨ **Version 1.93.0**
-
-`AddLineH()` used to be implemented similarly as `AddLine()` and had the same 0.5px offset and missing anti-aliased end caps.
+`AddLineH()` used to be implemented similarly as `AddLine()` and had the same 0.5px offset.

@@ -193,6 +193,8 @@ The default stroke position for `AddLineH()` is **Inside**, which means that 1px
+----
+
### `AddLineV(x, min_y, max_y, col, thickness, flags)`

@@ -203,12 +205,13 @@ The "inside" of the shape right of the line. You can think the vertical line as
Optimized rendering is used, if the vertical line is drawn on integer coordinates, integer thickness, and the stroke offset is Inside or Outside.
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
+
-π§ Changes from versions < 1.93
+π§ Changes in version 1.93.0
-π¨ **Version 1.93.0**
-
-`AddLineV()` used to have the same 0.5px offset as AddLine(). The offset was removed,.
+`AddLineV()` used to have the same 0.5px offset as AddLine(). The offset was removed.

@@ -225,6 +228,8 @@ The default stroke position for `AddLineV()` is **Inside**, which means that 1px
+---
+
## Rectangles
### `AddRect(p_min, p_max, col, rounding, thickness, flags)`
@@ -239,10 +244,11 @@ Corner rounding is clamped to fit inside the rectangle bounds.
Optimized rendering is used if the coordinates and thickness are integer, and rounding is small integer and stroke position is Inside or Outside.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.92.8 (2026-05)**
+
+π§ Changes in version 1.92.8: swapped last parameters of `AddRect()`
Swapped the trailing parameters `flags` and `thickness`:
@@ -257,7 +263,9 @@ Added inline redirection functions when `IMGUI_DISABLE_OBSOLETE_FUNCTIONS` is of
- to `draw_list->AddRect(p_min, p_max, color, rounding, border_size);`
Users of C++ and other languages with type-checking will be notified at compile-time of any mistakes. Users of high-level bindings or languages with no type-checking will be notified at runtime via an assert for invalid flags value. Refer to [Changelog](https://github.com/ocornut/imgui/blob/master/docs/CHANGELOG.txt) for more details.
-
+
+
+π§ Changes in version 1.93.0
π¨ **Version 1.93.0**
`AddRect()` used to have fixed 0.5px inset. This meant that a 1px line draw was drawn inside the shape, which works well when rendering widgets.
@@ -293,10 +301,11 @@ Draws filled rectangle from **p_min** (top-left) to **p_max** ( bottom-right), w
Optimized rendering is used when the coordinates are integer, and rounding is small integer.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.93.0**
+
+π§ Change in version 1.93.0
`AddRectFilled()` used to always draw non-rounded rectangle without anti-aliasing. Now it renders with anti-aliasing. The optimized rendering case for integer coords matches the previous non-AA rendering.
@@ -327,10 +336,11 @@ The default segment count is **0** (calculate count automatically based on radiu
The rendering code handles corners cases robustly, like stroke thickness that would completely cover the inside of the shape will fallback to rendering to filled circle instead.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.93.0**
+
+π§ Change in version 1.93.0
`AddCircle()` used to have fixed 0.5px inset. This meant that a 1px line draw was drawn inside the shape.
@@ -340,10 +350,14 @@ The 0.5px offset is now removed, and the user can use the stroke position to pla
+----
+
### `AddCircleFilled(center, radius, col, num_segments)`
Draws filled circle at **center** using **radius**, with specified color.
+----
+
### `AddEllipse(center, radius, col, rot, num_segments, thickness, flags)`

@@ -354,10 +368,11 @@ The default rotation is **0**, segment count is *0* (calculate count automatical
Stroked ellipse drawing is more complicated than other shapes and it does not handle all degenerate inputs, like thick thickness compared to ellipse size, as well as other shapes.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.93.0**
+
+π§ Changes in version 1.93.0
The ellipse used to have center stroke position, it is not changed inside to be consistent with other primitive shapes.
@@ -367,12 +382,16 @@ To get the old behavior set stroke position to center.
+----
+
### `AddEllipseFilled(center, radius, col, rot, num_segments)`
Draws filled ellipse at **center** using **radius** (separate for x, y), with specified rotation, color, and segment count.
The default rotation is *0*, segment count is *0* (calculate count automatically based on radius).
+----
+
## Polygons
### `AddNgon(center, radius, col, num_segments, thickness, flags)`
@@ -385,10 +404,11 @@ The default thickness is **1.0**, and default stroke position is **Inside**. Str
The rendering code handles corners cases robustly, like stroke thickness that would completely cover the inside of the shape will fallback to rendering to filled ngon instead.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.93.0**
+
+π§ Changes in version < 1.93.0
`AddNGon()` used to have fixed 0.5px inset. This meant that a 1px line draw was drawn inside the shape.
@@ -398,11 +418,14 @@ The 0.5px offset is now removed, and the user can use the stroke position to pla
+----
### `AddNgonFilled(center, radius, col, num_segments)`
Draws filled regular polygon at **center** using circumcircle **radius**, with specified color, and segment count.
+----
+
### `AddQuad(p1, p2, p3, p4, col, thickness, flags)`

@@ -413,6 +436,7 @@ The default thickness is **1.0**, and default stroke position is **Inside**. Str
The points should be wound counter clockwise and should not self-intersect. Internally calls `AddPolyline()`, see the method for more information.
+----
### `AddQuadFilled(p1, p2, p3, p4, col)`
@@ -420,6 +444,7 @@ Draws arbitrary filled quad (4 cornered polygon) described by **p1**, **p2**, **
The points should be wound counter clockwise and should not self-intersect. Internally calls `AddConvexPolyFilled()`, see the method for more information.
+----
### `AddTriangle(p1, p2, p3, col, thickness, flags)`
@@ -431,6 +456,7 @@ The default thickness is **1.0**, and default stroke position is **Inside**. Str
The points should be wound counter clockwise. Internally calls `AddPolyline()`, see the method for more information.
+----
### `AddTriangleFilled(p1, p2, p3, col)`
@@ -438,7 +464,7 @@ Draws arbitrary filled triangle (3 cornered polygon) described by **p1**, **p2**
The points should be wound counter clockwise. Internally calls `AddPolyline()`, see the method for more information.
-
+----
## General Polygons
@@ -458,6 +484,8 @@ There are some robustness measures for the case where the line thickness is larg
The rendering uses textures for ant ialiasing for all line thicknesses. This allows to use just one rendering function, and rendering is as fast on all sizes. Thereβs max line thickness, 32 (`IM_DRAWLIST_TEX_LINES_WIDTH_MAX`), after which the lines will start to become blurry.
+----
+
#### Stroke Options

@@ -471,6 +499,8 @@ The line ends can have square caps using flag `ImDrawFlags_CapSquare`, which wil
Shapes that do not have very sharp corners, can use `ImDrawFlags_JoinMiter` draw flag for faster rendering. When this flag is set, some safety measures are skipeed, like beveling sharp corners. A good rule of thumb is that if your shape has 90 degree or rounded corners, you should be able to use this flag.
+----
+
#### Stroke Position

@@ -481,15 +511,16 @@ For example, then the stroke position is inside, the stroke will be crips as lon
**Inside is right of the path direction.** The pictures of the shapes in this document shows the inside/ outside and an arrow indicating the line direction.
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
+
-π§ Changes from versions < 1.93
-
-π¨ **Version 1.92.8 (2026-05)**
-
+π§ Changes in version 1.92.8: swapped trailing parameters of `AddRect()`
Swapped the trailing parameters `flags` and `thickness`. See `AddRect()` section for details.
+
-π¨ **Version 1.93.0**
-
+
+π§ Changes in version 1.93.0
The algorithm to render lines got overhauled.

@@ -497,9 +528,10 @@ The algorithm to render lines got overhauled.
Previous the polyline rendering would expand the stroke along the normal at each polyline vertex. This caused inconsistent line width, which very noticeable when the polyline has sharper corners.
The line ends are now anti-aliased. This solves missing pixels at line ends and results in cleaner rendering, especially under motion.
-
+----
+
### `AddConvexPolyFilled(points, num_points, col)`

@@ -512,10 +544,11 @@ The rendering expands small faded fringe around the polygon for anti-aliasing. T
Shapes that do not have very sharp corners, can use `ImDrawFlags_JoinMiter` draw flag for faster rendering. When this flag is set, some safety measures are skipped, like beveling sharp corners. A good rule of thumb is that if your shape has 90 degree or rounded corners, you should be able to use this flag.
-
-π§ Changes from versions < 1.93
+> [!WARNING]
+> Open collapsed block below for a detailed list of changes and how to update.
-π¨ **Version 1.93.0**
+
+π§ Changes in version 1.93.0
`PathFillConvex()` was improved to handle input geometry more robustly.
@@ -523,6 +556,8 @@ The rendering of sharp corners was improved. Earlier there were issues with shar
+----
+
### `AddConcavePolyFilled(points, num_points, col)`

@@ -533,6 +568,7 @@ The polygon must be wound in clock wise order and does not have self-intersectio
The concave polygon fill is more expensive than convex one: it has O(N^2) complexity. Provided as a convenience for the user but not used by the main library.
+----
## Curves
@@ -544,6 +580,7 @@ Draws stroked cubic bezier curve described by **p1**, **p2**, **p3**, and **p4**
The default thickness is **1.0**, default segment count is **0** (automatic based on error tolerance), and default stroke position is **Center**. Stroke Position and Stroke Options flags can be used.
+----
### `AddBezierQuadratic(p1, p2, p3, col, thickness, num_segments, flags)`
@@ -553,6 +590,7 @@ Draws stroked quadratic bezier curve described by **p1**, **p2**, and **p3**, wi
The default thickness is **1.0**, default segment count is **0** (automatic based on error tolerance), and default stroke position is **Center**. Stroke Position and Stroke Options flags can be used.
+----
## Images and Gradients
@@ -560,6 +598,7 @@ The default thickness is **1.0**, default segment count is **0** (automatic base
Draws rectangle filled with image **ref_ref** from **p_min** (top-left) to **p_max** ( bottom-right), with specified input image UV-coordinates, color, and rounding.
+----
### `AddImage(tex_ref, p_min, p_max, uv_min, uv_max, col)`
@@ -569,6 +608,7 @@ The default UV-coordinates are **(0,0) - (1,1)** (the whole input image).
Note: The method renders the image without anti-aliasing.
+----
### `AddImageQuad(tex_ref, p1, p2, p3, p4, uv1, uv2, uv3, uv4, col)`
@@ -578,6 +618,7 @@ The points should be wound counter clockwise and should not self-intersect.
Note: The method renders the image without anti-aliasing.
+----
### `AddRectFilledMultiColor(p_min, p_max, col_upr_left, col_upr_right, col_bot_right, col_bot_left)`
@@ -585,6 +626,7 @@ Draws filled multi-colored rectangle **p_min** (top-left) to **p_max** ( bottom-
Note: The method renders the image without anti-aliasing.
+----
## Paths
@@ -593,7 +635,6 @@ The path rendering has stateful API which allows to stage a path one part at a t
**Important**: filled shapes must always use clockwise winding order! The anti-aliasing depends on it. Counter-clockwise shapes will have "inward" anti-aliasing.
So e.g. `PathArcTo(center, radius, PI * -0.5f, PI)` is ok, whereas `PathArcTo(center, radius, PI, PI * -0.5f)` won't have correct anti-aliasing when followed by `PathFillConvex()`.
-
### `PathClear()`
Clears the currently staged path.
@@ -663,6 +704,8 @@ Fills the staged path using `AddConvexPolyFilled()` and clears the path. See `Ad
Fills the staged path using `AddConcavePolyFilled()` and clears the path. See `AddConcavePolyFilled()` for more information.
+----
+
# Vertex/Index cost per Primitive
Old: up to 1.92.9