]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxUSE_IMAGE; added write-only wxXPMHandler
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 22 Apr 2001 22:31:53 +0000 (22:31 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 22 Apr 2001 22:31:53 +0000 (22:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9854 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/imagall.cpp
src/common/imagbmp.cpp
src/common/image.cpp
src/common/imaggif.cpp
src/common/imagjpeg.cpp
src/common/imagpcx.cpp
src/common/imagpng.cpp
src/common/imagpnm.cpp
src/common/imagtiff.cpp
src/common/imagxpm.cpp [new file with mode: 0644]

index ec8bf996c1e76dec1498c50a4f678cc6c8588dbb..454993388a5f10d3b6ff4ecc239b5cf77463ef40 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "wx/image.h"
 
+#if wxUSE_IMAGE
+
 //-----------------------------------------------------------------------------
 // This function allows dynamic access to all image handlers compile within
 // the library. This function should be in a separate file as some compilers
@@ -50,4 +52,9 @@ void wxInitAllImageHandlers()
 #if wxUSE_PCX
   wxImage::AddHandler( new wxPCXHandler );
 #endif
+#if wxUSE_XPM
+  wxImage::AddHandler( new wxXPMHandler );
+#endif
 }
+
+#endif // wxUSE_IMAGE
index 7caff9078edb052cf8f262be538ece27ed95b78b..9f92b3c8fc6505d6e8ea22194c6c6d8308af6529 100644 (file)
 #pragma hdrstop
 #endif
 
+#include "wx/defs.h"
+
+#if wxUSE_IMAGE
+
 #include "wx/imagbmp.h"
 #include "wx/bitmap.h"
 #include "wx/debug.h"
@@ -546,4 +550,4 @@ bool wxBMPHandler::DoCanRead( wxInputStream& stream )
 
 #endif // wxUSE_STREAMS
 
-
+#endif // wxUSE_IMAGE
index 8778bb42898b8021a9a0a6d90cabc61ad478d94a..c19e9da9d73e08be605ea4a7d4abc3553ff661dc 100644 (file)
     #pragma hdrstop
 #endif
 
+#include "wx/defs.h"
+
+#if wxUSE_IMAGE
+
 #include "wx/image.h"
 #include "wx/bitmap.h"
 #include "wx/debug.h"
@@ -1460,3 +1464,4 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
     return rotated;
 }
 
+#endif // wxUSE_IMAGE
index e152a6cbda369817c9b710749e6abecc74602a00..b8a5229e2343eac696fbafb7e895d1ff03451b2b 100644 (file)
@@ -22,7 +22,7 @@
 #  include "wx/defs.h"
 #endif
 
-#if wxUSE_GIF
+#if wxUSE_IMAGE && wxUSE_GIF
 
 #include "wx/imaggif.h"
 #include "wx/gifdecod.h"
index f985604631f44cd36ff3297623a35c95b116e052..8e760ef7b15fdb76dcd5d3df5ff97189dfff3358 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "wx/defs.h"
 
-#if wxUSE_LIBJPEG
+#if wxUSE_IMAGE && wxUSE_LIBJPEG
 
 #include "wx/imagjpeg.h"
 #include "wx/bitmap.h"
index 348dd9f8f9e290b8c1532923582ab256a92dc5b9..d03735e4c5ec0b851221d9684e6e43844bd3fef5 100644 (file)
@@ -23,7 +23,7 @@
 #  include "wx/defs.h"
 #endif
 
-#if wxUSE_STREAMS && wxUSE_PCX
+#if wxUSE_IMAGE && wxUSE_STREAMS && wxUSE_PCX
 
 #include "wx/imagpcx.h"
 #include "wx/wfstream.h"
index 8272a0d383934b751860528b540b15e7a9e83091..f68cf59e5f5d9bd1bdef41a19f738084e3960e39 100644 (file)
@@ -22,7 +22,7 @@
   #include "wx/defs.h"
 #endif
 
-#if wxUSE_LIBPNG
+#if wxUSE_IMAGE && wxUSE_LIBPNG
 
 #include "wx/imagpng.h"
 #include "wx/bitmap.h"
index 3646d49e8205beff3b0eb7bbabe1fe626e07fdab..d5ca1fae4ddfa7a2e6075188680dd9fb297a9a7e 100644 (file)
@@ -22,7 +22,7 @@
 #  include "wx/setup.h"
 #endif
 
