2010-11-11 15 views
13

Come cambierei un pixel su un display, in C?Mostra pixel sullo schermo in C

Assumere NULLA: sto utilizzando una macchina Linux dalla console per farlo. Non voglio usare toolkit o framework GUI per disegnare il pixel. Non voglio disegnare il pixel in una finestra. Voglio disegnare il pixel direttamente sullo schermo.

MODIFICA: Ho uno schermo. Sono su un laptop che esegue Linux dalla console. Preferirei una soluzione che non usasse X come preferirei sapere come funziona X rispetto a come usare X.

Se ci sono ulteriori informazioni, chiedere, ma non assumere. Non sto cercando di costruire una GUI, e quello era lo scopo principale di bloccare le ipotesi perché non voglio che la gente supponga che sto facendo le cose a lungo mentre in realtà sto solo armeggiando.

MODIFICA 2: è possibile utilizzare qualsiasi libreria correlata X11 purché si possa spiegare come funzionano.

+1

Bene, suppongo che sei Kos giuste. Semplicemente non volevo che la gente credesse che volevo fare il lungo percorso solo per creare una GUI senza toolkit quando in realtà preferirei sapere come funzionano gli schermi. – DavidJFelix

+2

Se non possiamo assumere nulla, non posso assumere che la domanda sia in inglese, né che i caratteri visualizzati che descrivono la domanda abbiano alcuna relazione con i caratteri che l'OP ha scritto. OK, è sciocco ma è uno dei miei animaletti che la gente dice "non assumere nulla!" quando in realtà vogliono solo dire che ci sono alcuni presupposti di base che vogliono rimuovere. – LarsH

+0

È uno dei miei animaletti quando le persone fanno supposizioni. :) – DavidJFelix

risposta

10

Se davvero non assumiamo nulla, possiamo anche supporre che X stia funzionando? Del resto, possiamo anche supporre che ci sia una scheda video? Forse Linux sta funzionando senza head e stiamo accedendo su una console seriale.

Se è possibile assumere alcune cose, supponiamo che Linux sia stato avviato con il supporto framebuffer. (Sono passati un paio di anni da quando ho lavorato con i framebuffer Linux, potrei ottenere alcuni dettagli sbagliati.) Ci sarà un dispositivo creato, probabilmente /dev/fb o /dev/fb0. Apri quel file e inizia a scrivere valori RGB su un offset, e lo schermo cambierà, praticamente indipendentemente da qualsiasi cosa: console di testo, console grafica, ambiente desktop completo, ecc. Se vuoi vedere se il supporto del framebuffer funziona, fai dd if=/dev/zero of=/dev/fb sulla riga di comando e il display dovrebbe diventare tutto nero.

+1

'/ dev/urandom' o' ~/naughty.pnm' è molto più divertente di '/ dev/zero' ... –

+0

Testato. Lo schermo diventa nero. – DavidJFelix

+0

È sicuro, chiunque? – Abdillah

13

C non ha alcuna capacità grafica: è necessario utilizzare una libreria di terze parti per questo.

+0

C è un linguaggio e non ha capacità * reali * da solo. Forse intendevi dire libc? – cdhowie

+2

OP specificato Linux. Ciò significa che hai molto più di semplice C. –

+4

La libreria di terze parti utilizzerà un linguaggio di programmazione (forse Assembly), il supporto AND/OR dal sistema operativo e dai driver di dispositivo. È ovvio dalla domanda che come scrivere una libreria di terze parti è ciò che viene chiesto qui. Sfortunato che questa spazzatura ottenga più upvotes di una risposta parzialmente utile. –

6

Non si può assumere un display in C. Non c'è letteralmente modo di fare ciò che si chiede.

Modifica: OK, hai un display, ma di nuovo, non c'è molto da cui puoi arrivare. Il punto è che ci sono TON di standard concorrenti per i display grafici, e mentre alcuni di essi (interfacce VGA, per esempio) sono standardizzati, molti altri (le interfacce dei driver di visualizzazione, ad esempio) NON lo sono. Molto di ciò che fanno X (e altri driver di dispositivi di visualizzazione, come Windows o simili), hanno un codice di interfaccia specifico per comunicare con i driver di visualizzazione; essi astraggono la complessità di trattare con i driver di visualizzazione. I sistemi di finestre, tuttavia, hanno enormi librerie di codice complicato e specifico per gestire i driver di visualizzazione; il fatto che queste cose siano relativamente trasparenti è un'indicazione di quanto lavoro hanno messo in queste cose nel tempo.

