> 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__


Reply via email to