// File: donfreiday[P]gb/./imgui/imgui.cpp
// Function: ImGui::DragBehavior(ImRect const&, unsigned int, float*, float, float, float, int, float)
bool ImGui::DragBehavior(const ImRect& frame_bb, ImGuiID id, float* v, float v_speed, float v_min, float v_max, int decimal_precision, float power)
{
    ImGuiState& g = *GImGui;
    ImGuiWindow* window = GetCurrentWindow();
    const ImGuiStyle& style = g.Style;

    // Draw frame
    const ImU32 frame_col = window->Color(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
    RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);

    bool value_changed = false;

    // Process clicking on the drag
    if (g.ActiveId == id)
    {
        if (g.IO.MouseDown[0])
        {
            if (g.ActiveIdIsJustActivated)
            {
                // Lock current value on click
                g.DragCurrentValue = *v;
                g.DragLastMouseDelta = ImVec2(0.f, 0.f);
            }

            const ImVec2 mouse_drag_delta = ImGui::GetMouseDragDelta(0, 1.0f);
            if (fabsf(mouse_drag_delta.x - g.DragLastMouseDelta.x) > 0.0f)
            {
                float speed = v_speed;
                if (speed == 0.0f && (v_max - v_min) != 0.0f && (v_max - v_min) < FLT_MAX)
                    speed = (v_max - v_min) * g.DragSpeedDefaultRatio;
                if (g.IO.KeyShift && g.DragSpeedScaleFast >= 0.0f)
                    speed = speed * g.DragSpeedScaleFast;
                if (g.IO.KeyAlt && g.DragSpeedScaleSlow >= 0.0f)
                    speed = speed * g.DragSpeedScaleSlow;

                float v_cur = g.DragCurrentValue;
                float delta = (mouse_drag_delta.x - g.DragLastMouseDelta.x) * speed;
                if (fabsf(power - 1.0f) > 0.001f)
                {
                    // Logarithmic curve on both side of 0.0
                    float v0_abs = v_cur >= 0.0f ? v_cur : -v_cur;
                    float v0_sign = v_cur >= 0.0f ? 1.0f : -1.0f;
                    float v1 = powf(v0_abs, 1.0f / power) + (delta * v0_sign);
                    float v1_abs = v1 >= 0.0f ? v1 : -v1;
                    float v1_sign = v1 >= 0.0f ? 1.0f : -1.0f;          // Crossed sign line
                    v_cur = powf(v1_abs, power) * v0_sign * v1_sign;    // Reapply sign
                }
                else
                {
                    v_cur += delta;
                }
                g.DragLastMouseDelta.x = mouse_drag_delta.x;

                // Clamp
                if (v_min < v_max)
                    v_cur = ImClamp(v_cur, v_min, v_max);
                g.DragCurrentValue = v_cur;

                // Round to user desired precision, then apply
                v_cur = RoundScalar(v_cur, decimal_precision);
                if (*v != v_cur)
                {
                    *v = v_cur;
                    value_changed = true;
                }
            }
        }
        else
        {
            SetActiveID(0);
        }
    }

    return value_changed;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdx, -0x18(%rbp)
movss %xmm0, -0x1c(%rbp)
movss %xmm1, -0x20(%rbp)
movss %xmm2, -0x24(%rbp)
movl %ecx, -0x28(%rbp)
movss %xmm3, -0x2c(%rbp)
movq 0x57b4c(%rip), %rax     # 0x794c0
movq %rax, -0x38(%rbp)
callq 0x2e220
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
addq $0x13e8, %rax           # imm = 0x13E8
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x38(%rbp), %rax
movl 0x1790(%rax), %eax
cmpl -0xc(%rbp), %eax
jne 0x219b6
movl $0x8, %eax
movl %eax, -0xa4(%rbp)
jmp 0x219d8
movq -0x38(%rbp), %rax
movl 0x1788(%rax), %edx
movl -0xc(%rbp), %esi
movl $0x6, %eax
movl $0x7, %ecx
cmpl %esi, %edx
cmovel %ecx, %eax
movl %eax, -0xa4(%rbp)
movq -0xa0(%rbp), %rdi
movl -0xa4(%rbp), %esi
movss 0x3962b(%rip), %xmm0    # 0x5b018
callq 0x2ea40
movl %eax, -0x4c(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x58(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
movl -0x4c(%rbp), %edi
movq -0x48(%rbp), %rax
movss 0x28(%rax), %xmm2
movsd -0x58(%rbp), %xmm0
movsd -0x60(%rbp), %xmm1
movl $0x1, %esi
callq 0x10a20
movb $0x0, -0x61(%rbp)
movq -0x38(%rbp), %rax
movl 0x1790(%rax), %eax
cmpl -0xc(%rbp), %eax
jne 0x21df3
movq -0x38(%rbp), %rax
testb $0x1, 0xf8(%rax)
je 0x21de6
movq -0x38(%rbp), %rax
testb $0x1, 0x1799(%rax)
je 0x21a93
movq -0x18(%rbp), %rax
movss (%rax), %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, 0x27c0(%rax)
leaq -0x6c(%rbp), %rdi
xorps %xmm1, %xmm1
movaps %xmm1, %xmm0
callq 0x2d280
movq -0x38(%rbp), %rax
movq -0x6c(%rbp), %rcx
movq %rcx, 0x27c4(%rax)
xorl %edi, %edi
movss 0x3957b(%rip), %xmm0    # 0x5b018
callq 0x11ac0
movlpd %xmm0, -0x74(%rbp)
movss -0x74(%rbp), %xmm0
movq -0x38(%rbp), %rax
subss 0x27c4(%rax), %xmm0
movaps 0x39681(%rip), %xmm1    # 0x5b140
pand %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0x21de4
movss -0x1c(%rbp), %xmm0
movss %xmm0, -0x78(%rbp)
movss -0x78(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x21b30
jp 0x21b30
movss -0x24(%rbp), %xmm0
subss -0x20(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x21afe
jp 0x21afe
jmp 0x21b30
movss -0x24(%rbp), %xmm1
subss -0x20(%rbp), %xmm1
movss 0x3958c(%rip), %xmm0    # 0x5b09c
ucomiss %xmm1, %xmm0
jbe 0x21b30
movss -0x24(%rbp), %xmm0
subss -0x20(%rbp), %xmm0
movq -0x38(%rbp), %rax
mulss 0x27cc(%rax), %xmm0
movss %xmm0, -0x78(%rbp)
movq -0x38(%rbp), %rax
testb $0x1, 0x106(%rax)
je 0x21b67
movq -0x38(%rbp), %rax
movss 0x27d4(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x21b67
movss -0x78(%rbp), %xmm0
movq -0x38(%rbp), %rax
mulss 0x27d4(%rax), %xmm0
movss %xmm0, -0x78(%rbp)
movq -0x38(%rbp), %rax
testb $0x1, 0x107(%rax)
je 0x21b9e
movq -0x38(%rbp), %rax
movss 0x27d0(%rax), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x21b9e
movss -0x78(%rbp), %xmm0
movq -0x38(%rbp), %rax
mulss 0x27d0(%rax), %xmm0
movss %xmm0, -0x78(%rbp)
movq -0x38(%rbp), %rax
movss 0x27c0(%rax), %xmm0
movss %xmm0, -0x7c(%rbp)
movss -0x74(%rbp), %xmm0
movq -0x38(%rbp), %rax
subss 0x27c4(%rax), %xmm0
mulss -0x78(%rbp), %xmm0
movss %xmm0, -0x80(%rbp)
movss -0x2c(%rbp), %xmm0
movss 0x39441(%rip), %xmm1    # 0x5b018
subss %xmm1, %xmm0
movaps 0x3955e(%rip), %xmm1    # 0x5b140
pand %xmm1, %xmm0
movss 0x394e2(%rip), %xmm1    # 0x5b0d0
ucomiss %xmm1, %xmm0
jbe 0x21d54
movss -0x7c(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x21c13
movss -0x7c(%rbp), %xmm0
movss %xmm0, -0xa8(%rbp)
jmp 0x21c2d
movss -0x7c(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0xa8(%rbp)
movss -0xa8(%rbp), %xmm0
movss %xmm0, -0x84(%rbp)
movss -0x7c(%rbp), %xmm1
movss 0x393ce(%rip), %xmm3    # 0x5b018
movss 0x3942a(%rip), %xmm2    # 0x5b07c
xorps %xmm0, %xmm0
cmpless %xmm1, %xmm0
movaps %xmm0, %xmm1
andps %xmm3, %xmm1
andnps %xmm2, %xmm0
orps %xmm1, %xmm0
movss %xmm0, -0x88(%rbp)
movss -0x84(%rbp), %xmm0
movss 0x3939a(%rip), %xmm1    # 0x5b018
divss -0x2c(%rbp), %xmm1
callq 0x7680
movaps %xmm0, %xmm1
movss -0x80(%rbp), %xmm0
movss -0x88(%rbp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x8c(%rbp)
movss -0x8c(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x21cca
movss -0x8c(%rbp), %xmm0
movss %xmm0, -0xac(%rbp)
jmp 0x21ce7
movss -0x8c(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0xac(%rbp)
movss -0xac(%rbp), %xmm0
movss %xmm0, -0x90(%rbp)
movss -0x8c(%rbp), %xmm1
movss 0x39311(%rip), %xmm3    # 0x5b018
movss 0x3936d(%rip), %xmm2    # 0x5b07c
xorps %xmm0, %xmm0
cmpless %xmm1, %xmm0
movaps %xmm0, %xmm1
andps %xmm3, %xmm1
andnps %xmm2, %xmm0
orps %xmm1, %xmm0
movss %xmm0, -0x94(%rbp)
movss -0x90(%rbp), %xmm0
movss -0x2c(%rbp), %xmm1
callq 0x7680
mulss -0x88(%rbp), %xmm0
mulss -0x94(%rbp), %xmm0
movss %xmm0, -0x7c(%rbp)
jmp 0x21d63
movss -0x80(%rbp), %xmm0
addss -0x7c(%rbp), %xmm0
movss %xmm0, -0x7c(%rbp)
movss -0x74(%rbp), %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, 0x27c4(%rax)
movss -0x20(%rbp), %xmm1
movss -0x24(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x21d9c
movss -0x7c(%rbp), %xmm0
movss -0x20(%rbp), %xmm1
movss -0x24(%rbp), %xmm2
callq 0xe3b0
movss %xmm0, -0x7c(%rbp)
movss -0x7c(%rbp), %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, 0x27c0(%rax)
movss -0x7c(%rbp), %xmm0
movl -0x28(%rbp), %edi
callq 0x1fcc0
movss %xmm0, -0x7c(%rbp)
movq -0x18(%rbp), %rax
movss (%rax), %xmm0
ucomiss -0x7c(%rbp), %xmm0
jne 0x21dd1
jp 0x21dd1
jmp 0x21de2
movss -0x7c(%rbp), %xmm0
movq -0x18(%rbp), %rax
movss %xmm0, (%rax)
movb $0x1, -0x61(%rbp)
jmp 0x21de4
jmp 0x21df1
xorl %edi, %edi
xorl %eax, %eax
movl %eax, %esi
callq 0xbe60
jmp 0x21df3
movb -0x61(%rbp), %al
andb $0x1, %al
addq $0xb0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)