LINUX.ORG.RU

Re: как нарисовать окружность в консоли (Иксов нет вообще) на Си.

Теоретически для этого можно воспользоваться библиотеками svgalib или libgl, но по опыту скажу, что работа с ними у меня восторга не вызвала.

Murr ★★ ()

Re: как нарисовать окружность в консоли (Иксов нет вообще) на Си.

можно в текстовом виде - считай, что у тебя экран 80x25 пискелей :)

grustnoe ★★ ()

Re: как нарисовать окружность в консоли (Иксов нет вообще) на Си.

а если прямую запись в видеопамять? Ведь полно всяких flame-эффектиков, 4-килобайтных...

anonymous ()

Re: как нарисовать окружность в консоли (Иксов нет вообще) на Си.

Хрен ты что запишешь в память пока ты не рут... Да и вообще - ядро на такие штучки просто обязано обижаться...

Llama ()

Re: как нарисовать окружность в консоли (Иксов нет вообще) на Си.

#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;

#define FBIOGET_VSCREENINFO     0x4600
#define FBIOGET_FSCREENINFO     0x4602

struct fb_fix_screeninfo {
        char id[16];
        unsigned long smem_start;

        u32 smem_len;
        u32 type;
        u32 type_aux;
        u32 visual;
        u16 xpanstep;
        u16 ypanstep;
        u16 ywrapstep;
        u32 line_length;
        unsigned long mmio_start;

        u32 mmio_len;
        u32 accel;
        u16 reserved[3];
};

struct fb_bitfield {
        u32 offset;                     /* beginning of bitfield        */
        u32 length;                     /* length of bitfield           */
        u32 msb_right;          /* != 0 : Most significant bit is */
                                        /* right */
};

struct fb_var_screeninfo {
        u32 xres;                       /* visible resolution           */
        u32 yres;
        u32 xres_virtual;               /* virtual resolution           */
        u32 yres_virtual;
        u32 xoffset;                    /* offset from virtual to visible */
        u32 yoffset;                    /* resolution                   */

        u32 bits_per_pixel;             /* guess what                   */
        u32 grayscale;          /* != 0 Graylevels instead of colors */

        struct fb_bitfield red;         /* bitfield in fb mem if true color, */
        struct fb_bitfield green;       /* else only length is significant */
        struct fb_bitfield blue;
        struct fb_bitfield transp;      /* transparency                 */

        u32 nonstd;                     /* != 0 Non standard pixel format */
        u32 activate;                   /* see FB_ACTIVATE_*            */

        u32 height;                     /* height of picture in mm    */
        u32 width;                      /* width of picture in mm     */

        u32 accel_flags;                /* acceleration flags (hints)   */

        /* Timing: All values in pixclocks, except pixclock (of course) */
        u32 pixclock;                   /* pixel clock in ps (pico seconds) */
        u32 left_margin;                /* time from sync to picture    */
        u32 right_margin;               /* time from picture to sync    */
        u32 upper_margin;               /* time from sync to picture    */
        u32 lower_margin;
        u32 hsync_len;          /* length of horizontal sync    */
        u32 vsync_len;          /* length of vertical sync      */
        u32 sync;                       /* see FB_SYNC_*                */
        u32 vmode;                      /* see FB_VMODE_*               */
        u32 reserved[6];                /* Reserved for future compatibility */
};


static inline void set_bit (char * b, int bit, _Bool set) {
    if (set)
        b[bit/8] |= 1<<(bit%8);
    else b[bit/8] &= ~(1<<(bit%8));
}

static void putpixel (char * frame_buffer, int x, int y, int color, struct fb_var_screeninfo var, struct fb_fix_screeninfo fix) {
    long bit;
    int  i;

    bit  = (x+y*var.xres)*var.bits_per_pixel;
    for (i=0; i<var.bits_per_pixel; i++)
        set_bit (frame_buffer, bit+i, (color&(1<<i))?1:0);
}

main () {
    int fd = open ("/dev/fb0", O_RDWR);
    char * vbuf;
    int i, rc;
    struct fb_var_screeninfo var;
    struct fb_fix_screeninfo fix;

    if (fd == -1) {
        fprintf (stderr, "failed to open fb device!\n");
        return 0;
    }

    rc = ioctl (fd, FBIOGET_VSCREENINFO, &var);
    if (rc == -1) {
        fprintf (stderr, "failed to get var_screeninfo!\n");
        return 0;
    }

    rc = ioctl (fd, FBIOGET_FSCREENINFO, &fix);
    if (rc == -1) {
        fprintf (stderr, "failed to get var_screeninfo!\n");
        return 0;
    }

    vbuf = mmap (NULL, fix.mmio_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if (vbuf == MAP_FAILED) {
        fprintf (stderr, "failed to mmap fb mem!\n");
        return 0;
    }

    for (i=0; i<1000; i++)
        putpixel (vbuf, i, i, 255, var, fix);

    getchar ();

    return 1;
}

Murr ★★ ()

Re: как нарисовать окружность в консоли (Иксов нет вообще) на Си.

Только надо понять как корректно проэкспортировать фреймбуферные объявления (те, что написал я, годятся для 2.4.20), ну и плюс на не фреймбуферной консоли нужно еще перейти во фреймбуфер. :D

Murr ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.