Ignore:
Timestamp:
Nov 25, 2007, 3:12:01 PM (12 years ago)
Author:
Sam Hocevar
Message:
  • Introduce cucul_get_canvas_chars() and cucul_get_canvas_attrs() to avoid direct cv->chars and cv->attrs access by display drivers.
File:
1 edited

Legend:

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

    r2055 r2056  
    3434#include <string.h>
    3535
     36#include "cucul.h"
     37#include "cucul_internals.h"
    3638#include "caca.h"
    3739#include "caca_internals.h"
    38 #include "cucul.h"
    39 #include "cucul_internals.h"
    4040
    4141/*
     
    7878    char const *fonts[] = { NULL, "8x13bold", "fixed" }, **parser;
    7979    char const *geometry;
    80     unsigned int width = dp->cv->width, height = dp->cv->height;
     80    unsigned int width = cucul_get_canvas_width(dp->cv);
     81    unsigned int height = cucul_get_canvas_height(dp->cv);
    8182    int i;
    8283
     
    9192    dp->resize.allow = 1;
    9293    cucul_set_canvas_size(dp->cv, width ? width : 80, height ? height : 32);
     94    width = cucul_get_canvas_width(dp->cv);
     95    height = cucul_get_canvas_height(dp->cv);
    9396    dp->resize.allow = 0;
    9497
     
    193196    dp->drv.p->window =
    194197        XCreateWindow(dp->drv.p->dpy, DefaultRootWindow(dp->drv.p->dpy), 0, 0,
    195                       dp->cv->width * dp->drv.p->font_width,
    196                       dp->cv->height * dp->drv.p->font_height,
     198                      width * dp->drv.p->font_width,
     199                      height * dp->drv.p->font_height,
    197200                      0, 0, InputOutput, 0,
    198201                      CWBackingStore | CWBackPixel | CWEventMask,
     
    241244
    242245    dp->drv.p->pixmap = XCreatePixmap(dp->drv.p->dpy, dp->drv.p->window,
    243                                    dp->cv->width * dp->drv.p->font_width,
    244                                    dp->cv->height * dp->drv.p->font_height,
    245                                    DefaultDepth(dp->drv.p->dpy,
    246                                             DefaultScreen(dp->drv.p->dpy)));
     246                                      width * dp->drv.p->font_width,
     247                                      height * dp->drv.p->font_height,
     248                                      DefaultDepth(dp->drv.p->dpy,
     249                                      DefaultScreen(dp->drv.p->dpy)));
    247250    dp->drv.p->pointer = None;
    248251
     
    279282static unsigned int x11_get_display_width(caca_display_t const *dp)
    280283{
    281     return dp->cv->width * dp->drv.p->font_width;
     284    return cucul_get_canvas_width(dp->cv) * dp->drv.p->font_width;
    282285}
    283286
    284287static unsigned int x11_get_display_height(caca_display_t const *dp)
    285288{
    286     return dp->cv->height * dp->drv.p->font_height;
     289    return cucul_get_canvas_height(dp->cv) * dp->drv.p->font_height;
    287290}
    288291
    289292static void x11_display(caca_display_t *dp)
    290293{
     294    uint32_t const *cvchars = (uint32_t const *)cucul_get_canvas_chars(dp->cv);
     295    uint32_t const *cvattrs = (uint32_t const *)cucul_get_canvas_attrs(dp->cv);
     296    unsigned int width = cucul_get_canvas_width(dp->cv);
     297    unsigned int height = cucul_get_canvas_height(dp->cv);
    291298    unsigned int x, y, len;
    292299
    293300    /* First draw the background colours. Splitting the process in two
    294301     * loops like this is actually slightly faster. */
    295     for(y = 0; y < dp->cv->height; y++)
    296     {
    297         for(x = 0; x < dp->cv->width; x += len)
    298         {
    299             uint32_t *attrs = dp->cv->attrs + x + y * dp->cv->width;
     302    for(y = 0; y < height; y++)
     303    {
     304        for(x = 0; x < width; x += len)
     305        {
     306            uint32_t const *attrs = cvattrs + x + y * width;
    300307            uint16_t bg = _cucul_attr_to_rgb12bg(*attrs);
    301308
    302309            len = 1;
    303             while(x + len < dp->cv->width
     310            while(x + len < width
    304311                   && _cucul_attr_to_rgb12bg(attrs[len]) == bg)
    305312                len++;
     
    316323
    317324    /* Then print the foreground characters */
    318     for(y = 0; y < dp->cv->height; y++)
     325    for(y = 0; y < height; y++)
    319326    {
    320327        unsigned int yoff = (y + 1) * dp->drv.p->font_height
    321328                                    - dp->drv.p->font_offset;
    322         uint32_t *chars = dp->cv->chars + y * dp->cv->width;
    323         uint32_t *attrs = dp->cv->attrs + y * dp->cv->width;
    324 
    325         for(x = 0; x < dp->cv->width; x++, chars++, attrs++)
     329        uint32_t const *chars = cvchars + y * width;
     330        uint32_t const *attrs = cvattrs + y * width;
     331
     332        for(x = 0; x < width; x++, chars++, attrs++)
    326333        {
    327334            XSetForeground(dp->drv.p->dpy, dp->drv.p->gc,
     
    349356    XCopyArea(dp->drv.p->dpy, dp->drv.p->pixmap, dp->drv.p->window,
    350357              dp->drv.p->gc, 0, 0,
    351               dp->cv->width * dp->drv.p->font_width,
    352               dp->cv->height * dp->drv.p->font_height,
     358              width * dp->drv.p->font_width,
     359              height * dp->drv.p->font_height,
    353360              0, 0);
    354361    XFlush(dp->drv.p->dpy);
     
    374381static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev)
    375382{
     383    unsigned int width = cucul_get_canvas_width(dp->cv);
     384    unsigned int height = cucul_get_canvas_height(dp->cv);
    376385    XEvent xevent;
    377386    char key;
     
    387396            XCopyArea(dp->drv.p->dpy, dp->drv.p->pixmap,
    388397                      dp->drv.p->window, dp->drv.p->gc, 0, 0,
    389                       dp->cv->width * dp->drv.p->font_width,
    390                       dp->cv->height * dp->drv.p->font_height, 0, 0);
     398                      width * dp->drv.p->font_width,
     399                      height * dp->drv.p->font_height, 0, 0);
    391400            continue;
    392401        }
     
    402411                  / dp->drv.p->font_height;
    403412
    404             if(!w || !h || (w == dp->cv->width && h == dp->cv->height))
     413            if(!w || !h || (w == width && h == height))
    405414                continue;
    406415
     
    418427            unsigned int newy = xevent.xmotion.y / dp->drv.p->font_height;
    419428
    420             if(newx >= dp->cv->width)
    421                 newx = dp->cv->width - 1;
    422             if(newy >= dp->cv->height)
    423                 newy = dp->cv->height - 1;
     429            if(newx >= width)
     430                newx = width - 1;
     431            if(newy >= height)
     432                newy = height - 1;
    424433
    425434            if(dp->mouse.x == newx && dp->mouse.y == newy)
Note: See TracChangeset for help on using the changeset viewer.