loadjpeg.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // loadjpeg.c
  2. // jpeg wrapper for BlitzMax libjpeg
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <setjmp.h>
  6. #include <jpeglib.h>
  7. static jmp_buf jmp_env;
  8. static void format_message (j_common_ptr cinfo, char * buffer) {}
  9. static void output_message (j_common_ptr cinfo) {}
  10. static void emit_message (j_common_ptr cinfo, int msg_level) {}
  11. static void error_exit (j_common_ptr cinfo){
  12. // printf("error_exit called from loadjpeg.c\n");
  13. // fflush(stdout);
  14. longjmp( jmp_env,-1 );
  15. }
  16. //jpeg_destroy(cinfo);}
  17. static void reset_error_mgr (j_common_ptr cinfo) {
  18. cinfo->err->num_warnings=0;cinfo->err->msg_code = 0;
  19. }
  20. int (*ReadStream)(void*,int,void*);
  21. int (*WriteStream)(const void*,int,void*);
  22. void initjerr(struct jpeg_error_mgr *jerr)
  23. {
  24. jerr->error_exit = error_exit;
  25. jerr->emit_message = emit_message;
  26. jerr->output_message = output_message;
  27. jerr->format_message = format_message;
  28. jerr->reset_error_mgr = reset_error_mgr;
  29. jerr->trace_level = 0; // default = no tracing
  30. jerr->num_warnings = 0; // no warnings emitted yet
  31. jerr->msg_code = 0; // may be useful as a flag for "no error"
  32. // Initialize message table pointers
  33. jerr->jpeg_message_table = NULL; //jpeg_std_message_table;
  34. jerr->last_jpeg_message = 0; //(int) JMSG_LASTMSGCODE - 1;
  35. // jerr->jpeg_message_table = jpeg_std_message_table;
  36. // jerr->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
  37. jerr->addon_message_table = NULL;
  38. jerr->first_addon_message = 0; // for safety
  39. jerr->last_addon_message = 0;
  40. }
  41. int loadjpg(void *stream,void *readfunc,int *width,int *height,int *channels,char **pix)
  42. {
  43. int size,w,h,d,span,res;
  44. char *p;
  45. struct jpeg_decompress_struct cinfo;
  46. struct jpeg_error_mgr jerr;
  47. ReadStream=readfunc;
  48. initjerr(&jerr);
  49. cinfo.err=&jerr;
  50. jpeg_create_decompress(&cinfo);
  51. jpeg_stdio_src(&cinfo,(FILE*)stream);
  52. if( setjmp( jmp_env ) ){
  53. jpeg_destroy_decompress( &cinfo );
  54. return -1;
  55. }
  56. res=jpeg_read_header(&cinfo,TRUE);
  57. if (res!=1){
  58. jpeg_destroy_decompress( &cinfo );
  59. return -1;
  60. }
  61. jpeg_start_decompress(&cinfo);
  62. *width=w=cinfo.output_width;
  63. *height=h=cinfo.output_height;
  64. *channels=d=cinfo.output_components;
  65. p=(char*)malloc(w*h*d);
  66. *pix=p;
  67. if (p)
  68. {
  69. span=w*d;
  70. while (h--)
  71. {
  72. jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&p,1);
  73. p+=span;
  74. }
  75. }
  76. jpeg_finish_decompress(&cinfo);
  77. jpeg_destroy_decompress(&cinfo);
  78. return 0;
  79. }
  80. struct jpeg_compress_struct ccinfo;
  81. struct jpeg_error_mgr jerr;
  82. int savejpg(void *stream,void *writefunc,int width,int height,int pitch,char *pix,int qlty){
  83. int y;
  84. WriteStream=writefunc;
  85. initjerr(&jerr);
  86. ccinfo.err=&jerr;
  87. jpeg_create_compress(&ccinfo);
  88. jpeg_stdio_dest(&ccinfo,(FILE*)stream); //(_iobuf*)out);
  89. if( setjmp(jmp_env) ){return 1;}
  90. ccinfo.image_width=width; //* image width and height, in pixels
  91. ccinfo.image_height=height;
  92. ccinfo.input_components=3; // # of color components per pixel
  93. ccinfo.in_color_space=JCS_RGB; // colorspace of input image
  94. jpeg_set_defaults(&ccinfo);
  95. jpeg_set_quality(&ccinfo,qlty,TRUE);
  96. jpeg_start_compress(&ccinfo,TRUE);
  97. for (y=0;y<height;y++){
  98. jpeg_write_scanlines(&ccinfo,&pix,1);
  99. pix+=pitch;
  100. }
  101. jpeg_finish_compress(&ccinfo);
  102. jpeg_destroy_compress(&ccinfo);
  103. return 0;
  104. }
  105. #ifdef simon
  106. #include <jinclude.h>
  107. #include <jpeglib.h>
  108. #include <jversion.h>
  109. #include <jerror.h>
  110. // from jerror.c
  111. /*
  112. * Create the message string table.
  113. * We do this from the master message list in jerror.h by re-reading
  114. * jerror.h with a suitable definition for macro JMESSAGE.
  115. * The message table is made an external symbol just in case any applications
  116. * want to refer to it directly.
  117. */
  118. #ifdef NEED_SHORT_EXTERNAL_NAMES
  119. #define jpeg_std_message_table jMsgTable
  120. #endif
  121. #define JMESSAGE(code,string) string ,
  122. const char * const jpeg_std_message_table[] = {
  123. #include <jerror.h>
  124. NULL
  125. };
  126. #endif