diff options
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/smush/codec47.cpp | 1103 | ||||
-rw-r--r-- | scumm/smush/codec47.h | 6 | ||||
-rw-r--r-- | scumm/smush/player.cpp | 3 |
3 files changed, 1107 insertions, 5 deletions
diff --git a/scumm/smush/codec47.cpp b/scumm/smush/codec47.cpp index 05fef0cef6..d4fed99756 100644 --- a/scumm/smush/codec47.cpp +++ b/scumm/smush/codec47.cpp @@ -20,22 +20,997 @@ */ #include <stdafx.h> +#include "scumm.h" +#include "engine.h" #include "codec47.h" #include "chunk.h" #include "blitter.h" +static const int16 codec37_table[] = { + 0, 0, 1, 0, 2, 0, 3, 0, 3, 0, 3, 0, 3, + 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 2, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 2, 0, 3, 0, 3, 0, 3, 0, 3, 0, + 2, 0, 1, 0, 1, 0, 1, 0, 2, 0, 2, 0, 0, + 0, 2, 0, 5, 0, 7, 0, 7, 0, 7, 0, 7, 0, + 7, 0, 7, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 3, 0, 4, 0, 6, 0, 7, 0, 7, 0, 7, + 0, 7, 0, 6, 0, 4, 0, 3, 0, 1, 0, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 2, 0, 3, 0, 5, 0, 8, 0, 13, 0, 21, 0, + -1, 0, -2, 0, -3, 0, -5, 0, -8, 0,-13, 0,-17, + 0,-21, 0, 0, 1, 1, 1, 2, 1, 3, 1, 5, 1, + 8, 1, 13, 1, 21, 1, -1, 1, -2, 1, -3, 1, -5, + 1, -8, 1,-13, 1,-17, 1,-21, 1, 0, 2, 1, 2, + 2, 2, 3, 2, 5, 2, 8, 2, 13, 2, 21, 2, -1, + 2, -2, 2, -3, 2, -5, 2, -8, 2,-13, 2,-17, 2, + -21, 2, 0, 3, 1, 3, 2, 3, 3, 3, 5, 3, 8, + 3, 13, 3, 21, 3, -1, 3, -2, 3, -3, 3, -5, 3, + -8, 3,-13, 3,-17, 3,-21, 3, 0, 5, 1, 5, 2, + 5, 3, 5, 5, 5, 8, 5, 13, 5, 21, 5, -1, 5, + -2, 5, -3, 5, -5, 5, -8, 5,-13, 5,-17, 5,-21, + 5, 0, 8, 1, 8, 2, 8, 3, 8, 5, 8, 8, 8, + 13, 8, 21, 8, -1, 8, -2, 8, -3, 8, -5, 8, -8, + 8,-13, 8,-17, 8,-21, 8, 0, 13, 1, 13, 2, 13, + 3, 13, 5, 13, 8, 13, 13, 13, 21, 13, -1, 13, -2, + 13, -3, 13, -5, 13, -8, 13,-13, 13,-17, 13,-21, 13, + 0, 21, 1, 21, 2, 21, 3, 21, 5, 21, 8, 21, 13, + 21, 21, 21, -1, 21, -2, 21, -3, 21, -5, 21, -8, 21, + -13, 21,-17, 21,-21, 21, 0, -1, 1, -1, 2, -1, 3, + -1, 5, -1, 8, -1, 13, -1, 21, -1, -1, -1, -2, -1, + -3, -1, -5, -1, -8, -1,-13, -1,-17, -1,-21, -1, 0, + -2, 1, -2, 2, -2, 3, -2, 5, -2, 8, -2, 13, -2, + 21, -2, -1, -2, -2, -2, -3, -2, -5, -2, -8, -2,-13, + -2,-17, -2,-21, -2, 0, -3, 1, -3, 2, -3, 3, -3, + 5, -3, 8, -3, 13, -3, 21, -3, -1, -3, -2, -3, -3, + -3, -5, -3, -8, -3,-13, -3,-17, -3,-21, -3, 0, -5, + 1, -5, 2, -5, 3, -5, 5, -5, 8, -5, 13, -5, 21, + -5, -1, -5, -2, -5, -3, -5, -5, -5, -8, -5,-13, -5, + -17, -5,-21, -5, 0, -8, 1, -8, 2, -8, 3, -8, 5, + -8, 8, -8, 13, -8, 21, -8, -1, -8, -2, -8, -3, -8, + -5, -8, -8, -8,-13, -8,-17, -8,-21, -8, 0,-13, 1, + -13, 2,-13, 3,-13, 5,-13, 8,-13, 13,-13, 21,-13, + -1,-13, -2,-13, -3,-13, -5,-13, -8,-13,-13,-13,-17, + -13,-21,-13, 0,-17, 1,-17, 2,-17, 3,-17, 5,-17, + 8,-17, 13,-17, 21,-17, -1,-17, -2,-17, -3,-17, -5, + -17, -8,-17,-13,-17,-17,-17,-21,-17, 0,-21, 1,-21, + 2,-21, 3,-21, 5,-21, 8,-21, 13,-21, 21,-21, -1, + -21, -2,-21, -3,-21, -5,-21, -8,-21,-13,-21,-17,-21, + 0, 0, -8,-29, 8,-29,-18,-25, 17,-25, 0,-23, -6, + -22, 6,-22,-13,-19, 12,-19, 0,-18, 25,-18,-25,-17, + -5,-17, 5,-17,-10,-15, 10,-15, 0,-14, -4,-13, 4, + -13, 19,-13,-19,-12, -8,-11, -2,-11, 0,-11, 2,-11, + 8,-11,-15,-10, -4,-10, 4,-10, 15,-10, -6, -9, -1, + -9, 1, -9, 6, -9,-29, -8,-11, -8, -8, -8, -3, -8, + 3, -8, 8, -8, 11, -8, 29, -8, -5, -7, -2, -7, 0, + -7, 2, -7, 5, -7,-22, -6, -9, -6, -6, -6, -3, -6, + -1, -6, 1, -6, 3, -6, 6, -6, 9, -6, 22, -6,-17, + -5, -7, -5, -4, -5, -2, -5, 0, -5, 2, -5, 4, -5, + 7, -5, 17, -5,-13, -4,-10, -4, -5, -4, -3, -4, -1, + -4, 0, -4, 1, -4, 3, -4, 5, -4, 10, -4, 13, -4, + -8, -3, -6, -3, -4, -3, -3, -3, -2, -3, -1, -3, 0, + -3, 1, -3, 2, -3, 4, -3, 6, -3, 8, -3,-11, -2, + -7, -2, -5, -2, -3, -2, -2, -2, -1, -2, 0, -2, 1, + -2, 2, -2, 3, -2, 5, -2, 7, -2, 11, -2, -9, -1, + -6, -1, -4, -1, -3, -1, -2, -1, -1, -1, 0, -1, 1, + -1, 2, -1, 3, -1, 4, -1, 6, -1, 9, -1,-31, 0, + -23, 0,-18, 0,-14, 0,-11, 0, -7, 0, -5, 0, -4, + 0, -3, 0, -2, 0, -1, 0, 0,-31, 1, 0, 2, 0, + 3, 0, 4, 0, 5, 0, 7, 0, 11, 0, 14, 0, 18, + 0, 23, 0, 31, 0, -9, 1, -6, 1, -4, 1, -3, 1, + -2, 1, -1, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, + 1, 6, 1, 9, 1,-11, 2, -7, 2, -5, 2, -3, 2, + -2, 2, -1, 2, 0, 2, 1, 2, 2, 2, 3, 2, 5, + 2, 7, 2, 11, 2, -8, 3, -6, 3, -4, 3, -2, 3, + -1, 3, 0, 3, 1, 3, 2, 3, 3, 3, 4, 3, 6, + 3, 8, 3,-13, 4,-10, 4, -5, 4, -3, 4, -1, 4, + 0, 4, 1, 4, 3, 4, 5, 4, 10, 4, 13, 4,-17, + 5, -7, 5, -4, 5, -2, 5, 0, 5, 2, 5, 4, 5, + 7, 5, 17, 5,-22, 6, -9, 6, -6, 6, -3, 6, -1, + 6, 1, 6, 3, 6, 6, 6, 9, 6, 22, 6, -5, 7, + -2, 7, 0, 7, 2, 7, 5, 7,-29, 8,-11, 8, -8, + 8, -3, 8, 3, 8, 8, 8, 11, 8, 29, 8, -6, 9, + -1, 9, 1, 9, 6, 9,-15, 10, -4, 10, 4, 10, 15, + 10, -8, 11, -2, 11, 0, 11, 2, 11, 8, 11, 19, 12, + -19, 13, -4, 13, 4, 13, 0, 14,-10, 15, 10, 15, -5, + 17, 5, 17, 25, 17,-25, 18, 0, 18,-12, 19, 13, 19, + -6, 22, 6, 22, 0, 23,-17, 25, 18, 25, -8, 29, 8, + 29, 0, 31, 0, 0, -6,-22, 6,-22,-13,-19, 12,-19, + 0,-18, -5,-17, 5,-17,-10,-15, 10,-15, 0,-14, -4, + -13, 4,-13, 19,-13,-19,-12, -8,-11, -2,-11, 0,-11, + 2,-11, 8,-11,-15,-10, -4,-10, 4,-10, 15,-10, -6, + -9, -1, -9, 1, -9, 6, -9,-11, -8, -8, -8, -3, -8, + 0, -8, 3, -8, 8, -8, 11, -8, -5, -7, -2, -7, 0, + -7, 2, -7, 5, -7,-22, -6, -9, -6, -6, -6, -3, -6, + -1, -6, 1, -6, 3, -6, 6, -6, 9, -6, 22, -6,-17, + -5, -7, -5, -4, -5, -2, -5, -1, -5, 0, -5, 1, -5, + 2, -5, 4, -5, 7, -5, 17, -5,-13, -4,-10, -4, -5, + -4, -3, -4, -2, -4, -1, -4, 0, -4, 1, -4, 2, -4, + 3, -4, 5, -4, 10, -4, 13, -4, -8, -3, -6, -3, -4, + -3, -3, -3, -2, -3, -1, -3, 0, -3, 1, -3, 2, -3, + 3, -3, 4, -3, 6, -3, 8, -3,-11, -2, -7, -2, -5, + -2, -4, -2, -3, -2, -2, -2, -1, -2, 0, -2, 1, -2, + 2, -2, 3, -2, 4, -2, 5, -2, 7, -2, 11, -2, -9, + -1, -6, -1, -5, -1, -4, -1, -3, -1, -2, -1, -1, -1, + 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, + -1, 9, -1,-23, 0,-18, 0,-14, 0,-11, 0, -7, 0, + -5, 0, -4, 0, -3, 0, -2, 0, -1, 0, 0,-23, 1, + 0, 2, 0, 3, 0, 4, 0, 5, 0, 7, 0, 11, 0, + 14, 0, 18, 0, 23, 0, -9, 1, -6, 1, -5, 1, -4, + 1, -3, 1, -2, 1, -1, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5, 1, 6, 1, 9, 1,-11, 2, -7, + 2, -5, 2, -4, 2, -3, 2, -2, 2, -1, 2, 0, 2, + 1, 2, 2, 2, 3, 2, 4, 2, 5, 2, 7, 2, 11, + 2, -8, 3, -6, 3, -4, 3, -3, 3, -2, 3, -1, 3, + 0, 3, 1, 3, 2, 3, 3, 3, 4, 3, 6, 3, 8, + 3,-13, 4,-10, 4, -5, 4, -3, 4, -2, 4, -1, 4, + 0, 4, 1, 4, 2, 4, 3, 4, 5, 4, 10, 4, 13, + 4,-17, 5, -7, 5, -4, 5, -2, 5, -1, 5, 0, 5, + 1, 5, 2, 5, 4, 5, 7, 5, 17, 5,-22, 6, -9, + 6, -6, 6, -3, 6, -1, 6, 1, 6, 3, 6, 6, 6, + 9, 6, 22, 6, -5, 7, -2, 7, 0, 7, 2, 7, 5, + 7,-11, 8, -8, 8, -3, 8, 0, 8, 3, 8, 8, 8, + 11, 8, -6, 9, -1, 9, 1, 9, 6, 9,-15, 10, -4, + 10, 4, 10, 15, 10, -8, 11, -2, 11, 0, 11, 2, 11, + 8, 11, 19, 12,-19, 13, -4, 13, 4, 13, 0, 14,-10, + 15, 10, 15, -5, 17, 5, 17, 0, 18,-12, 19, 13, 19, + -6, 22, 6, 22, 0, 23 +}; + +static const int16 codec47_table[] = { + 0, 0, -1, -43, 6, -43, -9, -42, 13, -41, + -16, -40, 19, -39, -23, -36, 26, -34, -2, -33, + 4, -33, -29, -32, -9, -32, 11, -31, -16, -29, + 32, -29, 18, -28, -34, -26, -22, -25, -1, -25, + 3, -25, -7, -24, 8, -24, 24, -23, 36, -23, + -12, -22, 13, -21, -38, -20, 0, -20, -27, -19, + -4, -19, 4, -19, -17, -18, -8, -17, 8, -17, + 18, -17, 28, -17, 39, -17, -12, -15, 12, -15, + -21, -14, -1, -14, 1, -14, -41, -13, -5, -13, + 5, -13, 21, -13, -31, -12, -15, -11, -8, -11, + 8, -11, 15, -11, -2, -10, 1, -10, 31, -10, + -23, -9, -11, -9, -5, -9, 4, -9, 11, -9, + 42, -9, 6, -8, 24, -8, -18, -7, -7, -7, + -3, -7, -1, -7, 2, -7, 18, -7, -43, -6, + -13, -6, -4, -6, 4, -6, 8, -6, -33, -5, + -9, -5, -2, -5, 0, -5, 2, -5, 5, -5, + 13, -5, -25, -4, -6, -4, -3, -4, 3, -4, + 9, -4, -19, -3, -7, -3, -4, -3, -2, -3, + -1, -3, 0, -3, 1, -3, 2, -3, 4, -3, + 6, -3, 33, -3, -14, -2, -10, -2, -5, -2, + -3, -2, -2, -2, -1, -2, 0, -2, 1, -2, + 2, -2, 3, -2, 5, -2, 7, -2, 14, -2, + 19, -2, 25, -2, 43, -2, -7, -1, -3, -1, + -2, -1, -1, -1, 0, -1, 1, -1, 2, -1, + 3, -1, 10, -1, -5, 0, -3, 0, -2, 0, + -1, 0, 1, 0, 2, 0, 3, 0, 5, 0, + 7, 0, -10, 1, -7, 1, -3, 1, -2, 1, + -1, 1, 0, 1, 1, 1, 2, 1, 3, 1, + -43, 2, -25, 2, -19, 2, -14, 2, -5, 2, + -3, 2, -2, 2, -1, 2, 0, 2, 1, 2, + 2, 2, 3, 2, 5, 2, 7, 2, 10, 2, + 14, 2, -33, 3, -6, 3, -4, 3, -2, 3, + -1, 3, 0, 3, 1, 3, 2, 3, 4, 3, + 19, 3, -9, 4, -3, 4, 3, 4, 7, 4, + 25, 4, -13, 5, -5, 5, -2, 5, 0, 5, + 2, 5, 5, 5, 9, 5, 33, 5, -8, 6, + -4, 6, 4, 6, 13, 6, 43, 6, -18, 7, + -2, 7, 0, 7, 2, 7, 7, 7, 18, 7, + -24, 8, -6, 8, -42, 9, -11, 9, -4, 9, + 5, 9, 11, 9, 23, 9, -31, 10, -1, 10, + 2, 10, -15, 11, -8, 11, 8, 11, 15, 11, + 31, 12, -21, 13, -5, 13, 5, 13, 41, 13, + -1, 14, 1, 14, 21, 14, -12, 15, 12, 15, + -39, 17, -28, 17, -18, 17, -8, 17, 8, 17, + 17, 18, -4, 19, 0, 19, 4, 19, 27, 19, + 38, 20, -13, 21, 12, 22, -36, 23, -24, 23, + -8, 24, 7, 24, -3, 25, 1, 25, 22, 25, + 34, 26, -18, 28, -32, 29, 16, 29, -11, 31, + 9, 32, 29, 32, -4, 33, 2, 33, -26, 34, + 23, 36, -19, 39, 16, 40, -13, 41, 9, 42, + -6, 43, 1, 43, 0, 0, 0, 0, 0, 0 +}; + +static const uint32 codec47_delta[] = { + 0x0, 0x1010101, 0x2020202, 0x3030303, 0x4040404, + 0x5050505, 0x6060606, 0x7070707, 0x8080808, 0x9090909, + 0x0A0A0A0A, 0x0B0B0B0B, 0x0C0C0C0C, 0x0D0D0D0D, 0x0E0E0E0E, + 0x0F0F0F0F, 0x10101010, 0x11111111, 0x12121212, 0x13131313, + 0x14141414, 0x15151515, 0x16161616, 0x17171717, 0x18181818, + 0x19191919, 0x1A1A1A1A, 0x1B1B1B1B, 0x1C1C1C1C, 0x1D1D1D1D, + 0x1E1E1E1E, 0x1F1F1F1F, 0x20202020, 0x21212121, 0x22222222, + 0x23232323, 0x24242424, 0x25252525, 0x26262626, 0x27272727, + 0x28282828, 0x29292929, 0x2A2A2A2A, 0x2B2B2B2B, 0x2C2C2C2C, + 0x2D2D2D2D, 0x2E2E2E2E, 0x2F2F2F2F, 0x30303030, 0x31313131, + 0x32323232, 0x33333333, 0x34343434, 0x35353535, 0x36363636, + 0x37373737, 0x38383838, 0x39393939, 0x3A3A3A3A, 0x3B3B3B3B, + 0x3C3C3C3C, 0x3D3D3D3D, 0x3E3E3E3E, 0x3F3F3F3F, 0x40404040, + 0x41414141, 0x42424242, 0x43434343, 0x44444444, 0x45454545, + 0x46464646, 0x47474747, 0x48484848, 0x49494949, 0x4A4A4A4A, + 0x4B4B4B4B, 0x4C4C4C4C, 0x4D4D4D4D, 0x4E4E4E4E, 0x4F4F4F4F, + 0x50505050, 0x51515151, 0x52525252, 0x53535353, 0x54545454, + 0x55555555, 0x56565656, 0x57575757, 0x58585858, 0x59595959, + 0x5A5A5A5A, 0x5B5B5B5B, 0x5C5C5C5C, 0x5D5D5D5D, 0x5E5E5E5E, + 0x5F5F5F5F, 0x60606060, 0x61616161, 0x62626262, 0x63636363, + 0x64646464, 0x65656565, 0x66666666, 0x67676767, 0x68686868, + 0x69696969, 0x6A6A6A6A, 0x6B6B6B6B, 0x6C6C6C6C, 0x6D6D6D6D, + 0x6E6E6E6E, 0x6F6F6F6F, 0x70707070, 0x71717171, 0x72727272, + 0x73737373, 0x74747474, 0x75757575, 0x76767676, 0x77777777, + 0x78787878, 0x79797979, 0x7A7A7A7A, 0x7B7B7B7B, 0x7C7C7C7C, + 0x7D7D7D7D, 0x7E7E7E7E, 0x7F7F7F7F, 0x80808080, 0x81818181, + 0x82828282, 0x83838383, 0x84848484, 0x85858585, 0x86868686, + 0x87878787, 0x88888888, 0x89898989, 0x8A8A8A8A, 0x8B8B8B8B, + 0x8C8C8C8C, 0x8D8D8D8D, 0x8E8E8E8E, 0x8F8F8F8F, 0x90909090, + 0x91919191, 0x92929292, 0x93939393, 0x94949494, 0x95959595, + 0x96969696, 0x97979797, 0x98989898, 0x99999999, 0x9A9A9A9A, + 0x9B9B9B9B, 0x9C9C9C9C, 0x9D9D9D9D, 0x9E9E9E9E, 0x9F9F9F9F, + 0x0A0A0A0A0, 0x0A1A1A1A1, 0x0A2A2A2A2, 0x0A3A3A3A3, 0x0A4A4A4A4, + 0x0A5A5A5A5, 0x0A6A6A6A6, 0x0A7A7A7A7, 0x0A8A8A8A8, 0x0A9A9A9A9, + 0x0AAAAAAAA, 0x0ABABABAB, 0x0ACACACAC, 0x0ADADADAD, 0x0AEAEAEAE, + 0x0AFAFAFAF, 0x0B0B0B0B0, 0x0B1B1B1B1, 0x0B2B2B2B2, 0x0B3B3B3B3, + 0x0B4B4B4B4, 0x0B5B5B5B5, 0x0B6B6B6B6, 0x0B7B7B7B7, 0x0B8B8B8B8, + 0x0B9B9B9B9, 0x0BABABABA, 0x0BBBBBBBB, 0x0BCBCBCBC, 0x0BDBDBDBD, + 0x0BEBEBEBE, 0x0BFBFBFBF, 0x0C0C0C0C0, 0x0C1C1C1C1, 0x0C2C2C2C2, + 0x0C3C3C3C3, 0x0C4C4C4C4, 0x0C5C5C5C5, 0x0C6C6C6C6, 0x0C7C7C7C7, + 0x0C8C8C8C8, 0x0C9C9C9C9, 0x0CACACACA, 0x0CBCBCBCB, 0x0CCCCCCCC, + 0x0CDCDCDCD, 0x0CECECECE, 0x0CFCFCFCF, 0x0D0D0D0D0, 0x0D1D1D1D1, + 0x0D2D2D2D2, 0x0D3D3D3D3, 0x0D4D4D4D4, 0x0D5D5D5D5, 0x0D6D6D6D6, + 0x0D7D7D7D7, 0x0D8D8D8D8, 0x0D9D9D9D9, 0x0DADADADA, 0x0DBDBDBDB, + 0x0DCDCDCDC, 0x0DDDDDDDD, 0x0DEDEDEDE, 0x0DFDFDFDF, 0x0E0E0E0E0, + 0x0E1E1E1E1, 0x0E2E2E2E2, 0x0E3E3E3E3, 0x0E4E4E4E4, 0x0E5E5E5E5, + 0x0E6E6E6E6, 0x0E7E7E7E7, 0x0E8E8E8E8, 0x0E9E9E9E9, 0x0EAEAEAEA, + 0x0EBEBEBEB, 0x0ECECECEC, 0x0EDEDEDED, 0x0EEEEEEEE, 0x0EFEFEFEF, + 0x0F0F0F0F0, 0x0F1F1F1F1, 0x0F2F2F2F2, 0x0F3F3F3F3, 0x0F4F4F4F4, + 0x0F5F5F5F5, 0x0F6F6F6F6, 0x0F7F7F7F7, 0x0F8F8F8F8, 0x0F9F9F9F9, + 0x0FAFAFAFA, 0x0FBFBFBFB, 0x0FCFCFCFC, 0x0FDFDFDFD, 0x0FEFEFEFE, + 0x0FFFFFFFF +}; + +static int32 last_table_width; + +static byte smush_mktable1[99072+100]; +static byte smush_mktable2[32768+100]; +static byte smush_buffer[65536]; + +static int16 codec47_temp_table[256+100]; +static int16 smush_buf_big[128+100]; +static int16 smush_buf_small[32+100]; + +void mk_tables(int32 param) { + int32 variable1, variable2, variable3, variable4, count_1, count_2; + int32 tmp_param, tmp_param_tmp, tmp_value1, tmp_value2, b1, b2; + int32 * tmp_table37_1_2, * tmp_table37_1_1, * tmp_table37_2_2, * tmp_table37_2_1; + int32 value_table37_1_1, value_table37_1_2; + int32 table[64], tmp_a, tmp_c, tmp_d, s, p, d, tmp_ib, tmp; + int32 * table37_1, * table37_2, * tmp_table, l; + byte * ptr; + + if (param == 8) { + table37_1 = (int32*)&codec37_table[64]; + table37_2 = (int32*)&codec37_table[96]; + ptr = (byte*)&smush_mktable1 + 128; + for (l = 0; l < 256; l++) { + *ptr = 0; + ptr += 388; + } + ptr = (byte*)&smush_mktable1 + 129; + for (l = 0; l < 256; l++) { + *ptr = 0; + ptr += 388; + } + } + + if (param == 4) { + table37_1 = (int32*)&codec37_table[0]; + table37_2 = (int32*)&codec37_table[32]; + ptr = (byte*)&smush_mktable2 + 32; + for (l = 0; l < 256; l++) { + *ptr = 0; + ptr += 128; + } + ptr = (byte*)&smush_mktable2 + 33; + for (l = 0; l < 256; l++) { + *ptr = 0; + ptr += 128; + } + } + + s = 0; + p = 0; + tmp_param = param * param; + tmp_table37_1_1 = table37_1; + tmp_table37_2_1 = table37_2; + count_1 = 16; + do { + tmp_table37_1_2 = table37_1; + tmp_table37_2_2 = table37_2; + count_2 = 16; + do { + tmp = *(int32*)(tmp_table37_2_1); + tmp_value1 = tmp; + if (tmp == 0) { + b1 = 0; + goto label3; + } + if ((tmp_value1 - param) == -1) { + b1 = 1; + goto label3; + } + b1 = 2; + tmp = *(int32*)(tmp_table37_1_1); + if (tmp != 0) { + b1 = 0; + tmp -= param; + if (tmp == -1) + b1 = 3; + else + b1 = 4; + } +label3: + tmp = *(int32*)(tmp_table37_2_2); + tmp_value2 = tmp; + if (tmp == 0) { + b2 = 0; + goto label4; + } + if ((tmp_value2 - param) == -1) { + b2 = 1; + goto label4; + } + tmp = *(int32*)(tmp_table37_1_2); + if (tmp == 0) { + b2 = 2; + goto label4; + } + tmp -= param; + if (tmp == -1) + b2 = 3; + else + b2 = 4; +label4: + tmp_param_tmp = tmp_param - 1; + d = tmp_param_tmp; + if(tmp_param != 0) { + do { + table[d] = 0; + } while (d-- != 0); + } + value_table37_1_1 = *(int32*)(tmp_table37_1_1); + value_table37_1_2 = *(int32*)(tmp_table37_1_2); + tmp_c = abs(tmp_value2 - tmp_value1); + tmp_a = abs(value_table37_1_2 - value_table37_1_1); + if (tmp_c <= tmp_a) { + tmp_c = tmp_a; + } + variable1 = 0; + tmp_c++; + variable2 = tmp_c; + if (tmp_c <= 0) + goto label27; + do { + tmp_a = variable2; + if (tmp_a > 1) { + tmp_c = tmp_a; + tmp_a = variable1; + tmp_c -= tmp_a; + tmp_a = variable2; + tmp_c--; + tmp_a--; + tmp_ib = tmp_a; + tmp_d = value_table37_1_1; + tmp_ib >>= 1; + variable3 = tmp_a; + tmp_a = value_table37_1_2; + tmp_d *= variable1; + tmp_a *= tmp_c; + tmp_a += tmp_d; + tmp_a += tmp_ib; + tmp_a /= variable3; + tmp_d = tmp_value2; + variable4 = tmp_a; + tmp_a = tmp_value1; + tmp_d *= tmp_c; + tmp_a *= variable1; + tmp_d += tmp_a; + tmp_a = tmp_d + tmp_ib; + tmp_a /= variable3; + } else { + tmp_a = value_table37_1_1; + variable4 = tmp_a; + tmp_a = tmp_value1; + } + tmp_c = param; + tmp_d = variable4; + tmp_c *= tmp_a; + tmp_c += tmp_d; + tmp_table = &table[tmp_c]; + *(int32*)(tmp_table) = 1; + if (b1 != 2) + goto label8; + if (b2 == 3) + goto label11; +label8: + if (b2 != 2) + goto label9; + if (b1 == 3) + goto label11; +label9: + if (b1 != 0) + goto label10; + if (b2 != 1) + goto label11; +label10: + if (b2 != 0) + goto label12; + if (b1 == 1) + goto label13; +label11: + if (tmp_a < 0) + goto label26; + tmp_c = param; + tmp_c <<= 2; + do { + *(int32*)(tmp_table) = 1; + tmp_table -= tmp_c / 4; + } while (--tmp_a >= 0); + goto label26; +label12: + if (b1 != 1) + goto label14; +label13: + if (b2 != 0) + goto label15; +label14: + if (b2 != 1) + goto label16; + if (b1 == 0) + goto label17; +label15: + tmp_c = param; + if (tmp_c <= tmp_a) + goto label26; + tmp_c <<= 2; + tmp_d = param; + tmp_d -= tmp_a; + do { + *(int32*)(tmp_table) = 1; + tmp_table += tmp_c / 4; + } while (--tmp_d != 0); + goto label26; +label16: + if (b1 != 0) + goto label18; +label17: + if (b2 == 1) + goto label21; +label18: + if (b2 != 0) + goto label19; + if (b1 == 1) + goto label21; +label19: + if (b1 != 3) + goto label20; + if (b2 != 2) + goto label21; +label20: + if (b2 != 3) + goto label22; + if (b1 == 2) + goto label23; +label21: + tmp_c = param; + if (tmp_c <= variable4) + goto label26; + tmp_c -= variable4; + d = tmp_c; + do { + *(uint32*)(tmp_table++) = 1; + } while (--d != 0); + goto label26; +label22: + if (b1 != 2) + goto label24; +label23: + if (b2 != 3) + goto label25; +label24: + if (b2 != 2) + goto label26; + if (b1 == 3) + goto label26; +label25: + if (variable4 >= 0) { + tmp_c = variable4 + 1; + d = tmp_c; + do { + *(uint32*)(tmp_table--) = 1; + } while (--d != 0); + } +label26:; + } while (variable2 > ++variable1); +label27: + if (tmp_param != 0) { + if (param == 8) { + tmp_c = tmp_param_tmp; + do { + if (table[tmp_c] != 0) { + smush_mktable1[0 + s + smush_mktable1[128 + s]] = (byte)tmp_c; + smush_mktable1[128 + s]++; + } else { + smush_mktable1[64 + s + smush_mktable1[129 + s]] = (byte)tmp_c; + smush_mktable1[129 + s]++; + } + } while (tmp_c-- != 0); + } + if (param == 4) { + tmp_c = tmp_param_tmp; + do { + if (table[tmp_c] != 0) { + smush_mktable2[0 + p + smush_mktable2[32 + p]] = (byte)tmp_c; + smush_mktable2[32 + p]++; + } else { + smush_mktable2[16 + p + smush_mktable2[33 + p]] = (byte)tmp_c; + smush_mktable2[33 + p]++; + } + } while (tmp_c-- != 0); + } + } + p += 128; + s += 388; + tmp_table37_1_2++; + tmp_table37_2_2++; + } while (--count_2 != 0); + tmp_table37_1_1++; + tmp_table37_2_1++; + } while (--count_1!= 0); +} + +void make_tables(int32 width) { + if (last_table_width == width) + return; + last_table_width = width; + + int32 a, c, d, s, tmp_value, tmp_offset; + int16 tmp, tmp2; + + int16 * tmp_ptr = (int16*)&codec47_temp_table; + int16 * ptr_table = (int16*)&codec47_table[1]; + do { + int16 tmp_word = *(int16*)(ptr_table); + ptr_table += 2; + tmp_word *= (int16)width; + tmp_word += *(int16*)(ptr_table - 3); + tmp_ptr++; + *(int16*)(tmp_ptr - 1) = tmp_word; + } while (tmp_ptr < &codec47_temp_table[255]); + a = 0; + c = 0; + s = 0; + tmp_value = 0; + do { + d = 0; + tmp = smush_mktable2[32 + c]; + if (tmp != 0) { + do { + tmp = smush_mktable2[0 + c + d]; + tmp2 = tmp; + tmp2 >>= 2; + tmp &= 3; + tmp2 &= 0xFFFF00FF; + tmp2 *= (int16)width; + tmp2 += tmp; + smush_buf_small[s + d] = tmp2; + d++; + tmp = smush_mktable2[32 + c]; + } while (tmp > d); + } + d = 0; + tmp = smush_mktable2[33 + c]; + if (tmp != 0) { + do { + tmp = smush_mktable2[16 + c + d]; + tmp2 = tmp; + tmp2 >>= 2; + tmp &= 3; + tmp2 &= 0xFFFF00FF; + tmp2 *= (int16)width; + tmp2 += tmp; + smush_buf_small[16 + s + d] = tmp2; + d++; + tmp = smush_mktable2[33 + c]; + } while (tmp > d); + } + d = 0; + tmp = smush_mktable1[128 + a]; + if (tmp != 0) { + do { + tmp = smush_mktable1[0 + a + d]; + tmp2 = tmp >> 3; + tmp = tmp & 7; + tmp2 &= 0xFFFF00FF; + tmp2 *= (int16)width; + tmp2 += tmp; + tmp_offset = tmp_value; + tmp_offset += d; + d++; + smush_buf_big[tmp_offset] = tmp2; + tmp = smush_mktable1[128 + a]; + } while (tmp > d); + } + d = 0; + tmp = smush_mktable1[129 + a]; + if (tmp != 0) { + do { + tmp = smush_mktable1[64 + a + d]; + tmp2 = tmp >> 3; + tmp = tmp & 7; + tmp2 &= 0xFFFF00FF; + tmp2 *= (int16)width; + tmp2 += tmp; + tmp_offset = tmp_value; + tmp_offset += d; + d++; + smush_buf_big[64 + tmp_offset] = tmp2; + tmp = smush_mktable1[129 + a]; + } while (tmp > d); + } + + a += 388; + tmp_value += 194; + c += 128; + s += 64; + } while (s < 16384); +} + +static void bomp_decode(byte *dst, byte *src, int32 len) { + byte code; + byte color; + int32 num; + + do { + code = *src++; + if (code & 1) { + num = (code >> 1) + 1; + color = *src++; + memset(dst, color, num); + dst += num; + } else { + num = (code >> 1) + 1; + memcpy(dst, src, num); + dst += num; + src += num; + } + } while (len -= num); +} + +static int32 codec47_decode2_offset1; +static int32 codec47_decode2_offset2; +static int16 * codec47_decode2_table; +static int32 d_pitch; +static byte * codec47_decode2_param_ptr; +static int16 * codec47_decode2_buf2; +static int16 * codec47_decode2_buf1; +static int32 codec47_subgfx_width_blocks; +static int32 codec47_subgfx_height_blocks; +static int32 codec47_subgfx_width_pixels; +static byte * d_src; +static byte * d_dst; + +static void codec47_subgfx_lev4() { + int32 tmp, tmp2; + byte code = *d_src; + if (code < 0xF8) { + d_src++; + tmp2 = codec47_decode2_table[code] + codec47_decode2_offset1; + *(uint16*)(d_dst + (d_pitch * 0)) = *(uint16*)(d_dst + (d_pitch * 0) + tmp2); + *(uint16*)(d_dst + (d_pitch * 1)) = *(uint16*)(d_dst + (d_pitch * 1) + tmp2); + return; + } + if (code == 0xFF) { + *(uint16*)(d_dst + (d_pitch * 0)) = *(uint16*)(d_src + (d_pitch * 0) + 1); + *(uint16*)(d_dst + (d_pitch * 1)) = *(uint16*)(d_src + (d_pitch * 1) + 3); + d_src += 5; + return; + } + if (code == 0xFE) { + tmp = *(d_src + 1); + int32 val = tmp | tmp << 8; + d_src += 2; + *(uint16*)(d_dst + (d_pitch * 0)) = (int16)val; + *(uint16*)(d_dst + (d_pitch * 1)) = (int16)val; + return; + } + if (code == 0xFC) { + tmp2 = codec47_decode2_offset2; + d_src++; + *(uint16*)(d_dst + (d_pitch * 0)) = *(uint16*)(d_dst + (d_pitch * 0) + tmp2); + *(uint16*)(d_dst + (d_pitch * 1)) = *(uint16*)(d_dst + (d_pitch * 1) + tmp2); + return; + } + tmp = *(codec47_decode2_param_ptr + code); + int32 val = tmp | tmp << 8; + d_src++; + *(uint16*)(d_dst + (d_pitch * 0)) = (int16)val; + *(uint16*)(d_dst + (d_pitch * 1)) = (int16)val; +} + +static void codec47_subgfx_lev3() { + int32 tmp, tmp2; + byte code = *d_src; + if (code < 0xF8) { + d_src++; + tmp2 = codec47_decode2_table[code] + codec47_decode2_offset1; + byte * dst2 = d_dst + d_pitch * 2; + *(uint32*)(dst2 + (d_pitch * 0)) = *(uint32*)(dst2 + (d_pitch * 0) + tmp2); + *(uint32*)(d_dst + (d_pitch * 0)) = *(uint32*)(d_dst + (d_pitch * 0) + tmp2); + *(uint32*)(dst2 + (d_pitch * 1)) = *(uint32*)(dst2 + (d_pitch * 1) + tmp2); + *(uint32*)(d_dst + (d_pitch * 1)) = *(uint32*)(d_dst + (d_pitch * 1) + tmp2); + return; + } + if (code == 0xFF) { + d_src++; + byte * tmp_dst = d_dst; + codec47_subgfx_lev4(); + d_dst += 2; + codec47_subgfx_lev4(); + d_dst += d_pitch * 2 - 2; + codec47_subgfx_lev4(); + d_dst += 2; + codec47_subgfx_lev4(); + d_dst = tmp_dst; + return; + } + if (code == 0xFE) { + int32 val = codec47_delta[*(d_src + 1)]; + d_src += 2; + *(uint32*)(d_dst + (d_pitch * 0)) = val; + *(uint32*)(d_dst + (d_pitch * 1)) = val; + *(uint32*)(d_dst + (d_pitch * 2)) = val; + *(uint32*)(d_dst + (d_pitch * 3)) = val; + return; + } + if (code == 0xFD) { + d_src += 4; + return; + + byte * tmp_ptr = (*(d_src + 1) << 7) + (byte*)codec47_decode2_buf2; + int32 l = *(tmp_ptr + 96); + byte val = *(d_src + 2); + int16 * tmp_ptr2 = (int16*)tmp_ptr; + do { + *(d_dst + *(tmp_ptr2)) = val; + tmp_ptr2++; + } while (--l); + l = *(tmp_ptr + 97); + val = *(d_src + 3); + tmp_ptr2 = (int16*)(tmp_ptr + 32); + do { + *(d_dst + *(tmp_ptr2)) = val; + tmp_ptr2++; + } while (--l); + d_src += 4; + return; + } + if (code == 0xFC) { + d_src++; + tmp2 = codec47_decode2_offset2; + byte * dst2 = d_dst + d_pitch * 2; + *(uint32*)(dst2 + (d_pitch * 0)) = *(uint32*)(dst2 + (d_pitch * 0) + tmp2); + *(uint32*)(d_dst + (d_pitch * 0)) = *(uint32*)(d_dst + (d_pitch * 0) + tmp2); + *(uint32*)(dst2 + (d_pitch * 1)) = *(uint32*)(dst2 + (d_pitch * 1) + tmp2); + *(uint32*)(d_dst + (d_pitch * 1)) = *(uint32*)(d_dst + (d_pitch * 1) + tmp2); + return; + } + tmp = *(codec47_decode2_param_ptr + code); + d_src++; + int32 val = codec47_delta[tmp]; + *(uint32*)(d_dst + (d_pitch * 0)) = val; + *(uint32*)(d_dst + (d_pitch * 1)) = val; + *(uint32*)(d_dst + (d_pitch * 2)) = val; + *(uint32*)(d_dst + (d_pitch * 3)) = val; +} + +static void codec47_subgfx_lev2() { + int32 tmp, tmp2; + byte code = *d_src; + if (code < 0xF8) { + d_src++; + tmp2 = codec47_decode2_table[code] + codec47_decode2_offset1; + byte * dst2 = d_dst + d_pitch * 4; + *(uint32*)(dst2 + (d_pitch * 0) + 0) = *(uint32*)(dst2 + (d_pitch * 0) + tmp2); + *(uint32*)(d_dst + (d_pitch * 0) + 0) = *(uint32*)(d_dst + (d_pitch * 0) + tmp2); + *(uint32*)(dst2 + (d_pitch * 0) + 4) = *(uint32*)(dst2 + (d_pitch * 0) + tmp2 + 4); + *(uint32*)(d_dst + (d_pitch * 0) + 4) = *(uint32*)(d_dst + (d_pitch * 0) + tmp2 + 4); + *(uint32*)(dst2 + (d_pitch * 1) + 0) = *(uint32*)(dst2 + (d_pitch * 1) + tmp2); + *(uint32*)(d_dst + (d_pitch * 1) + 0) = *(uint32*)(d_dst + (d_pitch * 1) + tmp2); + *(uint32*)(dst2 + (d_pitch * 1) + 4) = *(uint32*)(dst2 + (d_pitch * 1) + tmp2 + 4); + *(uint32*)(d_dst + (d_pitch * 1) + 4) = *(uint32*)(d_dst + (d_pitch * 1) + tmp2 + 4); + *(uint32*)(dst2 + (d_pitch * 2) + 0) = *(uint32*)(dst2 + (d_pitch * 2) + tmp2); + *(uint32*)(d_dst + (d_pitch * 2) + 0) = *(uint32*)(d_dst + (d_pitch * 2) + tmp2); + *(uint32*)(dst2 + (d_pitch * 2) + 4) = *(uint32*)(dst2 + (d_pitch * 2) + tmp2 + 4); + *(uint32*)(d_dst + (d_pitch * 2) + 4) = *(uint32*)(d_dst + (d_pitch * 2) + tmp2 + 4); + *(uint32*)(dst2 + (d_pitch * 3) + 0) = *(uint32*)(dst2 + (d_pitch * 3) + tmp2); + *(uint32*)(d_dst + (d_pitch * 3) + 0) = *(uint32*)(d_dst + (d_pitch * 3) + tmp2); + *(uint32*)(dst2 + (d_pitch * 3) + 4) = *(uint32*)(dst2 + (d_pitch * 3) + tmp2 + 4); + *(uint32*)(d_dst + (d_pitch * 3) + 4) = *(uint32*)(d_dst + (d_pitch * 3) + tmp2 + 4); + return; + } + if (code == 0xFF) { + byte * tmp_dst = d_dst; + codec47_subgfx_lev3(); + d_dst += 4; + codec47_subgfx_lev3(); + d_dst += d_pitch * 4 - 4; + codec47_subgfx_lev3(); + d_dst += 4; + codec47_subgfx_lev3(); + d_dst = tmp_dst; + return; + } + if (code == 0xFE) { + int32 val = codec47_delta[*(d_src + 1)]; + d_src += 2; + byte * dst2 = d_dst + d_pitch * 4; + *(uint32*)(dst2 + (d_pitch * 0)) = val; + *(uint32*)(d_dst + (d_pitch * 0)) = val; + *(uint32*)(dst2 + (d_pitch * 0) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 0) + 4) = val; + *(uint32*)(dst2 + (d_pitch * 1)) = val; + *(uint32*)(d_dst + (d_pitch * 1)) = val; + *(uint32*)(dst2 + (d_pitch * 1) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 1) + 4) = val; + *(uint32*)(dst2 + (d_pitch * 2)) = val; + *(uint32*)(d_dst + (d_pitch * 2)) = val; + *(uint32*)(dst2 + (d_pitch * 2) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 2) + 4) = val; + *(uint32*)(dst2 + (d_pitch * 3)) = val; + *(uint32*)(d_dst + (d_pitch * 3)) = val; + *(uint32*)(dst2 + (d_pitch * 3) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 3) + 4) = val; + return; + } + if (code == 0xFD) { + d_src += 4; + return; + tmp = *(d_src + 1); + tmp2 = tmp * 4; + tmp <<= 7; + int32 tmp3 = tmp2 + tmp * 2; + byte * tmp_ptr = tmp + tmp3 + (byte*)codec47_decode2_buf1; + byte l = *(tmp_ptr + 384); + byte val = *(d_src + 2); + int32 * tmp_ptr2 = (int32*)tmp_ptr; + do { + *(d_dst + *(tmp_ptr2)) = val; + tmp_ptr2++; + } while (--l > 0); + l = *(tmp_ptr + 385); + val = *(d_src + 3); + tmp_ptr2 = (int32*)(tmp_ptr + 128); + do { + *(d_dst + *(tmp_ptr2)) = val; + tmp_ptr2++; + } while (--l > 0); + d_src += 4; + return; + } + if (code == 0xFC) { + d_src++; + tmp2 = codec47_decode2_offset2; + byte * dst2 = d_dst + d_pitch * 4; + *(uint32*)(dst2 + (d_pitch * 0)) = *(uint32*)(dst2 + (d_pitch * 0) + tmp2); + *(uint32*)(d_dst + (d_pitch * 0)) = *(uint32*)(d_dst + (d_pitch * 0) + tmp2); + *(uint32*)(dst2 + (d_pitch * 0) + 4) = *(uint32*)(dst2 + (d_pitch * 0) + 4 + tmp2); + *(uint32*)(d_dst + (d_pitch * 0) + 4) = *(uint32*)(d_dst + (d_pitch * 0) + 4 + tmp2); + *(uint32*)(dst2 + (d_pitch * 1)) = *(uint32*)(dst2 + (d_pitch * 1) + tmp2); + *(uint32*)(d_dst + (d_pitch * 1)) = *(uint32*)(d_dst + (d_pitch * 1) + tmp2); + *(uint32*)(dst2 + (d_pitch * 1) + 4) = *(uint32*)(dst2 + (d_pitch * 1) + 4 + tmp2); + *(uint32*)(d_dst + (d_pitch * 1) + 4) = *(uint32*)(d_dst + (d_pitch * 1) + 4 + tmp2); + *(uint32*)(dst2 + (d_pitch * 2)) = *(uint32*)(dst2 + (d_pitch * 2) + tmp2); + *(uint32*)(d_dst + (d_pitch * 2)) = *(uint32*)(d_dst + (d_pitch * 2) + tmp2); + *(uint32*)(dst2 + (d_pitch * 2) + 4) = *(uint32*)(dst2 + (d_pitch * 2) + 4 + tmp2); + *(uint32*)(d_dst + (d_pitch * 2) + 4) = *(uint32*)(d_dst + (d_pitch * 2) + 4 + tmp2); + *(uint32*)(dst2 + (d_pitch * 3)) = *(uint32*)(dst2 + (d_pitch * 3) + tmp2); + *(uint32*)(d_dst + (d_pitch * 3)) = *(uint32*)(d_dst + (d_pitch * 3) + tmp2); + *(uint32*)(dst2 + (d_pitch * 3) + 4) = *(uint32*)(dst2 + (d_pitch * 3) + 4 + tmp2); + *(uint32*)(d_dst + (d_pitch * 3) + 4) = *(uint32*)(d_dst + (d_pitch * 3) + 4 + tmp2); + return; + } + tmp = *(codec47_decode2_param_ptr + code); + d_src++; + int32 val = codec47_delta[tmp]; + byte * dst2 = d_dst + d_pitch * 4; + *(uint32*)(dst2 + (d_pitch * 0)) = val; + *(uint32*)(d_dst + (d_pitch * 0)) = val; + *(uint32*)(dst2 + (d_pitch * 0) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 0) + 4) = val; + *(uint32*)(dst2 + (d_pitch * 1)) = val; + *(uint32*)(d_dst + (d_pitch * 1)) = val; + *(uint32*)(dst2 + (d_pitch * 1) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 1) + 4) = val; + *(uint32*)(dst2 + (d_pitch * 2)) = val; + *(uint32*)(d_dst + (d_pitch * 2)) = val; + *(uint32*)(dst2 + (d_pitch * 2) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 2) + 4) = val; + *(uint32*)(dst2 + (d_pitch * 3)) = val; + *(uint32*)(d_dst + (d_pitch * 3)) = val; + *(uint32*)(dst2 + (d_pitch * 3) + 4) = val; + *(uint32*)(d_dst + (d_pitch * 3) + 4) = val; +} + +static byte * g_out; + +static void disp() { + g_scumm->_system->copy_rect((const byte *)g_out, 640, 0, 0, 640, 480); + g_scumm->_system->update_screen(); + g_scumm->waitForTimer(100); +} + +static void decode2(byte * dst, byte * src, int32 offset1, int32 offset2, int32 pitch, + int16 * tmp_table, byte * param_ptr, int32 height, int32, + int16 * buf2, int16 * buf1) { + d_dst = dst; + d_src = src; + codec47_decode2_offset1 = offset1; + codec47_decode2_offset2 = offset2; + d_pitch = pitch; + codec47_decode2_table = tmp_table; + codec47_decode2_param_ptr = param_ptr - 0xf8; + codec47_decode2_buf1 = buf1; + codec47_decode2_buf2 = buf2; + codec47_subgfx_height_blocks = (height + 7) >> 3; + codec47_subgfx_width_blocks = (pitch + 7) >> 3; + codec47_subgfx_width_pixels = pitch << 3; + codec47_subgfx_width_pixels -= pitch; + + do { + int32 tmp_codec47_subgfx_width_blocks = codec47_subgfx_width_blocks; + do { + codec47_subgfx_lev2(); + d_dst += 8; + } while (--tmp_codec47_subgfx_width_blocks); + d_dst += codec47_subgfx_width_pixels; + } while (--codec47_subgfx_height_blocks); +} + bool Codec47Decoder::initSize(const Point & p, const Rect & r) { - Decoder::initSize(p, r); - clean(); -// int32 frame_size = getRect().width() * getRect().height(); + if(r.width() != getRect().width() && r.height() != getRect().height()) { + if( + (r.width() != 640 || r.height() != 480) + ) + return false; + Decoder::initSize(p, r); + clean(); - return true; + mk_tables(4); + mk_tables(8); + + int32 frame_size = getRect().width() * getRect().height(); + _deltaSize = frame_size * 3; + _deltaBuf = new byte[_deltaSize]; + _deltaBufs[0] = _deltaBuf; + _deltaBufs[1] = _deltaBuf + frame_size; + _curBuf = _deltaBuf + frame_size * 2; + + return true; + } + return false; } Codec47Decoder::Codec47Decoder() { } void Codec47Decoder::clean() { + last_table_width = -1; + if(_deltaBuf) { + delete []_deltaBuf; + _deltaSize = 0; + _deltaBuf = 0; + _deltaBufs[0] = 0; + _deltaBufs[1] = 0; + } } Codec47Decoder::~Codec47Decoder() { @@ -43,6 +1018,126 @@ Codec47Decoder::~Codec47Decoder() { } bool Codec47Decoder::decode(Blitter & dst, Chunk & src) { + g_out = dst.getPtr(); + int32 width = getRect().width(); + int32 height = getRect().height(); + int32 offset_table1 = _deltaBufs[1] - _curBuf; + int32 offset_table2 = _deltaBufs[0] - _curBuf; + + int32 chunk_size = src.getSize() - 14; + byte * chunk_buffer = (byte*)malloc(chunk_size); + src.read(chunk_buffer, chunk_size); + + int32 first_word = READ_LE_UINT16(chunk_buffer + 0); + + byte * gfx_data = chunk_buffer + 26; + byte * tmp_ptr, * tmp_ptr1, * tmp_ptr2, * tmp_ptr3; + + if (first_word == 0) { + make_tables(width); + memset(_deltaBufs[0], chunk_buffer[12], width * height); + memset(_deltaBufs[1], chunk_buffer[13], width * height); + _var100 = -1; + } + + byte * tmp_curBuf = _curBuf; + + byte * ptr; + int32 r, l, count; + byte * ff = gfx_data; + if ((chunk_buffer[4] & 1) != 0) { + r = 0; + ptr = (byte*)smush_buffer; + count = r; + do { + l = count; + if (ptr <= &smush_buffer[65536 + 256]) { + tmp_ptr = ptr; + do { + byte tmp = *gfx_data++; + *tmp_ptr = tmp; + tmp_ptr += 256; + smush_buffer[l + r] = tmp; + } while (++l < 256); + } + r += 256; + ptr += 257; + count++; + } while (ptr < &smush_buffer[65536 + 256]); + } + + switch(chunk_buffer[2]) { + case 0: + memcpy(_curBuf, gfx_data, width * height); + _var104 = _curBuf; + break; + case 1: + warning("codec47: not implemented decode1 proc"); +// decode1(_curBuf, gfx_data, width * height, &smush_buffer) + _var104 = _curBuf; + break; + case 2: +// if (((arg_7 & 16) != 0) && (param1 == 0)) + if (chunk_buffer[3] == 0) { + _var100 = first_word; + free(chunk_buffer); + return false; + } + if ((first_word - _var100) == 1) { + decode2(tmp_curBuf, gfx_data, offset_table1, offset_table2, width, + codec47_temp_table, chunk_buffer + 8, height, width * 8, + smush_buf_small, smush_buf_big); + _var104 = _curBuf; + } + break; + case 3: +// if (((arg_7 & 16) != 0) && (param1 == 0)) + if (chunk_buffer[3] == 0) { + _var100 = first_word; + free(chunk_buffer); + return false; + } + memcpy(_curBuf, _deltaBufs[1], width * height); + _var104 = _curBuf; + break; + case 4: +// if (((arg_7 & 16) != 0) && (param1 == 0)) + if (chunk_buffer[3] == 0) { + _var100 = first_word; + free(chunk_buffer); + return false; + } + memcpy(_curBuf, _deltaBufs[0], width * height); + _var104 = _curBuf; + break; + case 5: + bomp_decode(_curBuf, gfx_data, READ_LE_UINT32(chunk_buffer + 14)); + _var104 = _curBuf; + break; + } + + if (_var104 != 0) { + dst.blit(_var104, width * height); +// dst.blit(_curBuf, width * height); + } + + if ((first_word - _var100) == 1) { + if (chunk_buffer[3] == 1) { + tmp_ptr1 = _curBuf; + _curBuf = _deltaBufs[1]; + _deltaBufs[1] = tmp_ptr1; + } else if (chunk_buffer[3] == 2) { + tmp_ptr = _deltaBufs[0]; + tmp_ptr2 = _deltaBufs[1]; + tmp_ptr3 = _curBuf; + _deltaBufs[0] = tmp_ptr2; + _deltaBufs[1] = tmp_ptr3; + _curBuf = tmp_ptr; + } + } + _var100 = first_word; + + free(chunk_buffer); return true; } diff --git a/scumm/smush/codec47.h b/scumm/smush/codec47.h index 15ffb2c34d..98cb5c112a 100644 --- a/scumm/smush/codec47.h +++ b/scumm/smush/codec47.h @@ -28,6 +28,12 @@ class Codec47Decoder : public Decoder { private: + int32 _deltaSize; + byte * _deltaBufs[2]; + byte * _deltaBuf; + byte * _curBuf; + int32 _var100; + byte * _var104; public: bool initSize(const Point &, const Rect &); diff --git a/scumm/smush/player.cpp b/scumm/smush/player.cpp index a8ac75db2e..c450c0ccb5 100644 --- a/scumm/smush/player.cpp +++ b/scumm/smush/player.cpp @@ -526,8 +526,9 @@ void SmushPlayer::handleFrameObject(Chunk & b) { _codec37Called = true; break; case 47: - initSize(r, false, true); + initSize(r, true, false); decodeCodec(b, r, _codec47); + _codec37Called = true; break; case 21: case 44: |