/**
 ** imgtest.c ---- test image functions mapping
 **
 ** Copyright (c) 1998 Hartmut Schirmer
 **
 ** This is a test/demo file of the GRX graphics library.
 ** You can use GRX test/demo files as you want.
 **
 ** The GRX graphics library is free software; you can redistribute it
 ** and/or modify it under some conditions; see the "copying.grx" file
 ** for details.
 **
 ** This library is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 **
 **/

#include "test.h"

#define PARTS 4

TESTFUNC(imgtest)
{
	int  x = GrSizeX();
	int  y = GrSizeY();
	int  ww = (x / PARTS)-1;
	int  wh = (y / PARTS)-1;
	int m1, m2, d1, d2;
	GrColor c1, c2, c3;
	GrContext ctx;
	GrImage *img1;
	GrImage *img2;
	GrEvent ev;

	if (! GrCreateContext(ww,wh,NULL,&ctx)) return;

	GrSetContext(&ctx);
	c1 = GrAllocColor(255,100,0);
	c2 = GrAllocColor(0,0,(GrNumColors() >= 16 ? 180 : 63));
	c3 = GrAllocColor(0,255,0);
	drawing(0,0,ww,wh,c1,c2);
	GrBox(0,0,ww-1,wh-1,c1);

	GrSetContext(NULL);

	img1 = GrImageFromContext(&ctx);
	if (!img1) return;

	GrFilledBox(0,0,ww+1,wh+1,c3);
	GrFilledBox(ww+15,0,2*ww+16,wh+1,c3);

	GrBitBlt(NULL,1,1,&ctx,0,0,ww-1,wh-1,0);
	GrImageDisplay(ww+16,1,img1);
	GrImageDisplayExt(0,wh+4,x-1,y-1, img1);

	GrEventWaitKeyOrClick(&ev);

	for (m1=1; m1 <= PARTS ; m1<<=1) {
	  for (d1=1; d1 <= PARTS; d1 <<= 1) {
	    for (m2=1; m2 <= PARTS ; m2<<=1) {
	      for (d2=1; d2 <= PARTS; d2 <<= 1) {
		img2 = GrImageStretch(img1,(m1*ww)/d1, (m2*wh)/d2);
		if (img2) {
		  GrImageDisplayExt(0,0,x-1,y-1,img2);
		  GrImageDestroy(img2);
		}
	      }
	    }
	  }
	}
	GrEventWaitKeyOrClick(&ev);

	/* let's finish with some GrGetScanline / GrPutScanline tests */
	for (d1 = 1; d1 < 32; ++d1) {
	  for (m1 = wh; m1 < y-wh-d1-1; ++m1) {
	    const GrColor *cp;
	    cp = GrGetScanline(ww+1,x-ww-d1,m1+1);
	    if (cp) {
	      GrPutScanline(ww,x-ww-d1-1,m1,cp,GrIMAGE|c2);
	    }
	  }
	}

	GrEventWaitKeyOrClick(&ev);
}

