(*
  :Program.       RCT.mod
  :Contents.      RCT exports functions to use RCT-generated
  :Contents.      c-source-code from Amiga-Oberon
  :Author.        Volker Rudolph
  :Address.       Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern 26
  :Phone.         06301/8566
  :Copyright.     Freeware
  :Language.      Oberon / Assembler
  :Translator.    Oberon V1.17.1 / A68k (Freeware)
  :History.       Version 1.0 - first public release
  :Bugs.          No known bugs.
*)
MODULE RCT;

IMPORT o:OberonLib,s:SYSTEM,e:Exec,I:Intuition;

TYPE
  CProcType * = PROCEDURE(arg:LONGINT):LONGINT;

VAR
  IntuiBase["_IntuiBase"]:I.IntuitionBasePtr;

(* This procedure calls the c-function 'cProc' with the argument 'arg' *)
(* The return value is the return value of the c-function.             *)
PROCEDURE CCall * {"_CCall"} (cProc:CProcType;arg:LONGINT):LONGINT;

PROCEDURE ImagesToChip*(images:I.ImagePtr;imageNum:INTEGER):BOOLEAN;
VAR
  oldMemReqs:LONGSET;
  chipMem:e.ADDRESS;
  imageData:POINTER TO BYTE;
  to:POINTER TO BYTE;
  size:LONGINT;
  i:INTEGER;
BEGIN
  oldMemReqs := o.MemReqs;
  o.MemReqs := LONGSET{e.chip,e.public};

  IF imageNum > 0 THEN
    imageData := images.imageData;
  END; (* IF *)

  i := 0;
  WHILE i < imageNum DO
    size := LONG(s.VAL(INTEGER,s.VAL(SET,images.width)*{4..14})+16) *
            LONG(images.height) *
            LONG(images.depth) DIV 8;

    o.New(chipMem,size);
    IF chipMem = NIL THEN RETURN FALSE END;

    to := chipMem;
    e.CopyMem(imageData^,to^,size);

    images.imageData := chipMem;

    INC(imageData,size);
    INC(images,s.SIZE(I.Image));
    INC(i);
  END; (* WHILE *)

  o.MemReqs := oldMemReqs;

  RETURN TRUE;
END ImagesToChip;

BEGIN
  IntuiBase := I.int;
END RCT.
