home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser-CD 2001 January / LCD_01_2001.iso / develop / screen102 / screen / dev.txt next >
Encoding:
Text File  |  2000-01-13  |  22.3 KB  |  524 lines

  1. /* documentation des appels à la librairie dynamique screen.ldg */
  2.  
  3. Screen.ldg 0.97                Belfort le 13/01/2000
  4.  
  5. 16 fonctions sont à disposition:
  6.  
  7.                          --------------------------
  8.  
  9. long __CDECL screen_init( long vdihandle, videoinf *display, char *type_ecran, sortievideo 
  10. *more_infos, long flag) 
  11.     Permet d'initialiser l'écran cette fonction doit être appelée avant la  
  12.     fonction  d'affichage à l'écran screen_display(). Un seul appel à 
  13.     cette fonction suffit.
  14.  
  15. paramêtres
  16. screen_init() retourne 0 si l'écran n'est pas supporté 1 si il l'est 
  17. et que le mode est rapide, 2 si il est supporté mais que le mode est 
  18. lent et -1 si le type d'écran proposé est stupide, -2 probleme de 
  19. paramêtres.
  20.  
  21. vdihandle: numéro de la station virtuelle VDI de votre application
  22. display: pointeur sur une structure "videoinf" la fonction remplira 
  23. pour vous largeur_ECRAN, hauteur_ECRAN, octets, add_ECRAN. Le reste est a remplir 
  24. à votre charge en fonction de vos besoins.
  25. type_ecran: chaine de caractère décrivant l'écran cela peut être donné 
  26. par le testeur d'écran.
  27. more_infos: structure remplie par la fonction vous permettant de 
  28. connaitre les palettes nécessaires.
  29. flag: Si première fois que vous utilisez cette procedure mettre 0, si 
  30. il y a eu changement de résolution mettre -1L
  31.  
  32. Cette procédure est absolument nécessaire une fois avant 
  33. screen_display() mais interdit avant virtual_display()
  34.  
  35.                          --------------------------
  36.     
  37. void __CDECL screen_display(long vdihandle, videoinf *display) 
  38.     Affiche l'image sur l'écran
  39.  
  40.  Fonction permettant d'afficher directement à l'écran une image RGB
  41.  ou une partie d'image de taille indifférente. Cette fonction permet
  42.  de réduire les couleurs et d'afficher du mode RVB 32bits au mode
  43.  palette 8bits avec tramage.
  44.  
  45. vdihandle: numéro de la station virtuelle VDI de votre application
  46. display : strcture préalablement remplie décrivant ce que l'on veut 
  47. faire.
  48.  
  49.  
  50.                          --------------------------
  51.  
  52. long __CDECL virtual_display(long vdihandle, videoinf *display, char *type_memoire, sortievideo 
  53. *more_infos) 
  54.     Permet de travailler en mémoire et permet par exemple de faire du
  55.     tramage rapide. Le type de format d'image à gérer en mémoire 
  56.     doit être décrit par *display et *type_mémoire que vous aurez 
  57.     rempli préallablement.
  58.  
  59. paramêtres
  60.  
  61. virtual_display() retourne 0 si l'écran n'est pas supporté 1 si il l'est 
  62. et que le mode est rapide, 2 si il est supporté mais que le mode est 
  63. lent et -1 si le type d'écran proposé est stupide.
  64.  
  65. vdihandle: numéro de la station virtuelle VDI de votre application
  66. display: pointeur sur une structure "videoinf" il faut remplir 
  67. les champs largeur_ECRAN, hauteur_ECRAN, octets, add_ECRAN, contrairement à la 
  68. fonction screen_init().  add_ECRAN doit correspondre à l'adresse 
  69. mémoire où vous voulez faire la copie.
  70. type_memoire: description du format de sorti désiré comme pour 
  71. screen_init()
  72. more_infos: structure remplie par la fonction vous permettant de 
  73. connaitre les palettes nécessaires.
  74.  
  75. Remarque: Il est interdit d'utiliser screen_init() si vous décidez 
  76. d'utiliser l'affichage virtuel
  77.                          --------------------------
  78.  
  79.  
  80. void __CDECL fix_palette(sortievideo *more_infos, long mode, long vdihandle)
  81.   Pour fixer la palette (valable jusqu'à 256 couleurs) à utiliser 
  82.   après screen_init()
  83.  
  84. more_infos: déja passé à screen_init()
  85. mode: 1L pour le moment
  86. vdihandle: numéro vdi de la virtual worstation.
  87.  
  88.  
  89.                          --------------------------
  90.  
  91. long __CDECL screen_detect(long vdihandle, char *answer)
  92.     Permet de détecter le format hard de la mémoire vidéo
  93.     Supporte normalement toutes les machines GEM même les 
  94.     émulateurs.
  95.     
  96. paramêtres
  97.  
  98. screen_detect() retourne un long <0L si il y a erreur
  99.  
  100. vdihandle: handle VDI de votre application
  101. *answer: pointeur sur une chaine de caractère (mini 50), dans cette 
  102. chaine sera retourné le format en ASCII de la vidéo, désignée comme 
  103. suit:
  104. _En premier un chiffre précédé éventuellement par -, ce chiffre 
  105. représente le nombre de plans de la vidéo, le - indique qu'il s'agit 
  106. d'un codage au format Little Endiant (format Intel) au lieu d'un 
  107. Big Endiant (format Motorola).
  108.  
  109. _Ensuite vient le format par lui même, deux cas distincts, les formats 
  110. à palette (jusqu'à 8 plans) et les formats RVB au delà.
  111. Dans le premier cas le chiffre est suivi éventuellement de E si 
  112. l'écran est au format entrelacé puis de C puis éventuellement de 
  113. SP qui signifie que la palette n'est pas hard mais de type soft (si 
  114. vous changez la définition d'une couleur, les pixels déja dessinés à 
  115. l'écran ne seront pas modifiés, seuls les pixels dessinés après 
  116. auront la couleur voulue)  ex: 8C, 8EC, 8CSP ...
  117. Dans le second cas sont exprimés le codage RVB, dans l'ordre de codage 
  118. du poids fort vers le poids faible chaque couleur désignée par la 
  119. lettre R(rouge), V(vert), B(bleu) ou encore X(bit non utilisé) suivi 
  120. du nombre de bits utilisés. ex: 32X8R8V8B8
  121.  
  122. _Ce codage peut être suivi de la mention "VDI", qui signifie que 
  123. l'écran n'est pas accessible directement (Physbase, Logbase ne 
  124. fonctionne pas), c'est possible avec certains émulateurs. Il faut donc 
  125. adresser l'écran avec le VDI pas le choix. ex: 8CSPVDI
  126. screen_display() ne sait pas directement réaliser cette opération, il 
  127. est nécessaire d'allouer un bloc mémoire suffisament grand puis par 
  128. virtual_display() de demander le dessin dans ce bloc. Il ne vous reste 
  129. plus qu'à faire une copie avec vro_cpyfm(). Le format bien sur doit 
  130. correspondre au format d'écran si vous copiez avec le paramêtre 
  131. fd_stand = 0 des structures MFDB passées. Si fd_stand = 1 alors il 
  132. faut prendre le format VDI standard correspondant au nombre de plans 
  133. de votre écran (note pour le moment il n'existe pas ce mode en 8 
  134. plans, cette fonctionalité est à l'étude)
  135.  
  136. _Le codage est ensuite suivi de la lettre ':' puis du nombre 
  137. supplémentaire d'octets en fin de ligne (la plupart du temps 0 mais 
  138. ce genre de carte existe sur Mac)
  139.  
  140. Actuellement le systême supporte les mémoires video suivantes:
  141. 32 plans:
  142.     32X8R8V8B8
  143.     32R8V8B8X8
  144.     32B8V8R8X8
  145.     32X8B8V8R8   (rem: TGA32)
  146. 24 plans:                
  147.     24R8V8B8 (format de base des fonctions)
  148.     24B8V8R8     (rem: TGA24)
  149. 16(15) plans:
  150.     -16R5V6B5
  151.     -16X1R5V5B5
  152.     16R5V6B5
  153.     16X1R5V5B5
  154.     16R5V5X1B5 (TC color Falcon)
  155. 8 plans avec palette:
  156.     8C
  157.     8G
  158.     8EC
  159.     8EG
  160.  
  161. 4 plans:     (pour le moment la     couleur n'est pas gérée -> tramage 
  162. en noir et blan a terme j'espere fournir un tramage couleur pour 4EC 
  163. et 4C)
  164.     4C   (existe sur vieux Mac???)
  165.     4EC  (format ST basse)
  166.     4G
  167.     4EG  (format ST basse)
  168.     4P   (existe sur vieux mac, ET4000: mode plan par plan comme 
  169.     VDI pas sur que cela marche!)
  170.  
  171. 2 plans:     (pour le moment la     couleur n'est pas gérée -> tramage 
  172. en noir et blan a terme j'espere fournir un tramage couleur pour 2EC 
  173. et 2C)
  174.     2C   (existe sur vieux Mac???)
  175.     2EC  (format ST moyenne)
  176.     2G
  177.     2EG  (format ST moyenne)
  178.  
  179. 1 plan:
  180.     1C ou 1G (ST haute)
  181.  
  182.     
  183. WARNING: Utilisation: L'écran doit être retenu avant l'appel à 
  184. screen_detect() sous peine de mauvaise détection, une fois la 
  185. détection l'écran doit être libéré.
  186. exemple:
  187. while(!wind_update(BEG_UPDATE)); 
  188. flag=screen_detect((long)vdihandle,retourneecc);
  189. wind_update(END_UPDATE); 
  190.  
  191.                          --------------------------
  192.  
  193. long __CDECL trnfm_to_R8V8B8(unsigned char *src, long destR8V8B8, unsigned char *palette,long width, long height,long nb_plans,long mode)
  194.  transforme une image entière à différents formats vers mode TC 24R8V8B8 (le mode normalisé pour screen) 
  195.            
  196.            *src: pointeur sur l'image à transformer      
  197.         destR8V8B8: pointeur sur le buffer destination ou numéro GEMDOS donné par Fopen()         
  198.         *palette: palette RGB de l'image source 8bits par couleur fondamentale, donc 3octets par couleur
  199.         les valeurs sont à la suites les unes des autres couleurs de 0 à 255 dans l'ordre RVB
  200.                 Si -1L pour 1 plan et 4plans palette par défaut, ne pas utiliser pour les autres plans
  201.         width: largeur de l'image en pixels 
  202.         height: hauteur de l'image en pixels
  203.         nb_plans: nombres de plans dans l'image source (1, 2, 3,4,5,6,7,8, 16, 32 pas de 24 bien sur!!!)
  204.         mode: 0L : Source type VDI (description plan par plan)
  205.               1L : Source entrelacée (typiquement video entrelacée ST et Falcon jusqu'à 8 plans (256 couleurs))
  206.                   ce mode n'est supporté que pour 2, 4 et 8 
  207.                   plans ou standard VDI 16, 24 et 32 plans (RVB 
  208.                   la largeur source peut etre quelconque mais 
  209.                   pour compatibilité VDI la largeur réelle de 
  210.                   la source est le multiple de 16 supérieur si 
  211.                   largeur%16!=0) Ne pas appeler cette fonction 
  212.                   en 24plans si largeur%16==0 c'est alors le 
  213.                   format natif de screen_display()
  214.               2L : Source mode non entrelacée pixel par pixel (format le + simple!)
  215.                   ce mode n'est supporté que pour 4, 8, 16 et 32 
  216.                   plans
  217.               
  218.               au dela de 8 plans "mode" n'est plus pris en compte le format est du type RVB
  219.               ainsi que pour le mode 1 plan
  220.               
  221.               Si bit 8 de mode = 1 (256) alors la destination n'est plus un pointeur mémoire
  222.               mais le numéro GEMDOS d'un fichier ouvert en écriture de la fonction cliente
  223.               où la transformation sera écrite.
  224.               Si bit 9 de mode = 1 alors sauvegarde du fichier texture.24b dans le répertoire
  225.               courant.
  226.               
  227.         retourne 1L si ok, 
  228.                          0L si non supporté, 
  229.                          <0L si erreur  
  230.                                 -1 largeur image non supportée ex en mono multiple de 8, mode 1 doit être multiple de 16
  231.                                 -2 palette manquante (nécessaire même pour le mode noir et blanc car on peut substituer au noir et au blanc 2 couleurs au choix)
  232.                                 -3 mode non supporté
  233.                                 -4 erreur source
  234.                                 -5 erreur destination
  235.                                 -6 conversion impossible (en mode 1 uniquement nb plans demandés incohérent)                                
  236.                                                                 -7 la conversion demandée pour le moment ne supporte pas l'écriture sur disque
  237.                                         -8 Erreur handle GEMDOS!
  238.                                         -9 Conversion stupide! vous êtes déja en 24bits comme il faut
  239.  
  240. Attention l'image doit être complète en largeur on ne peut donc pas s'en servir pour faire
  241. de l'affichage directe ca doit se passer en mémoire, le client est supposer savoir calculer
  242. la taille du buffer destination (3*width*height) et le réserver avant appel. L'image source
  243. n'est pas modifiée. Source et destination ne peuvent pas être confondues!!!
  244.  
  245.                          --------------------------
  246.  
  247. long  __CDECL trnfm_plane_to_VDI(unsigned char *src, unsigned char *dest, long nb_plans,char *srcdef, long width, long height, long options)
  248. /*Transformations à nombre de plans constants sans modification des couleurs juste une 
  249. réorganisation de l'image sans changement de repère vers le format VDI pour le nombre
  250. de plans donnés CAD:
  251.     Nb de plans            Format initial                        Format VDI               nom srcdef autorisé
  252.         1                        1 plan                                        aucune transformation!
  253.         2                        Entrelacé                                    2 plans séparés          EC
  254.         4                        Entrelacé/non entrelacé        4 plans séparés          EC et C
  255.         8                        Entrelacé/non entrelacé     8 plans séparés          EC et C
  256.         16                    Formats RVB divers          R5V6B5                   ex B5V6B5 ...
  257.         24                    Formats RVB divers                R8V8B8                   ex B8V8R8 ...
  258.         32                    Formats RVB divers                X8R8V8B8                 ex X8B8V8R8 ...
  259. Ces formats peuvent ensuites être utilisés avec vr_trnfm() pour le mettre au format de la carte
  260. soit pour mettre en forme vers trnfm_to_R8V8B8() principalements pour les plans >8 car cette
  261. fonction sait directement déja transformer directement vers 24 plans les nombres de plans inférieurs.
  262.    *src : source
  263.    *dest : destination  WARNING le buffer destination doit assumer avoir la bonne taille
  264.        si options==0 ou 1 CAD ((width+15)&(0xFFFFFFFFL-15L))*height*nb_plans sinon width*height*nb_plans
  265.    nb_plans : nombre de plans
  266.    *srcdef : format du source
  267.    width : largeur image
  268.    height : hauteur image
  269.    option : 0 transformation vers VDI, 2 transformation vers mode simple
  270.    
  271.    retourne 1 si Ok sinon:
  272.                 0  non supporté
  273.                -1 largeur image non supportée
  274.  
  275.     la destination doit être réservée par le client à la taille du source
  276.  
  277. ATTENTION: cette procédure est actuellement très incomplète elle supporte les transformations suivantes:
  278.  8C ainsi que toutes les transformations 24 et 32 plans 
  279.  
  280.  
  281.                          --------------------------
  282.                          
  283. void __CDECL trnfm_ind_pal( unsigned char *palette, long nbplans)
  284.    converti une palette GEMDOS vers une palette standard VDI 
  285.    (positionnement des couleurs)
  286.    fonctionne pour 4 et 8 plans.
  287.    
  288.    unsigned char *palette : palette de départ et de retour
  289.    long nbplans : nombre de plans
  290.  
  291.  
  292. */
  293.  
  294.                          --------------------------
  295.  
  296. void __CDECL restore_palette(long vdihandle)
  297.    restore la palette quand il n'y a plus de client intéressé
  298.  
  299.  
  300.                          --------------------------
  301.  
  302. void __CDECL screen_display_texture(long vdihandle, videoinf *display, long startx, long starty)
  303.    affiche une texture
  304.    startx, starty, x,y ou commence la référence à l'écran de la 
  305.    texture
  306.  
  307.                          --------------------------
  308.  
  309. short __CDECL screen_display_from_disk(long vdihandle, videoinf *display,long gemdos_handle)
  310.    fait l'affichage à partir d'un bloc RVB sur disque retourne 0 si ok
  311.    vdihandle : station VDI ouverte
  312.    display :strcture préalablement remplie décrivant ce que l'on veut faire.
  313.    gemdos_handle : numéro de fichier Gemdos ouvert par le client sur 
  314.    le buffer RVB enregistré.
  315.  
  316.                         --------------------------
  317.  
  318. void __CDECL Save_TGA(char *file, void *buffer, long WIDTH, long HEIGHT, long mode)
  319.  
  320.                         --------------------------
  321.  
  322. void __CDECL direct_display(long vdihandle,videoinf *display,long nbplans,long mode) /* affiche une image au format déja de l'écran vers l'écran par VDI */
  323. /* si mode == 1 alors à partir du disque add_RGB devient le numéro GEMDOS de fichier
  324. Ce mode n'est pour le moment pas supporté mettre 0 
  325. sinon add_RGB == adresse en mémoire de l'image Bitmap (sans octets supplémentaires!)
  326. et au format déja transformé écran 
  327. add_ECRAN n'est pas pris en compte affichage uniquement sur écran par VDI */
  328.  
  329. Attention: screen_detect() doit être obligatoirement appelée pour 
  330. utiliser cette fonction
  331.  
  332.                         --------------------------
  333.  
  334. void __CDECL direct_display_texture(long vdihandle, videoinf *display, long startx, long starty)  
  335. /* affiche l'image en considerant que c'est une texture CAD répête l'image pour remplir
  336. la destination idem screen_display_texture() Cette procédure utilise 
  337. le VDI */
  338.  
  339. Attention: screen_detect() doit être obligatoirement appelée pour 
  340. utiliser cette fonction
  341.  
  342.  
  343.                         --------------------------
  344.  
  345.  
  346. void __CDECL resize_R8V8B8(char *dest,long dest_width,long dest_height,char *src,long src_width,long src_height)
  347. Modifie la largeur et hauteur d'une image pour le moment c'est une 
  348. routine minimale, l'aspect!!!!!!!
  349. Cette routine est plus ideale pour les petites images et les 
  350. rétrécissements comme sur les pages WEB, pour les travaux
  351. plus volumineux voir plutot resize_generalR8V8B8() si elle ne vous 
  352. conviendrait pas mieux.
  353. dest=pointeur sur un buffer préalloué par le client à la taille 
  354.     dest_width*dest_height*3 image destination sera au format 
  355.     R8V8B8
  356. dest_width=largeur destination
  357. dest_height=hauteur destination
  358. src=pointeur source image au format R8V8B8
  359. src_width=largeur source
  360. src_height=hauteur source
  361.  
  362. WARNING: largeurs et hauteurs ne peuvent pas dépasser 65535 malgre les 
  363. long, cela à cause de l'accélération de l'algorithme
  364.  
  365. Et c'est fini!!!
  366.  
  367. La procédure supporte:
  368.  
  369. -Ecrans à nombres de plans: 1, 2, 4, 8, 16(15), 24, 32
  370. -Les formats doivent être du type palette couleur pour le nombre de 
  371. plans de 1 à 8 et au format type RVB de 16 à 32
  372. -Permet de détecter si un écran est du type entrelacé ou non pour les 
  373. écrans de type palette couleur
  374. -Pour ce même type d'écran il permet de déterminer si la palette hard 
  375. existe ou non (ex TOS2WIN, STemulator n'ont pas de palette hard)
  376. -Pour les écrans type RVB il permet de détecter si l'écran est au 
  377. format Little Endiant ou Big Endiant (cela n'a d'intérêt qu'en 16 
  378. plans).
  379. -Permet de détecter si en fin de ligne il y a des octets 
  380. supplémentaires inutiles (cas possible sous MagicMac selon carte 
  381. vidéo)
  382. -La procédure détecte si on peut ou non adresser directement l'écran.
  383. -Ca marche sur tout ce que j'ai pu tester (ST, Hades Nova, MagicMac,
  384. STemulator, Tos2Win, TosBox, Magic ...) Si vous constatez une 
  385. incompatibilité contactez nous!!!
  386.  
  387.  
  388. screen_ldg supporte le partage entre plusieurs applications il n'y a
  389. rien de particulier à faire
  390.  
  391. Les structures:
  392.  
  393. typedef struct
  394. {
  395.     unsigned LONG add_RGB;       /* adresse du buffer image au format natif RGB 8bits 
  396.                                                             par couleur si -1L forcer à reconnaitre l'écran
  397.                                                             pas d'affichage retour des paramêtres dans la structure
  398.                                                             et typepixel rempli (prévoir 15 octets) */
  399.     unsigned WORD largeur_RGB;   /* largeur de l'image RGB */
  400.     unsigned WORD hauteur_RGB;   /* hauteur de l'image RGB */
  401.     unsigned LONG add_ECRAN;     /* adresse écran ou mémoire si NULL automatique écran */
  402.     unsigned WORD largeur_ECRAN; /* largeur de l'écran en pixels si 0 automatique*/
  403.     unsigned WORD hauteur_ECRAN; /* hauteur de l'écran en pixels si 0 automatique*/
  404.     LONG octets;  /* nombres d'octets de décalage en fin de ligne sur la plupart des 
  405.                                 cartes = 0*/
  406.     unsigned WORD  position_X;   /* position sur l'écran en pixels selon X de départ de recopie */
  407.     unsigned WORD position_Y;       /* position sur l'écran en pixels selon Y de départ de recopie */
  408.     unsigned WORD X_voulu;       /* position dans l'image en pixels selon X de départ de recopie */
  409.     unsigned WORD Y_voulu;       /* position dans l'image en pixels selon Y de départ de recopie */
  410.     unsigned WORD largeur_voulue;/* largeur en pixel de recopie */
  411.     unsigned WORD hauteur_voulue;/* hauteur en pixels de recopie */
  412.     unsigned LONG add_palette_SP;/* adresse d'un tableau de 255 valeurs des correspondances
  413.                       de couleur pour le cas sans palette hard */
  414. } videoinf;
  415.  
  416. typedef struct
  417. {
  418.     unsigned LONG chainepix;  /* adresse de la chaine de caractère décrivant un pixel */
  419.     unsigned char retour1;    /* 0 oK, 0xFF écran non supporté */ 
  420.     unsigned char retour2;    /* 0xFF routine générale lente */
  421.     unsigned WORD version;    /* numéro de version */
  422.     unsigned LONG palettecouleur; /* adresse palette couleur */
  423.     unsigned LONG palettegris;    /* adresse palette grise */
  424. } sortievideo;
  425.  
  426. Exemple d'utilisation
  427.  
  428. Affichage directe à l'écran exemple pour GCC:
  429.  
  430. #include <stdio.h>
  431. #include <osbind.h>
  432. #include <ldg.h>
  433. #include <compiler.h>
  434. #include "scrnldg.h" 
  435. #include "protoscr.c" 
  436. long __CDECL (*screen_detect)(long vdihandle, char *answer);
  437. long __CDECL (*screen_init)(long vdihandle, videoinf *display, char *type_ecran, sortievideo *more_infos, long flag);
  438. static void __CDECL (*fix_palette)(sortievideo *more_infos, long mode, long vdihandle)=NULL;
  439. void __CDECL (*screen_display)(long vdihandle, videoinf *display);
  440. void __CDECL (*restore_palette)(long vdihandle);
  441.  
  442. main()
  443. { videoinf mydisplay;
  444.   sortievideo myinfos;
  445.   int app_id,vdihandle, work_in[]= {1,1,1,1,1,1,1,1,1,1,2}, 
  446.   work_out[57], palette=0;  
  447.   LDG *screenldg;
  448.   
  449.   app_id = appl_init (); 
  450.   
  451.   if( (screenldg = ldg_exec ( app_id, "screen.ldg")) == NULL)  /* Chargement de la lib screen.ldg */
  452.   { /* échec */
  453.     form_alert ( 1, "[1][Erreur chargement librairie |SCREEN.LDG!][OK]");
  454.     appl_exit();
  455.     exit(0);
  456.   }
  457.                   /* recharche des fonctions de screen.ldg pour les utiliser */
  458.   init_screen(screenldg);
  459.   
  460.   if((screen_detect!=NULL)&&(screen_init!=NULL)&&(fix_palette!=NULL)&&(screen_display!=NULL)) /* les fonctions ont été trouvées */
  461.   { char retourneecc[50];
  462.     retourneecc[0]=0;
  463.     
  464.     v_opnvwk(work_in,&vdihandle,work_out); /* les fonctions ont besoin du handle VDI pour fonctionner on ouvre une station virtuelle VDI */
  465.     while(!wind_update(BEG_UPDATE)); 
  466.     if(screen_detect((long)vdihandle,retourneecc)>=0) 
  467.     {  /* écran reconnu mais peut être pas supporté! on n'en sait 
  468.        rien jusque là */
  469.        wind_update(END_UPDATE); 
  470.        if(screen_init((long)vdihandle, &mydisplay,retourneecc,&myinfos,0L)>0) 
  471.        { /* écran supporté ca rempli tout par défaut à notre place */
  472.             char *pt_image; /* pointeur sur notre image */
  473.             
  474.             fix_palette(&myinfos, 1L, (long) vdihandle); /* là je fixe la pallette n'est en fait nécessaire que pour les résolution <= 8 plans */
  475.             palette=1;
  476.             
  477.             /* on doit charger une image au format RVB CAD par pixel 
  478.             3 octets dans l'ordre RVB admettons qu'elle face 50*60*/
  479.             pt_image=Malloc(50*60*3);
  480.             /* ...  chargement de votre image a vou de jouer */
  481.            /* on renseigne sur l'image source  */
  482.             mydisplay.largeur_RGB=50;
  483.             mydisplay.hauteur_RGB=60;
  484.                 /* on veut l'image tout a gauche et à 20 
  485.                 pixels du haut sur l'écran */
  486.             mydisplay.position_X=0; 
  487.             mydisplay.position_Y=20;
  488.                 /* à partir du coin haut gauche de l'image */
  489.             mydisplay.X_voulu=0;
  490.             mydisplay.Y_voulu=0;
  491.                 /* sur toute la largeur et hauteur de l'image (ne 
  492.                 peut depasser cette taille)*/
  493.             mydisplay.largeur_voulue=50;
  494.             mydisplay.hauteur_voulue=60;
  495.             screen_display(vdihandle, &mydisplay); /* affichage */
  496.             
  497.             /* maintenant sur une portion d'image !!!*/
  498.                 /* on veut l'image à 60 pixels de la gauche et à 20 
  499.                 pixels du haut sur l'écran */
  500.             mydisplay.position_X=60; 
  501.             mydisplay.position_Y=20;
  502.                 /* à partir de 10 pixels % à la gauche et 20 % au 
  503.                 haut */
  504.             mydisplay.X_voulu=10;
  505.             mydisplay.Y_voulu=20;
  506.                 /* sur 20 pixels par 20 pixels */
  507.             mydisplay.largeur_voulue=20;
  508.             mydisplay.hauteur_voulue=20;
  509.             screen_display(vdihandle, &mydisplay); /* affichage */
  510.             
  511.        }
  512.     } else wind_update(END_UPDATE); 
  513.     
  514.     v_clsvwk(vdihandle);  /* refermeture de la station VDI */
  515.     if((palette)&&(restore_palette!=NULL)) restore_palette(vdihandle);
  516.   }
  517.   
  518.   ldg_term(app_id, screenldg); /* libération du LDG */
  519.  
  520.   appl_exit();
  521. }
  522.  
  523.  
  524. Olivier LANDEMARRE le 23/08/1999