+0

Puoi supporre che. Sto eseguendo Linux dalla console su un laptop. – DavidJFelix

+0

La prossima cosa saprai, mi dirai che è funzionale. :) –

+1

Bene, allora descrivimi i requisiti minimi per come farei l'output su uno schermo. Puoi assumere tutto ciò che spieghi accuratamente. – DavidJFelix

0

Penso che quello che stai cercando sia informazioni su come scrivere sul frame buffer. Il modo più semplice sarebbe usare SDL e renderizzare il frame buffer, oppure usare GTK + con DirectFB, anche se questo va contro l'editto relativo al non utilizzo di toolkit o framework.

+0

Inoltre, presuppone che ci sia un framebuffer. Il funzionamento senza testa è completamente normale. –

+3

McWafflestix: Sebbene pedantemente vero, penso che sia un po 'falso dire che non si può assumere uno schermo. Dopo tutto, senza una visualizzazione di qualche tipo la domanda non ha alcun senso. – Cercerilla

+0

Sì, è pedante. Ma il punto ha bisogno di essere reso forte, perché è stato l'OP a suggerire di assumere "NIENTE". – dmckee

5

molto primitivi e facendo un sacco di ipotesi:

fd = open("/dev/fb0", O_RDWR); 
lseek(fd, 640*y+x, SEEK_SET); 
write(fd, "\377\377\377\377", 4); 

In realtà, si userebbe mmap piuttosto che write, e utilizzare l'appropriato ioctl per interrogare la modalità schermo piuttosto che assumere 640xHHH 32bpp. Ci sono anche problemi di endian, ecc.

Quindi nella realtà reale, è possibile utilizzare una sorta di codice di libreria che gestisce questo tipo di cose per voi.

1

Suppongo che si possa dipingere al programma terminale che si sta utilizzando come console. Tutto quello che devi fare è capire quale è e cercare.

Whoops ho assunto un terminale. : P

+0

Vedere anche: ['aalib'] (http://aa-project.sourceforge.net/). – dmckee

-3

Il tuo migliore amico sarebbe printf. La griglia stampata in modo semplice con un simbolo (come ".") Significherebbe che tutti i pixel sono attivi. E la griglia stampata con caratteri di spazio bianco (come "") significherebbe che tutti i pixel sono spenti. Per esempio, questo è il modo che possiamo trarre sine() funzione nel flusso di output pianura:

#include <stdio.h> 

#define MAXY 20 
#define MAXX 75 
static char display[MAXY][MAXX]; 

void setGraph(void) { 
    memset(display, ' ', sizeof(display)); 

    int i; 
    // draw Y axis 
    for (i=0; i < MAXY; i++) 
     display[i][3] = '|'; 
    // draw X axis 
    for (i=0; i < MAXX; i++) 
     display[1][i] = '-'; 
    // draw origin 
    display[0][0] = '0'; 
    display[0][1] = ','; 
    display[0][2] = '0'; 
    // draw arrows 
    display[1][MAXX-1] = '>'; 
    display[MAXY-1][3] = 'v'; 
    // draw labels 
    display[0][MAXX-3] = 'X'; 
    display[MAXY-3][2] = 'Y'; 
} 

void plotSine() { 
    int i; 
    int y; 
    for (i=4; i < MAXX; i++) { 
     y = 2 + (int)7.0*(1.0 + sin(0.45*(float)i)); 
     display[y][i] = '.'; 
    } 
} 

void drawDisplay(void) { 
    int x,y; 
    for (x=0; x < MAXY; x++) { 
     for (y=0; y < MAXX; y++) { 
     printf("%c", display[x][y]); 
     } 
     printf("\n"); 
    } 
} 

int main() { 
    setGraph(); 
    plotSine(); 
    drawDisplay(); 
    return 0; 
} 

che genererà tale uscita:

0,0|                 X 
--------------------------------------------------------------------------> 
    |  **   **   **   **   ** 
    |  * *   * *   * *   * *   * * 
    | 
    | *    *    *    *    * 
    |   *    *    *    *    * 
    | 
    | *    *    *    *    * 
    |   *    *    *    *    * 
    | 
    | *    *    *    *    * 
    |   *    *    *    *    * 
    | 
    | *   * *   * *   * *   * *   * 
    |*   **   **   **   **   ** 
    | 
    Y| 
    | 
    v 
Problemi correlati