Skip to content
Snippets Groups Projects
Select Git revision
  • 141a1cb89ba512fb579b9d500777a95f87061036
  • master default protected
  • 9.0
  • 8.0
  • nt-tools
  • 7.8
  • 7.6
  • 7.4
  • 7.2
  • 7.0
  • 0.6
  • rosuav/latex-markdown-renderer
  • rxnpatch/rxnpatch
  • marcus/gobject-introspection
  • rxnpatch/8.0
  • rosuav/pre-listening-ports
  • rosuav/async-annotations
  • rosuav/pgsql-ssl
  • rxnpatch/rxnpatch-broken/2023-10-06T094250
  • grubba/fdlib
  • grubba/wip/sakura/8.0
  • v8.0.2020
  • v8.0.2018
  • v8.0.2016
  • v8.0.2014
  • v8.0.2012
  • v8.0.2008
  • v8.0.2006
  • v8.0.2004
  • v8.0.2002
  • v8.0.2000
  • v8.0.1998
  • v8.0.1996
  • v8.0.1994
  • v8.0.1992
  • v8.0.1990
  • v8.0.1988
  • v8.0.1986
  • rxnpatch/clusters/8.0/2025-04-29T124414
  • rxnpatch/2025-04-29T124414
  • v8.0.1984
41 results

any.c

Blame
  • user avatar
    Mirar (Pontus Hagland) authored
    Rev: src/modules/Image/encodings/any.c:1.10
    141a1cb8
    History
    any.c 3.82 KiB
    /* $Id: any.c,v 1.10 1999/05/28 13:30:51 mirar Exp $ */
    
    /*
    **! module Image
    **! note
    **!	$Id: any.c,v 1.10 1999/05/28 13:30:51 mirar Exp $
    **! submodule ANY
    **!
    **!	This method calls the other decoding methods
    **!	and has some heuristics for what type of image
    **!	this is.
    **!
    **!	Methods:
    **!	<ref>decode</ref>, <ref>decode_alpha</ref>,
    **!	<ref>_decode</ref>
    **!
    **! see also: Image
    **!
    */
    #include "global.h"
    
    #include <math.h>
    #include <ctype.h>
    
    #include "stralloc.h"
    RCSID("$Id: any.c,v 1.10 1999/05/28 13:30:51 mirar Exp $");
    #include "pike_macros.h"
    #include "operators.h"
    #include "builtin_functions.h"
    #include "object.h"
    #include "constants.h"
    #include "interpret.h"
    #include "svalue.h"
    #include "threads.h"
    #include "array.h"
    #include "error.h"
    #include "threads.h"
    
    #include "image.h"
    
    void image_gif__decode(INT32 args);
    void image_pnm_decode(INT32 args);
    void image_xwd__decode(INT32 args);
    
    /*
    **! method mapping _decode(string data)
    **! method object decode(string data)
    **! method object decode_alpha(string data)
    **!	Tries heuristics to find the correct method 
    **!	of decoding the data, then calls that method.
    **!
    **! 	The result of _decode() is a mapping that contains
    **!	<pre>
    **!		"type":image data type (ie, "image/jpeg" or similar)
    **!		"image":the image object,
    **!		"alpha":the alpha channel or 0 if N/A
    **!	</pre>
    **!
    **! note
    **!	Throws upon failure.
    */
    
    void image_any__decode(INT32 args)
    {
       if (args!=1 || sp[-args].type!=T_STRING)
          error("Image.ANY.decode: illegal arguments\n");
       
       if (sp[-args].u.string->len<4)
          error("Image.ANY.decode: too short string\n");
    
    #define CHAR2(a,b) ((((unsigned char)(a))<<8)|((unsigned char)(b)))
       /* ok, try the heuristics */
       switch (CHAR2(sp[-args].u.string->str[0],sp[-args].u.string->str[1]))
       {
          case CHAR2('P','1'):
          case CHAR2('P','2'):
          case CHAR2('P','3'):
          case CHAR2('P','4'):
          case CHAR2('P','5'):
          case CHAR2('P','6'):
          case CHAR2('P','7'):
    	 /* ok, a PNM */
    	 img_pnm_decode(1);
    	 push_text("image/x-pnm");
    	 goto simple_image;
    
          case CHAR2(255,216):
    	 /* JFIF */
    	 push_text("Image");
    	 push_int(0);
    	 SAFE_APPLY_MASTER("resolv",2);
    	 push_text("JPEG");
    	 f_index(2);
    	 push_text("decode");
    	 f_index(2);
    	 stack_swap();
    	 f_call_function(2);
    	 push_text("image/jpeg");
    	 goto simple_image;
    
          case CHAR2('P','N'):
    	 /* PNG */
    	 push_text("Image");
    	 push_int(0);
    	 SAFE_APPLY_MASTER("resolv",2);
    	 push_text("PNG");
    	 f_index(2);
    	 push_text("_decode");
    	 f_index(2);
    	 stack_swap();
    	 f_call_function(2);
    	 return;
    
          case CHAR2('G','I'):
    	 /* GIF */
    	 image_gif_decode_map(1);
    	 return;
    
          case CHAR2('F','O'):
    	 /* ILBM (probably) */
    	 img_ilbm_decode(1);
    	 push_text("image/x-ilbm");
    	 goto simple_image;
    
          case CHAR2('B','M'):
    	 /* BMP */
    	 img_bmp__decode(1);
    	 return;
    
          case CHAR2(0,0):
    	 switch (CHAR2(sp[-args].u.string->str[2],sp[-args].u.string->str[3]))
    	 {
    	    case CHAR2(0,'k'):
    	       /* XWD */
    	       image_xwd__decode(1);
    	       return; /* done */
    	 }
    	 
    	 goto unknown_format;
    
          default:
    unknown_format:
    	 error("Unknown image format.\n");	 
       }
    
    simple_image:
       /* on stack: object image,string type */
       f_aggregate(2);
       push_text("image");
       push_text("type");
       f_aggregate(2);
       stack_swap();
       f_mkmapping(2);
       return;
    }
    
    void image_any_decode(INT32 args)
    {
       image_any__decode(args);
       push_text("image");
       f_index(2);
    }
    
    void image_any_decode_alpha(INT32 args)
    {
       image_any__decode(args);
       push_text("alpha");
       f_index(2);
    }
    
    
    /** module *******************************************/
    
    void init_image_any(void)
    {
       add_function("_decode",image_any__decode,
    		"function(string:mapping)",0);
       add_function("decode",image_any_decode,
    		"function(string:object)",0);
       add_function("decode_alpha",image_any_decode_alpha,
    		"function(string:object)",0);
    }
    
    void exit_image_any(void)
    {
    }