gfx.c
changeset 1991 4ce69ba880b4
parent 1914 2b4b3c3a95b4
child 1996 e87f196b0ba9
equal deleted inserted replaced
1990:efb67f977138 1991:4ce69ba880b4
     3 #include "spritecache.h"
     3 #include "spritecache.h"
     4 #include "strings.h"
     4 #include "strings.h"
     5 #include "gfx.h"
     5 #include "gfx.h"
     6 #include "table/palettes.h"
     6 #include "table/palettes.h"
     7 #include "hal.h"
     7 #include "hal.h"
       
     8 
       
     9 Colour _cur_palette[256];
     8 
    10 
     9 static void GfxMainBlitter(const Sprite *sprite, int x, int y, int mode);
    11 static void GfxMainBlitter(const Sprite *sprite, int x, int y, int mode);
    10 
    12 
    11 static int _stringwidth_out;
    13 static int _stringwidth_out;
    12 static byte _cursor_backup[64*64];
    14 static byte _cursor_backup[64*64];
  1480 }
  1482 }
  1481 
  1483 
  1482 #if 0
  1484 #if 0
  1483 static void GfxScalePalette(int pal, byte scaling)
  1485 static void GfxScalePalette(int pal, byte scaling)
  1484 {
  1486 {
  1485 	byte *dst, *src;
  1487 	const Colour* src;
  1486 	size_t count;
  1488 	uint i;
  1487 
  1489 
  1488 	GfxInitPalettes();
  1490 	GfxInitPalettes();
  1489 
  1491 
  1490 	dst = _cur_palette;
       
  1491 	src = GET_PALETTE(pal);
  1492 	src = GET_PALETTE(pal);
  1492 	count = 256;
  1493 	for (i = 0; i < lengthof(_cur_palette); i++) {
  1493 	do {
  1494 		_cur_palette[i].r = src[i].r * scaling >> 8;
  1494 		dst[0] = (byte)(src[0] * scaling >> 8);
  1495 		_cur_palette[i].g = src[i].g * scaling >> 8;
  1495 		dst[1] = (byte)(src[1] * scaling >> 8);
  1496 		_cur_palette[i].b = src[i].b * scaling >> 8;
  1496 		dst[2] = (byte)(src[2] * scaling >> 8);
  1497 	}
  1497 		dst += 3;
       
  1498 		src += 3;
       
  1499 	} while (--count);
       
  1500 }
  1498 }
  1501 #endif
  1499 #endif
  1502 
  1500 
  1503 void DoPaletteAnimations(void);
  1501 void DoPaletteAnimations(void);
  1504 
  1502 
  1505 void GfxInitPalettes(void)
  1503 void GfxInitPalettes(void)
  1506 {
  1504 {
  1507 	int pal = _use_dos_palette?1:0;
  1505 	memcpy(_cur_palette, _palettes[_use_dos_palette ? 1 : 0], sizeof(_cur_palette));
  1508 	memcpy(_cur_palette, _palettes[pal], 256*3);
       
  1509 
  1506 
  1510 	_pal_first_dirty = 0;
  1507 	_pal_first_dirty = 0;
  1511 	_pal_last_dirty = 255;
  1508 	_pal_last_dirty = 255;
  1512 	DoPaletteAnimations();
  1509 	DoPaletteAnimations();
  1513 }
  1510 }
  1514 
  1511 
  1515 #define EXTR(p,q) (((uint16)(_timer_counter * (p)) * (q)) >> 16)
  1512 #define EXTR(p,q) (((uint16)(_timer_counter * (p)) * (q)) >> 16)
  1516 #define EXTR2(p,q) (((uint16)(~_timer_counter * (p)) * (q)) >> 16)
  1513 #define EXTR2(p,q) (((uint16)(~_timer_counter * (p)) * (q)) >> 16)
  1517 #define COPY_TRIPLET do {d[0]=s[0+j]; d[1]=s[1+j]; d[2]=s[2+j];d+=3;}while(0)
       
  1518 
  1514 
  1519 void DoPaletteAnimations(void)
  1515 void DoPaletteAnimations(void)
  1520 {
  1516 {
  1521 	const byte *s;
  1517 	const Colour* s;
  1522 	byte *d;
  1518 	Colour* d;
  1523 	/* Amount of colors to be rotated.
  1519 	/* Amount of colors to be rotated.
  1524 	 * A few more for the DOS palette, because the water colors are
  1520 	 * A few more for the DOS palette, because the water colors are
  1525 	 * 245-254 for DOS and 217-226 for Windows.  */
  1521 	 * 245-254 for DOS and 217-226 for Windows.  */
  1526 	int c = _use_dos_palette?38:28;
  1522 	int c = _use_dos_palette?38:28;
  1527 	int j;
  1523 	int j;
  1528 	int i;
  1524 	int i;
  1529 	const ExtraPaletteValues *ev = &_extra_palette_values;
  1525 	const ExtraPaletteValues *ev = &_extra_palette_values;
  1530 	byte old_val[114]; // max(c*(38:28)) = 114
  1526 	Colour old_val[38]; // max(38, 28)
  1531 
  1527 
  1532 	d = _cur_palette + 217*3;
  1528 	d = &_cur_palette[217];
  1533 	memcpy(old_val, d, c*3);
  1529 	memcpy(old_val, d, c * sizeof(*old_val));
  1534 
  1530 
  1535 	// Dark blue water
  1531 	// Dark blue water
  1536 	s = ev->a;
  1532 	s = ev->a;
  1537 	if (_opt.landscape == LT_CANDY) s = ev->ac;
  1533 	if (_opt.landscape == LT_CANDY) s = ev->ac;
  1538 	j = EXTR(320,5) * 3;
  1534 	j = EXTR(320,5);
  1539 	for(i=0; i!=5; i++) {
  1535 	for(i=0; i!=5; i++) {
  1540 		COPY_TRIPLET;
  1536 		*d++ = s[j];
  1541 		j+=3;
  1537 		j++;
  1542 		if (j == 15) j = 0;
  1538 		if (j == 5) j = 0;
  1543 	}
  1539 	}
  1544 
  1540 
  1545 	// Glittery water
  1541 	// Glittery water
  1546 	s = ev->b;
  1542 	s = ev->b;
  1547 	if (_opt.landscape == LT_CANDY) s = ev->bc;
  1543 	if (_opt.landscape == LT_CANDY) s = ev->bc;
  1548 	j = EXTR(128, 15) * 3;
  1544 	j = EXTR(128, 15);
  1549 	for(i=0; i!=5; i++) {
  1545 	for(i=0; i!=5; i++) {
  1550 		COPY_TRIPLET;
  1546 		*d++ = s[j];
  1551 		j += 9;
  1547 		j += 3;
  1552 		if (j >= 45) j -= 45;
  1548 		if (j >= 15) j -= 15;
  1553 	}
  1549 	}
  1554 
  1550 
  1555 	s = ev->e;
  1551 	s = ev->e;
  1556 	j = EXTR2(512, 5) * 3;
  1552 	j = EXTR2(512, 5);
  1557 	for(i=0; i!=5; i++) {
  1553 	for(i=0; i!=5; i++) {
  1558 		COPY_TRIPLET;
  1554 		*d++ = s[j];
  1559 		j += 3;
  1555 		j++;
  1560 		if (j == 3*5) j = 0;
  1556 		if (j == 5) j = 0;
  1561 	}
  1557 	}
  1562 
  1558 
  1563 	// Oil refinery fire animation
  1559 	// Oil refinery fire animation
  1564 	s = ev->oil_ref;
  1560 	s = ev->oil_ref;
  1565 	j = EXTR2(512, 7) * 3;
  1561 	j = EXTR2(512, 7);
  1566 	for(i=0; i!=7; i++) {
  1562 	for(i=0; i!=7; i++) {
  1567 		COPY_TRIPLET;
  1563 		*d++ = s[j];
  1568 		j += 3;
  1564 		j++;
  1569 		if (j == 3*7) j = 0;
  1565 		if (j == 7) j = 0;
  1570 	}
  1566 	}
  1571 
  1567 
  1572 	// Radio tower blinking
  1568 	// Radio tower blinking
  1573 	{
  1569 	{
  1574 		byte i,v;
  1570 		byte i,v;
  1575 		i = (_timer_counter >> 1) & 0x7F;
  1571 		i = (_timer_counter >> 1) & 0x7F;
  1576 		(v = 255, i < 0x3f) ||
  1572 		(v = 255, i < 0x3f) ||
  1577 		(v = 128, i < 0x4A || i >= 0x75) ||
  1573 		(v = 128, i < 0x4A || i >= 0x75) ||
  1578 		(v = 20);
  1574 		(v = 20);
  1579 		d[0] = v;
  1575 		d->r = v;
  1580 		d[1] = d[2] = 0;
  1576 		d->g = 0;
  1581 		d += 3;
  1577 		d->b = 0;
       
  1578 		d++;
  1582 
  1579 
  1583 		i ^= 0x40;
  1580 		i ^= 0x40;
  1584 		(v = 255, i < 0x3f) ||
  1581 		(v = 255, i < 0x3f) ||
  1585 		(v = 128, i < 0x4A || i >= 0x75) ||
  1582 		(v = 128, i < 0x4A || i >= 0x75) ||
  1586 		(v = 20);
  1583 		(v = 20);
  1587 		d[0] = v;
  1584 		d->r = v;
  1588 
  1585 		d->g = 0;
  1589 		d[1] = d[2] = 0;
  1586 		d->b = 0;
  1590 		d += 3;
  1587 		d++;
  1591 	}
  1588 	}
  1592 
  1589 
  1593 	// Handle lighthouse and stadium animation
  1590 	// Handle lighthouse and stadium animation
  1594 	s = ev->lighthouse;
  1591 	s = ev->lighthouse;
  1595 	j = EXTR(256, 4) * 3;
  1592 	j = EXTR(256, 4);
  1596 	for(i=0; i!=4; i++) {
  1593 	for(i=0; i!=4; i++) {
  1597 		COPY_TRIPLET;
  1594 		*d++ = s[j];
  1598 		j += 3;
  1595 		j++;
  1599 		if (j == 3*4) j = 0;
  1596 		if (j == 4) j = 0;
  1600 	}
  1597 	}
  1601 
  1598 
  1602 	// Animate water for old DOS graphics
  1599 	// Animate water for old DOS graphics
  1603 	if(_use_dos_palette) {
  1600 	if(_use_dos_palette) {
  1604 		// Dark blue water DOS
  1601 		// Dark blue water DOS
  1605 		s = ev->a;
  1602 		s = ev->a;
  1606 		if (_opt.landscape == LT_CANDY) s = ev->ac;
  1603 		if (_opt.landscape == LT_CANDY) s = ev->ac;
  1607 		j = EXTR(320,5) * 3;
  1604 		j = EXTR(320,5);
  1608 		for(i=0; i!=5; i++) {
  1605 		for(i=0; i!=5; i++) {
  1609 			COPY_TRIPLET;
  1606 			*d++ = s[j];
  1610 			j+=3;
  1607 			j++;
  1611 			if (j == 15) j = 0;
  1608 			if (j == 5) j = 0;
  1612 		}
  1609 		}
  1613 
  1610 
  1614 		// Glittery water DOS
  1611 		// Glittery water DOS
  1615 		s = ev->b;
  1612 		s = ev->b;
  1616 		if (_opt.landscape == LT_CANDY) s = ev->bc;
  1613 		if (_opt.landscape == LT_CANDY) s = ev->bc;
  1617 		j = EXTR(128, 15) * 3;
  1614 		j = EXTR(128, 15);
  1618 		for(i=0; i!=5; i++) {
  1615 		for(i=0; i!=5; i++) {
  1619 			COPY_TRIPLET;
  1616 			*d++ = s[j];
  1620 			j += 9;
  1617 			j += 3;
  1621 			if (j >= 45) j -= 45;
  1618 			if (j >= 15) j -= 15;
  1622 		}
  1619 		}
  1623 	}
  1620 	}
  1624 
  1621 
  1625 	if (memcmp(old_val, _cur_palette + 217*3, c*3)) {
  1622 	if (memcmp(old_val, &_cur_palette[217], c * sizeof(*old_val)) != 0) {
  1626 		if (_pal_first_dirty > 217) _pal_first_dirty = 217;
  1623 		if (_pal_first_dirty > 217) _pal_first_dirty = 217;
  1627 		if (_pal_last_dirty < 217+c) _pal_last_dirty = 217+c;
  1624 		if (_pal_last_dirty < 217 + c) _pal_last_dirty = 217 + c;
  1628 	}
  1625 	}
  1629 }
  1626 }
  1630 
  1627 
  1631 
  1628 
  1632 void LoadStringWidthTable(void)
  1629 void LoadStringWidthTable(void)