view tools/libgutil.c @ 2576:812b16ee49db

I had been living under apparent false impression that "realfft.c" on which the FFT implementation in DMLIB was basically copied from was released in public domain at some point, but it could very well be that it never was. Correct license is (or seems to be) GNU GPL. Thus I removing the code from DMLIB, and profusely apologize to the author, Philip Van Baren. It was never my intention to distribute code based on his original work under a more liberal license than originally intended.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 11 Mar 2022 16:32:50 +0200
parents 6d12670e0248
children
line wrap: on
line source

/*
 * Common graphics utility functions for tools
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2012-2015 Tecnic Software productions (TNSP)
 *
 * Please read file 'COPYING' for information on license and distribution.
 */
#include "libgutil.h"


void dmFillRect(SDL_Surface *screen, int x0, int y0, int x1, int y1, Uint32 col)
{
    SDL_Rect rc;
    rc.x = x0;
    rc.y = y0;
    rc.w = x1 - x0 + 1;
    rc.h = y1 - y0 + 1;
    SDL_FillRect(screen, &rc, col);
}


void dmDrawHLine(SDL_Surface *screen, int x0, int x1, int yc, const Uint32 col)
{
    const int bpp = screen->format->BytesPerPixel,
              cx0 = screen->clip_rect.x, cy0 = screen->clip_rect.y,
              cx1 = screen->clip_rect.x + screen->clip_rect.w - 1,
              cy1 = screen->clip_rect.y + screen->clip_rect.h - 1;

    DM_SWAP_IF(int, x0, x1);
    if (yc < cy0|| yc > cy1 || x1 < cx0 || x0 > cx1) return;
    if (x0 < cx0) x0 = cx0;
    if (x1 > cx1) x1 = cx1;

    int x = x1 - x0 + 1;
    Uint8 *pix = ((Uint8 *) screen->pixels) + yc * screen->pitch + (x0 * bpp);
    switch (screen->format->BitsPerPixel)
    {
        case 8:
            while (x--)
                *pix++ = col;
            break;

        case 32:
            {
                Uint32 *p = (Uint32 *) pix;
                while (x--)
                    *p++ = col;
            }
            break;
    }
}


void dmDrawVLine(SDL_Surface *screen, int y0, int y1, int xc, const Uint32 col)
{
    const int bpp = screen->format->BytesPerPixel,
              pitch = screen->pitch / bpp,
              cx0 = screen->clip_rect.x, cy0 = screen->clip_rect.y,
              cx1 = screen->clip_rect.x + screen->clip_rect.w - 1,
              cy1 = screen->clip_rect.y + screen->clip_rect.h - 1;

    DM_SWAP_IF(int, y0, y1);
    if (xc < cx0 || xc > cx1 || y1 < cy0 || y0 > cy1) return;
    if (y0 < cy0) y0 = cy0;
    if (y1 > cy1) y1 = cy1;

    int y = y1 - y0 + 1;
    Uint8 *pix = ((Uint8 *) screen->pixels) + y0 * screen->pitch + (xc * bpp);
    switch (screen->format->BitsPerPixel)
    {
        case 8:
            while (y--)
            {
                *pix = col;
                pix += pitch;
            }
            break;

        case 32:
            {
                Uint32 *p = (Uint32 *) pix;
                while (y--)
                {
                    *p = col;
                    p += pitch;
                }
            }
            break;
    }
}


void dmDrawBox3D(SDL_Surface *screen, int x0, int y0, int x1, int y1, Uint32 ucol, Uint32 dcol)
{
    dmDrawHLine(screen, x0    , x1 - 1, y0, ucol);
    dmDrawHLine(screen, x0 + 1, x1    , y1, dcol);

    dmDrawVLine(screen, y0    , y1 - 1, x0, ucol);
    dmDrawVLine(screen, y0 + 1, y1    , x1, dcol);
}


void dmFillBox3D(SDL_Surface *screen, int x0, int y0, int x1, int y1, Uint32 bgcol, Uint32 ucol, Uint32 dcol)
{
    SDL_Rect rc;

    rc.x = x0 + 1;
    rc.y = y0 + 1;
    rc.w = x1 - x0 - 1;
    rc.h = y1 - y0 - 1;
    SDL_FillRect(screen, &rc, bgcol);

    dmDrawBox3D(screen, x0, y0, x1, y1, ucol, dcol);
}


void dmDrawBMTextConstQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt)
{
    const char *ptr = fmt;
    DMUnscaledBlitFunc blit = dmGetUnscaledBlitFunc(font->glyphs->format, screen->format, mode);
    Uint8 *orig = font->glyphs->pixels;
    SDL_Surface surf;

    memcpy(&surf, font->glyphs, sizeof(SDL_Surface));

    while (*ptr)
    {
        int ch = toupper(*ptr++);

        if (ch == '_')
        {
            xc += 4;
            continue;
        }

        if (ch < font->maxglyph && ch != ' ')
        {
            DMBitmapGlyph *glyph = &font->glyphMap[ch];

            if (glyph->index >= 0)
            {
                surf.pixels = orig + glyph->index * font->gsize;
                surf.w = glyph->width;
                surf.h = glyph->height;

                blit(&surf, xc, yc, screen);
            }
        }
        xc += font->width;
    }
}


void dmDrawBMTextVAQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, va_list ap)
{
    char tmp[512];
    vsnprintf(tmp, sizeof(tmp), fmt, ap);
    dmDrawBMTextConstQ(screen, font, mode, xc, yc, tmp);
}


void dmDrawBMTextQ(SDL_Surface *screen, DMBitmapFont *font, int mode, int xc, int yc, const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    dmDrawBMTextVAQ(screen, font, mode, xc, yc, fmt, ap);
    va_end(ap);
}