Changeset 488
- Timestamp:
- Jun 23, 2005, 6:44:14 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/src/graphics.c
r487 r488 977 977 #if defined(USE_GL) 978 978 if(_caca_driver == CACA_DRIVER_GL) 979 980 981 982 983 979 { 980 int i; 981 char *empty; 982 983 if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY"))) 984 984 sscanf(getenv("CACA_GEOMETRY"), 985 985 "%ux%u", &_caca_width, &_caca_height); 986 986 987 987 if(!_caca_width) 988 988 _caca_width = 80; … … 990 990 _caca_height = 32; 991 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 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) 1027 1027 return -1; 1028 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 glBindTexture(GL_TEXTURE_2D,id[i]); 1055 1056 1057 1058 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 } 1061 1061 else 1062 1062 #endif 1063 1063 #if defined(USE_NULL) 1064 1064 if(_caca_driver == CACA_DRIVER_NULL) 1065 1066 1065 { 1066 if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY"))) 1067 1067 sscanf(getenv("CACA_GEOMETRY"), 1068 1068 "%ux%u", &_caca_width, &_caca_height); 1069 1069 if(!_caca_width) 1070 1070 _caca_width = 80; 1071 1071 if(!_caca_height) 1072 1072 _caca_height = 32; 1073 1073 } 1074 1074 else 1075 1075 #endif … … 1150 1150 #if defined(USE_GL) 1151 1151 if(_caca_driver == CACA_DRIVER_GL) 1152 1153 1154 1152 { 1153 glutDestroyWindow(gl_window); 1154 } 1155 1155 else 1156 1156 #endif 1157 1157 #if defined(USE_NULL) 1158 1158 if(_caca_driver == CACA_DRIVER_NULL) 1159 1160 1161 1162 1163 1159 { 1160 /* I'm bored to write 'nothing to do'. 1161 * So I don't. 1162 */ 1163 } 1164 1164 else 1165 1165 #endif … … 1200 1200 #if defined(USE_GL) 1201 1201 if(_caca_driver == CACA_DRIVER_GL) 1202 1203 1204 1202 { 1203 glutSetWindowTitle(title); 1204 } 1205 1205 else 1206 1206 #endif … … 1240 1240 #if defined(USE_GL) 1241 1241 if(_caca_driver == CACA_DRIVER_GL) 1242 1243 1244 1242 { 1243 return gl_width; 1244 } 1245 1245 else 1246 1246 #endif … … 1280 1280 #if defined(USE_GL) 1281 1281 if(_caca_driver == CACA_DRIVER_GL) 1282 1283 1284 1282 { 1283 return gl_height; 1284 } 1285 1285 else 1286 1286 #endif … … 1454 1454 #if defined(USE_GL) 1455 1455 if(_caca_driver == CACA_DRIVER_GL) 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 }1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 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 } 1544 1544 else 1545 1545 #endif 1546 1546 #if defined(USE_NULL) 1547 1547 if(_caca_driver == CACA_DRIVER_NULL) 1548 1549 1550 1548 { 1549 /* Do I told you about my cat ? */ 1550 } 1551 1551 #endif 1552 1552 { … … 1776 1776 { 1777 1777 0, 1778 0x00 007F,1779 0x0 07F00,1780 0x0 07F7F,1781 0x7 F0000,1782 0x7 F007F,1783 0x7 F7F00,1784 0x7 F7F7F,1778 0x007, 1779 0x070, 1780 0x077, 1781 0x700, 1782 0x707, 1783 0x770, 1784 0x777, 1785 1785 0, 1786 0x00 00FF,1787 0x0 0FF00,1788 0x0 0FFFF,1789 0xF F0000,1790 0xF F00FF,1791 0xFF FF00,1792 0xFFF FFF,1786 0x00F, 1787 0x0F0, 1788 0x0FF, 1789 0xF00, 1790 0xF0F, 1791 0xFF0, 1792 0xFFF, 1793 1793 1794 1794 }; … … 1820 1820 { 1821 1821 for(b=0;b<0x0f+1;b++) 1822 1823 1824 "%s.b%x%x { color:#%06x; background-color:#%06x;}\n",buffer,1825 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 } 1828 1828 } 1829 1829 sprintf(buffer, "%s</style>\n</head>\n<body>\n",buffer); … … 1835 1835 { 1836 1836 sprintf(buffer, 1837 1837 "%s<tr>",buffer); 1838 1838 1839 1839 for(x=0;x<_caca_width;x++) 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 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 ",buffer); 1875 x++; 1876 } 1877 sprintf(buffer, "%s</td>",buffer); 1878 1879 } 1880 1881 } 1882 1882 sprintf(buffer, "%s</tr>\n",buffer); 1883 1883 } … … 1901 1901 char* caca_get_html3(void) 1902 1902 { 1903 char *buffer ;1904 unsigned int x, y;1903 char *buffer, *cur; 1904 unsigned int x, y, len; 1905 1905 1906 1906 /* 13000 -> css palette 1907 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; 1911 1911 1912 1912 /* 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 ", 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, " "); 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 } 1965 1941 1966 1942 /* Footer */ 1967 sprintf(buffer, "%s</table>\n",buffer);1943 cur += sprintf(cur, "</div>\n"); 1968 1944 1969 1945 /* Crop to really used size */ 1970 buffer = realloc(buffer, (strlen(buffer) +1) * sizeof(char));1946 buffer = realloc(buffer, (strlen(buffer) + 1) * sizeof(char)); 1971 1947 1972 1948 return buffer; 1973 1949 } 1974 1950 1975 1976 1951 static int const irc_palette[] = 1977 1952 { 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, 1996 1957 }; 1997 1958 … … 2011 1972 /* 15 bytes assumed for max length per pixel */ 2012 1973 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 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 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 } 2042 2003 else 2043 2044 2045 2046 2047 2048 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 } 2052 2013 sprintf(buffer, "%s\n", buffer); 2053 2014 }
Note: See TracChangeset
for help on using the changeset viewer.