mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Merge branch '2016-08-rounded-image' of https://github.com/thedmd/imgui into thedmd-2016-08-rounded-image
This commit is contained in:
		
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1309,6 +1309,7 @@ struct ImDrawList | |||||||
|     IMGUI_API void  AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); |     IMGUI_API void  AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); | ||||||
|     IMGUI_API void  AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = 0xFFFFFFFF); |     IMGUI_API void  AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = 0xFFFFFFFF); | ||||||
|     IMGUI_API void  AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,0), const ImVec2& uv_c = ImVec2(1,1), const ImVec2& uv_d = ImVec2(0,1), ImU32 col = 0xFFFFFFFF); |     IMGUI_API void  AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,0), const ImVec2& uv_c = ImVec2(1,1), const ImVec2& uv_d = ImVec2(0,1), ImU32 col = 0xFFFFFFFF); | ||||||
|  |     IMGUI_API void  AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, float rounding, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = 0xFFFFFFFF, int rounding_corners = ~0); | ||||||
|     IMGUI_API void  AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness, bool anti_aliased); |     IMGUI_API void  AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness, bool anti_aliased); | ||||||
|     IMGUI_API void  AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col, bool anti_aliased); |     IMGUI_API void  AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col, bool anti_aliased); | ||||||
|     IMGUI_API void  AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0); |     IMGUI_API void  AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0); | ||||||
| @@ -1348,6 +1349,7 @@ struct ImDrawList | |||||||
|     inline    void  PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col)     { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } |     inline    void  PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col)     { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } | ||||||
|     IMGUI_API void  UpdateClipRect(); |     IMGUI_API void  UpdateClipRect(); | ||||||
|     IMGUI_API void  UpdateTextureID(); |     IMGUI_API void  UpdateTextureID(); | ||||||
|  |     IMGUI_API void  PrimDistributeUV(ImDrawVert* start, ImDrawVert* end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // All draw data to render an ImGui frame | // All draw data to render an ImGui frame | ||||||
|   | |||||||
| @@ -1152,6 +1152,41 @@ void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, cons | |||||||
|         PopTextureID(); |         PopTextureID(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, float rounding, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, int rounding_corners) | ||||||
|  | { | ||||||
|  |     if ((col & IM_COL32_A_MASK) == 0) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |     if (rounding <= 0.0f) | ||||||
|  |     { | ||||||
|  |         AddImage(user_texture_id, a, b, uv_a, uv_b, col); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // FIXME-OPT: This is wasting draw calls. | ||||||
|  |     const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back(); | ||||||
|  |     if (push_texture_id) | ||||||
|  |         PushTextureID(user_texture_id); | ||||||
|  |  | ||||||
|  |     if (rounding > 0.0f && rounding_corners != 0) | ||||||
|  |     { | ||||||
|  |         size_t startIndex = VtxBuffer.size(); | ||||||
|  |         PathRect(a, b, rounding, rounding_corners); | ||||||
|  |         PathFillConvex(col); | ||||||
|  |         size_t endIndex = VtxBuffer.size(); | ||||||
|  |  | ||||||
|  |         ImGui::ShadeVertsLinearUV(VtxBuffer.Data + startIndex, VtxBuffer.Data + endIndex, a, b, uv_a, uv_b, true); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         PrimReserve(6, 4); | ||||||
|  |         PrimRectUV(a, b, uv_a, uv_b, col); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (push_texture_id) | ||||||
|  |         PopTextureID(); | ||||||
|  | } | ||||||
|  |  | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| // ImDrawData | // ImDrawData | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| @@ -1226,6 +1261,30 @@ void ImGui::ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_sta | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Distribute UV over (a, b) rectangle | ||||||
|  | void ImGui::ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp) | ||||||
|  | { | ||||||
|  |     const ImVec2 size = b - a; | ||||||
|  |     const ImVec2 uv_size = uv_b - uv_a; | ||||||
|  |     const ImVec2 scale = ImVec2( | ||||||
|  |         size.x ? (uv_size.x / size.x) : 0.0f, | ||||||
|  |         size.y ? (uv_size.y / size.y) : 0.0f); | ||||||
|  |  | ||||||
|  |     if (clamp) | ||||||
|  |     { | ||||||
|  |         const ImVec2 min = ImMin(uv_a, uv_b); | ||||||
|  |         const ImVec2 max = ImMax(uv_a, uv_b); | ||||||
|  |  | ||||||
|  |         for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) | ||||||
|  |             vertex->uv = ImClamp(uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale), min, max); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) | ||||||
|  |             vertex->uv = uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| // ImFontConfig | // ImFontConfig | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
|   | |||||||
| @@ -155,6 +155,7 @@ static inline ImVec2 ImFloor(const ImVec2& v) | |||||||
| static inline float  ImDot(const ImVec2& a, const ImVec2& b)                    { return a.x * b.x + a.y * b.y; } | static inline float  ImDot(const ImVec2& a, const ImVec2& b)                    { return a.x * b.x + a.y * b.y; } | ||||||
| static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a)        { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } | static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a)        { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } | ||||||
| static inline float  ImLinearSweep(float current, float target, float speed)    { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } | static inline float  ImLinearSweep(float current, float target, float speed)    { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } | ||||||
|  | static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs)                { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } | ||||||
|  |  | ||||||
| // We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. | // We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. | ||||||
| // Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions. | // Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions. | ||||||
| @@ -873,6 +874,7 @@ namespace ImGui | |||||||
|     // Shade functions |     // Shade functions | ||||||
|     IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); |     IMGUI_API void          ShadeVertsLinearColorGradientKeepAlpha(ImDrawVert* vert_start, ImDrawVert* vert_end, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); | ||||||
|     IMGUI_API void          ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x); |     IMGUI_API void          ShadeVertsLinearAlphaGradientForLeftToRightText(ImDrawVert* vert_start, ImDrawVert* vert_end, float gradient_p0_x, float gradient_p1_x); | ||||||
|  |     IMGUI_API void          ShadeVertsLinearUV(ImDrawVert* vert_start, ImDrawVert* vert_end, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); | ||||||
|  |  | ||||||
| } // namespace ImGui | } // namespace ImGui | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user