Ignore:
Timestamp:
Mar 8, 2006, 11:33:01 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • Finished moving everything driver-specific to the apropriate driver_*.c files. Phew. Now they just need a few comments.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_gl.c

    r549 r550  
    2828#include <string.h>
    2929#include <stdlib.h>
     30#include <stdio.h>
    3031
    3132#include "caca.h"
     
    7172static void gl_handle_mouse_motion(int, int);
    7273
     74struct driver_private
     75{
     76    int window;
     77    unsigned int width, height;
     78    float font_width, font_height;
     79    float incx, incy;
     80    int id[94];
     81    unsigned char resized, bit;
     82    unsigned char mouse_changed, mouse_clicked;
     83    unsigned int mouse_x, mouse_y;
     84    unsigned int mouse_button, mouse_state;
     85
     86    unsigned char key;
     87    int special_key;
     88    int new_width;
     89    int new_height;
     90
     91    float sw, sh;
     92};
     93
    7394static int gl_init_graphics(caca_t *kk)
    7495{
     
    80101    int i;
    81102
     103    kk->drv.p = malloc(sizeof(struct driver_private));
     104
    82105    gl_kk = kk;
    83106
     
    89112        cucul_set_size(kk->qq, width, height);
    90113
    91     kk->gl.font_width = 9;
    92     kk->gl.font_height = 15;
    93 
    94     kk->gl.width = kk->qq->width * kk->gl.font_width;
    95     kk->gl.height = kk->qq->height * kk->gl.font_height;
    96 
    97     kk->gl.resized = 0;
    98     kk->gl.bit = 0;
    99 
    100     kk->gl.mouse_changed = kk->gl.mouse_clicked = 0;
    101     kk->gl.mouse_button = kk->gl.mouse_state = 0;
    102 
    103     kk->gl.key = 0;
    104     kk->gl.special_key = 0;
    105 
    106     kk->gl.sw = 9.0f / 16.0f;
    107     kk->gl.sh = 15.0f / 16.0f;
     114    kk->drv.p->font_width = 9;
     115    kk->drv.p->font_height = 15;
     116
     117    kk->drv.p->width = kk->qq->width * kk->drv.p->font_width;
     118    kk->drv.p->height = kk->qq->height * kk->drv.p->font_height;
     119
     120    kk->drv.p->resized = 0;
     121    kk->drv.p->bit = 0;
     122
     123    kk->drv.p->mouse_changed = kk->drv.p->mouse_clicked = 0;
     124    kk->drv.p->mouse_button = kk->drv.p->mouse_state = 0;
     125
     126    kk->drv.p->key = 0;
     127    kk->drv.p->special_key = 0;
     128
     129    kk->drv.p->sw = 9.0f / 16.0f;
     130    kk->drv.p->sh = 15.0f / 16.0f;
    108131
    109132    glutInit(&argc, argv);
    110133
    111134    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    112     glutInitWindowSize(kk->gl.width, kk->gl.height);
    113     kk->gl.window = glutCreateWindow("caca for GL");
    114 
    115     gluOrtho2D(0, kk->gl.width, kk->gl.height, 0);
     135    glutInitWindowSize(kk->drv.p->width, kk->drv.p->height);
     136    kk->drv.p->window = glutCreateWindow("caca for GL");
     137
     138    gluOrtho2D(0, kk->drv.p->width, kk->drv.p->height, 0);
    116139
    117140    glDisable(GL_CULL_FACE);
     
    131154    glPushMatrix();
    132155    glLoadIdentity();
    133     gluOrtho2D(0, kk->gl.width, kk->gl.height, 0);
     156    gluOrtho2D(0, kk->drv.p->width, kk->drv.p->height, 0);
    134157
    135158    glMatrixMode(GL_MODELVIEW);
     
    146169    for(i = 0; i < 94; i++)
    147170    {
    148         glGenTextures(1, (GLuint*)&kk->gl.id[i]);
    149         glBindTexture(GL_TEXTURE_2D, kk->gl.id[i]);
     171        glGenTextures(1, (GLuint*)&kk->drv.p->id[i]);
     172        glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]);
    150173        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    151174        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     
    164187
    165188        glEnable(GL_TEXTURE_2D);
    166         glBindTexture(GL_TEXTURE_2D, kk->gl.id[i]);
     189        glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]);
    167190        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
    168                          0, kk->gl.height - 16, 16, 16, 0);
     191                         0, kk->drv.p->height - 16, 16, 16, 0);
    169192
    170193        glutMainLoopEvent();
     
    177200static int gl_end_graphics(caca_t *kk)
    178201{
    179     glutDestroyWindow(kk->gl.window);
     202    glutDestroyWindow(kk->drv.p->window);
     203    free(kk->drv.p);
    180204    return 0;
    181205}
     
    189213static unsigned int gl_get_window_width(caca_t *kk)
    190214{
    191     return kk->gl.width;
     215    return kk->drv.p->width;
    192216}
    193217
    194218static unsigned int gl_get_window_height(caca_t *kk)
    195219{
    196     return kk->gl.height;
     220    return kk->drv.p->height;
    197221}
    198222
     
    204228
    205229    line = 0;
    206     for(y = 0; y < kk->gl.height; y += kk->gl.font_height)
     230    for(y = 0; y < kk->drv.p->height; y += kk->drv.p->font_height)
    207231    {
    208232        uint8_t *attr = kk->qq->attr + line * kk->qq->width;
    209233
    210         for(x = 0; x < kk->gl.width; x += kk->gl.font_width)
     234        for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width)
    211235        {
    212236            glDisable(GL_TEXTURE_2D);
     
    214238            glBegin(GL_QUADS);
    215239                glVertex2f(x, y);
    216                 glVertex2f(x + kk->gl.font_width, y);
    217                 glVertex2f(x + kk->gl.font_width, y + kk->gl.font_height);
    218                 glVertex2f(x, y + kk->gl.font_height);
     240                glVertex2f(x + kk->drv.p->font_width, y);
     241                glVertex2f(x + kk->drv.p->font_width, y + kk->drv.p->font_height);
     242                glVertex2f(x, y + kk->drv.p->font_height);
    219243            glEnd();
    220244
     
    231255
    232256    line = 0;
    233     for(y = 0; y < kk->gl.height; y += kk->gl.font_height)
     257    for(y = 0; y < kk->drv.p->height; y += kk->drv.p->font_height)
    234258    {
    235259        uint8_t *attr = kk->qq->attr + line * kk->qq->width;
    236260        uint32_t *chars = kk->qq->chars + line * kk->qq->width;
    237261
    238         for(x = 0; x < kk->gl.width; x += kk->gl.font_width)
     262        for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width)
    239263        {
    240264            if(*chars != (uint32_t)' ')
     
    243267
    244268                /* FIXME: check ch bounds */
    245                 glBindTexture(GL_TEXTURE_2D, kk->gl.id[ch - 32]);
     269                glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[ch - 32]);
    246270                glColor4bv(gl_bgpal[attr[0] & 0xf]);
    247271                glBegin(GL_QUADS);
    248                     glTexCoord2f(0, kk->gl.sh);
     272                    glTexCoord2f(0, kk->drv.p->sh);
    249273                    glVertex2f(x, y);
    250                     glTexCoord2f(kk->gl.sw, kk->gl.sh);
    251                     glVertex2f(x + kk->gl.font_width, y);
    252                     glTexCoord2f(kk->gl.sw, 0);
    253                     glVertex2f(x + kk->gl.font_width, y + kk->gl.font_height);
     274                    glTexCoord2f(kk->drv.p->sw, kk->drv.p->sh);
     275                    glVertex2f(x + kk->drv.p->font_width, y);
     276                    glTexCoord2f(kk->drv.p->sw, 0);
     277                    glVertex2f(x + kk->drv.p->font_width, y + kk->drv.p->font_height);
    254278                    glTexCoord2f(0, 0);
    255                     glVertex2f(x, y + kk->gl.font_height);
     279                    glVertex2f(x, y + kk->drv.p->font_height);
    256280                glEnd();
    257281            }
     
    273297                                         unsigned int *new_height)
    274298{
    275     kk->gl.width = kk->gl.new_width;
    276     kk->gl.height = kk->gl.new_height;
    277 
    278     *new_width = kk->gl.width / kk->gl.font_width;
    279     *new_height = (kk->gl.height / kk->gl.font_height) + 1;
     299    kk->drv.p->width = kk->drv.p->new_width;
     300    kk->drv.p->height = kk->drv.p->new_height;
     301
     302    *new_width = kk->drv.p->width / kk->drv.p->font_width;
     303    *new_height = (kk->drv.p->height / kk->drv.p->font_height) + 1;
    280304
    281305    glMatrixMode(GL_PROJECTION);
     
    283307    glLoadIdentity();
    284308
    285     glViewport(0, 0, kk->gl.width, kk->gl.height);
    286     gluOrtho2D(0, kk->gl.width, kk->gl.height, 0);
     309    glViewport(0, 0, kk->drv.p->width, kk->drv.p->height);
     310    gluOrtho2D(0, kk->drv.p->width, kk->drv.p->height, 0);
    287311    glMatrixMode(GL_MODELVIEW);
    288312}
     
    294318    glutMainLoopEvent();
    295319
    296     if(kk->gl.resized && !kk->resize)
     320    if(kk->drv.p->resized && !kk->resize)
    297321    {
    298322        kk->resize = 1;
    299         kk->gl.resized = 0;
     323        kk->drv.p->resized = 0;
    300324        return CACA_EVENT_RESIZE;
    301325    }
    302326
    303     if(kk->gl.mouse_changed)
    304     {
    305         if(kk->gl.mouse_clicked)
     327    if(kk->drv.p->mouse_changed)
     328    {
     329        if(kk->drv.p->mouse_clicked)
    306330        {
    307             event |= CACA_EVENT_MOUSE_PRESS | kk->gl.mouse_button;
    308             kk->gl.mouse_clicked = 0;
     331            event |= CACA_EVENT_MOUSE_PRESS | kk->drv.p->mouse_button;
     332            kk->drv.p->mouse_clicked = 0;
    309333        }
    310         kk->mouse_x = kk->gl.mouse_x;
    311         kk->mouse_y = kk->gl.mouse_y;
     334        kk->mouse_x = kk->drv.p->mouse_x;
     335        kk->mouse_y = kk->drv.p->mouse_y;
    312336        event |= CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y;
    313         kk->gl.mouse_changed = 0;
    314     }
    315 
    316     if(kk->gl.key != 0)
     337        kk->drv.p->mouse_changed = 0;
     338    }
     339
     340    if(kk->drv.p->key != 0)
    317341    {
    318342        event |= CACA_EVENT_KEY_PRESS;
    319         event |= kk->gl.key;
    320         kk->gl.key = 0;
     343        event |= kk->drv.p->key;
     344        kk->drv.p->key = 0;
    321345        return event;
    322346    }
    323347
    324     if(kk->gl.special_key != 0)
     348    if(kk->drv.p->special_key != 0)
    325349    {
    326350        event |= CACA_EVENT_KEY_PRESS;
    327351
    328         switch(kk->gl.special_key)
     352        switch(kk->drv.p->special_key)
    329353        {
    330             case GLUT_KEY_F1 : kk->gl.special_key = 0; return event | CACA_KEY_F1;
    331             case GLUT_KEY_F2 : kk->gl.special_key = 0; return event | CACA_KEY_F2;
    332             case GLUT_KEY_F3 : kk->gl.special_key = 0; return event | CACA_KEY_F3;
    333             case GLUT_KEY_F4 : kk->gl.special_key = 0; return event | CACA_KEY_F4;
    334             case GLUT_KEY_F5 : kk->gl.special_key = 0; return event | CACA_KEY_F5;
    335             case GLUT_KEY_F6 : kk->gl.special_key = 0; return event | CACA_KEY_F6;
    336             case GLUT_KEY_F7 : kk->gl.special_key = 0; return event | CACA_KEY_F7;
    337             case GLUT_KEY_F8 : kk->gl.special_key = 0; return event | CACA_KEY_F8;
    338             case GLUT_KEY_F9 : kk->gl.special_key = 0; return event | CACA_KEY_F9;
    339             case GLUT_KEY_F10: kk->gl.special_key = 0; return event | CACA_KEY_F10;
    340             case GLUT_KEY_F11: kk->gl.special_key = 0; return event | CACA_KEY_F11;
    341             case GLUT_KEY_F12: kk->gl.special_key = 0; return event | CACA_KEY_F12;
    342             case GLUT_KEY_LEFT : kk->gl.special_key = 0; return event | CACA_KEY_LEFT;
    343             case GLUT_KEY_RIGHT: kk->gl.special_key = 0; return event | CACA_KEY_RIGHT;
    344             case GLUT_KEY_UP   : kk->gl.special_key = 0; return event | CACA_KEY_UP;
    345             case GLUT_KEY_DOWN : kk->gl.special_key = 0; return event | CACA_KEY_DOWN;
     354            case GLUT_KEY_F1 : kk->drv.p->special_key = 0; return event | CACA_KEY_F1;
     355            case GLUT_KEY_F2 : kk->drv.p->special_key = 0; return event | CACA_KEY_F2;
     356            case GLUT_KEY_F3 : kk->drv.p->special_key = 0; return event | CACA_KEY_F3;
     357            case GLUT_KEY_F4 : kk->drv.p->special_key = 0; return event | CACA_KEY_F4;
     358            case GLUT_KEY_F5 : kk->drv.p->special_key = 0; return event | CACA_KEY_F5;
     359            case GLUT_KEY_F6 : kk->drv.p->special_key = 0; return event | CACA_KEY_F6;
     360            case GLUT_KEY_F7 : kk->drv.p->special_key = 0; return event | CACA_KEY_F7;
     361            case GLUT_KEY_F8 : kk->drv.p->special_key = 0; return event | CACA_KEY_F8;
     362            case GLUT_KEY_F9 : kk->drv.p->special_key = 0; return event | CACA_KEY_F9;
     363            case GLUT_KEY_F10: kk->drv.p->special_key = 0; return event | CACA_KEY_F10;
     364            case GLUT_KEY_F11: kk->drv.p->special_key = 0; return event | CACA_KEY_F11;
     365            case GLUT_KEY_F12: kk->drv.p->special_key = 0; return event | CACA_KEY_F12;
     366            case GLUT_KEY_LEFT : kk->drv.p->special_key = 0; return event | CACA_KEY_LEFT;
     367            case GLUT_KEY_RIGHT: kk->drv.p->special_key = 0; return event | CACA_KEY_RIGHT;
     368            case GLUT_KEY_UP   : kk->drv.p->special_key = 0; return event | CACA_KEY_UP;
     369            case GLUT_KEY_DOWN : kk->drv.p->special_key = 0; return event | CACA_KEY_DOWN;
    346370            default: return CACA_EVENT_NONE;
    347371        }
     
    358382    caca_t *kk = gl_kk;
    359383
    360     kk->gl.key = key;
     384    kk->drv.p->key = key;
    361385}
    362386
     
    365389    caca_t *kk = gl_kk;
    366390
    367     kk->gl.special_key = key;
     391    kk->drv.p->special_key = key;
    368392}
    369393
     
    372396    caca_t *kk = gl_kk;
    373397
    374     if(kk->gl.bit) /* Do not handle reshaping at the first time */
    375     {
    376         kk->gl.new_width = w;
    377         kk->gl.new_height = h;
    378 
    379         kk->gl.resized = 1;
     398    if(kk->drv.p->bit) /* Do not handle reshaping at the first time */
     399    {
     400        kk->drv.p->new_width = w;
     401        kk->drv.p->new_height = h;
     402
     403        kk->drv.p->resized = 1;
    380404    }
    381405    else
    382         kk->gl.bit = 1;
     406        kk->drv.p->bit = 1;
    383407}
    384408
     
    387411    caca_t *kk = gl_kk;
    388412
    389     kk->gl.mouse_clicked = 1;
    390     kk->gl.mouse_button = button;
    391     kk->gl.mouse_state = state;
    392     kk->gl.mouse_x = x / kk->gl.font_width;
    393     kk->gl.mouse_y = y / kk->gl.font_height;
    394     kk->gl.mouse_changed = 1;
     413    kk->drv.p->mouse_clicked = 1;
     414    kk->drv.p->mouse_button = button;
     415    kk->drv.p->mouse_state = state;
     416    kk->drv.p->mouse_x = x / kk->drv.p->font_width;
     417    kk->drv.p->mouse_y = y / kk->drv.p->font_height;
     418    kk->drv.p->mouse_changed = 1;
    395419}
    396420
     
    399423    caca_t *kk = gl_kk;
    400424
    401     kk->gl.mouse_x = x / kk->gl.font_width;
    402     kk->gl.mouse_y = y / kk->gl.font_height;
    403     kk->gl.mouse_changed = 1;
     425    kk->drv.p->mouse_x = x / kk->drv.p->font_width;
     426    kk->drv.p->mouse_y = y / kk->drv.p->font_height;
     427    kk->drv.p->mouse_changed = 1;
    404428}
    405429
     
    410434void gl_init_driver(caca_t *kk)
    411435{
    412     kk->driver.driver = CACA_DRIVER_GL;
    413 
    414     kk->driver.init_graphics = gl_init_graphics;
    415     kk->driver.end_graphics = gl_end_graphics;
    416     kk->driver.set_window_title = gl_set_window_title;
    417     kk->driver.get_window_width = gl_get_window_width;
    418     kk->driver.get_window_height = gl_get_window_height;
    419     kk->driver.display = gl_display;
    420     kk->driver.handle_resize = gl_handle_resize;
    421     kk->driver.get_event = gl_get_event;
     436    kk->drv.driver = CACA_DRIVER_GL;
     437
     438    kk->drv.init_graphics = gl_init_graphics;
     439    kk->drv.end_graphics = gl_end_graphics;
     440    kk->drv.set_window_title = gl_set_window_title;
     441    kk->drv.get_window_width = gl_get_window_width;
     442    kk->drv.get_window_height = gl_get_window_height;
     443    kk->drv.display = gl_display;
     444    kk->drv.handle_resize = gl_handle_resize;
     445    kk->drv.get_event = gl_get_event;
    422446}
    423447
Note: See TracChangeset for help on using the changeset viewer.