From 3af706cc3164bacc24899e0fc827c28e7ea812b6 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 29 Oct 2006 18:58:25 +0000 Subject: [PATCH] added TGA handler (somewhat modified patch 1393912) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42644 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 21 + build/bakefiles/files.bkl | 2 + build/msw/makefile.bcc | 28 ++ build/msw/makefile.gcc | 28 ++ build/msw/makefile.vc | 28 ++ build/msw/makefile.wat | 28 ++ build/msw/wx_core.dsp | 8 + docs/changes.txt | 1 + docs/latex/wx/image.tex | 4 +- include/wx/gdicmn.h | 1 + include/wx/image.h | 1 + include/wx/imagtga.h | 46 +++ include/wx/mac/setup0.h | 3 + include/wx/motif/setup0.h | 3 + include/wx/msw/setup0.h | 3 + include/wx/msw/wince/setup.h | 3 + include/wx/os2/setup0.h | 3 + include/wx/palmos/setup0.h | 3 + include/wx/setup_inc.h | 3 + samples/image/horse.tga | Bin 0 -> 40786 bytes samples/image/image.cpp | 86 ++-- setup.h.in | 2 + src/common/imagall.cpp | 3 + src/common/imagtga.cpp | 748 +++++++++++++++++++++++++++++++++++ src/wxWindows.dsp | 8 + 25 files changed, 1013 insertions(+), 51 deletions(-) create mode 100644 include/wx/imagtga.h create mode 100644 samples/image/horse.tga create mode 100644 src/common/imagtga.cpp diff --git a/Makefile.in b/Makefile.in index 54201648de..a00b8d39e2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -2965,6 +2965,7 @@ COND_USE_GUI_1_ALL_GUI_HEADERS = \ wx/imagpcx.h \ wx/imagpng.h \ wx/imagpnm.h \ + wx/imagtga.h \ wx/imagtiff.h \ wx/imagxpm.h \ wx/listbase.h \ @@ -3471,6 +3472,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS = \ monodll_imagpcx.o \ monodll_imagpng.o \ monodll_imagpnm.o \ + monodll_imagtga.o \ monodll_imagtiff.o \ monodll_imagxpm.o \ monodll_layout.o \ @@ -3642,6 +3644,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS = \ monodll_imagpcx.o \ monodll_imagpng.o \ monodll_imagpnm.o \ + monodll_imagtga.o \ monodll_imagtiff.o \ monodll_imagxpm.o \ monodll_layout.o \ @@ -5223,6 +5226,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_1 = \ monolib_imagpcx.o \ monolib_imagpng.o \ monolib_imagpnm.o \ + monolib_imagtga.o \ monolib_imagtiff.o \ monolib_imagxpm.o \ monolib_layout.o \ @@ -5394,6 +5398,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_1 = \ monolib_imagpcx.o \ monolib_imagpng.o \ monolib_imagpnm.o \ + monolib_imagtga.o \ monolib_imagtiff.o \ monolib_imagxpm.o \ monolib_layout.o \ @@ -7187,6 +7192,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_2 = \ coredll_imagpcx.o \ coredll_imagpng.o \ coredll_imagpnm.o \ + coredll_imagtga.o \ coredll_imagtiff.o \ coredll_imagxpm.o \ coredll_layout.o \ @@ -7358,6 +7364,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_2 = \ coredll_imagpcx.o \ coredll_imagpng.o \ coredll_imagpnm.o \ + coredll_imagtga.o \ coredll_imagtiff.o \ coredll_imagxpm.o \ coredll_layout.o \ @@ -8621,6 +8628,7 @@ COND_USE_GUI_1_WXUNIV_0___CORE_SRC_OBJECTS_3 = \ corelib_imagpcx.o \ corelib_imagpng.o \ corelib_imagpnm.o \ + corelib_imagtga.o \ corelib_imagtiff.o \ corelib_imagxpm.o \ corelib_layout.o \ @@ -8792,6 +8800,7 @@ COND_USE_GUI_1_WXUNIV_1___CORE_SRC_OBJECTS_3 = \ corelib_imagpcx.o \ corelib_imagpng.o \ corelib_imagpnm.o \ + corelib_imagtga.o \ corelib_imagtiff.o \ corelib_imagxpm.o \ corelib_layout.o \ @@ -15832,6 +15841,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@monodll_imagpnm.o: $(srcdir)/src/common/imagpnm.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/imagpnm.cpp +@COND_USE_GUI_1@monodll_imagtga.o: $(srcdir)/src/common/imagtga.cpp $(MONODLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/imagtga.cpp + @COND_USE_GUI_1@monodll_imagtiff.o: $(srcdir)/src/common/imagtiff.cpp $(MONODLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/imagtiff.cpp @@ -19927,6 +19939,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@monolib_imagpnm.o: $(srcdir)/src/common/imagpnm.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/imagpnm.cpp +@COND_USE_GUI_1@monolib_imagtga.o: $(srcdir)/src/common/imagtga.cpp $(MONOLIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/imagtga.cpp + @COND_USE_GUI_1@monolib_imagtiff.o: $(srcdir)/src/common/imagtiff.cpp $(MONOLIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/imagtiff.cpp @@ -24373,6 +24388,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@coredll_imagpnm.o: $(srcdir)/src/common/imagpnm.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/imagpnm.cpp +@COND_USE_GUI_1@coredll_imagtga.o: $(srcdir)/src/common/imagtga.cpp $(COREDLL_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/imagtga.cpp + @COND_USE_GUI_1@coredll_imagtiff.o: $(srcdir)/src/common/imagtiff.cpp $(COREDLL_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/common/imagtiff.cpp @@ -27295,6 +27313,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@corelib_imagpnm.o: $(srcdir)/src/common/imagpnm.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/imagpnm.cpp +@COND_USE_GUI_1@corelib_imagtga.o: $(srcdir)/src/common/imagtga.cpp $(CORELIB_ODEP) +@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/imagtga.cpp + @COND_USE_GUI_1@corelib_imagtiff.o: $(srcdir)/src/common/imagtiff.cpp $(CORELIB_ODEP) @COND_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/common/imagtiff.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index 368797cd92..93225d5482 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -619,6 +619,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/common/imagpcx.cpp src/common/imagpng.cpp src/common/imagpnm.cpp + src/common/imagtga.cpp src/common/imagtiff.cpp src/common/imagxpm.cpp src/common/layout.cpp @@ -825,6 +826,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/imagpcx.h wx/imagpng.h wx/imagpnm.h + wx/imagtga.h wx/imagtiff.h wx/imagxpm.h wx/listbase.h diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc index 8098ad8be2..5e36077a7e 100644 --- a/build/msw/makefile.bcc +++ b/build/msw/makefile.bcc @@ -1469,6 +1469,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_imagpcx.obj \ $(OBJS)\monodll_imagpng.obj \ $(OBJS)\monodll_imagpnm.obj \ + $(OBJS)\monodll_imagtga.obj \ $(OBJS)\monodll_imagtiff.obj \ $(OBJS)\monodll_imagxpm.obj \ $(OBJS)\monodll_layout.obj \ @@ -1690,6 +1691,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_imagpcx.obj \ $(OBJS)\monodll_imagpng.obj \ $(OBJS)\monodll_imagpnm.obj \ + $(OBJS)\monodll_imagtga.obj \ $(OBJS)\monodll_imagtiff.obj \ $(OBJS)\monodll_imagxpm.obj \ $(OBJS)\monodll_layout.obj \ @@ -2077,6 +2079,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_imagpcx.obj \ $(OBJS)\monolib_imagpng.obj \ $(OBJS)\monolib_imagpnm.obj \ + $(OBJS)\monolib_imagtga.obj \ $(OBJS)\monolib_imagtiff.obj \ $(OBJS)\monolib_imagxpm.obj \ $(OBJS)\monolib_layout.obj \ @@ -2298,6 +2301,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_imagpcx.obj \ $(OBJS)\monolib_imagpng.obj \ $(OBJS)\monolib_imagpnm.obj \ + $(OBJS)\monolib_imagtga.obj \ $(OBJS)\monolib_imagtiff.obj \ $(OBJS)\monolib_imagxpm.obj \ $(OBJS)\monolib_layout.obj \ @@ -2595,6 +2599,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_imagpcx.obj \ $(OBJS)\coredll_imagpng.obj \ $(OBJS)\coredll_imagpnm.obj \ + $(OBJS)\coredll_imagtga.obj \ $(OBJS)\coredll_imagtiff.obj \ $(OBJS)\coredll_imagxpm.obj \ $(OBJS)\coredll_layout.obj \ @@ -2816,6 +2821,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_imagpcx.obj \ $(OBJS)\coredll_imagpng.obj \ $(OBJS)\coredll_imagpnm.obj \ + $(OBJS)\coredll_imagtga.obj \ $(OBJS)\coredll_imagtiff.obj \ $(OBJS)\coredll_imagxpm.obj \ $(OBJS)\coredll_layout.obj \ @@ -3038,6 +3044,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_imagpcx.obj \ $(OBJS)\corelib_imagpng.obj \ $(OBJS)\corelib_imagpnm.obj \ + $(OBJS)\corelib_imagtga.obj \ $(OBJS)\corelib_imagtiff.obj \ $(OBJS)\corelib_imagxpm.obj \ $(OBJS)\corelib_layout.obj \ @@ -3259,6 +3266,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_imagpcx.obj \ $(OBJS)\corelib_imagpng.obj \ $(OBJS)\corelib_imagpnm.obj \ + $(OBJS)\corelib_imagtga.obj \ $(OBJS)\corelib_imagtiff.obj \ $(OBJS)\corelib_imagxpm.obj \ $(OBJS)\corelib_layout.obj \ @@ -6047,6 +6055,11 @@ $(OBJS)\monodll_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monodll_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monodll_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $** @@ -8026,6 +8039,11 @@ $(OBJS)\monolib_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monolib_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monolib_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $** @@ -10038,6 +10056,11 @@ $(OBJS)\coredll_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\coredll_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\coredll_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $** @@ -11293,6 +11316,11 @@ $(OBJS)\corelib_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\corelib_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\corelib_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $** diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index e375b1e750..d9e5c1b77c 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -1479,6 +1479,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_imagpcx.o \ $(OBJS)\monodll_imagpng.o \ $(OBJS)\monodll_imagpnm.o \ + $(OBJS)\monodll_imagtga.o \ $(OBJS)\monodll_imagtiff.o \ $(OBJS)\monodll_imagxpm.o \ $(OBJS)\monodll_layout.o \ @@ -1702,6 +1703,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_imagpcx.o \ $(OBJS)\monodll_imagpng.o \ $(OBJS)\monodll_imagpnm.o \ + $(OBJS)\monodll_imagtga.o \ $(OBJS)\monodll_imagtiff.o \ $(OBJS)\monodll_imagxpm.o \ $(OBJS)\monodll_layout.o \ @@ -2093,6 +2095,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_imagpcx.o \ $(OBJS)\monolib_imagpng.o \ $(OBJS)\monolib_imagpnm.o \ + $(OBJS)\monolib_imagtga.o \ $(OBJS)\monolib_imagtiff.o \ $(OBJS)\monolib_imagxpm.o \ $(OBJS)\monolib_layout.o \ @@ -2316,6 +2319,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_imagpcx.o \ $(OBJS)\monolib_imagpng.o \ $(OBJS)\monolib_imagpnm.o \ + $(OBJS)\monolib_imagtga.o \ $(OBJS)\monolib_imagtiff.o \ $(OBJS)\monolib_imagxpm.o \ $(OBJS)\monolib_layout.o \ @@ -2627,6 +2631,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_imagpcx.o \ $(OBJS)\coredll_imagpng.o \ $(OBJS)\coredll_imagpnm.o \ + $(OBJS)\coredll_imagtga.o \ $(OBJS)\coredll_imagtiff.o \ $(OBJS)\coredll_imagxpm.o \ $(OBJS)\coredll_layout.o \ @@ -2850,6 +2855,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_imagpcx.o \ $(OBJS)\coredll_imagpng.o \ $(OBJS)\coredll_imagpnm.o \ + $(OBJS)\coredll_imagtga.o \ $(OBJS)\coredll_imagtiff.o \ $(OBJS)\coredll_imagxpm.o \ $(OBJS)\coredll_layout.o \ @@ -3078,6 +3084,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_imagpcx.o \ $(OBJS)\corelib_imagpng.o \ $(OBJS)\corelib_imagpnm.o \ + $(OBJS)\corelib_imagtga.o \ $(OBJS)\corelib_imagtiff.o \ $(OBJS)\corelib_imagxpm.o \ $(OBJS)\corelib_layout.o \ @@ -3301,6 +3308,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_imagpcx.o \ $(OBJS)\corelib_imagpng.o \ $(OBJS)\corelib_imagpnm.o \ + $(OBJS)\corelib_imagtga.o \ $(OBJS)\corelib_imagtiff.o \ $(OBJS)\corelib_imagxpm.o \ $(OBJS)\corelib_layout.o \ @@ -6264,6 +6272,11 @@ $(OBJS)\monodll_imagpnm.o: ../../src/common/imagpnm.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\monodll_imagtga.o: ../../src/common/imagtga.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\monodll_imagtiff.o: ../../src/common/imagtiff.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -8343,6 +8356,11 @@ $(OBJS)\monolib_imagpnm.o: ../../src/common/imagpnm.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\monolib_imagtga.o: ../../src/common/imagtga.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\monolib_imagtiff.o: ../../src/common/imagtiff.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -10455,6 +10473,11 @@ $(OBJS)\coredll_imagpnm.o: ../../src/common/imagpnm.cpp $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\coredll_imagtga.o: ../../src/common/imagtga.cpp + $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\coredll_imagtiff.o: ../../src/common/imagtiff.cpp $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $(CPPDEPS) $< @@ -11810,6 +11833,11 @@ $(OBJS)\corelib_imagpnm.o: ../../src/common/imagpnm.cpp $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< endif +ifeq ($(USE_GUI),1) +$(OBJS)\corelib_imagtga.o: ../../src/common/imagtga.cpp + $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< +endif + ifeq ($(USE_GUI),1) $(OBJS)\corelib_imagtiff.o: ../../src/common/imagtiff.cpp $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index e2f91bfd6f..32582c77fe 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -1636,6 +1636,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_imagpcx.obj \ $(OBJS)\monodll_imagpng.obj \ $(OBJS)\monodll_imagpnm.obj \ + $(OBJS)\monodll_imagtga.obj \ $(OBJS)\monodll_imagtiff.obj \ $(OBJS)\monodll_imagxpm.obj \ $(OBJS)\monodll_layout.obj \ @@ -1857,6 +1858,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = \ $(OBJS)\monodll_imagpcx.obj \ $(OBJS)\monodll_imagpng.obj \ $(OBJS)\monodll_imagpnm.obj \ + $(OBJS)\monodll_imagtga.obj \ $(OBJS)\monodll_imagtiff.obj \ $(OBJS)\monodll_imagxpm.obj \ $(OBJS)\monodll_layout.obj \ @@ -2250,6 +2252,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_imagpcx.obj \ $(OBJS)\monolib_imagpng.obj \ $(OBJS)\monolib_imagpnm.obj \ + $(OBJS)\monolib_imagtga.obj \ $(OBJS)\monolib_imagtiff.obj \ $(OBJS)\monolib_imagxpm.obj \ $(OBJS)\monolib_layout.obj \ @@ -2471,6 +2474,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = \ $(OBJS)\monolib_imagpcx.obj \ $(OBJS)\monolib_imagpng.obj \ $(OBJS)\monolib_imagpnm.obj \ + $(OBJS)\monolib_imagtga.obj \ $(OBJS)\monolib_imagtiff.obj \ $(OBJS)\monolib_imagxpm.obj \ $(OBJS)\monolib_layout.obj \ @@ -2798,6 +2802,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_imagpcx.obj \ $(OBJS)\coredll_imagpng.obj \ $(OBJS)\coredll_imagpnm.obj \ + $(OBJS)\coredll_imagtga.obj \ $(OBJS)\coredll_imagtiff.obj \ $(OBJS)\coredll_imagxpm.obj \ $(OBJS)\coredll_layout.obj \ @@ -3019,6 +3024,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = \ $(OBJS)\coredll_imagpcx.obj \ $(OBJS)\coredll_imagpng.obj \ $(OBJS)\coredll_imagpnm.obj \ + $(OBJS)\coredll_imagtga.obj \ $(OBJS)\coredll_imagtiff.obj \ $(OBJS)\coredll_imagxpm.obj \ $(OBJS)\coredll_layout.obj \ @@ -3247,6 +3253,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_imagpcx.obj \ $(OBJS)\corelib_imagpng.obj \ $(OBJS)\corelib_imagpnm.obj \ + $(OBJS)\corelib_imagtga.obj \ $(OBJS)\corelib_imagtiff.obj \ $(OBJS)\corelib_imagxpm.obj \ $(OBJS)\corelib_layout.obj \ @@ -3468,6 +3475,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = \ $(OBJS)\corelib_imagpcx.obj \ $(OBJS)\corelib_imagpng.obj \ $(OBJS)\corelib_imagpnm.obj \ + $(OBJS)\corelib_imagtga.obj \ $(OBJS)\corelib_imagtiff.obj \ $(OBJS)\corelib_imagxpm.obj \ $(OBJS)\corelib_layout.obj \ @@ -6380,6 +6388,11 @@ $(OBJS)\monodll_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monodll_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monodll_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $** @@ -8359,6 +8372,11 @@ $(OBJS)\monolib_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\monolib_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\monolib_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $** @@ -10371,6 +10389,11 @@ $(OBJS)\coredll_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\coredll_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\coredll_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $** @@ -11626,6 +11649,11 @@ $(OBJS)\corelib_imagpnm.obj: ..\..\src\common\imagpnm.cpp $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $** !endif +!if "$(USE_GUI)" == "1" +$(OBJS)\corelib_imagtga.obj: ..\..\src\common\imagtga.cpp + $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $** +!endif + !if "$(USE_GUI)" == "1" $(OBJS)\corelib_imagtiff.obj: ..\..\src\common\imagtiff.cpp $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $** diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat index 5023e6898f..d74f079a86 100644 --- a/build/msw/makefile.wat +++ b/build/msw/makefile.wat @@ -361,6 +361,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_imagpcx.obj & $(OBJS)\monodll_imagpng.obj & $(OBJS)\monodll_imagpnm.obj & + $(OBJS)\monodll_imagtga.obj & $(OBJS)\monodll_imagtiff.obj & $(OBJS)\monodll_imagxpm.obj & $(OBJS)\monodll_layout.obj & @@ -584,6 +585,7 @@ ____CORE_SRC_FILENAMES_OBJECTS = & $(OBJS)\monodll_imagpcx.obj & $(OBJS)\monodll_imagpng.obj & $(OBJS)\monodll_imagpnm.obj & + $(OBJS)\monodll_imagtga.obj & $(OBJS)\monodll_imagtiff.obj & $(OBJS)\monodll_imagxpm.obj & $(OBJS)\monodll_layout.obj & @@ -979,6 +981,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_imagpcx.obj & $(OBJS)\monolib_imagpng.obj & $(OBJS)\monolib_imagpnm.obj & + $(OBJS)\monolib_imagtga.obj & $(OBJS)\monolib_imagtiff.obj & $(OBJS)\monolib_imagxpm.obj & $(OBJS)\monolib_layout.obj & @@ -1202,6 +1205,7 @@ ____CORE_SRC_FILENAMES_1_OBJECTS = & $(OBJS)\monolib_imagpcx.obj & $(OBJS)\monolib_imagpng.obj & $(OBJS)\monolib_imagpnm.obj & + $(OBJS)\monolib_imagtga.obj & $(OBJS)\monolib_imagtiff.obj & $(OBJS)\monolib_imagxpm.obj & $(OBJS)\monolib_layout.obj & @@ -1520,6 +1524,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\coredll_imagpcx.obj & $(OBJS)\coredll_imagpng.obj & $(OBJS)\coredll_imagpnm.obj & + $(OBJS)\coredll_imagtga.obj & $(OBJS)\coredll_imagtiff.obj & $(OBJS)\coredll_imagxpm.obj & $(OBJS)\coredll_layout.obj & @@ -1743,6 +1748,7 @@ ____CORE_SRC_FILENAMES_2_OBJECTS = & $(OBJS)\coredll_imagpcx.obj & $(OBJS)\coredll_imagpng.obj & $(OBJS)\coredll_imagpnm.obj & + $(OBJS)\coredll_imagtga.obj & $(OBJS)\coredll_imagtiff.obj & $(OBJS)\coredll_imagxpm.obj & $(OBJS)\coredll_layout.obj & @@ -1973,6 +1979,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\corelib_imagpcx.obj & $(OBJS)\corelib_imagpng.obj & $(OBJS)\corelib_imagpnm.obj & + $(OBJS)\corelib_imagtga.obj & $(OBJS)\corelib_imagtiff.obj & $(OBJS)\corelib_imagxpm.obj & $(OBJS)\corelib_layout.obj & @@ -2196,6 +2203,7 @@ ____CORE_SRC_FILENAMES_3_OBJECTS = & $(OBJS)\corelib_imagpcx.obj & $(OBJS)\corelib_imagpng.obj & $(OBJS)\corelib_imagpnm.obj & + $(OBJS)\corelib_imagtga.obj & $(OBJS)\corelib_imagtiff.obj & $(OBJS)\corelib_imagxpm.obj & $(OBJS)\corelib_layout.obj & @@ -6492,6 +6500,11 @@ $(OBJS)\monodll_imagpnm.obj : .AUTODEPEND ..\..\src\common\imagpnm.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\monodll_imagtga.obj : .AUTODEPEND ..\..\src\common\imagtga.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\monodll_imagtiff.obj : .AUTODEPEND ..\..\src\common\imagtiff.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< @@ -8571,6 +8584,11 @@ $(OBJS)\monolib_imagpnm.obj : .AUTODEPEND ..\..\src\common\imagpnm.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\monolib_imagtga.obj : .AUTODEPEND ..\..\src\common\imagtga.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\monolib_imagtiff.obj : .AUTODEPEND ..\..\src\common\imagtiff.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< @@ -10683,6 +10701,11 @@ $(OBJS)\coredll_imagpnm.obj : .AUTODEPEND ..\..\src\common\imagpnm.cpp $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\coredll_imagtga.obj : .AUTODEPEND ..\..\src\common\imagtga.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\coredll_imagtiff.obj : .AUTODEPEND ..\..\src\common\imagtiff.cpp $(CXX) -bt=nt -zq -fo=$^@ $(COREDLL_CXXFLAGS) $< @@ -12038,6 +12061,11 @@ $(OBJS)\corelib_imagpnm.obj : .AUTODEPEND ..\..\src\common\imagpnm.cpp $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< !endif +!ifeq USE_GUI 1 +$(OBJS)\corelib_imagtga.obj : .AUTODEPEND ..\..\src\common\imagtga.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< +!endif + !ifeq USE_GUI 1 $(OBJS)\corelib_imagtiff.obj : .AUTODEPEND ..\..\src\common\imagtiff.cpp $(CXX) -bt=nt -zq -fo=$^@ $(CORELIB_CXXFLAGS) $< diff --git a/build/msw/wx_core.dsp b/build/msw/wx_core.dsp index 85f17534ca..3d28353121 100644 --- a/build/msw/wx_core.dsp +++ b/build/msw/wx_core.dsp @@ -694,6 +694,10 @@ SOURCE=..\..\src\common\imagpnm.cpp # End Source File # Begin Source File +SOURCE=..\..\src\common\imagtga.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\common\imagtiff.cpp # End Source File # Begin Source File @@ -9009,6 +9013,10 @@ SOURCE=..\..\include\wx\imagpnm.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\imagtga.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\imagtiff.h # End Source File # Begin Source File diff --git a/docs/changes.txt b/docs/changes.txt index 126400247e..b26dd514af 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -93,6 +93,7 @@ All (GUI): - Many enhancements to wxRichTextCtrl including URL support, formatting and symbol dialogs, print/preview, and better list formatting. +- Support for loading TGA files added (Seth Jackson) Unix Ports: diff --git a/docs/latex/wx/image.tex b/docs/latex/wx/image.tex index fa8d2da1e8..8920eea23c 100644 --- a/docs/latex/wx/image.tex +++ b/docs/latex/wx/image.tex @@ -45,7 +45,7 @@ as support for saving images with alpha channel which also isn't implemented). The following image handlers are available. {\bf wxBMPHandler} is always installed by default. To use other image formats, install the appropriate -handler with \helpref{wxImage::AddHandler}{wximageaddhandler} or +handler with \helpref{wxImage::AddHandler}{wximageaddhandler} or call \helpref{wxInitAllImageHandlers}{wxinitallimagehandlers}. \twocolwidtha{5cm}% @@ -57,6 +57,7 @@ handler with \helpref{wxImage::AddHandler}{wximageaddhandler} or \twocolitem{\indexit{wxPCXHandler}}{For loading and saving (see below).} \twocolitem{\indexit{wxPNMHandler}}{For loading and saving (see below).} \twocolitem{\indexit{wxTIFFHandler}}{For loading and saving.} +\twocolitem{\indexit{wxTGAHandler}}{For loading only.} \twocolitem{\indexit{wxIFFHandler}}{For loading only.} \twocolitem{\indexit{wxXPMHandler}}{For loading and saving.} \twocolitem{\indexit{wxICOHandler}}{For loading and saving.} @@ -153,6 +154,7 @@ Creates an image from XPM data. \twocolitem{\indexit{wxBITMAP\_TYPE\_PCX}}{Load a PCX bitmap file.} \twocolitem{\indexit{wxBITMAP\_TYPE\_PNM}}{Load a PNM bitmap file.} \twocolitem{\indexit{wxBITMAP\_TYPE\_TIF}}{Load a TIFF bitmap file.} +\twocolitem{\indexit{wxBITMAP\_TYPE\_TGA}}{Load a TGA bitmap file.} \twocolitem{\indexit{wxBITMAP\_TYPE\_XPM}}{Load a XPM bitmap file.} \twocolitem{\indexit{wxBITMAP\_TYPE\_ICO}}{Load a Windows icon file (ICO).} \twocolitem{\indexit{wxBITMAP\_TYPE\_CUR}}{Load a Windows cursor file (CUR).} diff --git a/include/wx/gdicmn.h b/include/wx/gdicmn.h index bc3efb2c50..a3ff41b1c4 100644 --- a/include/wx/gdicmn.h +++ b/include/wx/gdicmn.h @@ -75,6 +75,7 @@ enum wxBitmapType wxBITMAP_TYPE_ICON_RESOURCE, wxBITMAP_TYPE_ANI, wxBITMAP_TYPE_IFF, + wxBITMAP_TYPE_TGA, wxBITMAP_TYPE_MACCURSOR, wxBITMAP_TYPE_MACCURSOR_RESOURCE, wxBITMAP_TYPE_ANY = 50 diff --git a/include/wx/image.h b/include/wx/image.h index d1d4ec7621..40418fdc5f 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -442,6 +442,7 @@ extern WXDLLEXPORT_DATA(wxImage) wxNullImage; #include "wx/imaggif.h" #include "wx/imagpcx.h" #include "wx/imagjpeg.h" +#include "wx/imagtga.h" #include "wx/imagtiff.h" #include "wx/imagpnm.h" #include "wx/imagxpm.h" diff --git a/include/wx/imagtga.h b/include/wx/imagtga.h new file mode 100644 index 0000000000..c921a8aca7 --- /dev/null +++ b/include/wx/imagtga.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagtga.h +// Purpose: wxImage TGA handler +// Author: Seth Jackson +// RCS-ID: $Id$ +// Copyright: (c) 2005 Seth Jackson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_IMAGTGA_H_ +#define _WX_IMAGTGA_H_ + +#include "wx/image.h" + +//----------------------------------------------------------------------------- +// wxTGAHandler +//----------------------------------------------------------------------------- + +#if wxUSE_TGA + +class WXDLLEXPORT wxTGAHandler : public wxImageHandler +{ +public: + wxTGAHandler() + { + m_name = wxT("TGA file"); + m_extension = wxT("tga"); + m_type = wxBITMAP_TYPE_TGA; + m_mime = wxT("image/tga"); + } + +#if wxUSE_STREAMS + virtual bool LoadFile(wxImage* image, wxInputStream& stream, + bool verbose = true, int index = -1); + virtual bool SaveFile(wxImage* image, wxOutputStream& stream, + bool verbose = true); + virtual bool DoCanRead(wxInputStream& stream); +#endif // wxUSE_STREAMS + +private: + DECLARE_DYNAMIC_CLASS(wxTGAHandler) +}; + +#endif // wxUSE_TGA + +#endif // _WX_IMAGTGA_H_ diff --git a/include/wx/mac/setup0.h b/include/wx/mac/setup0.h index 18226a4cba..89c7af6953 100644 --- a/include/wx/mac/setup0.h +++ b/include/wx/mac/setup0.h @@ -1152,6 +1152,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/include/wx/motif/setup0.h b/include/wx/motif/setup0.h index 89a3eca851..e9d856cd02 100644 --- a/include/wx/motif/setup0.h +++ b/include/wx/motif/setup0.h @@ -1151,6 +1151,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h index 2383426435..c7d6b3eec2 100644 --- a/include/wx/msw/setup0.h +++ b/include/wx/msw/setup0.h @@ -1151,6 +1151,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/include/wx/msw/wince/setup.h b/include/wx/msw/wince/setup.h index 537fe75ca9..c856681bd4 100644 --- a/include/wx/msw/wince/setup.h +++ b/include/wx/msw/wince/setup.h @@ -1151,6 +1151,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/include/wx/os2/setup0.h b/include/wx/os2/setup0.h index 3ea2bfebb7..b26dec1f5c 100644 --- a/include/wx/os2/setup0.h +++ b/include/wx/os2/setup0.h @@ -1151,6 +1151,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/include/wx/palmos/setup0.h b/include/wx/palmos/setup0.h index 125e771ba2..77ea1219d4 100644 --- a/include/wx/palmos/setup0.h +++ b/include/wx/palmos/setup0.h @@ -1151,6 +1151,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h index 8eb5b31ee3..9de20b614e 100644 --- a/include/wx/setup_inc.h +++ b/include/wx/setup_inc.h @@ -1147,6 +1147,9 @@ // Set to 1 for TIFF format support (requires libtiff) #define wxUSE_LIBTIFF 1 +// Set to 1 for TGA format support (loading only) +#define wxUSE_TGA 1 + // Set to 1 for GIF format support #define wxUSE_GIF 1 diff --git a/samples/image/horse.tga b/samples/image/horse.tga new file mode 100644 index 0000000000000000000000000000000000000000..ecf1bbca5411a7ff2f4b56d01c6f42199fc56346 GIT binary patch literal 40786 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 gOgmjbsF|falA`8E9=*L-JKwXK9Y1IS}3b^rhX literal 0 HcmV?d00001 diff --git a/samples/image/image.cpp b/samples/image/image.cpp index 0fe93285b9..0f8193546e 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -69,6 +69,7 @@ public: wxBitmap my_horse_pcx; wxBitmap my_horse_pnm; wxBitmap my_horse_tiff; + wxBitmap my_horse_tga; wxBitmap my_horse_xpm; wxBitmap my_horse_ico32; wxBitmap my_horse_ico16; @@ -618,6 +619,15 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, my_horse_tiff = wxBitmap( image ); #endif +#if wxUSE_LIBTIFF + image.Destroy(); + + if ( !image.LoadFile( dir + _T("horse.tga"), wxBITMAP_TYPE_TGA ) ) + wxLogError(wxT("Can't load TGA image")); + else + my_horse_tga = wxBitmap( image ); +#endif + CreateAntiAliasedBitmap(); my_smile_xbm = wxBitmap( (const char*)smile_bits, smile_width, @@ -782,9 +792,13 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_horse_tiff.Ok()) dc.DrawBitmap( my_horse_tiff, 30, 1530 ); - dc.DrawText( _T("XPM handler"), 30, 1745 ); + dc.DrawText( _T("TGA handler"), 30, 1745 ); + if (my_horse_tga.Ok()) + dc.DrawBitmap( my_horse_tga, 30, 1760 ); + + dc.DrawText( _T("XPM handler"), 30, 1975 ); if (my_horse_xpm.Ok()) - dc.DrawBitmap( my_horse_xpm, 30, 1760 ); + dc.DrawBitmap( my_horse_xpm, 30, 2000 ); // toucans { @@ -825,15 +839,17 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_smile_xbm.Ok()) { - dc.DrawText( _T("XBM bitmap"), 30, 1975 ); - dc.DrawText( _T("(green on red)"), 30, 1990 ); + int x = 300, y = 1800; + + dc.DrawText( _T("XBM bitmap"), x, y ); + dc.DrawText( _T("(green on red)"), x, y + 15 ); dc.SetTextForeground( _T("GREEN") ); dc.SetTextBackground( _T("RED") ); - dc.DrawBitmap( my_smile_xbm, 30, 2010 ); + dc.DrawBitmap( my_smile_xbm, x, y + 30 ); dc.SetTextForeground( *wxBLACK ); - dc.DrawText( _T("After wxImage conversion"), 150, 1975 ); - dc.DrawText( _T("(red on white)"), 150, 1990 ); + dc.DrawText( _T("After wxImage conversion"), x + 120, y ); + dc.DrawText( _T("(red on white)"), x + 120, y + 15 ); dc.SetTextForeground( wxT("RED") ); wxImage i = my_smile_xbm.ConvertToImage(); i.SetMaskColour( 255, 255, 255 ); @@ -841,7 +857,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Red(), wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); - dc.DrawBitmap( wxBitmap(i), 150, 2010, true ); + dc.DrawBitmap( wxBitmap(i), x + 120, y + 30, true ); dc.SetTextForeground( *wxBLACK ); } @@ -865,15 +881,17 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (mono.Ok()) { - dc.DrawText( _T("Mono bitmap"), 30, 2095 ); - dc.DrawText( _T("(red on green)"), 30, 2110 ); + int x = 300, y = 1900; + + dc.DrawText( _T("Mono bitmap"), x, y ); + dc.DrawText( _T("(red on green)"), x, y + 15 ); dc.SetTextForeground( wxT("RED") ); dc.SetTextBackground( wxT("GREEN") ); - dc.DrawBitmap( mono, 30, 2130 ); + dc.DrawBitmap( mono, x, y + 30 ); dc.SetTextForeground( *wxBLACK ); - dc.DrawText( _T("After wxImage conversion"), 150, 2095 ); - dc.DrawText( _T("(red on white)"), 150, 2110 ); + dc.DrawText( _T("After wxImage conversion"), x + 120, y ); + dc.DrawText( _T("(red on white)"), x + 120, y + 15 ); dc.SetTextForeground( wxT("RED") ); wxImage i = mono.ConvertToImage(); i.SetMaskColour( 255,255,255 ); @@ -881,7 +899,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Red(), wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); - dc.DrawBitmap( wxBitmap(i), 150, 2130, true ); + dc.DrawBitmap( wxBitmap(i), x + 120, y + 30, true ); dc.SetTextForeground( *wxBLACK ); } @@ -1150,42 +1168,10 @@ void MyFrame::OnPaste(wxCommandEvent& WXUNUSED(event)) bool MyApp::OnInit() { -#if wxUSE_LIBPNG - wxImage::AddHandler( new wxPNGHandler ); -#endif - -#if wxUSE_LIBJPEG - wxImage::AddHandler( new wxJPEGHandler ); -#endif - -#if wxUSE_LIBTIFF - wxImage::AddHandler( new wxTIFFHandler ); -#endif - -#if wxUSE_GIF - wxImage::AddHandler( new wxGIFHandler ); -#endif - -#if wxUSE_PCX - wxImage::AddHandler( new wxPCXHandler ); -#endif - -#if wxUSE_PNM - wxImage::AddHandler( new wxPNMHandler ); -#endif - -#if wxUSE_XPM - wxImage::AddHandler( new wxXPMHandler ); -#endif - -#if wxUSE_ICO_CUR - wxImage::AddHandler( new wxICOHandler ); - wxImage::AddHandler( new wxCURHandler ); - wxImage::AddHandler( new wxANIHandler ); -#endif + wxInitAllImageHandlers(); - wxFrame *frame = new MyFrame(); - frame->Show( true ); + wxFrame *frame = new MyFrame(); + frame->Show( true ); - return true; + return true; } diff --git a/setup.h.in b/setup.h.in index 952c9a0b6e..8081e1b03b 100644 --- a/setup.h.in +++ b/setup.h.in @@ -511,6 +511,8 @@ #define wxUSE_LIBTIFF 0 +#define wxUSE_TGA 0 + #define wxUSE_GIF 0 #define wxUSE_PNM 0 diff --git a/src/common/imagall.cpp b/src/common/imagall.cpp index 060d9c78b0..87bac918c2 100644 --- a/src/common/imagall.cpp +++ b/src/common/imagall.cpp @@ -53,6 +53,9 @@ void wxInitAllImageHandlers() wxImage::AddHandler( new wxCURHandler ); wxImage::AddHandler( new wxANIHandler ); #endif +#if wxUSE_TGA + wxImage::AddHandler( new wxTGAHandler ); +#endif #if wxUSE_XPM wxImage::AddHandler( new wxXPMHandler ); #endif diff --git a/src/common/imagtga.cpp b/src/common/imagtga.cpp new file mode 100644 index 0000000000..bf99b1af4c --- /dev/null +++ b/src/common/imagtga.cpp @@ -0,0 +1,748 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: imagtga.cpp +// Purpose: wxImage TGA handler +// Author: Seth Jackson +// CVS-ID: $Id$ +// Copyright: (c) 2005 Seth Jackson +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_IMAGE && wxUSE_TGA + +#ifndef WX_PRECOMP + #include "wx/palette.h" +#endif + +#include "wx/imagtga.h" +#include "wx/log.h" + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// TGA error codes. +enum +{ + wxTGA_OK = 0, + wxTGA_INVFORMAT = 1, + wxTGA_MEMERR = 2 +}; + +// TGA header bytes. +enum +{ + HDR_OFFSET = 0, + HDR_COLORTYPE = 1, + HDR_IMAGETYPE = 2, + HDR_PALETTESTART = 3, + HDR_PALETTELENGTH = 5, + HDR_PALETTEBITS = 7, + HDR_XORIGIN = 8, + HDR_YORIGIN = 10, + HDR_WIDTH = 12, + HDR_HEIGHT = 14, + HDR_BPP = 16, + HDR_ORIENTATION = 17, + HDR_SIZE +}; + +// TGA color types. +enum +{ + wxTGA_UNMAPPED = 0, + wxTGA_MAPPED = 1 +}; + +// ============================================================================ +// implementation +// ============================================================================ + +IMPLEMENT_DYNAMIC_CLASS(wxTGAHandler, wxImageHandler) + +#if wxUSE_STREAMS + +// ---------------------------------------------------------------------------- +// worker functions +// ---------------------------------------------------------------------------- + +static +void FlipTGA(unsigned char* imageData, int width, int height, short pixelSize) +{ + int lineLength = width * pixelSize; + unsigned char *line1 = imageData; + unsigned char *line2 = &imageData[lineLength * (height - 1)]; + + unsigned char temp; + for ( ; line1 < line2; line2 -= (lineLength * 2)) + { + for (int index = 0; index < lineLength; line1++, line2++, index++) + { + temp = *line1; + *line1 = *line2; + *line2 = temp; + } + } +} + +static +void DecodeRLE(unsigned char* imageData, unsigned long imageSize, + short pixelSize, wxInputStream& stream) +{ + unsigned long index = 0; + unsigned char current; + unsigned int length; + unsigned char buf[4]; + + while (index < imageSize) + { + current = stream.GetC(); + + // RLE packet. + if ( current & 0x80 ) + { + // Get the run length of the packet. + current &= 0x7f; + + current++; + + length = current; + + index += current * pixelSize; + + // Repeat the pixel length times. + stream.Read(buf, pixelSize); + + for (unsigned int i = 0; i < length; i++) + { + memcpy(imageData, buf, pixelSize); + + imageData += pixelSize; + } + } + else // Raw packet. + { + // Get the run length of the packet. + current++; + + length = current * pixelSize; + + index += length; + + // Write the next length pixels directly to the image data. + stream.Read(imageData, length); + + imageData += length; + } + } +} + +static +int ReadTGA(wxImage* image, wxInputStream& stream) +{ + // Read in the TGA header + unsigned char hdr[HDR_SIZE]; + stream.Read(hdr, HDR_SIZE); + + short offset = hdr[HDR_OFFSET] + HDR_SIZE; + short colorType = hdr[HDR_COLORTYPE]; + short imageType = hdr[HDR_IMAGETYPE]; + int paletteLength = hdr[HDR_PALETTELENGTH] + 256 * hdr[HDR_PALETTELENGTH + 1]; + int width = (hdr[HDR_WIDTH] + 256 * hdr[HDR_WIDTH + 1]) - + (hdr[HDR_XORIGIN] + 256 * hdr[HDR_XORIGIN + 1]); + int height = (hdr[HDR_HEIGHT] + 256 * hdr[HDR_HEIGHT + 1]) - + (hdr[HDR_YORIGIN] + 256 * hdr[HDR_YORIGIN + 1]); + short bpp = hdr[HDR_BPP]; + short orientation = hdr[HDR_ORIENTATION] & 0x20; + + image->Create(width, height); + + if (!image->Ok()) + { + return wxTGA_MEMERR; + } + + const short pixelSize = bpp / 8; + + const unsigned long imageSize = width * height * pixelSize; + + unsigned char *imageData = (unsigned char* )malloc(imageSize); + + if (!imageData) + { + return wxTGA_MEMERR; + } + + unsigned char *dst = image->GetData(); + + unsigned char* alpha = NULL; + if (bpp == 16 || bpp == 32) + { + image->SetAlpha(); + + alpha = image->GetAlpha(); + } + + // Seek from the offset we got from the TGA header. + stream.SeekI(offset, wxFromStart); + + // Load a palette if we have one. + if (colorType == wxTGA_MAPPED) + { + unsigned char buf[3]; + + unsigned char* r = new unsigned char[paletteLength]; + unsigned char* g = new unsigned char[paletteLength]; + unsigned char* b = new unsigned char[paletteLength]; + + for (int i = 0; i < paletteLength; i++) + { + stream.Read(buf, 3); + + r[i] = buf[2]; + g[i] = buf[1]; + b[i] = buf[0]; + } + + #if wxUSE_PALETTE + + // Set the palette of the image. + + image->SetPalette(wxPalette(paletteLength, r, g, b)); + + #endif // wxUSE_PALETTE + + delete[] r; + delete[] g; + delete[] b; + } + + // Handle the various TGA formats we support. + + switch (imageType) + { + // Raw indexed. + + case 1: + { + const wxPalette& palette = image->GetPalette(); + unsigned char r; + unsigned char g; + unsigned char b; + + // No compression read the data directly to imageData. + + stream.Read(imageData, imageSize); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // Raw RGB. + + case 2: + { + // No compression read the data directly to imageData. + + stream.Read(imageData, imageSize); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + //16 bpp. + + case 16: + { + unsigned char temp; + + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + temp = (imageData[index + 1] & 0x7c) << 1; + temp |= temp >> 5; + *(dst++) = temp; + + temp = ((imageData[index + 1] & 0x03) << 6) | ((imageData[index] & 0xe0) >> 2); + temp |= temp >> 5; + *(dst++) = temp; + + temp = (imageData[index] & 0x1f) << 3; + temp |= temp >> 5; + *(dst++) = temp; + + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + // 24 bpp. + + case 24: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + } + } + break; + + // 32 bpp. + + case 32: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 3]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // Raw grayscale. + + case 3: + { + // No compression read the data directly to imageData. + + stream.Read(imageData, imageSize); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 1]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // RLE indexed. + + case 9: + { + const wxPalette& palette = image->GetPalette(); + unsigned char r; + unsigned char g; + unsigned char b; + + // Decode the RLE data. + + DecodeRLE(imageData, imageSize, pixelSize, stream); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + palette.GetRGB(imageData[index], &r, &g, &b); + + *(dst++) = r; + *(dst++) = g; + *(dst++) = b; + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // RLE RGB. + + case 10: + { + // Decode the RLE data. + + DecodeRLE(imageData, imageSize, pixelSize, stream); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + //16 bpp. + + case 16: + { + unsigned char temp; + + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + temp = (imageData[index + 1] & 0x7c) << 1; + temp |= temp >> 5; + *(dst++) = temp; + + temp = ((imageData[index + 1] & 0x03) << 6) | ((imageData[index] & 0xe0) >> 2); + temp |= temp >> 5; + *(dst++) = temp; + + temp = (imageData[index] & 0x1f) << 3; + temp |= temp >> 5; + *(dst++) = temp; + + *(alpha++) = (imageData[index + 1] & 0x80) ? 0 : 255; + } + } + break; + + // 24 bpp. + + case 24: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + } + } + break; + + // 32 bpp. + + case 32: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index + 2]; + *(dst++) = imageData[index + 1]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 3]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + // RLE grayscale. + + case 11: + { + // Decode the RLE data. + + DecodeRLE(imageData, imageSize, pixelSize, stream); + + // If orientation == 0, then the image is stored upside down. + // We need to store it right side up. + + if (orientation == 0) + { + FlipTGA(imageData, width, height, pixelSize); + } + + // Handle the different pixel depths. + + switch (bpp) + { + // 8 bpp. + + case 8: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + } + } + break; + + // 16 bpp. + + case 16: + { + for (unsigned long index = 0; index < imageSize; index += pixelSize) + { + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(dst++) = imageData[index]; + *(alpha++) = imageData[index + 1]; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + } + break; + + default: + return wxTGA_INVFORMAT; + } + + free(imageData); + + return wxTGA_OK; +} + +static +int SaveTGA(wxImage* WXUNUSED(image), wxOutputStream& WXUNUSED(stream)) +{ + wxLogError(wxT("Saving in TGA format is not implemented.")); + + return wxTGA_OK; +} + +// ---------------------------------------------------------------------------- +// wxTGAHandler +// ---------------------------------------------------------------------------- + +bool wxTGAHandler::LoadFile(wxImage* image, + wxInputStream& stream, + bool verbose, + int WXUNUSED(index)) +{ + if ( !CanRead(stream) ) + { + if ( verbose ) + wxLogError(wxT("TGA: this is not a TGA file.")); + + return false; + } + + image->Destroy(); + + int error = ReadTGA(image, stream); + if ( error != wxTGA_OK ) + { + if ( verbose ) + { + switch ( error ) + { + case wxTGA_INVFORMAT: + wxLogError(wxT("TGA: image format unsupported.")); + break; + + case wxTGA_MEMERR: + wxLogError(wxT("TGA: couldn't allocate memory.")); + break; + + default: + wxLogError(wxT("TGA: unknown error!")); + } + } + + image->Destroy(); + + return false; + } + + return true; +} + +bool wxTGAHandler::SaveFile(wxImage* image, wxOutputStream& stream, bool verbose) +{ + int error = SaveTGA(image, stream); + + if ( error != wxTGA_OK ) + { + if ( verbose ) + { + switch ( error ) + { + case wxTGA_INVFORMAT: + wxLogError(wxT("TGA: invalid image.")); + break; + + case wxTGA_MEMERR: + wxLogError(wxT("TGA: couldn't allocate memory.")); + break; + + default: + wxLogError(wxT("TGA: unknown error!")); + } + } + + return false; + } + + return true; +} + +bool wxTGAHandler::DoCanRead(wxInputStream& stream) +{ + // read the fixed-size TGA headers + unsigned char hdr[HDR_SIZE]; + stream.Read(hdr, HDR_SIZE); + + // Check wether we can read the file or not. + + short colorType = hdr[HDR_COLORTYPE]; + if ( colorType != wxTGA_UNMAPPED && colorType != wxTGA_MAPPED ) + { + return false; + } + + short imageType = hdr[HDR_IMAGETYPE]; + if ( imageType == 0 || imageType == 32 || imageType == 33 ) + { + return false; + } + + short bpp = hdr[HDR_BPP]; + if ( bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32 ) + { + return false; + } + + return true; +} + +#endif // wxUSE_STREAMS + +#endif // wxUSE_IMAGE && wxUSE_TGA diff --git a/src/wxWindows.dsp b/src/wxWindows.dsp index 5cba9fbd7c..83cee20a2b 100644 --- a/src/wxWindows.dsp +++ b/src/wxWindows.dsp @@ -699,6 +699,10 @@ SOURCE=.\common\imagpnm.cpp # End Source File # Begin Source File +SOURCE=.\common\imagtga.cpp +# End Source File +# Begin Source File + SOURCE=.\common\imagtiff.cpp # End Source File # Begin Source File @@ -2843,6 +2847,10 @@ SOURCE=..\include\wx\imagpnm.h # End Source File # Begin Source File +SOURCE=..\include\wx\imagtga.h +# End Source File +# Begin Source File + SOURCE=..\include\wx\imagtiff.h # End Source File # Begin Source File -- 2.50.0