mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Cleanup - using ImRect more consistently for ImGui-side cliprect data
This commit is contained in:
		
							
								
								
									
										50
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -544,10 +544,10 @@ static void             LoadSettings(); | |||||||
| static void             SaveSettings(); | static void             SaveSettings(); | ||||||
| static void             MarkSettingsDirty(); | static void             MarkSettingsDirty(); | ||||||
|  |  | ||||||
| static void             PushClipRect(const ImVec4& clip_rect, bool clipped_by_current = true); | static void             PushClipRect(const ImRect& clip_rect, bool clipped_by_current = true); | ||||||
| static void             PushColumnClipRect(int column_index = -1); | static void             PushColumnClipRect(int column_index = -1); | ||||||
| static void             PopClipRect(); | static void             PopClipRect(); | ||||||
| static ImVec4           GetVisibleRect(); | static ImRect           GetVisibleRect(); | ||||||
|  |  | ||||||
| static bool             BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags); | static bool             BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags); | ||||||
| static void             CloseInactivePopups(); | static void             CloseInactivePopups(); | ||||||
| @@ -1622,7 +1622,7 @@ bool ImGui::IsClippedEx(const ImRect& bb, const ImGuiID* id, bool clip_even_when | |||||||
|     ImGuiState& g = *GImGui; |     ImGuiState& g = *GImGui; | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|  |  | ||||||
|     if (!bb.Overlaps(ImRect(window->ClipRect))) |     if (!bb.Overlaps(window->ClipRect)) | ||||||
|     { |     { | ||||||
|         if (!id || *id != GImGui->ActiveId) |         if (!id || *id != GImGui->ActiveId) | ||||||
|             if (clip_even_when_logged || !g.LogEnabled) |             if (clip_even_when_logged || !g.LogEnabled) | ||||||
| @@ -2194,23 +2194,22 @@ static void AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiW | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void PushClipRect(const ImVec4& clip_rect, bool clipped) | static void PushClipRect(const ImRect& clip_rect, bool clipped) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = ImGui::GetCurrentWindow(); |     ImGuiWindow* window = ImGui::GetCurrentWindow(); | ||||||
|  |  | ||||||
|     ImVec4 cr = clip_rect; |     ImRect cr = clip_rect; | ||||||
|     if (clipped) |     if (clipped) | ||||||
|     { |     { | ||||||
|         // Clip with existing clip rect |         // Clip our argument with the current clip rect | ||||||
|         const ImVec4 cur_cr = window->ClipRect; |         cr.Clip(window->ClipRect); | ||||||
|         cr = ImVec4(ImMax(cr.x, cur_cr.x), ImMax(cr.y, cur_cr.y), ImMin(cr.z, cur_cr.z), ImMin(cr.w, cur_cr.w)); |  | ||||||
|     } |     } | ||||||
|     cr.z = ImMax(cr.x, cr.z); |     cr.Max.x = ImMax(cr.Min.x, cr.Max.x); | ||||||
|     cr.w = ImMax(cr.y, cr.w); |     cr.Max.y = ImMax(cr.Min.y, cr.Max.y); | ||||||
|  |  | ||||||
|     IM_ASSERT(cr.x <= cr.z && cr.y <= cr.w); |     IM_ASSERT(cr.Min.x <= cr.Max.x && cr.Min.y <= cr.Max.y); | ||||||
|     window->ClipRect = cr; |     window->ClipRect = cr; | ||||||
|     window->DrawList->PushClipRect(cr); |     window->DrawList->PushClipRect(ImVec4(cr.Min.x, cr.Min.y, cr.Max.x, cr.Max.y)); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void PopClipRect() | static void PopClipRect() | ||||||
| @@ -2646,11 +2645,8 @@ void ImGui::CalcListClipping(int items_count, float items_height, int* out_items | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     const ImVec2 pos = window->DC.CursorPos; |     const ImVec2 pos = window->DC.CursorPos; | ||||||
|     const float clip_y1 = window->ClipRect.y; |     int start = (int)((window->ClipRect.Min.y - pos.y) / items_height); | ||||||
|     const float clip_y2 = window->ClipRect.w; |     int end = (int)((window->ClipRect.Max.y - pos.y) / items_height); | ||||||
|  |  | ||||||
|     int start = (int)((clip_y1 - pos.y) / items_height); |  | ||||||
|     int end = (int)((clip_y2 - pos.y) / items_height); |  | ||||||
|     start = ImClamp(start, 0, items_count); |     start = ImClamp(start, 0, items_count); | ||||||
|     end = ImClamp(end + 1, start, items_count); |     end = ImClamp(end + 1, start, items_count); | ||||||
|     *out_items_display_start = start; |     *out_items_display_start = start; | ||||||
| @@ -2937,12 +2933,12 @@ void ImGui::SetTooltip(const char* fmt, ...) | |||||||
|     va_end(args); |     va_end(args); | ||||||
| } | } | ||||||
|  |  | ||||||
| static ImVec4 GetVisibleRect() | static ImRect GetVisibleRect() | ||||||
| { | { | ||||||
|     ImGuiState& g = *GImGui; |     ImGuiState& g = *GImGui; | ||||||
|     if (g.IO.DisplayVisibleMin.x != g.IO.DisplayVisibleMax.x && g.IO.DisplayVisibleMin.y != g.IO.DisplayVisibleMax.y) |     if (g.IO.DisplayVisibleMin.x != g.IO.DisplayVisibleMax.x && g.IO.DisplayVisibleMin.y != g.IO.DisplayVisibleMax.y) | ||||||
|         return ImVec4(g.IO.DisplayVisibleMin.x, g.IO.DisplayVisibleMin.y, g.IO.DisplayVisibleMax.x, g.IO.DisplayVisibleMax.y); |         return ImRect(g.IO.DisplayVisibleMin, g.IO.DisplayVisibleMax); | ||||||
|     return ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); |     return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui::BeginTooltip() | void ImGui::BeginTooltip() | ||||||
| @@ -3897,10 +3893,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_ | |||||||
|         window->Collapsed = parent_window && parent_window->Collapsed; |         window->Collapsed = parent_window && parent_window->Collapsed; | ||||||
|  |  | ||||||
|         if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) |         if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) | ||||||
|         { |             window->Collapsed |= (window->ClipRect.Min.x >= window->ClipRect.Max.x || window->ClipRect.Min.y >= window->ClipRect.Max.y); | ||||||
|             const ImVec4 clip_rect_t = window->ClipRect; |  | ||||||
|             window->Collapsed |= (clip_rect_t.x >= clip_rect_t.z || clip_rect_t.y >= clip_rect_t.w); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // We also hide the window from rendering because we've already added its border to the command list. |         // We also hide the window from rendering because we've already added its border to the command list. | ||||||
|         // (we could perform the check earlier in the function but it is simpler at this point) |         // (we could perform the check earlier in the function but it is simpler at this point) | ||||||
| @@ -4780,17 +4773,17 @@ void ImGui::TextUnformatted(const char* text, const char* text_end) | |||||||
|         const char* line = text; |         const char* line = text; | ||||||
|         const float line_height = ImGui::GetTextLineHeight(); |         const float line_height = ImGui::GetTextLineHeight(); | ||||||
|         const ImVec2 text_pos = window->DC.CursorPos + ImVec2(0.0f, window->DC.CurrentLineTextBaseOffset); |         const ImVec2 text_pos = window->DC.CursorPos + ImVec2(0.0f, window->DC.CurrentLineTextBaseOffset); | ||||||
|         const ImVec4 clip_rect = window->ClipRect; |         const ImRect clip_rect = window->ClipRect; | ||||||
|         ImVec2 text_size(0,0); |         ImVec2 text_size(0,0); | ||||||
|  |  | ||||||
|         if (text_pos.y <= clip_rect.w) |         if (text_pos.y <= clip_rect.Max.y) | ||||||
|         { |         { | ||||||
|             ImVec2 pos = text_pos; |             ImVec2 pos = text_pos; | ||||||
|  |  | ||||||
|             // Lines to skip (can't skip when logging text) |             // Lines to skip (can't skip when logging text) | ||||||
|             if (!g.LogEnabled) |             if (!g.LogEnabled) | ||||||
|             { |             { | ||||||
|                 int lines_skippable = (int)((clip_rect.y - text_pos.y) / line_height); |                 int lines_skippable = (int)((clip_rect.Min.y - text_pos.y) / line_height); | ||||||
|                 if (lines_skippable > 0) |                 if (lines_skippable > 0) | ||||||
|                 { |                 { | ||||||
|                     int lines_skipped = 0; |                     int lines_skipped = 0; | ||||||
| @@ -8325,8 +8318,7 @@ void ImGui::Dummy(const ImVec2& size) | |||||||
| bool ImGui::IsRectVisible(const ImVec2& size) | bool ImGui::IsRectVisible(const ImVec2& size) | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
|     ImRect r(window->ClipRect); |     return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); | ||||||
|     return r.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui::BeginGroup() | void ImGui::BeginGroup() | ||||||
|   | |||||||
| @@ -570,7 +570,7 @@ struct ImGuiWindow | |||||||
|  |  | ||||||
|     ImGuiDrawContext        DC;                                 // Temporary per-window data, reset at the beginning of the frame |     ImGuiDrawContext        DC;                                 // Temporary per-window data, reset at the beginning of the frame | ||||||
|     ImVector<ImGuiID>       IDStack;                            // ID stack. ID are hashes seeded with the value at the top of the stack |     ImVector<ImGuiID>       IDStack;                            // ID stack. ID are hashes seeded with the value at the top of the stack | ||||||
|     ImVec4                  ClipRect;                           // = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2. |     ImRect                  ClipRect;                           // = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2. | ||||||
|     ImRect                  ClippedWindowRect;                  // = ClipRect just after setup in Begin() |     ImRect                  ClippedWindowRect;                  // = ClipRect just after setup in Begin() | ||||||
|     int                     LastFrameDrawn; |     int                     LastFrameDrawn; | ||||||
|     float                   ItemWidthDefault; |     float                   ItemWidthDefault; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ocornut
					ocornut