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) |