view dmdrawline.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children 997e26f17946
line wrap: on
line source


#ifdef DM_USE_SIMD
static int DM_DRAWLINE_NAME_ASM (SDL_Surface *screen, int x0, int y0, int x1, int y1, const Uint32 col);
#endif

#ifdef DM_USE_C
static int DM_DRAWLINE_NAME_C (SDL_Surface *screen, int x0, int y0, int x1, int y1, const Uint32 col)
{
    int dx, dy, xstep, ystep;
    const int qpitch = screen->pitch / DM_DRAWLINE_DST_BYTES;

    // Clipping
    if (dmClipLineCoords(&x0, &y0, &x1, &y1, screen))
        return -1;

    // Compute initial deltas
    dx = (x1 - x0) * 2;
    dy = (y1 - y0) * 2;

    if (dx < 0)
    {
        dx = -dx;
        xstep = -1;
    }
    else
        xstep = 1;

    if (dy < 0)
    {
        dy = -dy;
        ystep = -qpitch;
    }
    else
        ystep = qpitch;

    // Compute offsets
    y0 *= qpitch;
    y1 *= qpitch;

    DM_DRAWLINE_DST_TYPE *pix = screen->pixels;

    // Continue based on which delta is larger
    if (dx > dy)
    {
        int afrac = dy - (dx / 2);
        while (x0 != x1)
        {
            if (afrac >= 0)
            {
                y0 += ystep;
                afrac -= dx;
            }

            x0 += xstep;
            afrac += dy;
            
            DM_DRAWLINE_INNER
        }
    }
    else
    {
        int afrac = dx - (dy / 2);
        while (y0 != y1)
        {
            if (afrac >= 0)
            {
                x0 += xstep;
                afrac -= dy;
            }

            y0 += ystep;
            afrac += dx;

            DM_DRAWLINE_INNER
        }
    }

    return 0;
}
#endif

#undef DM_DRAWLINE_NAME
#undef DM_DRAWLINE_NAME_ASM
#undef DM_DRAWLINE_NAME_C
#undef DM_DRAWLINE_DST_BYTES
#undef DM_DRAWLINE_DST_TYPE