home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Examples / AppKit / ImageFilter / ImageFilter.m < prev    next >
Encoding:
Text File  |  1995-02-06  |  2.7 KB  |  87 lines

  1. /*
  2.  * ImageFilter.m, Image filter service example.
  3.  * Author: Ali T. Ozer, NeXT Computer, Inc.
  4.  * Written for 3.0, June 1, 1992.
  5.  *
  6.  * You may freely copy, distribute and reuse the code in this example.
  7.  * NeXT disclaims any warranty of any kind, expressed or implied, as to its
  8.  * fitness for any particular use.
  9.  */
  10.  
  11. #import    <appkit/appkit.h>
  12.  
  13. extern NXBitmapImageRep *convertIFFToTIFF (NXStream *imageStream);
  14.  
  15. @interface ImageConverter : Object
  16. - convertToTIFF:pb userData:(const char *)userData error:(char **)errorMessage;
  17. @end
  18.  
  19. @implementation ImageConverter
  20.  
  21. - convertToTIFF:pasteboard userData:(const char *)userData error:(char **)errorMessage
  22. {
  23.     static NXAtom typesThatCanBeConverted[2] = {NULL, NULL};
  24.     NXAtom typeToBeConverted;
  25.     char fileToBeConverted[MAXPATHLEN+1];
  26.     NXStream *imageStream = NULL;
  27.  
  28.     if (!typesThatCanBeConverted[0]) {
  29.     typesThatCanBeConverted[0] = NXCreateFilenamePboardType("iff");
  30.     typesThatCanBeConverted[1] = NULL;
  31.     }
  32.  
  33.     if (typeToBeConverted = [pasteboard findAvailableTypeFrom:typesThatCanBeConverted num:1]) {
  34.     char *data, *separator, *extension;
  35.     int dataLen;
  36.     [pasteboard readType:typeToBeConverted data:&data length:&dataLen];
  37.     if (data && dataLen) {
  38.         // Copy the name of the first file in the file list into "path"
  39.         // (Usually there will only be one file, but don't take any chances!)
  40.         int strLen = (separator = index(data, '\t')) ? (separator - data) : dataLen;
  41.         strncpy(fileToBeConverted, data, strLen);
  42.         fileToBeConverted[strLen] = 0;
  43.         // Make sure the file extension is what we want. If not, we punt.
  44.         extension = rindex(fileToBeConverted, '.');
  45.         if (extension && (strcmp(extension, ".iff") == 0)) {
  46.         imageStream = NXMapFile(fileToBeConverted, NX_READONLY);
  47.         }
  48.     }
  49.     // Deallocate the file name list
  50.     [pasteboard deallocatePasteboardData:data length:dataLen];
  51.     }
  52.  
  53.     if (imageStream) {
  54.     NXBitmapImageRep *tiffImage = nil;
  55.     NXStream *tiffStream = NULL;
  56.     NX_DURING
  57.         if (tiffImage = convertIFFToTIFF (imageStream)) {
  58.         tiffStream = NXOpenMemory (NULL, 0, NX_READWRITE);
  59.         [tiffImage writeTIFF:tiffStream];
  60.         [pasteboard declareTypes:&NXTIFFPboardType num:1 owner:self];
  61.         [pasteboard writeType:NXTIFFPboardType fromStream:tiffStream];
  62.         }
  63.     NX_HANDLER
  64.         NXLogError ("Error occurred while converting file %s:", fileToBeConverted);
  65.         NXReportError(&NXLocalHandler);
  66.     NX_ENDHANDLER
  67.     if (tiffImage) [tiffImage free];
  68.     if (tiffStream) NXCloseMemory (tiffStream, NX_FREEBUFFER);
  69.     NXCloseMemory (imageStream, NX_FREEBUFFER);
  70.     imageStream = NULL;
  71.     }
  72.  
  73.     return self;
  74. }
  75.  
  76. @end
  77.  
  78. int main(int argc, char **argv)
  79. {
  80.     id listener = [Listener new];
  81.     [listener setServicesDelegate:[ImageConverter new]];
  82.     [listener checkInAs:"A Simple Image Converter"];
  83.     [listener addPort];
  84.     [Listener run];
  85. }
  86.  
  87.