diff --git a/direct/src/plugin/Sources.pp b/direct/src/plugin/Sources.pp index 937e9efabe..86f4cd8aba 100644 --- a/direct/src/plugin/Sources.pp +++ b/direct/src/plugin/Sources.pp @@ -181,7 +181,8 @@ find_root_dir.cxx find_root_dir.h \ $[if $[IS_OSX],find_root_dir_assist.mm] \ is_pathsep.h is_pathsep.I \ - mkdir_complete.cxx mkdir_complete.h + mkdir_complete.cxx mkdir_complete.h \ + get_twirl_data.cxx get_twirl_data.h #begin static_lib_target // diff --git a/direct/src/plugin/get_twirl_data.cxx b/direct/src/plugin/get_twirl_data.cxx new file mode 100755 index 0000000000..86c18540be --- /dev/null +++ b/direct/src/plugin/get_twirl_data.cxx @@ -0,0 +1,739 @@ +// Filename: get_twirl_data.cxx +// Created by: drose (24Aug11) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "get_twirl_data.h" +#include "string.h" + +struct twirl_flip { + int _index; + bool _flip_x; + bool _flip_y; + bool _exchange; +}; + +static twirl_flip twirl_flip_table[twirl_num_steps] = { + { 0, false, false, false }, // 0 + { 1, false, false, false }, // 30 + { 2, false, false, false }, // 60 + { 0, false, true, true }, // 90 + { 1, false, true, true }, // 120 + { 2, false, true, true }, // 150 + { 0, true, true, false }, // 180 + { 1, true, true, false }, // 210 + { 2, true, true, false }, // 240 + { 0, true, false, true }, // 270 + { 1, true, false, true }, // 300 + { 2, true, false, true } // 330 +}; + +// These tables are the raw data for the twirl icon data. They're +// extracted with bin2c from the three layers of twirl.xcf, in this +// directory. +static const unsigned char twirl_0_data[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, + 0x5a, 0x3c, 0x3c, 0x5a, 0xdc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xca, 0x15, 0x00, 0x00, 0x15, 0xca, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xb0, + 0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0x1a, 0x00, 0x00, + 0x1a, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf2, 0xfe, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xc4, 0x45, 0x29, 0x94, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0x1a, 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xfe, 0xec, 0xdf, 0xe4, 0xf6, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x97, 0x28, 0x2a, 0x29, 0x2e, 0xe5, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xcc, 0x1a, 0x00, 0x00, 0x1a, 0xcc, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xf9, 0xdf, 0xdf, 0xdf, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xcb, 0x33, 0x2b, + 0x2b, 0x23, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0x1a, 0x00, + 0x00, 0x1a, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xdf, 0xe0, + 0xdf, 0xe2, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x25, 0x2b, 0x2a, 0x24, 0xba, 0xff, 0xfe, 0xff, + 0xff, 0xcc, 0x1a, 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xff, 0xfe, 0xff, + 0xf1, 0xdf, 0xe0, 0xe0, 0xde, 0xf0, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0x35, 0x29, 0x2b, 0x2a, + 0x43, 0xf8, 0xff, 0xff, 0xff, 0xcc, 0x1a, 0x00, 0x00, 0x1a, 0xcc, + 0xff, 0xfe, 0xff, 0xfb, 0xe2, 0xdf, 0xe0, 0xdf, 0xe4, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xb7, 0x22, 0x2a, 0x2b, 0x2d, 0x92, 0xff, 0xff, 0xff, 0xcc, 0x1a, + 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xff, 0xff, 0xec, 0xe0, 0xe0, 0xdf, + 0xde, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0xfa, 0x62, 0x25, 0x2b, 0x29, 0x45, 0xde, + 0xff, 0xff, 0xcc, 0x1a, 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xff, 0xf8, + 0xe2, 0xdf, 0xdf, 0xdf, 0xeb, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xaf, 0xdc, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x35, + 0x2a, 0x2a, 0x26, 0x8a, 0xfc, 0xff, 0xcc, 0x1a, 0x00, 0x00, 0x1a, + 0xcc, 0xff, 0xfe, 0xeb, 0xdf, 0xdf, 0xdf, 0xe2, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf3, 0xe8, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xd1, 0x55, 0x60, 0xa4, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x2a, 0x2b, 0x2a, 0x29, 0xe1, 0xff, 0xcc, + 0x1a, 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xf7, 0xde, 0xdf, 0xe0, 0xe0, + 0xec, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xe3, 0xd3, 0xd1, + 0xf3, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x6c, 0x57, 0x57, 0x52, + 0x65, 0xce, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xd5, 0x37, 0x2a, 0x2b, + 0x25, 0x60, 0xff, 0xcc, 0x1a, 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xe4, + 0xdf, 0xe0, 0xdf, 0xe2, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xef, + 0xd4, 0xd0, 0xd2, 0xd1, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0x56, 0x57, 0x58, 0x58, 0x56, 0x51, 0x8a, 0xd5, 0xff, 0xff, 0xfe, + 0xff, 0x86, 0x24, 0x2b, 0x2b, 0x20, 0xb5, 0xd3, 0x13, 0x00, 0x00, + 0x14, 0xcc, 0xf1, 0xde, 0xe0, 0xe0, 0xdf, 0xf1, 0xff, 0xfe, 0xff, + 0xfe, 0xf2, 0xdd, 0xd0, 0xd1, 0xd2, 0xd2, 0xd1, 0xd1, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0xa4, 0x57, 0x52, 0x58, 0x58, 0x57, 0x53, + 0x62, 0x93, 0xe4, 0xff, 0xff, 0xf9, 0x41, 0x28, 0x2b, 0x25, 0x38, + 0xca, 0x70, 0x74, 0x74, 0x6f, 0xd7, 0xe1, 0xdf, 0xe0, 0xdf, 0xe6, + 0xff, 0xff, 0xff, 0xf5, 0xe0, 0xd4, 0xd0, 0xd1, 0xd2, 0xd1, 0xd0, + 0xd3, 0xe9, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfc, 0xe6, 0x83, + 0x52, 0x57, 0x58, 0x58, 0x57, 0x57, 0x63, 0xa8, 0xfd, 0xff, 0xc5, + 0x1e, 0x21, 0x63, 0xd6, 0xfc, 0xf8, 0xfa, 0xfa, 0xf8, 0xfc, 0xf9, + 0xe8, 0xde, 0xdf, 0xf9, 0xff, 0xfd, 0xe4, 0xd4, 0xd1, 0xd1, 0xd2, + 0xd2, 0xd1, 0xd1, 0xe1, 0xfa, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xc1, 0x68, 0x59, 0x57, 0x57, 0x58, 0x57, + 0x52, 0x70, 0xd8, 0xf3, 0x73, 0xa6, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf1, 0xed, 0xfc, 0xf2, 0xd6, 0xd0, + 0xd1, 0xd2, 0xd1, 0xd1, 0xd2, 0xd7, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf4, 0xa3, + 0x6a, 0x53, 0x57, 0x58, 0x58, 0x55, 0x4f, 0x98, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xcf, 0xd1, 0xd2, 0xd2, 0xd1, 0xd1, 0xd8, 0xe8, 0xfe, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xe1, 0x9d, 0x54, 0x54, 0x58, 0x58, 0x50, + 0xb8, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xec, 0xd0, 0xd2, 0xd2, 0xd0, 0xd2, 0xe7, + 0xf8, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0xe2, + 0x7a, 0x50, 0x53, 0x84, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xde, 0xd0, + 0xd0, 0xde, 0xf9, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x5f, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xd5, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xe2, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe9, 0xda, + 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf3, 0xf4, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf6, + 0xa4, 0x7e, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x7e, 0xb1, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xdc, 0xc6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc6, 0xd7, 0x94, 0x6f, 0x72, 0x72, 0x72, 0x72, 0x72, + 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x6e, 0xb2, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xbe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, 0xcf, 0x94, 0x6f, 0x72, + 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x6e, + 0xb2, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xbe, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, + 0xcf, 0xa4, 0x7e, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x7e, 0xb0, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xc6, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + 0xc7, 0xc7, 0xc7, 0xc6, 0xd7, 0xeb, 0xe2, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe6, 0xe1, 0xfd, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf0, 0xf5, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0xa4, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xb6, 0xe4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xfd, 0xed, 0xb2, 0x9c, 0x9e, 0xba, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xc6, 0xaf, 0xae, 0xc5, 0xf3, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xed, 0xc7, 0x9e, 0x9f, 0xa1, 0xa1, 0x9c, + 0xd7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xae, 0xb2, 0xb2, 0xb0, 0xb1, 0xd4, + 0xf3, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf8, 0xca, 0xaa, 0x9e, 0xa0, + 0xa1, 0xa1, 0x9f, 0x9c, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xad, 0xb0, + 0xb2, 0xb2, 0xb1, 0xb0, 0xbb, 0xd7, 0xfc, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xda, 0xa9, + 0xa1, 0xa0, 0xa0, 0xa1, 0xa0, 0x9d, 0xb0, 0xea, 0xf9, 0xbd, 0xd8, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xd7, + 0xc5, 0xf9, 0xea, 0xba, 0xaf, 0xb1, 0xb2, 0xb1, 0xb1, 0xb2, 0xba, + 0xe6, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, + 0xf0, 0xb7, 0x9d, 0xa0, 0xa1, 0xa1, 0xa0, 0xa1, 0xa7, 0xd0, 0xfe, + 0xff, 0xdf, 0x9b, 0x9c, 0xba, 0xed, 0xfe, 0xfc, 0xfd, 0xfd, 0xfc, + 0xfd, 0xed, 0xba, 0x9c, 0x9c, 0xe9, 0xff, 0xfc, 0xd3, 0xb6, 0xb1, + 0xb1, 0xb2, 0xb2, 0xb1, 0xaf, 0xc9, 0xf5, 0xfe, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xf1, 0xca, 0xa0, 0x9e, 0xa1, 0xa1, 0xa0, 0x9e, 0xa7, + 0xc3, 0xf1, 0xff, 0xff, 0xfa, 0xa7, 0xa0, 0xa1, 0x9e, 0xa9, 0xed, + 0xca, 0xcc, 0xcc, 0xca, 0xe8, 0xa4, 0x9e, 0xa1, 0x9f, 0xae, 0xfd, + 0xff, 0xff, 0xef, 0xca, 0xb5, 0xaf, 0xb1, 0xb2, 0xb1, 0xaf, 0xb3, + 0xd8, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xda, 0xa0, 0xa0, 0xa1, 0xa1, + 0x9f, 0x9d, 0xbf, 0xe8, 0xff, 0xff, 0xfe, 0xff, 0xc4, 0x9e, 0xa1, + 0xa1, 0x9c, 0xe4, 0xef, 0xa8, 0x9d, 0x9d, 0xa8, 0xf0, 0xd9, 0x9c, + 0xa1, 0xa1, 0x9e, 0xce, 0xff, 0xfe, 0xff, 0xfe, 0xe9, 0xc6, 0xae, + 0xb1, 0xb2, 0xb2, 0xb1, 0xb1, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xac, 0xa0, 0xa0, 0x9d, 0xaa, 0xe5, 0xfd, 0xff, 0xff, 0xfe, 0xff, + 0xe7, 0xa5, 0xa0, 0xa1, 0x9e, 0xbf, 0xff, 0xec, 0xaa, 0xa0, 0xa0, + 0xaa, 0xec, 0xff, 0xb4, 0x9f, 0xa1, 0xa0, 0xa7, 0xf0, 0xff, 0xfe, + 0xff, 0xff, 0xfd, 0xe5, 0xb6, 0xaf, 0xb2, 0xb1, 0xbc, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xe5, 0x9f, 0xa6, 0xcd, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfd, 0xbc, 0xa0, 0xa1, 0xa0, 0xa3, 0xf5, 0xff, + 0xec, 0xaa, 0xa0, 0xa0, 0xaa, 0xec, 0xff, 0xee, 0x9f, 0xa0, 0xa1, + 0xa0, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xd1, 0xb5, + 0xb0, 0xe9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xd2, 0xec, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xe1, 0xa3, 0xa0, 0xa0, + 0x9f, 0xd0, 0xfe, 0xff, 0xec, 0xaa, 0xa0, 0xa0, 0xaa, 0xec, 0xff, + 0xfd, 0xc7, 0x9e, 0xa0, 0xa0, 0xa6, 0xe7, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xec, 0xd9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfc, + 0xb4, 0x9e, 0xa1, 0xa0, 0xaf, 0xf3, 0xff, 0xff, 0xec, 0xaa, 0xa0, + 0xa0, 0xaa, 0xec, 0xff, 0xff, 0xee, 0xab, 0xa0, 0xa1, 0x9e, 0xbd, + 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xd9, 0x9d, 0xa0, 0xa1, 0xa2, 0xd3, 0xff, 0xff, + 0xff, 0xec, 0xaa, 0xa0, 0xa0, 0xaa, 0xec, 0xff, 0xff, 0xff, 0xcb, + 0xa1, 0xa1, 0xa0, 0x9d, 0xe4, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfa, 0xa2, 0xa0, 0xa1, 0xa0, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xec, 0xaa, 0xa0, 0xa0, 0xaa, 0xec, + 0xff, 0xff, 0xff, 0xf9, 0xaa, 0xa0, 0xa1, 0xa0, 0xa9, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x9f, 0xa1, 0xa0, 0x9f, 0xe6, 0xff, 0xfe, 0xff, 0xff, 0xec, 0xaa, + 0xa0, 0xa0, 0xaa, 0xec, 0xff, 0xff, 0xfe, 0xff, 0xdc, 0x9d, 0xa1, + 0xa1, 0x9e, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xe3, 0xa3, 0xa1, 0xa1, 0x9c, 0xc3, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xec, 0xaa, 0xa0, 0xa0, 0xaa, 0xec, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0x9e, 0xa1, 0xa0, 0xa5, 0xeb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x9f, 0xa0, 0xa0, 0xa6, + 0xf6, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xec, 0xaa, 0xa0, 0xa0, 0xaa, + 0xec, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf1, 0xa0, 0xa0, 0xa0, 0x9f, + 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, + 0xe5, 0xac, 0xa0, 0xd4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0xaa, 0xa0, 0xa0, 0xaa, 0xec, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, + 0xcc, 0xa0, 0xac, 0xe5, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xde, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xec, 0xaa, 0xa0, 0xa0, 0xaa, 0xec, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xdb, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa9, 0x9e, 0x9e, + 0xa9, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xc2, 0xb7, 0xb7, 0xc2, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char twirl_30_data[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x73, 0x58, 0x57, 0x70, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x3e, 0x26, 0x26, 0x3b, 0xd2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfe, 0xbd, + 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x42, 0x2a, 0x2a, + 0x3f, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0x98, 0xf9, + 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xd1, 0x6c, 0x56, 0xa4, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x42, 0x2a, 0x2a, 0x3f, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xfb, 0x7d, 0x00, 0x19, 0xad, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x55, 0x57, 0x57, 0x57, 0xe6, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xd6, 0x42, 0x2a, 0x2a, 0x3f, 0xd3, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xdf, 0x04, 0x00, 0x00, 0x00, 0x7a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdb, 0x60, 0x57, + 0x58, 0x53, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x42, 0x2a, + 0x2a, 0x3f, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4d, 0x00, 0x00, + 0x00, 0x0a, 0xc1, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa3, 0x52, 0x58, 0x58, 0x52, 0xc1, 0xff, 0xfe, 0xff, + 0xff, 0xd6, 0x42, 0x2a, 0x2a, 0x3f, 0xd3, 0xff, 0xff, 0xfe, 0xff, + 0xab, 0x00, 0x00, 0x00, 0x00, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0x65, 0x56, 0x58, 0x57, + 0x68, 0xf4, 0xff, 0xfe, 0xff, 0xd6, 0x42, 0x2a, 0x2a, 0x3f, 0xd3, + 0xff, 0xff, 0xff, 0xf7, 0x1c, 0x00, 0x00, 0x00, 0x0d, 0xfa, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xce, 0x51, 0x57, 0x58, 0x59, 0xa3, 0xff, 0xff, 0xff, 0xd6, 0x42, + 0x2a, 0x2a, 0x3f, 0xd3, 0xff, 0xff, 0xff, 0x7c, 0x02, 0x00, 0x00, + 0x00, 0xa9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x89, 0x53, 0x58, 0x57, 0x69, 0xe0, + 0xff, 0xff, 0xd6, 0x42, 0x2a, 0x2a, 0x3f, 0xd3, 0xff, 0xff, 0xd7, + 0x20, 0x00, 0x00, 0x00, 0x42, 0xfa, 0xfe, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xbc, 0xda, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x62, + 0x57, 0x57, 0x53, 0x9d, 0xfc, 0xff, 0xd6, 0x42, 0x2a, 0x2a, 0x3f, + 0xd3, 0xff, 0xfb, 0x72, 0x00, 0x00, 0x00, 0x0c, 0xb8, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf6, 0xee, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xdc, 0x71, 0x78, 0xa9, 0xfb, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x93, 0x57, 0x58, 0x57, 0x54, 0xe1, 0xff, 0xd6, + 0x42, 0x2a, 0x2a, 0x3f, 0xd3, 0xff, 0xda, 0x00, 0x00, 0x00, 0x00, + 0x53, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xea, 0xe1, 0xdf, + 0xf5, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x85, 0x72, 0x73, 0x6f, + 0x78, 0xcd, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xe4, 0x63, 0x57, 0x58, + 0x54, 0x79, 0xff, 0xd6, 0x42, 0x2a, 0x2a, 0x3f, 0xd3, 0xff, 0x40, + 0x00, 0x00, 0x00, 0x0f, 0xcd, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xf2, + 0xe0, 0xdf, 0xe0, 0xdf, 0xe3, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xcd, + 0x71, 0x72, 0x73, 0x73, 0x72, 0x6d, 0x95, 0xd6, 0xfd, 0xff, 0xfe, + 0xff, 0xa8, 0x52, 0x58, 0x58, 0x50, 0xbc, 0xdb, 0x3c, 0x23, 0x23, + 0x39, 0xdb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0xfe, 0xff, + 0xfe, 0xf5, 0xe6, 0xde, 0xdf, 0xe0, 0xe0, 0xdf, 0xdf, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xb9, 0x76, 0x6d, 0x72, 0x73, 0x72, 0x6f, + 0x78, 0x9f, 0xe0, 0xff, 0xff, 0xfc, 0x70, 0x55, 0x58, 0x53, 0x5f, + 0xd2, 0x8b, 0x8e, 0x8f, 0x8b, 0xd0, 0x10, 0x00, 0x00, 0x00, 0x1b, + 0xf8, 0xff, 0xff, 0xf7, 0xe8, 0xe1, 0xdf, 0xdf, 0xe0, 0xdf, 0xde, + 0xe1, 0xf0, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, 0xee, 0x9e, + 0x6f, 0x72, 0x73, 0x73, 0x72, 0x72, 0x7a, 0xad, 0xfa, 0xff, 0xd8, + 0x4f, 0x50, 0x85, 0xdf, 0xfc, 0xfa, 0xfb, 0xfb, 0xfa, 0xfc, 0xd4, + 0x4f, 0x00, 0x00, 0xba, 0xff, 0xfd, 0xec, 0xe1, 0xdf, 0xdf, 0xe0, + 0xe0, 0xdf, 0xdf, 0xeb, 0xfc, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xd3, 0x83, 0x74, 0x72, 0x72, 0x73, 0x72, + 0x6f, 0x7f, 0xd6, 0xf5, 0x97, 0xb7, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0x9f, 0x5b, 0xf5, 0xf4, 0xe1, 0xdf, + 0xdf, 0xe0, 0xdf, 0xdf, 0xe0, 0xe4, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xb8, + 0x85, 0x6f, 0x72, 0x73, 0x73, 0x71, 0x6a, 0xa0, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe9, 0xdd, 0xdf, 0xe0, 0xe0, 0xdf, 0xdf, 0xe4, 0xf0, 0xff, 0xff, + 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xea, 0xb3, 0x72, 0x6f, 0x73, 0x73, 0x6c, + 0xc1, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xf4, 0xde, 0xe0, 0xe0, 0xdf, 0xe1, 0xef, + 0xfb, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xec, + 0x98, 0x6b, 0x6f, 0x94, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xea, 0xde, + 0xde, 0xea, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7b, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xe3, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xee, 0xe4, + 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf7, 0xf5, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf8, + 0xc3, 0xa5, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa5, 0xc7, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xe6, 0xd4, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, + 0xd5, 0xd5, 0xd4, 0xdf, 0xba, 0x9e, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9d, 0xc8, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xe7, 0xd0, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xdb, 0xba, 0x9e, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9d, + 0xc8, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xe7, 0xd0, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xdb, 0xc6, 0xaa, 0xac, 0xac, 0xac, 0xac, 0xac, 0xad, 0xac, 0xac, + 0xac, 0xac, 0xac, 0xab, 0xca, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xe8, 0xd6, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0xd7, 0xd7, 0xd7, 0xd7, 0xe1, 0xf4, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xf2, 0xe5, 0xfd, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf3, 0xf9, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0xa2, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xc3, 0xe5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xfd, 0xe9, 0xae, 0x9d, 0x9e, 0xb5, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xd2, 0xbf, 0xbe, 0xcc, 0xf3, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xeb, 0xc2, 0x9d, 0x9f, 0xa1, 0xa1, 0x9c, + 0xd2, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xe6, 0xbe, 0xc1, 0xc1, 0xbf, 0xbf, 0xd9, + 0xf3, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf5, 0xc6, 0xa9, 0x9e, 0xa0, + 0xa1, 0xa1, 0x9e, 0x9d, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xbd, 0xbf, + 0xc1, 0xc1, 0xc0, 0xbf, 0xc7, 0xdc, 0xfa, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xd5, 0xa8, + 0xa1, 0xa0, 0xa0, 0xa1, 0xa0, 0x9d, 0xb3, 0xed, 0xfa, 0xc4, 0xd3, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, + 0xcc, 0xfa, 0xf1, 0xca, 0xbe, 0xc0, 0xc1, 0xc0, 0xc0, 0xc1, 0xc6, + 0xe7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfc, + 0xed, 0xb3, 0x9d, 0xa0, 0xa1, 0xa1, 0xa0, 0xa1, 0xa8, 0xd4, 0xff, + 0xff, 0xe9, 0x9c, 0x9c, 0xb6, 0xe9, 0xfd, 0xfc, 0xfd, 0xfd, 0xfc, + 0xfe, 0xef, 0xc6, 0xae, 0xad, 0xea, 0xff, 0xfe, 0xdf, 0xc5, 0xc1, + 0xc0, 0xc1, 0xc1, 0xc0, 0xbe, 0xcf, 0xf5, 0xfd, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xf0, 0xc7, 0x9d, 0x9e, 0xa1, 0xa1, 0xa0, 0x9e, 0xa8, + 0xc6, 0xf4, 0xff, 0xff, 0xfd, 0xad, 0x9f, 0xa1, 0x9e, 0xa4, 0xe7, + 0xc9, 0xca, 0xca, 0xc8, 0xeb, 0xb6, 0xaf, 0xb2, 0xb1, 0xba, 0xfc, + 0xff, 0xff, 0xf6, 0xd7, 0xc5, 0xbf, 0xc0, 0xc1, 0xc1, 0xbf, 0xc0, + 0xdc, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xa0, 0xa0, 0xa1, 0xa1, + 0x9f, 0x9d, 0xc2, 0xea, 0xff, 0xff, 0xfe, 0xff, 0xcd, 0x9d, 0xa1, + 0xa1, 0x9c, 0xd9, 0xf0, 0xa9, 0x9d, 0x9d, 0xa7, 0xee, 0xe4, 0xad, + 0xb2, 0xb2, 0xaf, 0xd3, 0xff, 0xfe, 0xff, 0xff, 0xf0, 0xd4, 0xbe, + 0xc0, 0xc1, 0xc1, 0xc0, 0xc0, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xa0, 0xa0, 0x9d, 0xad, 0xe9, 0xfd, 0xff, 0xff, 0xfe, 0xff, + 0xef, 0xa7, 0xa0, 0xa1, 0x9f, 0xb3, 0xff, 0xed, 0xab, 0xa0, 0xa0, + 0xaa, 0xeb, 0xff, 0xc6, 0xb0, 0xb2, 0xb1, 0xb6, 0xef, 0xff, 0xfe, + 0xff, 0xff, 0xfd, 0xee, 0xc7, 0xbe, 0xc0, 0xc0, 0xc7, 0xfe, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xea, 0xa0, 0xa7, 0xd1, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0xa0, 0xa1, 0xa0, 0x9e, 0xee, 0xff, + 0xec, 0xab, 0xa0, 0xa0, 0xaa, 0xeb, 0xff, 0xf3, 0xb1, 0xb1, 0xb2, + 0xb1, 0xcb, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdd, 0xc4, + 0xc0, 0xec, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xd7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xa6, 0xa0, 0xa0, + 0x9e, 0xc7, 0xfd, 0xff, 0xec, 0xab, 0xa0, 0xa0, 0xaa, 0xeb, 0xff, + 0xfe, 0xd4, 0xb0, 0xb1, 0xb1, 0xb5, 0xe9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xe1, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfd, + 0xbc, 0x9e, 0xa1, 0xa0, 0xaa, 0xed, 0xff, 0xff, 0xec, 0xab, 0xa0, + 0xa0, 0xaa, 0xeb, 0xff, 0xff, 0xf3, 0xbb, 0xb1, 0xb2, 0xb0, 0xc5, + 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xe3, 0x9d, 0xa0, 0xa1, 0xa1, 0xcb, 0xff, 0xff, + 0xff, 0xec, 0xab, 0xa0, 0xa0, 0xaa, 0xeb, 0xff, 0xff, 0xff, 0xd7, + 0xb2, 0xb2, 0xb1, 0xae, 0xe4, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xa8, 0xa0, 0xa1, 0xa0, + 0xa9, 0xf9, 0xff, 0xff, 0xff, 0xec, 0xab, 0xa0, 0xa0, 0xaa, 0xeb, + 0xff, 0xff, 0xff, 0xfc, 0xba, 0xb1, 0xb2, 0xb1, 0xb6, 0xfd, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, + 0x9e, 0xa1, 0xa1, 0x9d, 0xdb, 0xff, 0xfe, 0xff, 0xff, 0xec, 0xab, + 0xa0, 0xa0, 0xaa, 0xeb, 0xff, 0xff, 0xfe, 0xff, 0xe5, 0xaf, 0xb1, + 0xb2, 0xaf, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0xa5, 0xa0, 0xa1, 0x9e, 0xb9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0xab, 0xa0, 0xa0, 0xaa, 0xeb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc8, 0xaf, 0xb2, 0xb2, 0xb5, 0xec, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xa0, 0xa0, 0xa0, 0xa0, + 0xf1, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xec, 0xab, 0xa0, 0xa0, 0xaa, + 0xeb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf5, 0xb3, 0xb1, 0xb1, 0xb0, + 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xe8, 0xae, 0xa0, 0xcb, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xec, + 0xab, 0xa0, 0xa0, 0xaa, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, + 0xd7, 0xb1, 0xbc, 0xe9, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdc, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xec, 0xab, 0xa0, 0xa0, 0xaa, 0xeb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xe2, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa9, 0x9e, 0x9e, + 0xa8, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xc5, 0xb8, 0xb8, 0xc3, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char twirl_60_data[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x93, 0x7b, 0x7b, 0x8c, 0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x6a, 0x54, 0x54, 0x61, 0xd8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc8, + 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x6d, 0x57, 0x57, + 0x64, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xa8, 0xf8, + 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xdc, 0x85, 0x72, 0xaa, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x6d, 0x57, 0x57, 0x64, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xfc, 0x96, 0x28, 0x3e, 0xb6, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x71, 0x72, 0x72, 0x6e, 0xe5, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xe1, 0x6d, 0x57, 0x57, 0x64, 0xd9, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xe6, 0x30, 0x29, 0x2a, 0x27, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x7c, 0x72, + 0x73, 0x6f, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x6d, 0x57, + 0x57, 0x64, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x23, 0x2b, + 0x2b, 0x32, 0xc8, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xba, 0x6d, 0x73, 0x73, 0x6d, 0xc0, 0xff, 0xfe, 0xff, + 0xff, 0xe1, 0x6d, 0x57, 0x57, 0x64, 0xd9, 0xff, 0xff, 0xfe, 0xff, + 0xbd, 0x25, 0x2a, 0x2b, 0x25, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x85, 0x71, 0x73, 0x72, + 0x7e, 0xf0, 0xff, 0xfe, 0xff, 0xe1, 0x6d, 0x57, 0x57, 0x64, 0xd9, + 0xff, 0xff, 0xff, 0xf9, 0x43, 0x2a, 0x2b, 0x29, 0x33, 0xf9, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xde, 0x6d, 0x72, 0x73, 0x73, 0xab, 0xff, 0xff, 0xff, 0xe1, 0x6d, + 0x57, 0x57, 0x64, 0xd9, 0xff, 0xff, 0xff, 0x95, 0x2d, 0x2b, 0x2a, + 0x22, 0xb4, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xa4, 0x6f, 0x73, 0x72, 0x7e, 0xe0, + 0xff, 0xff, 0xe1, 0x6d, 0x57, 0x57, 0x64, 0xd9, 0xff, 0xff, 0xdf, + 0x46, 0x29, 0x2b, 0x25, 0x5e, 0xfa, 0xfe, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xd4, 0xe1, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7e, + 0x72, 0x73, 0x6f, 0xa5, 0xfc, 0xff, 0xe1, 0x6d, 0x57, 0x57, 0x64, + 0xd9, 0xff, 0xfc, 0x8d, 0x26, 0x2a, 0x2a, 0x34, 0xc2, 0xff, 0xfe, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xca, 0x76, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xeb, 0x9f, 0xa3, 0xbf, 0xf9, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xaa, 0x73, 0x73, 0x72, 0x6d, 0xdf, 0xff, 0xe1, + 0x6d, 0x57, 0x57, 0x64, 0xd9, 0xff, 0xe2, 0x2b, 0x2a, 0x2b, 0x2a, + 0x6e, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x73, 0x0d, 0x00, + 0xa1, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xa0, 0xa1, 0x9f, + 0xa1, 0xd7, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xef, 0x7e, 0x72, 0x73, + 0x70, 0x86, 0xff, 0xe1, 0x6d, 0x57, 0x57, 0x64, 0xd9, 0xff, 0x64, + 0x25, 0x2b, 0x2a, 0x37, 0xd2, 0xff, 0xfe, 0xff, 0xff, 0xfa, 0xb5, + 0x14, 0x00, 0x00, 0x00, 0x15, 0xf3, 0xff, 0xfe, 0xff, 0xff, 0xe2, + 0xa0, 0xa0, 0xa1, 0xa1, 0xa0, 0x9d, 0xb3, 0xe0, 0xfc, 0xff, 0xfe, + 0xff, 0xbf, 0x6e, 0x73, 0x73, 0x6d, 0xbc, 0xe6, 0x69, 0x52, 0x52, + 0x60, 0xe0, 0xb8, 0x20, 0x2b, 0x2b, 0x24, 0x83, 0xff, 0xfe, 0xff, + 0xff, 0xbe, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xd5, 0xa7, 0x9c, 0xa0, 0xa1, 0xa0, 0x9e, + 0xa3, 0xbb, 0xe6, 0xff, 0xff, 0xff, 0x8d, 0x6f, 0x73, 0x6f, 0x75, + 0xd7, 0xa5, 0xa6, 0xa7, 0xa2, 0xda, 0x3a, 0x24, 0x2b, 0x28, 0x3f, + 0xf8, 0xff, 0xff, 0xd6, 0x5b, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x74, 0xda, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xf6, 0xc5, + 0x9f, 0xa0, 0xa1, 0xa1, 0xa0, 0xa0, 0xa5, 0xc2, 0xf9, 0xff, 0xe4, + 0x6e, 0x6c, 0x95, 0xe2, 0xfc, 0xfb, 0xfc, 0xfc, 0xfb, 0xfd, 0xde, + 0x70, 0x22, 0x1d, 0xc1, 0xff, 0xfb, 0x7a, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x41, 0xd9, 0xfa, 0xff, 0xfe, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0xaf, 0xa2, 0xa0, 0xa0, 0xa1, 0xa0, + 0x9e, 0xa6, 0xde, 0xf8, 0xad, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xb4, 0x75, 0xf0, 0xc3, 0x24, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0xa0, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xd5, + 0xaf, 0x9f, 0xa0, 0xa1, 0xa1, 0xa0, 0x9b, 0xba, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x73, 0xf0, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xf4, 0xd1, 0xa3, 0x9d, 0xa1, 0xa1, 0x9c, + 0xd2, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, + 0xd1, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf6, + 0xc0, 0x9c, 0x9e, 0xb4, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x5b, 0x00, + 0x00, 0x34, 0xd2, 0xfb, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xaa, 0xe6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0x0e, 0x98, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xe7, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xea, 0xe8, + 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xe7, 0xff, 0xf8, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf9, + 0xc6, 0xa4, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa6, 0xa6, 0xa4, 0xc2, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xf0, 0xe1, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe2, + 0xe1, 0xe1, 0xe1, 0xe8, 0xbe, 0x9e, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9e, 0xc5, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xf0, 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xe5, 0xbe, 0x9e, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x9e, + 0xc5, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xde, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xe5, 0xcb, 0xac, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xae, 0xae, 0xae, 0xac, 0xc8, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xf0, 0xe3, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe4, 0xea, 0xf6, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xea, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xf6, 0xfc, 0xfa, 0xfa, 0xfa, 0xfa, + 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xde, 0xa6, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd3, 0xe8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf1, 0xb8, 0x9b, 0x9f, 0xb1, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xe1, 0xd0, 0xd0, 0xd7, 0xf4, 0xfe, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xf0, 0xcb, 0xa0, 0x9e, 0xa1, 0xa1, 0x9d, + 0xcf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xee, 0xcf, 0xd2, 0xd2, 0xd1, 0xd0, 0xe1, + 0xf5, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0xce, 0xac, 0x9e, 0xa0, + 0xa1, 0xa1, 0x9f, 0x9b, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xd0, 0xd0, + 0xd2, 0xd2, 0xd1, 0xd0, 0xd5, 0xe3, 0xf9, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xe0, 0xab, + 0xa2, 0xa0, 0xa0, 0xa1, 0xa0, 0x9e, 0xaa, 0xe5, 0xf9, 0xc5, 0xd1, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xe7, + 0xd4, 0xfb, 0xf6, 0xdb, 0xd0, 0xd1, 0xd2, 0xd2, 0xd1, 0xd2, 0xd5, + 0xea, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, + 0xf3, 0xbd, 0x9e, 0xa0, 0xa1, 0xa1, 0xa0, 0xa0, 0xa6, 0xc9, 0xfc, + 0xff, 0xea, 0x9c, 0x9c, 0xb4, 0xe7, 0xfe, 0xfc, 0xfd, 0xfd, 0xfc, + 0xfe, 0xf3, 0xd2, 0xbe, 0xbc, 0xea, 0xff, 0xff, 0xeb, 0xd5, 0xd2, + 0xd1, 0xd1, 0xd2, 0xd1, 0xd0, 0xda, 0xf6, 0xfd, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xf3, 0xcf, 0xa2, 0x9d, 0xa0, 0xa1, 0xa0, 0x9e, 0xa5, + 0xbf, 0xec, 0xff, 0xff, 0xfe, 0xaf, 0x9f, 0xa1, 0x9f, 0xa4, 0xe9, + 0xd3, 0xd3, 0xd3, 0xd1, 0xef, 0xc7, 0xbf, 0xc1, 0xc0, 0xc4, 0xfc, + 0xff, 0xff, 0xfa, 0xe4, 0xd6, 0xd0, 0xd1, 0xd2, 0xd2, 0xd1, 0xd0, + 0xe3, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xa0, 0xa0, 0xa1, 0xa1, + 0xa0, 0x9d, 0xb9, 0xe4, 0xfe, 0xff, 0xfe, 0xff, 0xcf, 0x9d, 0xa1, + 0xa1, 0x9c, 0xd7, 0xf5, 0xba, 0xaf, 0xaf, 0xb6, 0xef, 0xed, 0xbd, + 0xc1, 0xc1, 0xbf, 0xd7, 0xff, 0xfe, 0xff, 0xff, 0xf6, 0xe2, 0xd0, + 0xd1, 0xd2, 0xd2, 0xd1, 0xd1, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0xa0, 0xa1, 0x9e, 0xa5, 0xdf, 0xfd, 0xff, 0xff, 0xfe, 0xff, + 0xf1, 0xa7, 0xa0, 0xa1, 0x9f, 0xb2, 0xff, 0xf1, 0xbb, 0xb1, 0xb1, + 0xb7, 0xed, 0xff, 0xd4, 0xbf, 0xc1, 0xc0, 0xc4, 0xef, 0xff, 0xfe, + 0xff, 0xff, 0xfe, 0xf5, 0xd8, 0xd0, 0xd1, 0xd1, 0xd5, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xed, 0xa0, 0xa4, 0xc7, 0xfc, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0xa1, 0xa1, 0xa0, 0x9e, 0xed, 0xff, + 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, 0xed, 0xff, 0xf8, 0xc2, 0xc0, 0xc1, + 0xc0, 0xd2, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xea, 0xd5, + 0xd1, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xd7, 0xe7, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xa7, 0xa0, 0xa0, + 0x9e, 0xc6, 0xfd, 0xff, 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, 0xed, 0xff, + 0xfe, 0xdf, 0xbf, 0xc0, 0xc0, 0xc2, 0xeb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xe9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfd, + 0xbe, 0x9e, 0xa1, 0xa0, 0xaa, 0xed, 0xff, 0xff, 0xf1, 0xbb, 0xb1, + 0xb1, 0xb7, 0xed, 0xff, 0xff, 0xf7, 0xca, 0xc0, 0xc1, 0xbf, 0xcd, + 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xe5, 0x9d, 0xa0, 0xa1, 0xa1, 0xca, 0xff, 0xff, + 0xff, 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, 0xed, 0xff, 0xff, 0xff, 0xe2, + 0xc2, 0xc1, 0xc0, 0xbe, 0xe6, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xaa, 0x9f, 0xa1, 0xa0, + 0xa9, 0xf8, 0xff, 0xfe, 0xff, 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, 0xed, + 0xff, 0xff, 0xff, 0xff, 0xc9, 0xc0, 0xc1, 0xc0, 0xc2, 0xfc, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, + 0x9d, 0xa1, 0xa1, 0x9e, 0xda, 0xff, 0xfe, 0xff, 0xff, 0xf1, 0xbb, + 0xb1, 0xb1, 0xb7, 0xed, 0xff, 0xff, 0xfe, 0xff, 0xee, 0xbf, 0xc0, + 0xc1, 0xbf, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0xa6, 0xa0, 0xa1, 0x9e, 0xb7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, 0xed, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xd7, 0xbe, 0xc1, 0xc1, 0xc2, 0xec, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xa0, 0xa0, 0xa0, 0xa0, + 0xf0, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, + 0xed, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf9, 0xc3, 0xc0, 0xc0, 0xc0, + 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xec, 0xb0, 0xa0, 0xca, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xbb, 0xb1, 0xb1, 0xb7, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xe2, 0xc0, 0xc7, 0xec, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdd, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xbb, 0xb1, 0xb1, 0xb7, 0xed, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe8, 0xfe, 0xff, 0xfe, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xba, 0xb0, 0xb0, + 0xb6, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xd0, 0xc6, 0xc5, 0xcd, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char * const twirl_data[3] = { + twirl_0_data, + twirl_30_data, + twirl_60_data +}; + + +//////////////////////////////////////////////////////////////////// +// Function: get_twirl_data +// Description: Fills the indicated data array with a string of +// twirl_width * twirl_height bytes, representing the +// grayscale pixel values of the twirl_width x +// twirl_height image at frame number step of +// twirl_num_steps frames. Returns true on success, +// false on failure. +// +// You must pass data_length = twirl_width * +// twirl_height; this value is passed as a sanity check +// on array size. You should pass step so that 0 <= +// step < twirl_num_steps. +//////////////////////////////////////////////////////////////////// +bool +get_twirl_data(unsigned char data[], size_t data_length, int step) { + if (step < 0 || step >= twirl_num_steps) { + memset(data, 0, data_length); + return false; + } + if (data_length != twirl_width * twirl_height) { + memset(data, 0, data_length); + return false; + } + + twirl_flip &flip = twirl_flip_table[step]; + const unsigned char *in_data = twirl_data[flip._index]; + + for (int yi = 0; yi < twirl_height; ++yi) { + for (int xi = 0; xi < twirl_width; ++xi) { + int xo = xi; + int yo = yi; + if (flip._flip_x) { + xo = twirl_width - 1 - xo; + } + if (flip._flip_y) { + yo = twirl_width - 1 - yo; + } + if (flip._exchange) { + int t = xo; + xo = yo; + yo = t; + } + + data[yo * twirl_width + xo] = in_data[yi * twirl_width + xi]; + } + } + + return true; +} + diff --git a/direct/src/plugin/get_twirl_data.h b/direct/src/plugin/get_twirl_data.h new file mode 100755 index 0000000000..083ba81d50 --- /dev/null +++ b/direct/src/plugin/get_twirl_data.h @@ -0,0 +1,25 @@ +// Filename: get_twirl_data.h +// Created by: drose (24Aug11) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef GET_TWIRL_DATA_H +#define GET_TWIRL_DATA_H + +static const int twirl_width = 48; +static const int twirl_height = 48; +static const int twirl_num_steps = 12; + +bool get_twirl_data(unsigned char data[], size_t data_length, int step); + +#endif + diff --git a/direct/src/plugin/twirl.xcf b/direct/src/plugin/twirl.xcf new file mode 100755 index 0000000000..cb1be483d1 Binary files /dev/null and b/direct/src/plugin/twirl.xcf differ diff --git a/direct/src/plugin_npapi/ppInstance.cxx b/direct/src/plugin_npapi/ppInstance.cxx index b68fd1276c..4affeb0583 100644 --- a/direct/src/plugin_npapi/ppInstance.cxx +++ b/direct/src/plugin_npapi/ppInstance.cxx @@ -97,6 +97,9 @@ PPInstance(NPMIMEType pluginType, NPP instance, uint16_t mode, _got_window = false; _python_window_open = false; +#ifdef _WIN32 + _hwnd = 0; +#endif // _WIN32 #ifdef __APPLE__ // Get the run loop in the browser thread. (CFRunLoopGetMain() is @@ -252,15 +255,25 @@ set_window(NPWindow *window) { if (!_got_window) { _orig_window_proc = NULL; if (window->type == NPWindowTypeWindow) { - // Subclass the window to make it call our own window_proc instead - // of whatever window_proc it has already. This is just a dopey - // trick to allow us to poll events in the main thread. - HWND hwnd = (HWND)window->window; - _orig_window_proc = SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)window_proc); + // Save the window handle. + _hwnd = (HWND)window->window; - // Also set a timer to go off every once in a while, just in - // case something slips through. - SetTimer(hwnd, 1, 1000, NULL); + // Now that we've got a window handle, we can go get the + // twirling icon images. + win_get_twirl_bitmaps(); + + // Subclass the window to make it call our own window_proc + // instead of whatever window_proc it has already. This is + // mainly just a dopey trick to allow us to poll events in the + // main thread, but we also rely on this to paint the twirling + // icon into the browser window. + SetWindowLongPtr(_hwnd, GWLP_USERDATA, (LONG_PTR)this); + _orig_window_proc = SetWindowLongPtr(_hwnd, GWL_WNDPROC, (LONG_PTR)st_window_proc); + + // Also set a timer to go off every once in a while, to update + // the twirling icon, and also to catch events in case something + // slips through. + SetTimer(_hwnd, 1, 100, NULL); } } #endif // _WIN32 @@ -2043,7 +2056,7 @@ browser_sync_callback(void *) { #ifdef _WIN32 //////////////////////////////////////////////////////////////////// -// Function: PPInstance::window_proc +// Function: PPInstance::st_window_proc // Access: Private, Static // Description: We bind this function to the parent window we were // given in set_window, so we can spin the request_loop @@ -2051,6 +2064,29 @@ browser_sync_callback(void *) { // platforms rely on explicit windows events. //////////////////////////////////////////////////////////////////// LONG PPInstance:: +st_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { + LONG_PTR self = GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (self == NULL) { + // We haven't assigned the pointer yet (!?) + return DefWindowProc(hwnd, msg, wparam, lparam); + } + + return ((PPInstance *)self)->window_proc(hwnd, msg, wparam, lparam); +} +#endif // _WIN32 + +#ifdef _WIN32 +//////////////////////////////////////////////////////////////////// +// Function: PPInstance::window_proc +// Access: Private +// Description: The non-static window_proc() function. +// +// We bind this function to the parent window we were +// given in set_window, so we can spin the request_loop +// when needed. This is only in the Windows case; other +// platforms rely on explicit windows events. +//////////////////////////////////////////////////////////////////// +LONG PPInstance:: window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (!has_plugin_thread_async_call) { // Since we're here in the main thread, call handle_request_loop() @@ -2064,8 +2100,24 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // Eat the WM_ERASEBKGND message, so the browser's intervening // window won't overdraw on top of our own window. return true; + + case WM_PAINT: + if (!_started) { + // If we haven't yet loaded the instance, we can paint a + // twirling icon in the window. + PAINTSTRUCT ps; + HDC dc = BeginPaint(hwnd, &ps); + win_paint_twirl(hwnd, dc); + EndPaint(hwnd, &ps); + } + return true; case WM_TIMER: + if (!_started) { + InvalidateRect(_hwnd, NULL, FALSE); + } + break; + case WM_USER: break; } @@ -2074,6 +2126,111 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { } #endif // _WIN32 + +#ifdef _WIN32 +//////////////////////////////////////////////////////////////////// +// Function: PPInstance::win_get_twirl_bitmaps +// Access: Private +// Description: Fills _twirl_bitmaps with an array of bitmaps for +// drawing the twirling icon while we're waiting for the +// instance to load. +//////////////////////////////////////////////////////////////////// +void PPInstance:: +win_get_twirl_bitmaps() { + BITMAPINFOHEADER bmih; + bmih.biSize = sizeof(bmih); + bmih.biWidth = twirl_width; + bmih.biHeight = -twirl_height; + bmih.biPlanes = 1; + bmih.biBitCount = 32; + bmih.biCompression = BI_RGB; + bmih.biSizeImage = 0; + bmih.biXPelsPerMeter = 0; + bmih.biYPelsPerMeter = 0; + bmih.biClrUsed = 0; + bmih.biClrImportant = 0; + + BITMAPINFO bmi; + memcpy(&bmi, &bmih, sizeof(bmih)); + + HDC dc = GetDC(_hwnd); + + static const size_t twirl_size = twirl_width * twirl_height; + unsigned char twirl_data[twirl_size]; + unsigned char new_data[twirl_size * 4]; + + for (int step = 0; step < twirl_num_steps; ++step) { + get_twirl_data(twirl_data, twirl_size, step); + + // Replicate out the grayscale channels into RGBA. + for (int yi = 0; yi < twirl_height; ++yi) { + const unsigned char *sp = twirl_data + yi * twirl_width; + unsigned char *dp = new_data + yi * twirl_width * 4; + for (int xi = 0; xi < twirl_width; ++xi) { + dp[0] = sp[0]; + dp[1] = sp[0]; + dp[2] = sp[0]; + dp[3] = (unsigned char)0xff; + sp += 1; + dp += 4; + } + } + + // Now load the image. + _twirl_bitmaps[step] = CreateDIBitmap(dc, &bmih, CBM_INIT, (const char *)new_data, &bmi, 0); + } + + ReleaseDC(_hwnd, dc); +} +#endif // _WIN32 + +#ifdef _WIN32 +//////////////////////////////////////////////////////////////////// +// Function: PPInstance::win_paint_twirl +// Access: Private +// Description: Paints the twirling icon into the browser window +// before the instance has started. +//////////////////////////////////////////////////////////////////// +void PPInstance:: +win_paint_twirl(HWND hwnd, HDC dc) { + RECT rect; + GetClientRect(_hwnd, &rect); + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + + // Double-buffer with an offscreen bitmap first. + HDC bdc = CreateCompatibleDC(dc); + HBITMAP buffer = CreateCompatibleBitmap(dc, width, height); + SelectObject(bdc, buffer); + + // Start by painting the background color. + FillRect(bdc, &rect, WHITE_BRUSH); + + if (!_started && !_failed) { + // Which frame are we drawing? + DWORD now = GetTickCount(); + int step = (now / 100) % twirl_num_steps; + + HBITMAP twirl = _twirl_bitmaps[step]; + + int left = rect.left + (width - twirl_width) / 2; + int top = rect.top + (height - twirl_height) / 2; + + HDC mem_dc = CreateCompatibleDC(bdc); + SelectObject(mem_dc, twirl); + + BitBlt(bdc, left, top, twirl_width, twirl_height, + mem_dc, 0, 0, SRCCOPY); + + SelectObject(mem_dc, NULL); + DeleteDC(mem_dc); + } + + // Now blit the buffer to the window. + BitBlt(dc, 0, 0, width, height, bdc, 0, 0, SRCCOPY); +} +#endif // _WIN32 + #ifdef MACOSX_HAS_EVENT_MODELS //////////////////////////////////////////////////////////////////// // Function: PPInstance::copy_cocoa_event diff --git a/direct/src/plugin_npapi/ppInstance.h b/direct/src/plugin_npapi/ppInstance.h index 3c0ec2ceae..04e3caf47d 100644 --- a/direct/src/plugin_npapi/ppInstance.h +++ b/direct/src/plugin_npapi/ppInstance.h @@ -19,6 +19,7 @@ #include "fileSpec.h" #include "get_tinyxml.h" #include "p3d_lock.h" +#include "get_twirl_data.h" #include @@ -105,7 +106,10 @@ private: #ifdef _WIN32 static LONG - window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); + st_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); + LONG window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); + void win_get_twirl_bitmaps(); + void win_paint_twirl(HWND hwnd, HDC dc); #endif // _WIN32 class EventAuxData { @@ -201,6 +205,8 @@ private: NPWindow _window; #ifdef _WIN32 LONG_PTR _orig_window_proc; + HWND _hwnd; + HBITMAP _twirl_bitmaps[twirl_num_steps]; #endif // _WIN32 #ifdef __APPLE__