<1>/* Graphics Not Rendered in HTML */

#define APPLES_NUM 128

I64  x[APPLES_NUM], y[APPLES_NUM], cur_apple, cur_dist;
Bool trigger;

U0 DrawIt(CTask *, CDC *dc)
{
    I64 i, best_dist = I64_MAX, best_apple = 0;

    dc->flags |= DCF_LOCATE_NEAREST;
    dc->cur_x = mouse.pos.x;
    dc->cur_y = mouse.pos.y;
    dc->cur_z = 0;
    for (i = 0; i < APPLES_NUM; i++)
    {
        Sprite3(dc, x[i], y[i], 0, <1>);
        if (dc->nearest_dist <= best_dist)
        {
            //Distance to nearest pix, squared
            //Sqrt() is expensive so we work with distance squared.
            best_dist = dc->nearest_dist;
            best_apple = i;
        }
    }
    if (trigger)
    {
        cur_apple = best_apple;
        cur_dist = best_dist;
        trigger = FALSE;
    }
    GrPrint(dc, FONT_WIDTH, FONT_HEIGHT, "Dist Squared:%d", cur_dist);
}

U0 Pick()
{
    I64 i, message_code, arg1, arg2, delta_x, delta_y;

    for (i = 0; i < APPLES_NUM; i++)
    {
        x[i] = RandU16 % GR_WIDTH;
        y[i] = RandU16 % (GR_HEIGHT - FONT_HEIGHT * 3) + FONT_HEIGHT * 3;
    }
    SettingsPush; //See SettingsPush
    AutoComplete;
    DocCursor;
    DocClear;

    trigger = FALSE;
    cur_apple = cur_dist = 0;

    Fs->draw_it     = &DrawIt;
    Fs->win_inhibit = WIG_TASK_DEFAULT - WIF_SELF_FOCUS - WIF_SELF_BORDER;

    try
    {
        while (TRUE)
        {
            if (MessageGet(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN | 1 << MESSAGE_MS_L_DOWN) == MESSAGE_KEY_DOWN)
                goto pi_done;

                //Wait for window mgr to call DrawIt()
            trigger = TRUE;
            do Refresh;
            while (trigger);

            //Use screen coordinates, not window (arg1,arg2)
            //mouse.pos.x and mouse.pos.y are global variables updated
            //updated by the window mgr to hold the
            //screen coordinates of the mouse.
            delta_x = x[cur_apple] - mouse.pos.x;
            delta_y = y[cur_apple] - mouse.pos.y;

            do
            {
                message_code = MessageGet(&arg1, &arg2, 1 << MESSAGE_KEY_DOWN | 1 << MESSAGE_MS_MOVE | 1 << MESSAGE_MS_L_UP);
                if (message_code == MESSAGE_KEY_DOWN)
                    goto pi_done;
                x[cur_apple] = mouse.pos.x + delta_x;
                y[cur_apple] = mouse.pos.y + delta_y;
            }
            while (message_code != MESSAGE_MS_L_UP);
        }
pi_done:
        MessageGet(,, 1 << MESSAGE_KEY_UP);
    }
    catch
        PutExcept;
    SettingsPop;
}

Pick;