/* Find best scale to fit on the screen */
/* written by Günther Röhrich */
/* for jpegAGA 2.x */

#define __NOLIBBASE__
#include <proto/graphics.h>
#include <proto/exec.h>

#include <graphics/modeid.h>

#include <stdio.h>
#include <stdlib.h>
#include "jpeglib.h"
#include "WBFlags.h"

#define HAM8 1
#define TOLERANCE 35

extern struct WBFlags WBFlags;

extern struct GfxBase *GfxBase;

ULONG ScaleFitDisplayID=0;

int FindScaleFit(JDIMENSION width, JDIMENSION height, ULONG Mode)
{
 struct DimensionInfo querydims;
 ULONG MyDisplayID, NoSUPER72;
 JDIMENSION scrwidth, scrheight;
 JDIMENSION VGAwidth, VGAheight;
 int scale;

 ScaleFitDisplayID = 0;

 if(!GfxBase)
 {
   if(!(GfxBase = (struct GfxBase *)OpenLibrary((UBYTE *)"graphics.library",39)))
   {
     printf("Could not open graphics.library V39 or higher.\n");
     return -1;
   }
 }

 /* check if SUPER72 mode is available */

 NoSUPER72 = ModeNotAvailable(SUPER72_MONITOR_ID | SUPERHAMLACE_KEY);


 MyDisplayID = HIRESLACE_KEY;

 if(WBFlags.VGAenable)
 {
   if(ModeNotAvailable(VGAPRODUCT_KEY))
   {
     return -1;
   }
   else
   {
     if(GetDisplayInfoData(NULL, (UBYTE *)&querydims, sizeof(querydims),DTAG_DIMS,VGAPRODUCT_KEY))
     {
       /* allow 10 pixels tolerance */
       VGAwidth  = (JDIMENSION)querydims.StdOScan.MaxX+TOLERANCE;
       VGAheight = (JDIMENSION)querydims.StdOScan.MaxY+TOLERANCE;
     }
   }

   MyDisplayID = VGAPRODUCT_KEY;
   if(WBFlags.SUPER72enable && !NoSUPER72) MyDisplayID = SUPER72_MONITOR_ID | SUPERLACE_KEY;
 }

 if(GetDisplayInfoData(NULL, (UBYTE *)&querydims, sizeof(querydims),DTAG_DIMS,MyDisplayID))
 {
   /* allow 34 pixels tolerance */
   scrwidth  = (JDIMENSION)querydims.StdOScan.MaxX+TOLERANCE;
   scrheight = (JDIMENSION)querydims.StdOScan.MaxY+TOLERANCE;
   /* printf("Screen width:  %d, height: %d\n", scrwidth-TOLERANCE+1, scrheight-TOLERANCE+1); */
   /* printf("Picture width: %d, height: %d\n", width, height); */
   /* printf("VGA width:     %d, height: %d\n", VGAwidth-TOLERANCE+1, VGAheight-TOLERANCE+1); */
 }
 else return -1;

 for(scale=1; scale<8; scale = scale<<1)
 {
   if((width / scale <= scrwidth) && (height / scale <= scrheight)) break;
 }

 /* Find the right screenmode */


 /* SUPER72 is the default, when available */

 if(WBFlags.SUPER72enable && !NoSUPER72 && WBFlags.VGAenable)
 {
   if(Mode == HAM8)
   {
     ScaleFitDisplayID = SUPER72_MONITOR_ID | SUPERHAMLACE_KEY;
   }
   else
   {
     ScaleFitDisplayID = SUPER72_MONITOR_ID | SUPERLACE_KEY;
   }
 }


 /* Check for fit on a VGA screen */

 if(WBFlags.VGAenable)
 {
   /* check for fit on a LORES screen */
   if((VGAwidth / 2 >= width / scale) && (VGAheight / 2 >= height / scale))
   {
     if(Mode == HAM8)
     {
       ScaleFitDisplayID = VGALORESHAMDBL_KEY;
     }
     else
     {
       ScaleFitDisplayID = VGALORESDBL_KEY;
     }
   }
   else if((VGAwidth >= width / scale) && (VGAheight >= height / scale) || !WBFlags.SUPER72enable)
   {
     if(Mode == HAM8)
     {
       ScaleFitDisplayID = VGAPRODUCTHAM_KEY;
     }
     else
     {
       ScaleFitDisplayID = VGAPRODUCT_KEY;
     }
   }
 }

 if(ScaleFitDisplayID == 0)
 {
   /* check for fit on a LORES screen */
   if((scrwidth / (scale * 2) >= width) && (scrheight / (scale * 2) >= height))
   {
     if(Mode == HAM8)
     {
       ScaleFitDisplayID = HAM_KEY;
     }
     else
     {
       ScaleFitDisplayID = LORES_KEY;
     }
   }
   else
   {
     if(Mode == HAM8)
     {
       ScaleFitDisplayID = HIRESHAMLACE_KEY;
     }
     else
     {
       ScaleFitDisplayID = HIRESLACE_KEY;
     }
   }
 }

 return scale;
}
