/*
 * jwracorn8.c
 *
 * Copyright (C) 1993, Frank Lyonnet.
 *
 * This file contains routines to write scaled image in Acorn Sprite format from decompressor output .
 *
 */

#include "jinclude.h"
#include <stdlib.h>

/* Threads */
#include "C:kernel.h"
#include "MyThread.h"

#include "Bool.h"
#include "Scaling.h"

/* MySprite */
#include "Risc_OSLib:wimp.h"
#include "MySprite.h"

#include "Erreur.h"
#include "RISC_OSLib:msgs.h"

/* For colorspaces */
#include "Modes.h"

/* Scaling module */
static FYEO_scaling * ScaleHandle;

/* Save the SpriteHandle */
static void * TheSpriteHandle;

/* We access some shared memory */
extern int FYEO_lines_processed;

static void write_gray_sprite(char * Gray)
{
   mysprite_gray_output_one_line(TheSpriteHandle,Gray);

   FYEO_lines_processed++;
}

static void write_color_sprite(char * Red , char * Green , char * Blue)
{
   mysprite_color_output_one_line(TheSpriteHandle,Red,Green,Blue);

   FYEO_lines_processed++;
}

METHODDEF void output_init(decompress_info_ptr cinfo)
{
   /* Save the handle */
   TheSpriteHandle = cinfo -> output_sprite;

   switch(cinfo->out_color_space)
   {
   case CS_GRAYSCALE:

      /* Init the sprite output process */
      (void)mysprite_gray_output_init(TheSpriteHandle);

      /* Init the scaling module, give func to call to output one line */
      ScaleHandle = FYEO_gray_scaling_init(cinfo -> output_area_width ,
         cinfo -> output_area_height ,
         cinfo -> x_scale_mul , cinfo -> x_scale_div ,
         cinfo -> y_scale_mul , cinfo -> y_scale_div ,
         write_gray_sprite , cinfo -> special_speed);

      break;

   case CS_YCbCr:

      /* Init the sprite output process */
      (void)mysprite_color_output_init(TheSpriteHandle, FYEO_YUV);

      /* Init the scaling module, give func to call to output one line */
      ScaleHandle = FYEO_color_scaling_init(cinfo -> output_area_width ,
         cinfo -> output_area_height ,
         cinfo -> x_scale_mul , cinfo -> x_scale_div ,
         cinfo -> y_scale_mul , cinfo -> y_scale_div ,
         write_color_sprite , cinfo -> special_speed);

      break;

   default:
      erreur_interne(msgs_lookup("InvCMap"));
      break;
   };
}

/*
 * Write the color map.
 */
METHODDEF void put_color_map(decompress_info_ptr cinfo, int num_colors, JSAMPARRAY colormap)
{
  /* Nothing to do, we don't support it for now */
}

/*
 * Write some pixel data.
 */

METHODDEF void put_pixel_rows(decompress_info_ptr cinfo, int num_rows, JSAMPIMAGE pixel_data)
{
register JSAMPROW ptr0, ptr1, ptr2;
register int row;

   /* Passage sur les colonnes */

   for (row = 0; row < num_rows; row++)
   {
      ptr0 = pixel_data[0][row];
      ptr1 = pixel_data[1][row];
      ptr2 = pixel_data[2][row];

      switch(cinfo -> out_color_space)
      {
      case CS_GRAYSCALE:

         /* Fill in the scaling module */
         FYEO_gray_scaling_add_one_line(ScaleHandle,ptr0);
         break;

      case CS_YCbCr:

         /* Fill in the scaling module */
         FYEO_color_scaling_add_one_line(ScaleHandle,ptr0,ptr1,ptr2);
         break;
      default:
         erreur_interne(msgs_lookup("InvCMap"));
         break;
      };

      /* Time to multitask ? */
      if(row%8==0)
         my_thread_leave(OK);
   };
}

/*
 * Finish up at the end of the file.
 */

METHODDEF void output_term(decompress_info_ptr cinfo)
{
   switch(cinfo->out_color_space)
   {
   case CS_GRAYSCALE:

      /* Terminate the scaling module */
      FYEO_gray_scaling_term(ScaleHandle);

      /* The output to sprite is finished */
      mysprite_gray_output_term(TheSpriteHandle);
      break;

   case CS_YCbCr:

      /* Terminate the scaling module */
      FYEO_color_scaling_term(ScaleHandle);

      /* The output to sprite is finished */
      mysprite_color_output_term(TheSpriteHandle);
      break;
   default:
      erreur_interne(msgs_lookup("InvCMap"));
      break;
   };

   /* Last lines */
   my_thread_leave(OK);
}

/*
 * The method selection routine for Acorn Sprite format output.
 * This should be called from d_ui_method_selection if Acorn Sprite output is wanted.
 */

GLOBAL void jselwmacorn_decomp(decompress_info_ptr cinfo)
{
   cinfo->methods->output_init = output_init;
   cinfo->methods->put_color_map = put_color_map;
   cinfo->methods->put_pixel_rows = put_pixel_rows;
   cinfo->methods->output_term = output_term;
}

