Changeset 488


Ignore:
Timestamp:
Jun 23, 2005, 6:44:14 PM (16 years ago)
Author:
Sam Hocevar
Message:
  • src/graphics.c: heavy cleanup in caca_get_html3().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/graphics.c

    r487 r488  
    977977#if defined(USE_GL)
    978978      if(_caca_driver == CACA_DRIVER_GL)
    979         {
    980           int i;
    981           char *empty;
    982 
    983           if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY")))
     979        {
     980          int i;
     981          char *empty;
     982
     983          if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY")))
    984984            sscanf(getenv("CACA_GEOMETRY"),
    985985                   "%ux%u", &_caca_width, &_caca_height);
    986          
     986         
    987987        if(!_caca_width)
    988988            _caca_width = 80;
     
    990990            _caca_height = 32;
    991991
    992           gl_font_width = 9;
    993           gl_font_height = 15;
    994 
    995           gl_width =  _caca_width*gl_font_width;
    996           gl_height = _caca_height*gl_font_height;
    997 
    998           glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    999           glutInitWindowSize(gl_width, gl_height);
    1000           gl_window = glutCreateWindow("caca for GL");
    1001 
    1002           gluOrtho2D(0,gl_width, gl_height, 0);
    1003 
    1004           glDisable(GL_CULL_FACE);
    1005           glDisable(GL_DEPTH_TEST); 
    1006 
    1007           glutKeyboardFunc(gl_handle_keyboard);
    1008           glutSpecialFunc(gl_handle_special_key);
    1009           glutReshapeFunc(gl_handle_reshape);
    1010 
    1011           glLoadIdentity();
    1012 
    1013           glMatrixMode(GL_PROJECTION);
    1014           glPushMatrix();
    1015           glLoadIdentity();
    1016           gluOrtho2D(0, gl_width, gl_height, 0);
    1017 
    1018           glMatrixMode(GL_MODELVIEW);
    1019 
    1020 
    1021           glClear(GL_COLOR_BUFFER_BIT);
    1022 
    1023 
    1024 
    1025           empty = malloc(16*16*4);
    1026           if(empty == NULL)
     992          gl_font_width = 9;
     993          gl_font_height = 15;
     994
     995          gl_width =  _caca_width*gl_font_width;
     996          gl_height = _caca_height*gl_font_height;
     997
     998          glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
     999          glutInitWindowSize(gl_width, gl_height);
     1000          gl_window = glutCreateWindow("caca for GL");
     1001
     1002          gluOrtho2D(0,gl_width, gl_height, 0);
     1003
     1004          glDisable(GL_CULL_FACE);
     1005          glDisable(GL_DEPTH_TEST); 
     1006
     1007          glutKeyboardFunc(gl_handle_keyboard);
     1008          glutSpecialFunc(gl_handle_special_key);
     1009          glutReshapeFunc(gl_handle_reshape);
     1010
     1011          glLoadIdentity();
     1012
     1013          glMatrixMode(GL_PROJECTION);
     1014          glPushMatrix();
     1015          glLoadIdentity();
     1016          gluOrtho2D(0, gl_width, gl_height, 0);
     1017
     1018          glMatrixMode(GL_MODELVIEW);
     1019
     1020
     1021          glClear(GL_COLOR_BUFFER_BIT);
     1022
     1023
     1024
     1025          empty = malloc(16*16*4);
     1026          if(empty == NULL)
    10271027            return -1;
    10281028
    1029           memset(empty, 255, 16*16*4);
    1030           glEnable(GL_TEXTURE_2D);
    1031        
    1032           for(i=0;i<94;i++)
    1033             {
    1034               glGenTextures(1,&id[i]);
    1035               glBindTexture(GL_TEXTURE_2D, id[i]);
    1036               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    1037               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    1038               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
    1039                            16,16,
    1040                            0, GL_RGB, GL_UNSIGNED_BYTE, empty);
    1041             }
    1042           for(i=0;i<94;i++)
    1043             {
    1044              
    1045               glDisable(GL_TEXTURE_2D);
    1046               glClear(GL_COLOR_BUFFER_BIT);
    1047 
    1048               glColor3f(1,1,1);
    1049               glRasterPos2f(0,15);
    1050               glutBitmapCharacter(GLUT_BITMAP_9_BY_15,i+32);
    1051              
    1052 
    1053               glEnable(GL_TEXTURE_2D);
    1054               glBindTexture(GL_TEXTURE_2D,id[i]);                       
    1055               glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, gl_height-16, 16,16, 0);
    1056              
    1057               glutMainLoopEvent();
    1058               glutPostRedisplay();
    1059             }
    1060         }
     1029          memset(empty, 255, 16*16*4);
     1030          glEnable(GL_TEXTURE_2D);
     1031       
     1032          for(i=0;i<94;i++)
     1033            {
     1034              glGenTextures(1,&id[i]);
     1035              glBindTexture(GL_TEXTURE_2D, id[i]);
     1036              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     1037              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     1038              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
     1039                           16,16,
     1040                           0, GL_RGB, GL_UNSIGNED_BYTE, empty);
     1041            }
     1042          for(i=0;i<94;i++)
     1043            {
     1044             
     1045              glDisable(GL_TEXTURE_2D);
     1046              glClear(GL_COLOR_BUFFER_BIT);
     1047
     1048              glColor3f(1,1,1);
     1049              glRasterPos2f(0,15);
     1050              glutBitmapCharacter(GLUT_BITMAP_9_BY_15,i+32);
     1051             
     1052
     1053              glEnable(GL_TEXTURE_2D);
     1054              glBindTexture(GL_TEXTURE_2D,id[i]);                       
     1055              glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, gl_height-16, 16,16, 0);
     1056             
     1057              glutMainLoopEvent();
     1058              glutPostRedisplay();
     1059            }
     1060        }
    10611061    else
    10621062#endif
    10631063#if defined(USE_NULL)
    10641064      if(_caca_driver == CACA_DRIVER_NULL)
    1065         {
    1066           if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY")))
     1065        {
     1066          if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY")))
    10671067            sscanf(getenv("CACA_GEOMETRY"),
    10681068                   "%ux%u", &_caca_width, &_caca_height); 
    1069           if(!_caca_width)
     1069          if(!_caca_width)
    10701070            _caca_width = 80;
    1071           if(!_caca_height)
     1071          if(!_caca_height)
    10721072            _caca_height = 32;
    1073         }
     1073        }
    10741074      else
    10751075#endif
     
    11501150#if defined(USE_GL)
    11511151      if(_caca_driver == CACA_DRIVER_GL)
    1152         {
    1153           glutDestroyWindow(gl_window);
    1154         }
     1152        {
     1153          glutDestroyWindow(gl_window);
     1154        }
    11551155      else
    11561156#endif
    11571157#if defined(USE_NULL)
    11581158      if(_caca_driver == CACA_DRIVER_NULL)
    1159         {
    1160           /* I'm bored to write 'nothing to do'.
    1161            * So I don't.
    1162            */
    1163         }
     1159        {
     1160          /* I'm bored to write 'nothing to do'.
     1161           * So I don't.
     1162           */
     1163        }
    11641164      else
    11651165#endif
     
    12001200#if defined(USE_GL)
    12011201      if(_caca_driver == CACA_DRIVER_GL)
    1202         {
    1203           glutSetWindowTitle(title);
    1204         }
     1202        {
     1203          glutSetWindowTitle(title);
     1204        }
    12051205      else
    12061206#endif
     
    12401240#if defined(USE_GL)
    12411241      if(_caca_driver == CACA_DRIVER_GL)
    1242         {
    1243           return gl_width;
    1244         }
     1242        {
     1243          return gl_width;
     1244        }
    12451245      else
    12461246#endif
     
    12801280#if defined(USE_GL)
    12811281      if(_caca_driver == CACA_DRIVER_GL)
    1282         {
    1283           return gl_height;
    1284         }
     1282        {
     1283          return gl_height;
     1284        }
    12851285      else
    12861286#endif
     
    14541454#if defined(USE_GL)
    14551455      if(_caca_driver == CACA_DRIVER_GL)
    1456         {
    1457           unsigned int x, y, offsetx, offsety;
    1458          
    1459 
    1460           glClear(GL_COLOR_BUFFER_BIT);
    1461          
    1462           offsety=0;
    1463           for(y=0;y<gl_height;y+=gl_font_height)
    1464             {
    1465               offsetx = 0;
    1466             for(x=0;x<gl_width;x+=gl_font_width)
    1467               {
    1468                 uint8_t *attr = cache_attr + offsetx + offsety * _caca_width;
    1469                 int offset;
    1470                 float  br, bg, bb;
    1471                 offset = attr[0]>>4;
    1472 
    1473                 br = ((gl_bg_palette[offset]&0x00FF0000)>>16)/255.0f;
    1474                 bg = ((gl_bg_palette[offset]&0x0000FF00)>>8)/255.0f;
    1475                 bb = ((gl_bg_palette[offset]&0x000000FF))/255.0f;
    1476        
    1477                 glDisable(GL_TEXTURE_2D);
    1478                 glColor3f(br, bg, bb);
    1479                 glBegin(GL_QUADS);
    1480                 glVertex2f(x,y);
    1481                 glVertex2f(x+gl_font_width,y);
    1482                 glVertex2f(x+gl_font_width,y+gl_font_height);
    1483                 glVertex2f(x,y+gl_font_height);
    1484                 glEnd();
    1485        
    1486 
    1487                 offsetx++;
    1488               }  
    1489 
    1490             offsety++;
    1491             }
    1492 
    1493 
    1494 
    1495           /* 2nd pass, avoids changing render state too much */
    1496           glEnable(GL_BLEND);
    1497           glEnable(GL_TEXTURE_2D);
    1498           glBlendFunc(GL_ONE, GL_ONE);
    1499                
    1500           offsety=0;
    1501           for(y=0;y<gl_height;y+=gl_font_height)
    1502             {
    1503               offsetx = 0;
    1504               for(x=0;x<gl_width;x+=gl_font_width)
    1505                 {
    1506                   uint8_t *attr = cache_attr + offsetx + offsety * _caca_width;
    1507                   unsigned char *chr = cache_char + offsetx + offsety * _caca_width;
    1508                   float fr, fg, fb;
    1509        
    1510                
    1511                   fr = ((gl_bg_palette[attr[0] & 0xf]&0x00FF0000)>>16)/255.0f;
    1512                   fg = ((gl_bg_palette[attr[0] & 0xf]&0x0000FF00)>>8)/255.0f;
    1513                   fb = ((gl_bg_palette[attr[0] & 0xf]&0x000000FF))/255.0f;
    1514 
    1515                   if(chr[0] != ' ')
    1516                     {
    1517                       glBindTexture(GL_TEXTURE_2D, id[chr[0]-32]);
    1518                    
    1519                       glColor3f(fr, fg, fb);
    1520                       glBegin(GL_QUADS);
    1521                       glTexCoord2f(0,1);
    1522                       glVertex2f(x,y);
    1523                       glTexCoord2f(0.5,1);
    1524                       glVertex2f(x+gl_font_width,y);
    1525                       glTexCoord2f(0.5,0);
    1526                       glVertex2f(x+gl_font_width,y+gl_font_height);
    1527                       glTexCoord2f(0,0);
    1528                       glVertex2f(x,y+gl_font_height);
    1529                       glEnd();   
    1530                     }
    1531                   offsetx++;
    1532                 }
    1533               offsety++;
    1534             }
    1535           glDisable(GL_BLEND);
    1536           glDisable(GL_TEXTURE_2D);
    1537 
    1538 
    1539 
    1540           glutMainLoopEvent();
    1541           glutSwapBuffers();
    1542           glutPostRedisplay();
    1543         }
     1456        {
     1457          unsigned int x, y, offsetx, offsety;
     1458         
     1459
     1460          glClear(GL_COLOR_BUFFER_BIT);
     1461         
     1462          offsety=0;
     1463                for(y=0;y<gl_height;y+=gl_font_height)
     1464            {
     1465              offsetx = 0;
     1466            for(x=0;x<gl_width;x+=gl_font_width)
     1467              {
     1468                uint8_t *attr = cache_attr + offsetx + offsety * _caca_width;
     1469                int offset;
     1470                float  br, bg, bb;
     1471                offset = attr[0]>>4;
     1472
     1473                br = ((gl_bg_palette[offset]&0x00FF0000)>>16)/255.0f;
     1474                bg = ((gl_bg_palette[offset]&0x0000FF00)>>8)/255.0f;
     1475                bb = ((gl_bg_palette[offset]&0x000000FF))/255.0f;
     1476       
     1477                glDisable(GL_TEXTURE_2D);
     1478                glColor3f(br, bg, bb);
     1479                glBegin(GL_QUADS);
     1480                glVertex2f(x,y);
     1481                glVertex2f(x+gl_font_width,y);
     1482                glVertex2f(x+gl_font_width,y+gl_font_height);
     1483                glVertex2f(x,y+gl_font_height);
     1484                glEnd();
     1485       
     1486
     1487                  offsetx++;
     1488              }         
     1489
     1490            offsety++;
     1491            }
     1492
     1493
     1494
     1495          /* 2nd pass, avoids changing render state too much */
     1496          glEnable(GL_BLEND);
     1497          glEnable(GL_TEXTURE_2D);
     1498          glBlendFunc(GL_ONE, GL_ONE);
     1499               
     1500          offsety=0;
     1501                for(y=0;y<gl_height;y+=gl_font_height)
     1502            {
     1503              offsetx = 0;
     1504              for(x=0;x<gl_width;x+=gl_font_width)
     1505                {
     1506                  uint8_t *attr = cache_attr + offsetx + offsety * _caca_width;
     1507                  unsigned char *chr = cache_char + offsetx + offsety * _caca_width;
     1508                  float fr, fg, fb;
     1509       
     1510               
     1511                  fr = ((gl_bg_palette[attr[0] & 0xf]&0x00FF0000)>>16)/255.0f;
     1512                  fg = ((gl_bg_palette[attr[0] & 0xf]&0x0000FF00)>>8)/255.0f;
     1513                  fb = ((gl_bg_palette[attr[0] & 0xf]&0x000000FF))/255.0f;
     1514
     1515                  if(chr[0] != ' ')
     1516                    {
     1517                      glBindTexture(GL_TEXTURE_2D, id[chr[0]-32]);
     1518                   
     1519                      glColor3f(fr, fg, fb);
     1520                      glBegin(GL_QUADS);
     1521                      glTexCoord2f(0,1);
     1522                      glVertex2f(x,y);
     1523                      glTexCoord2f(0.5,1);
     1524                      glVertex2f(x+gl_font_width,y);
     1525                      glTexCoord2f(0.5,0);
     1526                      glVertex2f(x+gl_font_width,y+gl_font_height);
     1527                      glTexCoord2f(0,0);
     1528                      glVertex2f(x,y+gl_font_height);
     1529                      glEnd();   
     1530                    }
     1531                  offsetx++;
     1532                }
     1533              offsety++;
     1534            }
     1535          glDisable(GL_BLEND);
     1536          glDisable(GL_TEXTURE_2D);
     1537
     1538
     1539
     1540          glutMainLoopEvent();
     1541          glutSwapBuffers();
     1542          glutPostRedisplay();
     1543        }
    15441544else
    15451545#endif
    15461546#if defined(USE_NULL)
    15471547      if(_caca_driver == CACA_DRIVER_NULL)
    1548         {
    1549           /* Do I told you about my cat ? */
    1550         }
     1548        {
     1549          /* Do I told you about my cat ? */
     1550        }
    15511551#endif
    15521552    {
     
    17761776{
    17771777    0,
    1778     0x00007F,
    1779     0x007F00,
    1780     0x007F7F,
    1781     0x7F0000,
    1782     0x7F007F,
    1783     0x7F7F00,
    1784     0x7F7F7F,
     1778    0x007,
     1779    0x070,
     1780    0x077,
     1781    0x700,
     1782    0x707,
     1783    0x770,
     1784    0x777,
    17851785    0,
    1786     0x0000FF,
    1787     0x00FF00,
    1788     0x00FFFF,
    1789     0xFF0000,
    1790     0xFF00FF,
    1791     0xFFFF00,
    1792     0xFFFFFF,
     1786    0x00F,
     1787    0x0F0,
     1788    0x0FF,
     1789    0xF00,
     1790    0xF0F,
     1791    0xFF0,
     1792    0xFFF,
    17931793
    17941794};
     
    18201820    {
    18211821      for(b=0;b<0x0f+1;b++)
    1822         {
    1823           sprintf(buffer,
    1824                   "%s.b%x%x { color:#%06x; background-color:#%06x;}\n",buffer,
    1825                   b, f, html_palette[f], html_palette[b]);
    1826 
    1827         }
     1822        {
     1823          sprintf(buffer,
     1824                  "%s.b%x%x { color:#%03x; background-color:#%03x;}\n",buffer,
     1825                  b, f, html_palette[f], html_palette[b]);
     1826
     1827        }
    18281828    }
    18291829  sprintf(buffer, "%s</style>\n</head>\n<body>\n",buffer);
     
    18351835    {
    18361836      sprintf(buffer,
    1837               "%s<tr>",buffer);
     1837              "%s<tr>",buffer);
    18381838
    18391839      for(x=0;x<_caca_width;x++)
    1840         {
    1841           int len;
    1842           int i;
    1843           uint8_t *attr = cache_attr + x + y * _caca_width;
    1844 
    1845           /* Use colspan option to factorize cells with same attributes
    1846              (see below) */
    1847           len=1;
    1848           while(x + len < _caca_width
    1849                 && (attr[len]>>4) == (attr[0]>>4) &&
    1850                 (attr[len]&0x0f) == (attr[0]&0x0f))
    1851             len++;
    1852          
    1853           if(len==1)
    1854             {
    1855               sprintf(buffer,
    1856                       "%s<td class=b%x%x>%c</td>",buffer,
    1857                       cache_attr[x+y*caca_get_width()]>>4,
    1858                       cache_attr[x+y*caca_get_width()]&0x0f,
    1859                       cache_char[x+y*caca_get_width()]);
    1860             }
    1861           else
    1862             {
    1863               sprintf(buffer,
    1864                       "%s<td class=b%x%x colspan=%d>",buffer,
    1865                       cache_attr[x+y*caca_get_width()]>> 4,
    1866                       cache_attr[x+y*caca_get_width()]&0x0f,
    1867                       len+1);
    1868              
    1869               for(i=0;i<len;i++)
    1870                 {
    1871                   if(cache_char[x+y*caca_get_width()]!=' ')
    1872                     sprintf(buffer, "%s%c", buffer,cache_char[x+y*caca_get_width()]);
    1873                   else
    1874                     sprintf(buffer, "%s&nbsp;",buffer);
    1875                   x++;
    1876                 }
    1877               sprintf(buffer, "%s</td>",buffer);
    1878              
    1879             }
    1880 
    1881         }
     1840        {
     1841          int len;
     1842          int i;
     1843          uint8_t *attr = cache_attr + x + y * _caca_width;
     1844
     1845          /* Use colspan option to factorize cells with same attributes
     1846             (see below) */
     1847          len=1;
     1848          while(x + len < _caca_width
     1849                && (attr[len]>>4) == (attr[0]>>4) &&
     1850                (attr[len]&0x0f) == (attr[0]&0x0f))
     1851            len++;
     1852         
     1853          if(len==1)
     1854            {
     1855              sprintf(buffer,
     1856                      "%s<td class=b%x%x>%c</td>",buffer,
     1857                      cache_attr[x+y*caca_get_width()]>>4,
     1858                      cache_attr[x+y*caca_get_width()]&0x0f,
     1859                      cache_char[x+y*caca_get_width()]);
     1860            }
     1861          else
     1862            {
     1863              sprintf(buffer,
     1864                      "%s<td class=b%x%x colspan=%d>",buffer,
     1865                      cache_attr[x+y*caca_get_width()]>> 4,
     1866                      cache_attr[x+y*caca_get_width()]&0x0f,
     1867                      len+1);
     1868             
     1869              for(i=0;i<len;i++)
     1870                {
     1871                  if(cache_char[x+y*caca_get_width()]!=' ')
     1872                    sprintf(buffer, "%s%c", buffer,cache_char[x+y*caca_get_width()]);
     1873                  else
     1874                    sprintf(buffer, "%s&nbsp;",buffer);
     1875                  x++;
     1876                }
     1877              sprintf(buffer, "%s</td>",buffer);
     1878             
     1879            }
     1880
     1881        }
    18821882      sprintf(buffer, "%s</tr>\n",buffer);
    18831883    }
     
    19011901char* caca_get_html3(void)
    19021902{
    1903   char *buffer;
    1904   unsigned int x,y;
     1903  char *buffer, *cur;
     1904  unsigned int x, y, len;
    19051905
    19061906  /* 13000 -> css palette
    1907      40 -> max size used for a pixel (plus 10, never know)*/
    1908 
    1909   buffer = malloc((13000 + ((_caca_width*_caca_height)*40))*sizeof(char));
    1910  
     1907   * 40 -> max size used for a pixel (plus 10, never know)*/
     1908  /* FIXME: Check this value */
     1909  buffer = malloc((13000 + ((_caca_width*_caca_height) * 40)) * sizeof(char));
     1910  cur = buffer;
    19111911
    19121912  /* Table */
    1913   sprintf(buffer, "<table cols='%d' cellpadding='0' cellspacing='0'>\n", caca_get_height());
    1914 
    1915   for(y=0;y<_caca_height;y++)
    1916     {
    1917       sprintf(buffer,
    1918               "%s<tr>",buffer);
    1919 
    1920       for(x=0;x<_caca_width;x++)
    1921         {
    1922           int len;
    1923           int i;
    1924           uint8_t *attr = cache_attr + x + y * _caca_width;
    1925 
    1926           /* Use colspan option to factorize cells with same attributes
    1927              (see below) */
    1928           len=1;
    1929           while(x + len < _caca_width
    1930                 && (attr[len]>>4) == (attr[0]>>4) &&
    1931                 (attr[len]&0x0f) == (attr[0]&0x0f))
    1932             len++;
    1933          
    1934           if(len==1)
    1935             {
    1936               sprintf(buffer,
    1937                       "%s<td bgcolor=#%06X ><font color='#%06X'>%c</font></td>", buffer,
    1938                       html_palette[cache_attr[x+y*caca_get_width()]>>4],
    1939                       html_palette[cache_attr[x+y*caca_get_width()]&0x0f],
    1940                       cache_char[x+y*caca_get_width()]);
    1941             }
    1942           else
    1943             {
    1944               sprintf(buffer,
    1945                       "%s<td bgcolor=#%06X colspan=%d><font color='#%06X'>",buffer,
    1946                       html_palette[cache_attr[x+y*caca_get_width()]>> 4],
    1947                       len+1,
    1948                       html_palette[cache_attr[x+y*caca_get_width()]&0x0f]);
    1949              
    1950               for(i=0;i<len;i++)
    1951                 {
    1952                   if(cache_char[x+y*caca_get_width()]!=' ')
    1953                     sprintf(buffer, "%s%c", buffer, cache_char[x+y*caca_get_width()]);
    1954                   else
    1955                     sprintf(buffer, "%s&nbsp;", buffer);
    1956                   x++;
    1957                 }
    1958               sprintf(buffer, "%s</font></td>", buffer);
    1959              
    1960             }
    1961 
    1962         }
    1963       sprintf(buffer, "%s</tr>\n",buffer);
    1964     }
     1913  cur += sprintf(cur, "<div cellpadding='0' cellspacing='0' style='%s'>\n",
     1914                      "font-family: monospace, fixed; font-weight: bold;");
     1915
     1916  for(y = 0; y < _caca_height; y++)
     1917  {
     1918      for(x = 0; x < _caca_width; x += len)
     1919      {
     1920          uint8_t *cur_attr = cache_attr + y * _caca_width;
     1921          uint8_t *cur_char = cache_char + y * _caca_width;
     1922
     1923          cur += sprintf(cur,
     1924                  "<span style=\"color: #%03X; background-color: #%03X\">",
     1925                  html_palette[cur_attr[x] & 0x0f],
     1926                  html_palette[cur_attr[x] >> 4]);
     1927
     1928          for(len = 0;
     1929              x + len < _caca_width && cur_attr[x + len] == cur_attr[x];
     1930              len++)
     1931          {
     1932              if(cur_char[x + len] == ' ')
     1933                  cur += sprintf(cur, "&nbsp;");
     1934              else
     1935                  cur += sprintf(cur, "%c", cur_char[x + len]);
     1936          }
     1937          cur += sprintf(cur, "</span>");
     1938      }
     1939      cur += sprintf(cur, "<br />\n");
     1940  }
    19651941
    19661942  /* Footer */
    1967   sprintf(buffer, "%s</table>\n",buffer);
     1943  cur += sprintf(cur, "</div>\n");
    19681944
    19691945  /* Crop to really used size */
    1970   buffer = realloc(buffer, (strlen(buffer)+1) * sizeof(char));
     1946  buffer = realloc(buffer, (strlen(buffer) + 1) * sizeof(char));
    19711947
    19721948  return buffer;
    19731949}
    19741950
    1975 
    19761951static int const irc_palette[] =
    19771952{
    1978   /* Dark */
    1979   1,
    1980   2,
    1981   3,
    1982   10,
    1983   5,
    1984   6,
    1985   7,
    1986   14,
    1987   /* Light */
    1988   1,
    1989   12,
    1990   9,
    1991   11,
    1992   4,
    1993   13,
    1994   8,
    1995   16,
     1953    /* Dark */
     1954    1, 2, 3, 10, 5, 6, 7, 14,
     1955    /* Light */
     1956    1, 12, 9, 11, 4, 13, 8, 16,
    19961957};
    19971958
     
    20111972  /* 15 bytes assumed for max length per pixel */
    20121973  buffer = malloc(((_caca_width*_caca_height*15)+1)*sizeof(char));
    2013   sprintf(buffer,"%%O");
    2014 
    2015   for(y=0;y<_caca_height;y++)
    2016     {
    2017       for(x=0;x<_caca_width;x++)
    2018         {
    2019           if(cache_char[x+y*caca_get_width()] == ' ')
    2020             {
    2021               sprintf(buffer,
    2022                       "%s%%C%d,%d%c", buffer,
    2023                       irc_palette[cache_attr[x+y*caca_get_width()]>>4],
    2024                       irc_palette[cache_attr[x+y*caca_get_width()]>>4],
    2025                       '#');
    2026             }
    2027           else if(cache_char[x+y*caca_get_width()] == '%')
    2028             {
    2029              sprintf(buffer,
    2030                     "%s%%C%d,%d%%%%",  buffer,
    2031                     irc_palette[cache_attr[x+y*caca_get_width()]&0x0f],
    2032                     irc_palette[cache_attr[x+y*caca_get_width()]>> 4]);
    2033             }
    2034           else if(cache_char[x+y*caca_get_width()]>='0' && cache_char[x+y*caca_get_width()]<='9')
    2035             {
    2036               sprintf(buffer,
    2037                       "%s%%C%d,%d%%B%%B%c", buffer,
    2038                       irc_palette[cache_attr[x+y*caca_get_width()]&0x0f],
    2039                       irc_palette[cache_attr[x+y*caca_get_width()]>> 4],
    2040                       cache_char[x+y*caca_get_width()]);
    2041             }
     1974  sprintf(buffer, "%%O");
     1975
     1976  for(y = 0; y < _caca_height; y++)
     1977  {
     1978      for(x = 0; x < _caca_width; x++)
     1979        {
     1980          if(cache_char[x+y*caca_get_width()] == ' ')
     1981            {
     1982              sprintf(buffer,
     1983                      "%s%%C%d,%d%c", buffer,
     1984                      irc_palette[cache_attr[x+y*caca_get_width()]>>4],
     1985                      irc_palette[cache_attr[x+y*caca_get_width()]>>4],
     1986                      '#');
     1987            }
     1988          else if(cache_char[x+y*caca_get_width()] == '%')
     1989            {
     1990             sprintf(buffer,
     1991                    "%s%%C%d,%d%%%%",  buffer,
     1992                    irc_palette[cache_attr[x+y*caca_get_width()]&0x0f],
     1993                    irc_palette[cache_attr[x+y*caca_get_width()]>> 4]);
     1994            }
     1995          else if(cache_char[x+y*caca_get_width()]>='0' && cache_char[x+y*caca_get_width()]<='9')
     1996            {
     1997              sprintf(buffer,
     1998                      "%s%%C%d,%d%%B%%B%c", buffer,
     1999                      irc_palette[cache_attr[x+y*caca_get_width()]&0x0f],
     2000                      irc_palette[cache_attr[x+y*caca_get_width()]>> 4],
     2001                      cache_char[x+y*caca_get_width()]);
     2002            }
    20422003      else
    2043         {
    2044           sprintf(buffer,
    2045                   "%s%%C%d,%d%c", buffer,
    2046                   irc_palette[cache_attr[x+y*caca_get_width()]&0x0f],
    2047                   irc_palette[cache_attr[x+y*caca_get_width()]>> 4],
    2048                   cache_char[x+y*caca_get_width()]);
    2049             }
    2050 
    2051         }
     2004        {
     2005          sprintf(buffer,
     2006                  "%s%%C%d,%d%c", buffer,
     2007                  irc_palette[cache_attr[x+y*caca_get_width()]&0x0f],
     2008                  irc_palette[cache_attr[x+y*caca_get_width()]>> 4],
     2009                  cache_char[x+y*caca_get_width()]);
     2010            }
     2011
     2012        }
    20522013      sprintf(buffer, "%s\n", buffer);
    20532014    }
Note: See TracChangeset for help on using the changeset viewer.