<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 vars 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;