-#if wxUSE_PNM
+#if wxUSE_IMAGE && wxUSE_PNM
 
 #include "wx/imagpnm.h"
 #include "wx/log.h"
index ec1a1bc5341d00ec5f813b96f5e1870386b1f4c3..fe1b7172fcf096a71f83dad65610f3bc9e85d0ac 100644 (file)
@@ -20,7 +20,7 @@
 
 #include "wx/defs.h"
 
-#if wxUSE_LIBTIFF
+#if wxUSE_IMAGE && wxUSE_LIBTIFF
 
 #include "wx/imagtiff.h"
 #include "wx/bitmap.h"
diff --git a/src/common/imagxpm.cpp b/src/common/imagxpm.cpp
new file mode 100644 (file)
index 0000000..b637c66
--- /dev/null
@@ -0,0 +1,221 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        imagxpm.cpp
+// Purpose:     wxXPMHandler
+// Author:      Vaclav Slavik
+// RCS-ID:      $Id$
+// Copyright:   (c) 2001 Vaclav Slavik
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+/*
+
+This file is partially based on source code of ImageMagick by John Cristy. Its
+license is as follows:
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%                            X   X  PPPP   M   M                              %
+%                             X X   P   P  MM MM                              %
+%                              X    PPPP   M M M                              %
+%                             X X   P      M   M                              %
+%                            X   X  P      M   M                              %
+%                                                                             %
+%                                                                             %
+%                    Read/Write ImageMagick Image Format.                     %
+%                                                                             %
+%                                                                             %
+%                              Software Design                                %
+%                                John Cristy                                  %
+%                                 July 1992                                   %
+%                                                                             %
+%                                                                             %
+%  Copyright (C) 2001 ImageMagick Studio, a non-profit organization dedicated %
+%  to making software imaging solutions freely available.                     %
+%                                                                             %
+%  Permission is hereby granted, free of charge, to any person obtaining a    %
+%  copy of this software and associated documentation files ("ImageMagick"),  %
+%  to deal in ImageMagick without restriction, including without limitation   %
+%  the rights to use, copy, modify, merge, publish, distribute, sublicense,   %
+%  and/or sell copies of ImageMagick, and to permit persons to whom the       %
+%  ImageMagick is furnished to do so, subject to the following conditions:    %
+%                                                                             %
+%  The above copyright notice and this permission notice shall be included in %
+%  all copies or substantial portions of ImageMagick.                         %
+%                                                                             %
+%  The software is provided "as is", without warranty of any kind, express or %
+%  implied, including but not limited to the warranties of merchantability,   %
+%  fitness for a particular purpose and noninfringement.  In no event shall   %
+%  ImageMagick Studio be liable for any claim, damages or other liability,    %
+%  whether in an action of contract, tort or otherwise, arising from, out of  %
+%  or in connection with ImageMagick or the use or other dealings in          %
+%  ImageMagick.                                                               %
+%                                                                             %
+%  Except as contained in this notice, the name of the ImageMagick Studio     %
+%  shall not be used in advertising or otherwise to promote the sale, use or  %
+%  other dealings in ImageMagick without prior written authorization from the %
+%  ImageMagick Studio.                                                        %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+#ifdef __GNUG__
+#pragma implementation "imagxpm.h"
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#  pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#  include "wx/defs.h"
+#endif
+
+#if wxUSE_IMAGE && wxUSE_XPM
+
+#include "wx/imagxpm.h"
+#include "wx/wfstream.h"
+#include "wx/log.h"
+#include "wx/intl.h"
+#include "wx/utils.h"
+
+
+IMPLEMENT_DYNAMIC_CLASS(wxXPMHandler,wxImageHandler)
+
+//-----------------------------------------------------------------------------
+// wxXPMHandler
+//-----------------------------------------------------------------------------
+
+#if wxUSE_STREAMS
+
+bool wxXPMHandler::LoadFile(wxImage *WXUNUSED(image), 
+                            wxInputStream& WXUNUSED(stream), 
+                            bool verbose, int WXUNUSED(index))
+{
+    if (verbose)
+        wxLogDebug(_("XPM: the handler is write-only!"));
+    return FALSE;
+}
+
+bool wxXPMHandler::SaveFile(wxImage * image,
+                            wxOutputStream& stream, bool verbose)
+{
+    wxString tmp;
+    char tmp_c;
+    
+    // 1. count colours:
+    #define MaxCixels  92
+    static const char Cixel[MaxCixels+1] = 
+                         " .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjk"
+                         "lzxcvbnmMNBVCZASDFGHJKLPIUYTREWQ!~^/()_`'][{}|";
+    int chars_per_pixel;
+    int cols;
+    int i, j, k;
+    
+    cols = image->CountColours();
+    chars_per_pixel = 1;
+    for ( k = MaxCixels; cols > k; k *= MaxCixels)
+        chars_per_pixel++;
+
+    // 2. write the header:
+    tmp.Printf("/* XPM */\n"
+               "static char *xpm_data[] = {\n"
+               "/* columns rows colors chars-per-pixel */\n"
+               "\"%i %i %i %i\",\n", 
+               image->GetWidth(), image->GetHeight(), cols, chars_per_pixel);
+    stream.Write(tmp.mb_str(), tmp.Length());
+
+    // 3. create color symbols table:
+    wxHashTable table(wxKEY_INTEGER);
+    image->ComputeHistogram(table);
+
+    char *symbols_data = new char[cols * (chars_per_pixel+1)];
+    char **symbols = new char*[cols];
+
+    // 2a. find mask colour:
+    long mask_key = -1;
+    if (image->HasMask())
+        mask_key = (image->GetMaskRed() << 16) |
+                   (image->GetMaskGreen() << 8) | image->GetMaskBlue();
+    
+    // 2b. generate colour table:
+    table.BeginFind();
+    wxNode *node = NULL;
+    while ((node = table.Next()) != NULL)
+    {
+        wxHNode *hnode = (wxHNode*) node->GetData();
+        long index = hnode->index;
+        symbols[index] = symbols_data + index * (chars_per_pixel+1);
+        char *sym = symbols[index];
+
+        k = index % MaxCixels;
+        sym[0] = Cixel[k];
+        for (j = 1; j < chars_per_pixel; j++)
+        {
+            k = ((index - k) / MaxCixels) % MaxCixels;
+            sym[j] = Cixel[k];
+        }
+        sym[j] = '\0';
+
+        long key = node->GetKeyInteger();
+
+        if (key == 0)
+            tmp.Printf(wxT("\"%s c Black\",\n"), sym);
+        else if (key == mask_key)
+            tmp.Printf(wxT("\"%s c None\",\n"), sym);
+        else
+            tmp.Printf(wxT("\"%s c #%s%s%s\",\n"), sym, 
+                       wxDecToHex((unsigned char)(key >> 16)).c_str(),
+                       wxDecToHex((unsigned char)(key >> 8)).c_str(),
+                       wxDecToHex((unsigned char)(key)).c_str());
+        stream.Write(tmp.mb_str(), tmp.Length());
+    }
+
+    tmp = wxT("/* pixels */\n");
+    stream.Write(tmp.mb_str(), tmp.Length());
+
+    unsigned char *data = image->GetData();
+    for (j = 0; j < image->GetHeight(); j++)
+    {
+        tmp_c = '\"'; stream.Write(&tmp_c, 1);
+        for (i = 0; i < image->GetWidth(); i++, data += 3)
+        {
+            unsigned long key = (data[0] << 16) | (data[1] << 8) | (data[2]);
+            wxHNode *hnode = (wxHNode*) table.Get(key);
+            stream.Write(symbols[hnode->index], chars_per_pixel);
+        }
+        tmp_c = '\"'; stream.Write(&tmp_c, 1);
+        if ( j + 1 < image->GetHeight() )
+        {
+            tmp_c = ','; stream.Write(&tmp_c, 1);
+        }
+        tmp_c = '\n'; stream.Write(&tmp_c, 1);
+    }
+    tmp = wxT("};\n");
+    stream.Write(tmp.mb_str(), 3);
+    
+    delete[] symbols;
+    delete[] symbols_data;
+
+    return TRUE;
+}
+
+bool wxXPMHandler::DoCanRead(wxInputStream& stream)
+{
+    unsigned char buf[9];
+
+    stream.Read(buf, 9);
+    stream.SeekI(-9, wxFromCurrent);
+
+    return (memcmp(buf, "/* XPM */", 9) == 0);
+}
+
+#endif  // wxUSE_STREAMS
+
+#endif // wxUSE_XPM && wxUSE_IMAGE