home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / BitmapInline.pm < prev    next >
Text File  |  2004-01-12  |  6KB  |  208 lines

  1. package Win32::GUI::BitmapInline;
  2.  
  3. require Exporter;
  4. @ISA = qw(Exporter);
  5. @EXPORT = qw(inline);
  6.  
  7. $VERSION = "0.02";
  8.  
  9. $Counter = 1;
  10.  
  11. require Win32::GUI;
  12. require MIME::Base64;
  13.  
  14. sub new {
  15.     my($class, $data) = @_;
  16.     open(BMP, ">~$$.tmp") or return undef;
  17.     binmode(BMP);
  18.     print BMP MIME::Base64::decode($data);
  19.     close(BMP); 
  20.     my $B = new Win32::GUI::Bitmap("~$$.tmp");
  21.     unlink("~$$.tmp");
  22.     return $B;  
  23. }
  24.  
  25. sub newCursor {
  26.     my($class, $data) = @_;
  27.     open(BMP, ">~$$.tmp") or return undef;
  28.     binmode(BMP);
  29.     print BMP MIME::Base64::decode($data);
  30.     close(BMP); 
  31.     my $B = new Win32::GUI::Cursor("~$$.tmp");
  32.     unlink("~$$.tmp");
  33.     return $B;  
  34. }
  35.  
  36. sub newIcon {
  37.     my($class, $data) = @_;
  38.     open(BMP, ">~$$.tmp") or return undef;
  39.     binmode(BMP);
  40.     print BMP MIME::Base64::decode($data);
  41.     close(BMP); 
  42.     my $B = new Win32::GUI::Icon("~$$.tmp");
  43.     unlink("~$$.tmp");
  44.     return $B;  
  45. }
  46.  
  47. sub inline {
  48.     my ($file, $name) = @_;
  49.  
  50.     $name = "Bitmap" . $Win32::GUI::BitmapInline::Counter++ unless $name;
  51.  
  52.     my $type = "";
  53.     $file =~ /\.ico$/i and $type = "Icon";
  54.     $file =~ /\.cur$/i and $type = "Cursor";
  55.  
  56.  
  57.     open(BMP, $file) or
  58.         $! = "Bitmap file '$file' not found",
  59.         return undef;
  60.     my $oldsep = $/;
  61.     undef $/;
  62.     binmode(BMP);
  63.     my $ret = "";
  64.     $ret .= "\$$name = new$type Win32::GUI::BitmapInline( q(\n";
  65.     $ret .= MIME::Base64::encode( <BMP> );
  66.     $ret .= ") );\n";
  67.     close(BMP);
  68.     $/ = $oldsep;
  69.     print $ret;
  70.     return length($ret);
  71. }
  72.  
  73. 1;
  74.  
  75. __END__
  76.  
  77. =head1 NAME
  78.  
  79. Win32::GUI::BitmapInline - Inline bitmap support for Win32::GUI
  80.  
  81. =head1 SYNOPSIS
  82.  
  83. To create a BitmapInline:
  84.  
  85.     perl -MWin32::GUI::BitmapInline -e inline('image.bmp') >>script.pl
  86.  
  87. To use a BitmapInline (in script.pl):
  88.  
  89.     use Win32::GUI;
  90.     use Win32::GUI::BitmapInline ();
  91.     
  92.     $Bitmap1 = new Win32::GUI::BitmapInline( q(
  93.     Qk32AAAAAAAAAHYAAAAoAAAAEAAAABAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAA
  94.     AACcnABjzs4A9/f3AJzO/wCc//8Azv//AP///wD///8A////AP///wD///8A////AP///wD///8A
  95.     ////AHd3d3d3d3d3d3d3d3d3d3dwAAAAAAAABxIiIiIiIiIHFkVFRUVEQgcWVVRUVFRCBxZVVVVF
  96.     RUIHFlVVVFRUUgcWVVVVVUVCBxZVVVVUVFIHFlVVVVVVQgcWZmZmZmZSBxIiIiIRERF3cTZlUQd3
  97.     d3d3EREQd3d3d3d3d3d3d3d3
  98.     ) );
  99.  
  100. =head1 DESCRIPTION
  101.  
  102. This module can be used to "inline" a bitmap file in your script, so
  103. that it doesn't need to be accompained by several external files 
  104. (less hassle when you need to redistribute your script or move it 
  105. to another location).
  106.  
  107. The C<inline> function is used to create an inlined bitmap resource; it
  108. will print on STDOUT the packed data including the lines of Perl  
  109. needed to use the inlined bitmap resource; it is intended to be used as 
  110. a one-liner whose output is appended to your script.
  111.  
  112. The function takes the name of the bitmap file to inline as its first
  113. parameter; an additional, optional parameter can be given which will be 
  114. the name of the bitmap object in the resulting scriptlet, eg:
  115.  
  116.     perl -MWin32::GUI::BitmapInline -e inline('image.bmp','IMAGE')
  117.     
  118.     $IMAGE = new Win32::GUI::BitmapInline( q( ...
  119.  
  120. If no name is given, the resulting object name will be $Bitmap1 
  121. (the next ones $Bitmap2 , $Bitmap3 and so on).
  122.  
  123. Note that the object returned by C<new Win32::GUI::BitmapInline> is
  124. a regular Win32::GUI::Bitmap object.
  125.  
  126. With version 0.02 you can inline icons and cursors too. Nothing changes
  127. in the inlining process, just the file extension:
  128.  
  129.     perl -MWin32::GUI::BitmapInline -e inline('harrow.cur','Cursor1') >>script.pl
  130.     perl -MWin32::GUI::BitmapInline -e inline('guiperl.ico','Icon1') >>script.pl
  131.  
  132. The module recognizes from the extension the type of object that it
  133. should recreate, so it will add these lines to F<script.pl>:
  134.  
  135.     $Cursor1 = newCursor Win32::GUI::BitmapInline( q( ...
  136.     $Icon1 = newIcon Win32::GUI::BitmapInline( q( ...
  137.    
  138. C<newCursor> or C<newIcon> are used in place of just C<new>. As above,
  139. the returned objects are regular Win32::GUI objects (respectively,
  140. Win32::GUI::Cursor and Win32::GUI::Icon).
  141.  
  142. =head1 WARNINGS
  143.  
  144. =over 4
  145.  
  146. =item * 
  147.  
  148. B<Requires MIME::Base64>
  149.  
  150. ...and, of course, Win32::GUI :-)
  151.  
  152. =for html <P>
  153.  
  154. =item * 
  155.  
  156. B<Don't use it on large bitmap files!>
  157.  
  158. BitmapInline was designed for small bitmaps, such as
  159. toolbar items, icons, et alia; it is not at all 
  160. performant.
  161. Inlined data takes approximatively the size of your
  162. bitmap file plus a 30%; thus, if you inline a 100k bitmap 
  163. you're adding about 130k of bad-looking data to your script...
  164.  
  165. =for html <P>
  166.  
  167. =item * 
  168.  
  169. B<Your script must have write access to its current directory>
  170.  
  171. When inlined data are used in your script (with 
  172. C<new Win32::GUI::BitmapInline...>)
  173. a temporary file is created, then loaded as a regular
  174. bitmap and then immediately deleted.
  175. This will fail if your script is not able to create and delete
  176. files in the current directory at the moment of the call.
  177. One workaround could be to change directory to a safer place
  178. before constructing the bitmap:
  179.  
  180.     chdir("c:\\temp");
  181.     $Bitmap1 = new Win32::GUI::BitmapInline( ... );
  182.  
  183. A better solution could pop up in some future release...
  184.  
  185. =for html <P>
  186.  
  187. =item *
  188.  
  189. B<The package exports C<inline> by default>
  190.  
  191. For practical reasons (see one-liners above), C<inline> is 
  192. exported by default into your C<main> namespace; to avoid
  193. this side-effect is recommended to use the module in your
  194. production scripts as follows:
  195.  
  196.     use Win32::GUI::BitmapInline ();
  197.  
  198. =back
  199.  
  200. =head1 VERSION
  201.  
  202. Win32::GUI::BitmapInline version 0.02, 24 January 2001.
  203.  
  204. =head1 AUTHOR
  205.  
  206. Aldo Calpini ( C<dada@perl.it> ).
  207.  
  208. =cut