4.51.2.4.47. ogScale() | Table of Contents | 4.51.2.4.49. ogSetAlpha() |
procedure ogScaleBuf(dX1, dY1, dX2, dY2:int32; var srcObject:ogSurface; sX1, sY1, sX2, sY2:int32);Remarks:
Scales the region defined by (sX1,sY1),(sX2,sY2) to the destination region (dX1,dY1),(dX2,dY2). Will do pixel conversion if the surfaces are not the same bitdepth or pixel format.
Restrictions:Will do nothing if the any of the source coordinates are out of bounds. Will clip to valid coordinates in the destination surface if any of the destination coordinates are out of bounds, thus keeping the apsect ratio.
See also: Sample code:{ogScale.pas} uses ObjGfx40, CRT; var buf:^ogSurface; pixfmt:ogPixelFmt; xx, yy, zz:uInt32; sX1, sY1, sX2, sY2, dX1, dY1, dX2, dY2:uInt32; begin new(buf, ogInit); {Set the screen up as 1024x768 in true colour} if not screen^.ogCreate(1024, 768, OG_PIXFMT_32BPP) then begin writeln('Error setting video mode'); halt end; {Create a 320x200 buffer with the same pixel format as the screen} screen^.ogGetPixFmt(pixfmt); buf^.ogCreate(320, 256, pixfmt); {Draw the RGB cube} zz:=1; repeat with screen^ do for yy:=0 to 255 do for xx:=0 to 255 do if (yy=0) or (xx=255) or (zz=253) then ogSetPixel(256+256+(xx div 2)-(zz div 4),128+(yy div 2)+(zz div 4), ogRGB(xx,255-yy,zz)); inc(zz,2); until (zz>255); {Now scale sections of the cube to other portions of the screen} with screen^ do begin {Since we deal with the coordinates several times, set them up in variables. These could be passed directly into ogScaleBuf() if desired.} sX1 := 512-63; sY1 := 256-63; sX2 := 512+63; sY2 := 255+63; dX1 := 0; dY1 := 384; dX2 := 255; dY2 := 384+255; {Draw this line first since it goes behind the scaled area} ogLine(dX1, dY2, sX1-1, sY2+1, ogRGB(255, 255, 255)); ogScaleBuf(dX1, dY1, dX2, dY2, screen^, sX1, sY1, sX2, sY2); ogLine(dX1, dY1, sX1, sY1, ogRGB(255, 255, 255)); ogLine(dX2, dY1, sX2, sY1, ogRGB(255, 255, 255)); ogLine(dX2, dY2, sX2, sY2, ogRGB(255, 255, 255)); ogRect(sX1, sY1, sX2, sY2, ogRGB(255, 255, 255)); ogRect(dX1, dY1, dX2, dY2, ogRGB(255, 255, 255)); sX1 := 511-40; sY1 := 255+20; sX2 := 511+40; sY2 := 255+40; dX1 := 700; dY1 := 400; dX2 := 850; dY2 := 700; ogLine(dX2, dY2, sX2, sY2, ogRGB(255, 255, 255)); ogScaleBuf(dX1, dY1, dX2, dY2, screen^, sX1, sY1, sX2, sY2); ogLine(dX1, dY2, sX1, sY2, ogRGB(255, 255, 255)); ogLine(dX2, dY1, sX2, sY1, ogRGB(255, 255, 255)); ogLine(dX1, dY1, sX1, sY1, ogRGB(255, 255, 255)); ogRect(sX1, sY1, sX2, sY2, ogRGB(255, 255, 255)); ogRect(dX1, dY1, dX2, dY2, ogRGB(255, 255, 255)); sX1 := 512+75; sY1 := 150; sX2 := 512+110; sY2 := 190; dX1 := ogGetMaxX-200; dY1 := 0; dX2 := ogGetMaxX; dY2 := 250; ogLine(dX2, dY1, sX2+1, sY1, ogRGB(255, 255, 255)); ogLine(dX2, dY2, sX2+1, sY2+1, ogRGB(255, 255, 255)); ogScaleBuf(dX1, dY1, dX2, dY2, screen^, sX1, sY1, sX2, sY2); ogLine(dX1, dY2, sX1, sY2, ogRGB(255, 255, 255)); ogLine(dX1, dY1, sX1, sY1, ogRGB(255, 255, 255)); ogRect(sX1, sY1, sX2, sY2, ogRGB(255, 255, 255)); ogRect(dX1, dY1, dX2, dY2, ogRGB(255, 255, 255)); end; {with} for xx:=0 to 5 do begin {Scale the screen to the buffer} buf^.ogScale(screen^); {Draw a white rectangle around the edge of Buf} buf^.ogRect(0, 0, buf^.ogGetMaxX, buf^.ogGetMaxY, buf^.ogRGB(255, 255, 255)); {Copy Buf back to the screen (in the upper left)} screen^.ogCopy(buf^); end; readKey; dispose(buf, ogDone); end.
4.51.2.4.47. ogScale() | Table of Contents | 4.51.2.4.49. ogSetAlpha() |