mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 05:01:05 +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  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  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  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); | ||||
| @@ -1348,6 +1349,7 @@ struct ImDrawList | ||||
|     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  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 | ||||
|   | ||||
| @@ -1152,6 +1152,41 @@ void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, cons | ||||
|         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 | ||||
| //----------------------------------------------------------------------------- | ||||
| @@ -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 | ||||
| //----------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -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 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 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. | ||||
| // 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 | ||||
|     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          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 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user