Path: utzoo!utgpu!watmath!att!tut.cis.ohio-state.edu!purdue!haven!adm!smoke!gwyn
From: gwyn@smoke.BRL.MIL (Doug Gwyn)
Newsgroups: comp.lang.c
Subject: Re: Looking for routine to expand bitmap
Keywords: bitmap routine
Message-ID: <10683@smoke.BRL.MIL>
Date: 8 Aug 89 21:15:58 GMT
References: <8917@attctc.Dallas.TX.US>
Reply-To: gwyn@brl.arpa (Doug Gwyn)
Organization: Ballistic Research Lab (BRL), APG, MD.
Lines: 86

In article <8917@attctc.Dallas.TX.US> bobc@attctc.Dallas.TX.US (Bob Calbridge) writes:
>Is there a general algorithm for handling this type of expansion?

static void
Magnify( b, r, tb, p, fac )		/* adapted from "lens" */
	register Bitmap	*b, *tb;
	Rectangle	r;
	Point		p, fac;
	{
	register Bitmap	*stage;
	register int	i, shift;
	Point		d;
	Rectangle	s;

#if 0
	if ( fac.x < 1 || fac.y < 1 )	/* "can't happen" */
		return;
#endif

	d = sub( r.corner, r.origin );
	s.origin = p;
	s.corner = add( p, Pt( fac.x * d.x, fac.y * d.y ) );

	/* Copy source into origin of dest */

	bitblt( b, r, tb, p, F_STORE );

	/* Clear rest of dest */

	rectf( tb, Rect( s.origin.x + d.x, s.origin.y,
			 s.corner.x, s.corner.y
		       ),
	       F_CLR
	     );
	rectf( tb, Rect( s.origin.x, s.origin.y + d.y,
			 s.origin.x + d.x, s.corner.y
		       ),
	       F_CLR
	     );

	/* Now we expand in place */

	/* 1: expand horizontally */
	if ( fac.x > 1 )
		for( i = d.x - 1; i > 0; --i )
			{
			bitblt( tb, Rect( p.x + i, p.y, p.x + i + 1, p.y + d.y),
				tb, Pt( p.x + i * fac.x, p.y ), F_OR
			      );
			rectf( tb, Rect( p.x + i, p.y, p.x + i + 1, p.y + d.y ),
			       F_CLR
			     );
			}

	/* 2: smear horizontally */
	for( i = 1; i < fac.x; i *= 2 )
		{
		shift = min( i, fac.x - i );
		bitblt( tb, Rect( p.x, p.y, s.corner.x - shift, p.y + d.y ),
			tb, Pt( p.x + shift, p.y ), F_OR
		      );
		}

	/* 3: expand vertically */	
	if ( fac.y > 1 )
		for ( i = d.y - 1; i > 0; --i )
			{
			bitblt( tb, Rect( p.x, p.y + i, s.corner.x, p.y + i + 1
					),
				tb, Pt( p.x, p.y + i * fac.y ), F_OR
			      );
			rectf( tb, Rect( p.x, p.y + i, s.corner.x, p.y + i + 1
				       ),
			       F_CLR
			     );
			}

	/* 4: smear vertically */
	for ( i = 1; i < fac.y; i *= 2 )
		{
		shift = min( i, fac.y - i );
		bitblt( tb, Rect( p.x, p.y, s.corner.x, s.corner.y - shift ),
			tb, Pt( p.x, p.y + shift ), F_OR
		      );
		}	
	}