/* Copyright 1997 Acorn Computers Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/***************************************************/
/* File   : Images.h                               */
/*                                                 */
/* Purpose: Image related functions.               */
/*                                                 */
/* Author : Merlyn Kline for Customer browser     */
/*          This source adapted by A.D.Hodgkinson  */
/*                                                 */
/* History: 28-Nov-96: Created with dummy function */
/*                     for temporary use in other  */
/*                     routines.                   */
/*          20-Jan-97: Filled in with most of the  */
/*                     functions present and       */
/*                     converted to the new data   */
/*                     structures where needed.    */
/*          15-Mar-97: Reorganised a bit, putting  */
/*                     functions in a more logical */
/*                     order to aid legibility.    */
/*          17-Dec-97: Added support for saving as */
/*                     a Draw file.                */
/***************************************************/

/* Size reported for an image or Object if it's data isn't */
/* present and no other size information can be found      */

#define ImageDefaultOSSize_X 48
#define ImageDefaultOSSize_Y 48

/* The image_info structure is used for the image handling code, */
/* where each image has associated data about its size, fetch    */
/* status and so-on.                                             */

struct browser_data;

typedef struct image_info
{
  unsigned int          handle;         /* URL fetch handle for this image                              */
  Image               * istore;         /* Imagetrans pointer                                           */
  browser_data        * owner;          /* Owner of this structure                                      */

  int                   x;              /* X position on the page for the owner                         */
  int                   y;              /* Y position on the page for the owner                         */

  int                   dataoffset;     /* Offset of image data within image data block                 */
  int                   alloc;          /* Total space allocated in flex block                          */
  int                   ualloc;         /* Space allocated to url in flex block                         */
  int                   isize;          /* Size of image storage used                                   */
  HStream             * token;          /* Token this image appears in                                  */

  int                   currw;          /* Current width of image                                       */
  int                   currh;          /* Current height of image                                      */

  int                   xref;           /* Cross-reference to image record with same url                */

  int                   bytesgot;       /* Total bytes fetched for this image so far                    */

  unsigned int          started     :1; /* The fetch has started to happen                              */
  unsigned int          fetched     :1; /* Flag indicating the image is fetched                         */
  unsigned int          delayed     :1; /* Flag indicating the image is delayed (by delayimages option) */
  unsigned int          success     :1; /* This image completed fetching without errors                 */

  unsigned int          fixedsize   :1; /* The size has been fixed in the HTML                          */
  unsigned int          background  :1; /* The image is being used as a page background                 */

  unsigned int          hadfirst    :1; /* 1 = image has had image_update_image called for it           */
  unsigned int          reformat    :1; /* 1 = should reformat on next image update if fixedsize = 0    */
  unsigned int          fromhistory :1; /* 1 = image size came from image history rather than HTML      */
  unsigned int          hadfiller   :1; /* 1 = image has had RegisterFiller called for it               */
  unsigned int          canredraw   :1; /* 1 = image may be redrawn, else is waiting for a reformat     */
  unsigned int          priority    :1; /* 1 = show the image regardless of any global settings         */

} image_info;

/* Function prototypes */

_kernel_oserror * image_new_image                    (browser_data * b, const char * url, HStream * token, int background);
void              image_abort_fetches                (browser_data * b);
_kernel_oserror * image_process_null                 (browser_data * b);
_kernel_oserror * image_discard                      (browser_data * b);
void              image_reload                       (browser_data * b, HStream * token);
void              image_delay_fetches                (browser_data * b);
void              image_restart_fetches              (browser_data * b, int foreground, int background);

int               image_animate_images               (int eventcode, WimpPollBlock * block, IdBlock * idb, browser_data * handle);
_kernel_oserror * image_fill_background              (void * handle, int * i);

_kernel_oserror * image_redraw                       (browser_data * b, WimpRedrawWindowBlock * r, HStream * token, int x, int y);
int               image_tile_window                  (browser_data * b, WimpRedrawWindowBlock * r, int xorigin, int yorigin);
void              image_mark_as_redrawable           (browser_data * b, int image);
void              image_token_reformatted            (browser_data * b, HStream * token);

_kernel_oserror * image_mode_change                  (void);

int               image_fetching                     (browser_data * b);
int               image_fetched                      (browser_data * b, int image);
int               image_token_fetched                (browser_data * b, HStream * token);
int               image_total_bytes_fetched          (browser_data * b);
int               image_count_pending                (browser_data * b);
int               image_count_specific_pending       (browser_data * b);
int               image_count_delayed                (browser_data * b);
int               image_plot_started                 (browser_data * b, int image);
int               image_token_plot_started           (browser_data * b, HStream * token);

void              image_lock_token_image_size        (browser_data * b, HStream * token);
void              image_unlock_token_image_size      (browser_data * b, HStream * token);
_kernel_oserror * image_get_token_image_size         (browser_data * b, HStream * token, BBox * box);
_kernel_oserror * image_set_token_image_size         (browser_data * b, HStream * token, BBox * box);
_kernel_oserror * image_get_back_image_size          (browser_data * b, BBox * box);
int               image_get_token_image_position     (browser_data * b, HStream * t, int * x, int * y);
int               image_set_token_image_position     (browser_data * b, HStream * t, int x, int y);
void              image_get_background_image_url     (browser_data * b, char * buffer, int size);

void              image_convert_to_pixels            (browser_data * b, HStream * token, int * x, int * y);
_kernel_oserror * image_return_click_offset          (browser_data * b, HStream * t, WimpGetPointerInfoBlock * i, int * x, int * y);

_kernel_oserror * image_export_sprite                (char * path, browser_data * b, HStream * image);
int               image_sprite_size                  (browser_data * b, HStream * image);
_kernel_oserror * image_export_original              (char * path, browser_data * b, HStream * image);
int               image_original_size                (browser_data * b, HStream * image);

int               image_to_draw_file                 (browser_data * b, WimpRedrawWindowBlock * r, HStream * token, int x, int y, int dont_create);
int               image_draw_file_size               (browser_data * b, HStream * token, int dont_delete);
int               image_tile_to_draw                 (browser_data * b, WimpRedrawWindowBlock * r, int xorigin, int yorigin, int * size);

int               image_token_can_be_saved_as_sprite (browser_data * b, HStream * image);