> 1) I want to know how to be able to include an image embedded in the
> code somehow rather than as a seperate, external file (this way
> there's no pathing issue possible when compiling the thing).
>
In the past I have successfully used the following method on Windows
on wxPerl 0.26 to decode and decompress Zlib-compressed-uuencoded image
data directly into Wx::Bitmap objects without using any external files.
use Wx 0.26;
use Compress::Zlib;
my $bitmap = Wx::Bitmap->new(
Wx::Image->new( $width, $height,
uncompress( unpack('u',
<<'__END_OF_IMAGE_DATA__'
...
... uuencoded Zlib-compressed image data goes here ...
...
__END_OF_IMAGE_DATA__
))
)
);
I'll attach an executable example to this message, and also a script
to convert Windows bitmaps into executable wxPerl code.
It's for Windows only, but you can easily extend the idea to other
platforms.
> 3) I'd REALLY like to be able to do some real-time OpenGL 3D stuff.
> Totally lost on how.
>
Check this out: http://www.bribes.org/perl/wopengl.html
#!/usr/bin/perl --
use strict;
use warnings;
use Compress::Zlib;
use Wx 0.26;
die "For Windows Only\n" unless Wx::wxMSW();
$MyApp::TITLE = 'My Lame Application';
$MyApp::VERSION = '0.00';
$MyApp::LOGO = Wx::Bitmap->new(
Wx::Image->new( 150, 100,
uncompress( unpack('u',
<<'__END_OF_IMAGE_DATA__'
M>-KMG3%RZSH,15W^,@O()K*1OQEO)UO)%E*F=)LRI4N].[D3#(:4*)`2*<@&
M"D^>1Y;T>[EMAIL PROTECTED]:%G=:"8!`,"X)A03`(1CL$P;`@&[EMAIL PROTECTED]
[EMAIL PROTECTED],`AZMH^/C_]'V??W=Q#<U][?WT>NU[R^OGY^?@;!7>Q^OU^OU_&+;B\O
M+_#Z(+C1$,T0T_IA^N_7"@[EMAIL PROTECTED]&:]</W]O:&4`E'*Q^&"(`X$`0;
M=`OB6#]\<.V?GQ]C/P%KG]K&+<&[EMAIL PROTECTED](C_C#V$Y_:QB'!WKJ%D;/[EMAIL
PROTECTED]
MC3>"O76+CIQ`F9"]W6Z6J[O2-JX(]M8MA<@I6F55U7C3-GX(]M8M;'9>2P=/
M'[EMAIL PROTECTED],B)?R*T-D1O1`S$C2<GV%6WS#H48RFNBS\8
M"2%LFJ/WX=KF6()M/=^N.>[EMAIL PROTECTED]<#JV[S0N3$O1F#ZH':YD""N1K<%Y\HC=S'
MP843"G2AV7N`2Y*R/;P?I6V.(MA;MX"+OEP.488PC(-)"!6)4CNU.43;'$*P
M2O(U&]#`*>A*^"-G`7!L</BC="<[EMAIL PROTECTED]'!FZ'[EMAIL
PROTECTED]'4BCDT`1XBS`1/?<()/
M7H(;-]G<QP9KFY$$N^J6I8D#/M&D'/7@<3E$W!*=CI^[)(5TWO5A"/;[EMAIL PROTECTED]
M,.41#]\P0I9'/4*4T7G'I-`8;3.&8#_=(JW$(2_1_QP*>>G944^?9TOD7$W#
[EMAIL PROTECTED](0(ANDH4!-7%*&PGS4&R"E9E7Q&0DRCO5K'_$LBA;MDB2HM9.,
M>FUY/%P.9\`)\6E?50R"JZVJ/0LMAA;[EMAIL PROTECTED]))[EMAIL PROTECTED];F
M33P+*/$E)6A^`T1LU)PZ"X=?T;69#V?0+BNT(+AEY8@>[EMAIL PROTECTED]
MJ9L"Q"`HS;6J\Y<@;N\8A?0I0RL^E[I$$$3+Z/6@,D<Y<J_4`;VLT"5P/QR%
MET;5("A01#\PS;)TO&3&MB<09")0[C;BI[,SE"#(A`F%AU842Q/PU96CW0FB
M.[&#S3I^$`01AC*VCRC,`D>9Z<_FT*HNS0BY&I,[EMAIL PROTECTED](].V,2)N'(
M'[EMAIL PROTECTED],EY^&E\5\HY'#"!XW1#.Z0#'[EMAIL PROTECTED]/:V>'\.!4]/:DVE+7^
MPO0_QD'C<FVB"26G??LUN5:5"D7S2KT3*>1G*.=P))FPI%>#H&Y&.HC,+Z:_
[EMAIL PROTECTED];%U*#3E/*=0U"43R!11<@[EMAIL PROTECTED]<J+'$3!?[D>KVJO+
M))N*V[-(5NDAM54'05!,[QO:N%X,UO2^PC([EMAIL PROTECTED]&DL95T?;!R;(
M*&1?I]/CT<;U8IYJ:>%2"F:69I2KVWZ?@>!J,FKV)P71WI`KFSU/4C%8SEH_
[EMAIL PROTECTED]@JWW*1Y`!1]R\%QE[3`8X^#M1"98<LGAGL1Y-1`8KLNK6FNRGAX
M)[EMAIL PROTECTED]<]:UU8<4BPTNN-FPJ?5HM:5A/`EZ[!B=LN:3J$Q[([EMAIL PROTECTED]
MFI`L5.3JZMFJI5M.NO-4IPZ/2[,)N>CVI<8GF0\N5>3*XR.JRO6Y?J%S9<"1
M]`W)AN4S>[EMAIL PROTECTED]&[EMAIL PROTECTED]'[\FQ^]5
M9/Y4.1E=-RB1T[Y")/LCDG5\G%;OE$^N*"6F8K/+54&PMFYPJM_H1$Q+Y7^%
MF0L:F76\L-EQ,PC6EE6`7>T>(JF(*/Q*Q$G79YX$06-MX5*JLRQZ*5%&/JKT
M`0ANS$HU+""N'H9;&D90MK:=E^!D*$W?BR!B;WD4DW7&WD\?2A*M9R<X]=_`
M*RL79?$CF=7>[(9MXQU&<.J_B=Z2!-N>YZR=ECX209F1]=L0RI7WI2?LR82B
M:S08_#B+\02GINWJ]N(EV4^D9^6Z*JEK'!BP[=H#P=J<%;?[&8^7!\!.?]6#
M4HO8.XP?\EBGHPC:M4U#"3V+#P7<]%=/V$\/CWS\B!^"=J<H/X:B_,.E!::3
MZA9O!.W:YI#'4#C4+3X)3K9":_MC*(:E/<?K%K<$C=I&,E1+$#D>;2\1=*M;
M/!,T:IO"(I%^#4'O%_WX>=R]*X)&;3-;P2+[&KH^>/;B[Y43W@@:M8U^:FC;
M"UQ.JEO.0G!5V^C'O"QM9>JA6QR^>LDMP6GM!2+ZL7B](^?%\>O//!-<U3;@
M>[O=>D?.B^]7$#HGN!H>>[/S_QI0_P3+$\#>)2[^7\5[%H+3D!<S^=<MIR9(
MQ7([EMAIL PROTECTED],`B&!<&P([EMAIL PROTECTED]([EMAIL
PROTECTED],"X)A03`([EMAIL PROTECTED]"[EMAIL PROTECTED]
$I+<[A0``
__END_OF_IMAGE_DATA__
))
),
);
##############################################################################
package MyAboutBox;
use strict;
use warnings;
use base qw( Wx::Dialog );
use Wx qw( :everything );
use Wx::Event qw( EVT_BUTTON EVT_CLOSE );
sub new {
my ($class, $parent, $id, $title, $pos, $size, $style, $name) = @_;
$parent = undef unless defined $parent;
$id = -1 unless defined $id;
$title = "About $MyApp::TITLE" unless defined $title;
$pos = wxDefaultPosition unless defined $pos;
$size = [350, 160] unless defined $size;
$style = wxDEFAULT_DIALOG_STYLE unless defined $style;
$name = '' unless defined $name;
my $self = $class->SUPER::new(
$parent, $id, $title, $pos, $size, $style, $name,
);
Wx::StaticBitmap->new( $self, -1, $MyApp::LOGO, [10, 10] )
if $MyApp::LOGO->Ok();
my $label = Wx::StaticText->new( $self, -1,
"$MyApp::TITLE v$MyApp::VERSION\n"
. "\n"
. "(C) 2007 My Lame Company\n"
. "All Rights Reserved.",
[170, 10], [165, 55], wxALIGN_CENTER
);
$self->{button_1} = Wx::Button->new( $self, -1, '&OK', [260, 100] );
EVT_CLOSE( $self, \&OnClose );
EVT_BUTTON( $self, $self->{button_1}, \&OnClose );
return $self;
}
sub OnClose {
my ($self, $event) = @_;
$self->EndModal( 1 );
$self->Destroy();
}
1;
# End of class AboutBox
##############################################################################
package MyApp;
use strict;
use warnings;
use base qw( Wx::App );
sub OnInit {
my ($self) = @_;
Wx::InitAllImageHandlers();
my $dialog = MyAboutBox->new( undef, -1, );
$self->SetTopWindow( $dialog );
$dialog->CentreOnScreen();
$dialog->Show( 1 );
return 1;
}
1;
# End of class MyApp
##############################################################################
package main;
MyApp->new()->MainLoop();
exit;
# End of package main
##############################################################################
__END__
#!/usr/bin/perl --
#
# bitmap2wxperl.pl
#
# Converts the Windows bitmap files given on the command line
# into executable wxPerl code.
#
# In addition to Wx, the module Compress::Zlib is required
# to execute the resulting code and recover the bitmaps.
#
use strict;
use warnings;
use Compress::Zlib;
use Wx 0.26 qw( wxBITMAP_TYPE_ANY );
die "usage: bmp2wxperl.pl <bitmap file(s)>\n" unless @ARGV;
# Check all the files first
my @bitmaps = ();
while (my $filename = shift @ARGV) {
die "error: cannot read file \"$filename\"\n" unless ( -r $filename );
my $bitmap = Wx::Bitmap->new( $filename, wxBITMAP_TYPE_ANY );
die "error: cannot parse file \"$filename\"\n" unless ($bitmap and
$bitmap->Ok);
push @bitmaps, [$filename, $bitmap];
}
# Generate the code
print STDOUT "\n";
print STDOUT "use Wx 0.26;\n";
print STDOUT "use Compress::Zlib;\n\n\n";
print STDOUT "my %bitmaps = ();\n\n\n";
for (my $n = 0; @bitmaps; $n++) {
my ($filename, $bitmap) = @{ shift @bitmaps };
my $image = $bitmap->ConvertToImage();
my $data = $image->GetData();
my $height = $image->GetHeight();
my $width = $image->GetWidth();
my $c_data = compress( $data, 9 );
my $u_data = pack( 'u', $c_data );
chop($u_data) if ( $u_data =~ m/\n$/ );
print STDOUT <<"__END_OF_CODE__";
\$bitmaps{'$filename'} = Wx::Bitmap->new(
Wx::Image->new( $width, $height,
uncompress( unpack('u',
<<'__END_OF_IMAGE_${n}_DATA__'
$u_data
__END_OF_IMAGE_${n}_DATA__
))
),
);
__END_OF_CODE__
}
print STDOUT "\n\n#undef \%bitmaps;\n\n";
exit;
__END__