358 ^ self fromOS2Stream:aStream |
358 ^ self fromOS2Stream:aStream |
359 ]. |
359 ]. |
360 (header startsWith:#(16r53 16r5A)) ifTrue:[ "SZ" |
360 (header startsWith:#(16r53 16r5A)) ifTrue:[ "SZ" |
361 'WinIconReader [warning]: OS/2 SZ format not supported:' infoPrintNL. |
361 'WinIconReader [warning]: OS/2 SZ format not supported:' infoPrintNL. |
362 ^ nil. |
362 ^ nil. |
363 aStream position:1. |
363 "/ aStream position:1. |
364 'WinIconReader [info]: OS/2 SZ format' infoPrintNL. |
364 "/ 'WinIconReader [info]: OS/2 SZ format' infoPrintNL. |
365 ^ self fromOS2Stream:aStream |
365 "/ ^ self fromOS2Stream:aStream |
366 ]. |
366 ]. |
367 (header startsWith:#(0 0 1 0)) ifTrue:[ |
367 (header startsWith:#(0 0 1 0)) ifTrue:[ |
368 aStream position:1. |
368 aStream position:1. |
369 "/ 'WinIconReader [info]: Win3.x ICO format' infoPrintNL. |
369 "/ 'WinIconReader [info]: Win3.x ICO format' infoPrintNL. |
370 ^ self fromWindowsICOStream:aStream |
370 ^ self fromWindowsICOStream:aStream |
805 i := Image fromFile:'bitmaps/gifImages/garfield.gif'. |
805 i := Image fromFile:'bitmaps/gifImages/garfield.gif'. |
806 WindowsIconReader save:i onFile:'test.bmp'. |
806 WindowsIconReader save:i onFile:'test.bmp'. |
807 " |
807 " |
808 |
808 |
809 "Modified: 21.10.1997 / 05:02:02 / cg" |
809 "Modified: 21.10.1997 / 05:02:02 / cg" |
|
810 ! |
|
811 |
|
812 saveICO:image onFile:fileName |
|
813 "save image as ICO file on aFileName. |
|
814 Only depth 4 images of size 32x32 can be represented in this format." |
|
815 |
|
816 |depth bhSize biSize biClrUsed biSizeImage bfOffBits rowBytes imgBytesPerRow data srcIndex row| |
|
817 |
|
818 depth := image depth. |
|
819 width := image width. |
|
820 height := image height. |
|
821 |
|
822 depth ~~ 4 ifTrue:[ |
|
823 ^ Image cannotRepresentImageSignal |
|
824 raiseWith:image |
|
825 errorString:('ICO format only supports depths 4'). |
|
826 ]. |
|
827 (width ~~ 32 or:[height ~~ 32]) ifTrue:[ |
|
828 ^ Image cannotRepresentImageSignal |
|
829 raiseWith:image |
|
830 errorString:('ICO format (currently) only supports 32x32 bitmaps'). |
|
831 ]. |
|
832 |
|
833 "/ align rows on a longword boundary |
|
834 rowBytes := (depth * width + 31 // 32) * 4. |
|
835 biSizeImage := height * rowBytes. |
|
836 |
|
837 outStream := fileName asFilename writeStream. |
|
838 outStream binary. |
|
839 byteOrder := #lsb. |
|
840 |
|
841 "Write the file header" |
|
842 outStream nextPutAll:#[0 0 1 0]. "/ ICO magic |
|
843 self writeShort:1. "/ # of images in file |
|
844 outStream nextPut:image width. "/ |
|
845 outStream nextPut:image height. "/ |
|
846 outStream nextPut:(1 bitShift:image depth). "/ # of colors |
|
847 outStream nextPutAll:#[0 0 0 0 0 ]. "/ reserved |
|
848 self writeLong:16rE802. "/ size pixels |
|
849 self writeLong:16r26. "/ offset in file |
|
850 |
|
851 "/ 40 bytes - unknown format |
|
852 outStream nextPutAll:(ByteArray new:40). |
|
853 |
|
854 "/ 16-entry RGB map |
|
855 |
|
856 1 to:16 do:[:i | "Color map" |
|
857 |clr r g b| |
|
858 |
|
859 clr := image colorFromValue:i-1. |
|
860 clr isNil ifTrue:[ |
|
861 r := g := b := 0. |
|
862 ] ifFalse:[ |
|
863 r := clr redByte. |
|
864 g := clr greenByte. |
|
865 b := clr blueByte. |
|
866 ]. |
|
867 |
|
868 "/ put B,G,R |
|
869 outStream nextPut:b. |
|
870 outStream nextPut:g. |
|
871 outStream nextPut:r. |
|
872 outStream nextPut:0. |
|
873 ]. |
|
874 |
|
875 imgBytesPerRow := image bytesPerRow. |
|
876 data := image data. |
|
877 |
|
878 |
|
879 "/ sorry, must extract rows individually |
|
880 "/ (even if alignment is correct), |
|
881 "/ since ICO saves rows bottom-to-top |
|
882 |
|
883 row := ByteArray new:rowBytes. |
|
884 |
|
885 srcIndex := 1 + (height * imgBytesPerRow). |
|
886 1 to:height do:[:i | |
|
887 srcIndex := srcIndex - imgBytesPerRow. |
|
888 row replaceFrom:1 to:imgBytesPerRow with:data startingAt:srcIndex. |
|
889 outStream nextPutAll:row. |
|
890 ]. |
|
891 |
|
892 "/ the mask ... |
|
893 image mask isNil ifTrue:[ |
|
894 outStream next:128 put:16rFF |
|
895 ] ifFalse:[ |
|
896 imgBytesPerRow := image mask bytesPerRow. |
|
897 data := image mask data. |
|
898 row := ByteArray new:4. |
|
899 |
|
900 srcIndex := 1 + (height * imgBytesPerRow). |
|
901 1 to:height do:[:i | |
|
902 srcIndex := srcIndex - imgBytesPerRow. |
|
903 row replaceFrom:1 to:imgBytesPerRow with:data startingAt:srcIndex. |
|
904 outStream nextPutAll:row. |
|
905 ]. |
|
906 ]. |
|
907 |
|
908 outStream close. |
|
909 |
|
910 " |
|
911 |i| |
|
912 |
|
913 i := Image fromFile:'bitmaps/xpmBitmaps/SmalltalkX_clr.xpm'. |
|
914 i := Depth4Image fromImage:i. |
|
915 i := i magnifiedTo:32@32. |
|
916 WindowsIconReader new saveICO:i onFile:'test.ico'. |
|
917 " |
|
918 |
|
919 "Modified: 21.10.1997 / 05:02:02 / cg" |
810 ! ! |
920 ! ! |
811 |
921 |
812 !WindowsIconReader class methodsFor:'documentation'! |
922 !WindowsIconReader class methodsFor:'documentation'! |
813 |
923 |
814 version |
924 version |
815 ^ '$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.42 1998-09-18 14:00:55 cg Exp $' |
925 ^ '$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.43 1999-05-09 14:38:04 cg Exp $' |
816 ! ! |
926 ! ! |
817 WindowsIconReader initialize! |
927 WindowsIconReader initialize! |