LINUX.ORG.RU

Микробиблиотеку для попиксельного вывода в окошко посоветуйте (си)

 , ,


1

3

Скорость вторична. Кроссплатформенность вторична. Простота первична.

в идеале что-то вроде:

#include "libname.h"

...

void main(void) {
  int w = 640;
  int h = 480;
  void * screen = init_libname(w, h, RGBA);
  
  int x = 100;
  int y = 150;
  screen[w*y + x] = 255; // Red
  screen[w*y + x + 1] = 255; // Green
  screen[w*y + x + 2] = 255; // Blue

  free_libname(screen);
}

Окошко пусть создает. Ну, думаю, ясно что мне нужно. Наверняка все про такую занют (или себе писали), только мне не говорят.

// си хочу чистый, ламповый

// я еще слыхал, что в этих наших линуксах можно прям в видеопамять рисовать, прямо поверх всех окон. брешут, поди?

★★

я еще слыхал, что в этих наших линуксах можно прям в видеопамять рисовать, прямо поверх всех окон. брешут, поди?

Во фреймбуфер что ли?

Meyer ★★★ ()
void main(void) {
  int w = 640;
  int h = 480;
-  void * screen = init_libname(w, h, RGBA);
+ uint8_t screen = (uint8_t)calloc(w*h*3)
  
  int x = 100;
  int y = 150;
  screen[w*y + x] = 255; // Red
  screen[w*y + x + 1] = 255; // Green
  screen[w*y + x + 2] = 255; // Blue
+ copy_to_preffered(screen,preffered);
-  free_libname(screen);
}

PS. и я бы не сказал что предложенный TC интерфейс крайне удобен для энд-юзера. Юзеру придётся помнить как вычисляются координаты и раскладываются компоненты.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от Meyer

я еще слыхал, что в этих наших линуксах можно прям в видеопамять рисовать, прямо поверх всех окон. брешут, поди?

Во фреймбуфер что ли?

Наверное. А что такое фреймбуфер? я так понимаю где-то должна быть область памяти из которой формируется кадр постоянно. Оно?

pihter ★★ ()
Ответ на: комментарий от MKuznetsov

PS. и я бы не сказал что предложенный TC интерфейс крайне удобен для энд-юзера. Юзеру придётся помнить как вычисляются координаты и раскладываются компоненты.

макрос, функцией обернуть

pihter ★★ ()
Ответ на: комментарий от Dark_SavanT

Пиши в фреймбуффер по хардкору

Сообразил. Если переключиться в tty-ку на которой иксы не запущены — все работает.

Отличная штука, не знал что в этих ваших эмуляторах терминала рисовать можно о_О

// это ж что? и в магазине так стенку приподнять можно? накодить супермарио-клон да без иксов... ах, какое полезное изобретение!

pihter ★★ ()
Ответ на: комментарий от pihter

И что, поэтому надо бросаться на фреймбуфер-грабли? С чего все взяли что у тебя raspberry pi? У тебя ведь обычный x86? И как ты будешь фреймбуфер протаскивать?

Так что не морочь себе котелок, бери SDL2 и быстро всё сделаешь по своей отладочной задаче.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от slovazap

Так она самое простое что можно придумать. SDL_SetVideoMode, получаеешь SDL_Surface, на которой рисуешь пиксели, и SDL_Flip для вывода. Всё.

Ну, не так чтоб все в три функции — но несложно, да, спасибо.

Вот, мож кому пригодится

#include <stdio.h> 
#include <stdlib.h>  
#include <SDL/SDL.h>

void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B) { 
  Uint32 color = SDL_MapRGB(screen->format, R, G, B); 
  switch (screen->format->BytesPerPixel) { 
    case 1: {// Assuming 8-bpp 
      Uint8 *bufp; 
      bufp = (Uint8 *)screen->pixels + y*screen->pitch + x; *bufp = color; 
    } break; 
    case 2: {// Probably 15-bpp or 16-bpp 
      Uint16 *bufp; 
      bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x; *bufp = color; 
    } break; 
    case 3: {// Slow 24-bpp mode, usually not used 
      Uint8 *bufp; 
      bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3; 
      if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { 
        bufp[0] = color; 
        bufp[1] = color >> 8; 
        bufp[2] = color >> 16; 
      } else { 
        bufp[2] = color; 
        bufp[1] = color >> 8; 
        bufp[0] = color >> 16; 
      } 
    } break; 
    case 4: {// Probably 32-bpp 
      Uint32 *bufp; 
      bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x; 
      *bufp = color; 
    } break; 
  } 
} 

void Slock(SDL_Surface *screen) { 
  if ( SDL_MUSTLOCK(screen) ) { 
    if ( SDL_LockSurface(screen) < 0 ) { 
      return; 
    } 
  } 
} 

void Sulock(SDL_Surface *screen) {
  if ( SDL_MUSTLOCK(screen) ) { 
    SDL_UnlockSurface(screen); 
  } 
} 

int main(int argc, char *argv[]) { 
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { 
    printf("Unable to init SDL: %s\n", SDL_GetError()); 
    exit(1); 
  } 
  
  // перед выходом освободим ресурсы
  atexit(SDL_Quit); 
  
  SDL_Surface *screen; 
  screen=SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); 
  if ( screen == NULL ) { 
    printf("Unable to set 640x480 video: %s\n", SDL_GetError()); 
    exit(1); 
  } 
     
  // рисование
  DrawPixel(screen, 100, 100, 255, 255, 255);
  SDL_Flip(screen); 
     
  SDL_Event event;
  int quit = 0;
     
  while (!quit) {
    while (SDL_PollEvent(&event)) {
      if (event.type == SDL_QUIT) {
        quit = 1;
      }
    }
  }
  
  return 0;  
}

Конпеляется так:

gcc -lSDL -o sdl_screen sdl_screen.c

понятно, libsdl-dev в систему ставится отдельно

pihter ★★ ()
Ответ на: комментарий от I-Love-Microsoft

И что, поэтому надо бросаться на фреймбуфер-грабли?

А чего в нем граблястого? Очень любопытная штука

С чего все взяли что у тебя raspberry pi?

А почему только малина? Я так понял оно вообще в ядре. Нет?

И как ты будешь фреймбуфер протаскивать?

Эта фраза что значит? )

Так что не морочь себе котелок, бери SDL2 и быстро всё сделаешь по своей отладочной задаче.

Это я уже. Причем, пока делал, возникло стойкое ощущение дежавю, поковырял архивы — точно, я уже с этим разбирался ранее :)

pihter ★★ ()
Ответ на: комментарий от I-Love-Microsoft

Это если графическая консоль запущена?

Да пес его знает: я про фреймбуффер-то узнал вчера и то из статьи на википедии. Меня тут уже оборжали.

А то ведь не все консоли таковы.

Наверное, но на тех, которые таковы, дюже ловко получается. Самое главное по ресурсам: эдак и к какому-нибудь роутеру на OpenWRT можно дисплей приделать, мало ли — станком управлять )

pihter ★★ ()
Ответ на: комментарий от pihter

Да пес его знает: я про фреймбуффер-то узнал вчера и то из статьи на википедии.

ему на смену давно пришла подсистема DRM, API fbdev конечно проще и эмуляция его через DRM в ядре есть, но по-моему лучше актуальный API использовать

https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset.c

anonymous ()