Changeset 918 for libcaca/trunk/caca/driver_gl.c
- Timestamp:
- Apr 26, 2006, 8:59:20 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/caca/driver_gl.c
r912 r918 164 164 165 165 for(i = 32; i < 128; i++) 166 {167 glGenTextures(1, (GLuint*)&dp->drv.p->id[i - 32]);168 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id[i - 32]);169 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);171 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,172 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, empty_texture);173 }166 { 167 glGenTextures(1, (GLuint*)&dp->drv.p->id[i - 32]); 168 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id[i - 32]); 169 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 171 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 172 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, empty_texture); 173 } 174 174 175 175 for(i = 0; i < 8; i++) 176 {177 glGenTextures(1, (GLuint*)&dp->drv.p->id_uni[i]);178 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[i]);179 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);180 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);181 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,182 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, empty_texture);183 }176 { 177 glGenTextures(1, (GLuint*)&dp->drv.p->id_uni[i]); 178 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[i]); 179 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 180 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 181 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 182 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, empty_texture); 183 } 184 184 185 185 for(i = 32; i < 128; i++) 186 {187 glDisable(GL_TEXTURE_2D);188 glClear(GL_COLOR_BUFFER_BIT);189 190 glColor3f(1, 1, 1);191 glRasterPos2f(0, 15);192 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i);193 194 glEnable(GL_TEXTURE_2D);195 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id[i - 32]);196 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,197 0, dp->drv.p->height - 16, 16, 16, 0);186 { 187 glDisable(GL_TEXTURE_2D); 188 glClear(GL_COLOR_BUFFER_BIT); 189 190 glColor3f(1, 1, 1); 191 glRasterPos2f(0, 15); 192 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i); 193 194 glEnable(GL_TEXTURE_2D); 195 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id[i - 32]); 196 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 197 0, dp->drv.p->height - 16, 16, 16, 0); 198 198 199 199 #ifdef HAVE_GLUTCHECKLOOP 200 glutCheckLoop();200 glutCheckLoop(); 201 201 #else 202 glutMainLoopEvent();203 #endif 204 205 206 }202 glutMainLoopEvent(); 203 #endif 204 glutSwapBuffers(); 205 206 } 207 207 /* CP437 hack */ 208 208 for(i = 0; i < 8; i++) 209 {210 glDisable(GL_TEXTURE_2D);211 glClear(GL_COLOR_BUFFER_BIT);212 glColor3f(1, 1, 1);213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 {251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 209 { 210 glDisable(GL_TEXTURE_2D); 211 glClear(GL_COLOR_BUFFER_BIT); 212 glColor3f(1, 1, 1); 213 glTranslatef(0.5,0.5,0); 214 215 if(i==0) /* 0x00002580*/ 216 { 217 glBegin(GL_QUADS); 218 glVertex2f(0,0); glVertex2f(9,0); glVertex2f(9,7); glVertex2f(0,7); 219 glEnd(); 220 } 221 else if(i==1) /* 0x00002584*/ 222 { 223 glBegin(GL_QUADS); 224 glVertex2f(0,7); glVertex2f(9,7); glVertex2f(9,15); glVertex2f(0,15); 225 glEnd(); 226 } 227 else if(i==2) /* 0x00002588*/ 228 { 229 glBegin(GL_QUADS); 230 glVertex2f(0,0); glVertex2f(9,0); glVertex2f(9,15); glVertex2f(0,15); 231 glEnd(); 232 } 233 else if(i==3) /* 0x0000258c*/ 234 { 235 glBegin(GL_QUADS); 236 glVertex2f(0,0); glVertex2f(4,0); glVertex2f(4,15); glVertex2f(0,15); 237 glEnd(); 238 } 239 else if(i==4) /* 0x00002590*/ 240 { 241 glBegin(GL_QUADS); 242 glVertex2f(4,0); glVertex2f(9,0); glVertex2f(9,15); glVertex2f(4,15); 243 glEnd(); 244 } 245 else if(i>=5) /* 0x00002591*/ 246 { 247 int a, j, k = i-5; 248 for(j = dp->drv.p->font_height; j--; ) 249 for(a = dp->drv.p->font_width; a--; ) 250 { 251 if(((a + 2 * (j & 1)) & 3) > k) 252 continue; 253 254 glBegin(GL_POINTS); 255 glVertex2f(a, j); 256 glEnd(); 257 } 258 } 259 260 261 262 glEnable(GL_TEXTURE_2D); 263 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[i]); 264 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 265 0, dp->drv.p->height - 16, 16, 16, 0); 266 266 #ifdef HAVE_GLUTCHECKLOOP 267 267 glutCheckLoop(); 268 268 #else 269 270 #endif 271 272 273 274 275 }269 glutMainLoopEvent(); 270 #endif 271 glutSwapBuffers(); 272 glutPostRedisplay(); 273 274 275 } 276 276 277 277 … … 311 311 line = 0; 312 312 for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height) 313 {314 uint32_t *attr = dp->cv->attr + line * dp->cv->width;315 316 for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width)317 {318 uint16_t bg = _cucul_argb32_to_rgb12bg(*attr++);319 glDisable(GL_TEXTURE_2D);320 glColor3b(((bg & 0xf00) >> 8) * 8,321 ((bg & 0x0f0) >> 4) * 8,322 (bg & 0x00f) * 8);323 glBegin(GL_QUADS);324 glVertex2f(x, y);325 glVertex2f(x + dp->drv.p->font_width, y);326 glVertex2f(x + dp->drv.p->font_width,327 y + dp->drv.p->font_height);328 glVertex2f(x, y + dp->drv.p->font_height);329 glEnd();330 }331 332 line++;333 }313 { 314 uint32_t *attr = dp->cv->attr + line * dp->cv->width; 315 316 for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width) 317 { 318 uint16_t bg = _cucul_argb32_to_rgb12bg(*attr++); 319 glDisable(GL_TEXTURE_2D); 320 glColor3b(((bg & 0xf00) >> 8) * 8, 321 ((bg & 0x0f0) >> 4) * 8, 322 (bg & 0x00f) * 8); 323 glBegin(GL_QUADS); 324 glVertex2f(x, y); 325 glVertex2f(x + dp->drv.p->font_width, y); 326 glVertex2f(x + dp->drv.p->font_width, 327 y + dp->drv.p->font_height); 328 glVertex2f(x, y + dp->drv.p->font_height); 329 glEnd(); 330 } 331 332 line++; 333 } 334 334 335 335 /* 2nd pass, avoids changing render state too much */ … … 340 340 line = 0; 341 341 for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height) 342 {343 uint32_t *attr = dp->cv->attr + line * dp->cv->width;344 uint32_t *chars = dp->cv->chars + line * dp->cv->width;345 346 for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width)347 {348 uint32_t cv = *chars++;349 350 if(cv > 0x00000020 && cv < 0x00000080)351 {352 uint16_t fg = _cucul_argb32_to_rgb12fg(*attr);353 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id[cv - 32]);354 glColor3b(((fg & 0xf00) >> 8) * 8,355 ((fg & 0x0f0) >> 4) * 8,356 (fg & 0x00f) * 8);357 glBegin(GL_QUADS);358 glTexCoord2f(0, dp->drv.p->sh);359 glVertex2f(x, y);360 glTexCoord2f(dp->drv.p->sw, dp->drv.p->sh);361 glVertex2f(x + dp->drv.p->font_width, y);362 glTexCoord2f(dp->drv.p->sw, 0);363 glVertex2f(x + dp->drv.p->font_width,364 y + dp->drv.p->font_height);365 glTexCoord2f(0, 0);366 glVertex2f(x, y + dp->drv.p->font_height);367 glEnd();368 }369 370 {371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 glColor3b(((fg & 0xf00) >> 8) * 8,386 ((fg & 0x0f0) >> 4) * 8,387 (fg & 0x00f) * 8);388 glBegin(GL_QUADS);389 390 391 392 393 394 395 y + dp->drv.p->font_height);396 glTexCoord2f(0, 0);397 glVertex2f(x, y + dp->drv.p->font_height);398 glEnd();399 400 }401 402 attr++;403 }404 line++;405 }342 { 343 uint32_t *attr = dp->cv->attr + line * dp->cv->width; 344 uint32_t *chars = dp->cv->chars + line * dp->cv->width; 345 346 for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width) 347 { 348 uint32_t cv = *chars++; 349 350 if(cv > 0x00000020 && cv < 0x00000080) 351 { 352 uint16_t fg = _cucul_argb32_to_rgb12fg(*attr); 353 glBindTexture(GL_TEXTURE_2D, dp->drv.p->id[cv - 32]); 354 glColor3b(((fg & 0xf00) >> 8) * 8, 355 ((fg & 0x0f0) >> 4) * 8, 356 (fg & 0x00f) * 8); 357 glBegin(GL_QUADS); 358 glTexCoord2f(0, dp->drv.p->sh); 359 glVertex2f(x, y); 360 glTexCoord2f(dp->drv.p->sw, dp->drv.p->sh); 361 glVertex2f(x + dp->drv.p->font_width, y); 362 glTexCoord2f(dp->drv.p->sw, 0); 363 glVertex2f(x + dp->drv.p->font_width, 364 y + dp->drv.p->font_height); 365 glTexCoord2f(0, 0); 366 glVertex2f(x, y + dp->drv.p->font_height); 367 glEnd(); 368 } 369 else if(cv!=' ') 370 { 371 switch(cv) 372 { 373 case 0x00002580: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[0]); break; 374 case 0x00002584: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[1]); break; 375 case 0x00002588: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[2]); break; 376 case 0x0000258c: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[3]); break; 377 case 0x00002590: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[4]); break; 378 case 0x00002591: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[5]); break; 379 case 0x00002592: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[6]); break; 380 case 0x00002593: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id_uni[7]); break; 381 default: glBindTexture(GL_TEXTURE_2D, dp->drv.p->id['?' - 32]); break; 382 } 383 384 uint16_t fg = _cucul_argb32_to_rgb12fg(*attr); 385 glColor3b(((fg & 0xf00) >> 8) * 8, 386 ((fg & 0x0f0) >> 4) * 8, 387 (fg & 0x00f) * 8); 388 glBegin(GL_QUADS); 389 glTexCoord2f(0, dp->drv.p->sh); 390 glVertex2f(x, y); 391 glTexCoord2f(dp->drv.p->sw, dp->drv.p->sh); 392 glVertex2f(x + dp->drv.p->font_width, y); 393 glTexCoord2f(dp->drv.p->sw, 0); 394 glVertex2f(x + dp->drv.p->font_width, 395 y + dp->drv.p->font_height); 396 glTexCoord2f(0, 0); 397 glVertex2f(x, y + dp->drv.p->font_height); 398 glEnd(); 399 400 } 401 402 attr++; 403 } 404 line++; 405 } 406 406 glDisable(GL_BLEND); 407 407 glDisable(GL_TEXTURE_2D); … … 440 440 #ifdef HAVE_GLUTCLOSEFUNC 441 441 if(dp->drv.p->close) 442 {443 dp->drv.p->close = 0;444 ev->type = CACA_EVENT_QUIT;445 return 1;446 }442 { 443 dp->drv.p->close = 0; 444 ev->type = CACA_EVENT_QUIT; 445 return 1; 446 } 447 447 #endif 448 448 449 449 if(dp->resize.resized) 450 {451 ev->type = CACA_EVENT_RESIZE;452 ev->data.resize.w = dp->cv->width;453 ev->data.resize.h = dp->cv->height;454 return 1;455 }450 { 451 ev->type = CACA_EVENT_RESIZE; 452 ev->data.resize.w = dp->cv->width; 453 ev->data.resize.h = dp->cv->height; 454 return 1; 455 } 456 456 457 457 if(dp->drv.p->mouse_changed) 458 {459 ev->type = CACA_EVENT_MOUSE_MOTION;460 ev->data.mouse.x = dp->mouse.x;461 ev->data.mouse.y = dp->mouse.y;462 dp->drv.p->mouse_changed = 0;463 464 if(dp->drv.p->mouse_clicked)465 {466 _push_event(dp, ev);467 ev->type = CACA_EVENT_MOUSE_PRESS;468 ev->data.mouse.button = dp->drv.p->mouse_button;469 dp->drv.p->mouse_clicked = 0;470 }471 472 return 1;473 }458 { 459 ev->type = CACA_EVENT_MOUSE_MOTION; 460 ev->data.mouse.x = dp->mouse.x; 461 ev->data.mouse.y = dp->mouse.y; 462 dp->drv.p->mouse_changed = 0; 463 464 if(dp->drv.p->mouse_clicked) 465 { 466 _push_event(dp, ev); 467 ev->type = CACA_EVENT_MOUSE_PRESS; 468 ev->data.mouse.button = dp->drv.p->mouse_button; 469 dp->drv.p->mouse_clicked = 0; 470 } 471 472 return 1; 473 } 474 474 475 475 if(dp->drv.p->key != 0) 476 {477 ev->type = CACA_EVENT_KEY_PRESS;478 ev->data.key.ch = dp->drv.p->key;479 ev->data.key.ucs4 = (uint32_t)dp->drv.p->key;480 ev->data.key.utf8[0] = dp->drv.p->key;481 ev->data.key.utf8[1] = '\0';482 dp->drv.p->key = 0;483 return 1;484 }476 { 477 ev->type = CACA_EVENT_KEY_PRESS; 478 ev->data.key.ch = dp->drv.p->key; 479 ev->data.key.ucs4 = (uint32_t)dp->drv.p->key; 480 ev->data.key.utf8[0] = dp->drv.p->key; 481 ev->data.key.utf8[1] = '\0'; 482 dp->drv.p->key = 0; 483 return 1; 484 } 485 485 486 486 if(dp->drv.p->special_key != 0) 487 {488 switch(dp->drv.p->special_key)489 {490 case GLUT_KEY_F1 : ev->data.key.ch = CACA_KEY_F1; break;491 case GLUT_KEY_F2 : ev->data.key.ch = CACA_KEY_F2; break;492 case GLUT_KEY_F3 : ev->data.key.ch = CACA_KEY_F3; break;493 case GLUT_KEY_F4 : ev->data.key.ch = CACA_KEY_F4; break;494 case GLUT_KEY_F5 : ev->data.key.ch = CACA_KEY_F5; break;495 case GLUT_KEY_F6 : ev->data.key.ch = CACA_KEY_F6; break;496 case GLUT_KEY_F7 : ev->data.key.ch = CACA_KEY_F7; break;497 case GLUT_KEY_F8 : ev->data.key.ch = CACA_KEY_F8; break;498 case GLUT_KEY_F9 : ev->data.key.ch = CACA_KEY_F9; break;499 case GLUT_KEY_F10: ev->data.key.ch = CACA_KEY_F10; break;500 case GLUT_KEY_F11: ev->data.key.ch = CACA_KEY_F11; break;501 case GLUT_KEY_F12: ev->data.key.ch = CACA_KEY_F12; break;502 case GLUT_KEY_LEFT : ev->data.key.ch = CACA_KEY_LEFT; break;503 case GLUT_KEY_RIGHT: ev->data.key.ch = CACA_KEY_RIGHT; break;504 case GLUT_KEY_UP : ev->data.key.ch = CACA_KEY_UP; break;505 case GLUT_KEY_DOWN : ev->data.key.ch = CACA_KEY_DOWN; break;506 507 case GLUT_KEY_PAGE_DOWN : ev->data.key.ch = CACA_KEY_PAGEDOWN;508 509 510 511 512 513 default: ev->type = CACA_EVENT_NONE; return 0;514 }515 516 ev->type = CACA_EVENT_KEY_PRESS;517 ev->data.key.ucs4 = 0;518 ev->data.key.utf8[0] = '\0';519 520 dp->drv.p->special_key = 0;521 return 1;522 }487 { 488 switch(dp->drv.p->special_key) 489 { 490 case GLUT_KEY_F1 : ev->data.key.ch = CACA_KEY_F1; break; 491 case GLUT_KEY_F2 : ev->data.key.ch = CACA_KEY_F2; break; 492 case GLUT_KEY_F3 : ev->data.key.ch = CACA_KEY_F3; break; 493 case GLUT_KEY_F4 : ev->data.key.ch = CACA_KEY_F4; break; 494 case GLUT_KEY_F5 : ev->data.key.ch = CACA_KEY_F5; break; 495 case GLUT_KEY_F6 : ev->data.key.ch = CACA_KEY_F6; break; 496 case GLUT_KEY_F7 : ev->data.key.ch = CACA_KEY_F7; break; 497 case GLUT_KEY_F8 : ev->data.key.ch = CACA_KEY_F8; break; 498 case GLUT_KEY_F9 : ev->data.key.ch = CACA_KEY_F9; break; 499 case GLUT_KEY_F10: ev->data.key.ch = CACA_KEY_F10; break; 500 case GLUT_KEY_F11: ev->data.key.ch = CACA_KEY_F11; break; 501 case GLUT_KEY_F12: ev->data.key.ch = CACA_KEY_F12; break; 502 case GLUT_KEY_LEFT : ev->data.key.ch = CACA_KEY_LEFT; break; 503 case GLUT_KEY_RIGHT: ev->data.key.ch = CACA_KEY_RIGHT; break; 504 case GLUT_KEY_UP : ev->data.key.ch = CACA_KEY_UP; break; 505 case GLUT_KEY_DOWN : ev->data.key.ch = CACA_KEY_DOWN; break; 506 case GLUT_KEY_PAGE_UP : ev->data.key.ch = CACA_KEY_PAGEUP; break; 507 case GLUT_KEY_PAGE_DOWN : ev->data.key.ch = CACA_KEY_PAGEDOWN; 508 break; 509 case GLUT_KEY_HOME : ev->data.key.ch = CACA_KEY_HOME; break; 510 case GLUT_KEY_END : ev->data.key.ch = CACA_KEY_END; break; 511 case GLUT_KEY_INSERT : ev->data.key.ch = CACA_KEY_INSERT; break; 512 513 default: ev->type = CACA_EVENT_NONE; return 0; 514 } 515 516 ev->type = CACA_EVENT_KEY_PRESS; 517 ev->data.key.ucs4 = 0; 518 ev->data.key.utf8[0] = '\0'; 519 520 dp->drv.p->special_key = 0; 521 return 1; 522 } 523 523 524 524 ev->type = CACA_EVENT_NONE; … … 558 558 559 559 if(dp->drv.p->bit) /* Do not handle reshaping at the first time */ 560 {561 dp->drv.p->new_width = w;562 dp->drv.p->new_height = h;563 564 dp->resize.w = w / dp->drv.p->font_width;565 dp->resize.h = (h / dp->drv.p->font_height) + 1;566 567 dp->resize.resized = 1;568 }560 { 561 dp->drv.p->new_width = w; 562 dp->drv.p->new_height = h; 563 564 dp->resize.w = w / dp->drv.p->font_width; 565 dp->resize.h = (h / dp->drv.p->font_height) + 1; 566 567 dp->resize.resized = 1; 568 } 569 569 else 570 570 dp->drv.p->bit = 1;
Note: See TracChangeset
for help on using the changeset viewer.