F64 MySin(F64 d)
{ //Sin() does not have an address.
        return Sin(d);
}

F64 MyCos(F64 d)
{ //Cos() does not have an address.
        return Cos(d);
}

U0 FunDraw1(CDC *dc, F64 (*f)(F64 t))
{
        I64 i, w = Fs->pix_width, h = Fs->pix_height;
        F64 scale = h / 5.0;

        for (i = -w / 2; i <= w / 2; i++)
                GrLine(dc,      w / 2 + i,              h / 2 - scale * f(i / scale * 2 * pi), 
                                        w / 2 + i + 1,  h / 2 - scale * f((i + 1) / scale * 2 * pi));
}

U0 FunDraw2(CDC *dc, F64 (*f)(F64 t, F64 p), F64 T)
{
        I64 i, w = Fs->pix_width, h = Fs->pix_height;
        F64 scale = h / 5.0;

        for (i = -w / 2; i <= w / 2; i++)
                GrLine(dc, w / 2 + i, h / 2 - scale * f(i / scale, T), w / 2 + i + 1, h / 2 - scale * f((i + 1) / scale, T));
}

U0 Init(CDC *dc)
{
        I64 i, w = Fs->pix_width, h = Fs->pix_height;
        F64 scale = h / 5.0;

        DocClear;
        DCFill(dc);
        dc->color = BLACK;
        GrLine(dc, 0, h / 2, w - 1, h / 2);
        GrLine(dc, w / 2, 0, w / 2, h - 1);
        for (i = -2; i <= 2; i++)
        {
                dc->color = BLACK;
                GrLine(dc, w / 2 - 3, h / 2 - scale * i, w / 2 + 3, h / 2 - scale * i);
                if (i)
                {
                        dc->color = DKGRAY;
                        GrPrint(dc, w / 2 + 5, h / 2 - scale * i - FONT_HEIGHT / 2, "%5.1f", ToF64(i));
                }
        }
        for (i = -4; i <= 4; i++)
        {
                dc->color = BLACK;
                GrLine(dc, w / 2 + scale * i, h / 2 - 3, w / 2 + scale * i, h / 2 + 3);
                if (i)
                {
                        dc->color = DKGRAY;
                        GrPrint(dc, w / 2 + scale * i - 7 * FONT_WIDTH / 2, h / 2 + 5 + FONT_HEIGHT, "%5.1f*T", ToF64(i));
                }
        }
}

U0 SoundMathDemo()
{
        CDC *dc = DCAlias;

        Init(dc);
        dc->color = RED;
        FunDraw1(dc, &MySin);
        "$RED$Sin$FG$\n";
        PressAKey;
        dc->color = BLUE;
        FunDraw2(dc, &Saw, 1.0);
        "$BLUE$Saw$FG$\n";
        PressAKey;
        dc->color = GREEN;
        FunDraw2(dc, &FullSaw, 1.0);
        "$GREEN$FullSaw$FG$\n";
        PressAKey;

        Init(dc);
        dc->color = RED;
        FunDraw1(dc, &MyCos);
        "$RED$Cos$FG$\n";
        PressAKey;
        dc->color = BLUE;
        FunDraw2(dc, &Caw, 1.0);
        "$BLUE$Caw$FG$\n";
        PressAKey;
        dc->color = GREEN;
        FunDraw2(dc, &FullCaw, 1.0);
        "$GREEN$FullCaw$FG$\n";
        PressAKey;

        Init(dc);
        dc->color = RED;
        FunDraw1(dc, &MySin);
        "$RED$Sin$FG$\n";
        PressAKey;
        dc->color = BLUE;
        FunDraw2(dc, &Tri, 1.0);
        "$BLUE$Tri$FG$\n";
        PressAKey;
        dc->color = GREEN;
        FunDraw2(dc, &FullTri, 1.0);
        "$GREEN$FullTri$FG$\n";
        PressAKey;

        DCFill(dc);
        DCDel(dc);
}

SoundMathDemo;