فهرست منبع

experiment with twirling icon while core API downloads

David Rose 14 سال پیش
والد
کامیت
939fc2da2d

+ 2 - 1
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
 //

+ 739 - 0
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;
+}
+

+ 25 - 0
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
+

BIN
direct/src/plugin/twirl.xcf


+ 167 - 10
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);
-
-      // Also set a timer to go off every once in a while, just in
-      // case something slips through.
-      SetTimer(hwnd, 1, 1000, NULL);
+      // Save the window handle.
+      _hwnd = (HWND)window->window;
+
+      // 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

+ 7 - 1
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 <vector>
 
@@ -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__