From 939fc2da2d0a5d1c573aee32a7927d9cffd03f37 Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 25 Aug 2011 00:52:17 +0000 Subject: [PATCH] experiment with twirling icon while core API downloads --- direct/src/plugin/Sources.pp | 3 +- direct/src/plugin/get_twirl_data.cxx | 739 +++++++++++++++++++++++++ direct/src/plugin/get_twirl_data.h | 25 + direct/src/plugin/twirl.xcf | Bin 0 -> 68068 bytes direct/src/plugin_npapi/ppInstance.cxx | 175 +++++- direct/src/plugin_npapi/ppInstance.h | 8 +- 6 files changed, 939 insertions(+), 11 deletions(-) create mode 100755 direct/src/plugin/get_twirl_data.cxx create mode 100755 direct/src/plugin/get_twirl_data.h create mode 100755 direct/src/plugin/twirl.xcf 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 0000000000000000000000000000000000000000..cb1be483d1da4a4b5c67aaf527d83e0c1116ced9 GIT binary patch literal 68068 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 == 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__