🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.sys.amiga.tech
Article #12089

2 unrelated questions (long?)

#12089
From: David Gay
Date: Mon, 03 Apr 1989 16:02
151 lines
4637 bytes
a) YAPQ - Yet another printer question

In article <sorry, no ref> daveb@cbmvax.uucp writes:
>In article <890329170226.20401ec5@elcc.epfl.ch> I write:
>>How can I work out the maximum size for a graphic dump ? If I send a DUMPRPORT

>>request with SPECIAL_NOPRINT, SPECIAL_FULLCOLS and SPECIAL_FULLROWS, it sets
>>io_DestCols & io_DestRows, but adjusts them so that the ratio of my RastPort i
s
>
>>preserved. Is there any way round this ? If not, any easy way to work these
>>out from the returned values ? (I want the margins, left offset, etc to be tak
e
>n
>>
>>into account of course.)
>>
>        There are many ways to do what you want.  The simplest way is to
>set io_DestCols and io_DestRows to some enormus value (like 5000).  The printer

>device will chop these numbers down so that they fit on the paper.

I chose LONG_MAX ...

>Another
>way would be to set these values explicitly in preferences (on the 2nd printer
>graphic screen) under the Limits heading of Pixels.

Actually, I'm trying to print according to the users preferences, at the
printers resolution, in slices, following a user specified ratio (I'm printing
graphs). I have one last (really!) question:

Can I use the PaperLength field(in combination with PrintSpacing) of preferences

as an indication of the size of one page ?


b) I'm having problems with AreaEllipse. However, this problem shows up as
intermittent crashes, so it is very hard to pin down(*) ... I'm setting the
TmpRas & AreaInfo with the following routines:

struct NewAreaInfo
{
   struct AreaInfo area;
   APTR areabuf;
   int acnt;
};

struct NewTmpRas
{
   struct TmpRas tmpras;
   int x,y;
};

int AllocTmpRas(struct RastPort *rp, long x, long y)
{
   struct NewTmpRas *tmpras;
   PLANEPTR plane;

   plane = (PLANEPTR)AllocRaster(x, y);
   if (plane == NULL) return (NULL);

   tmpras = (struct NewTmpRas *)AllocMem(sizeof(struct NewTmpRas), 0);
   if (!tmpras) {
      FreeRaster(plane, x, y);
      return(NULL);
   }

   tmpras->x = x;
   tmpras->y = y;
   rp->TmpRas = &tmpras->tmpras;
   InitTmpRas(&tmpras->tmpras, plane, RASSIZE(x, y));
   return(TRUE);
}

void FreeTmpRas(struct RastPort *rp)
{
   struct NewTmpRas *tmpras = (struct NewTmpRas *)(rp->TmpRas);

   FreeRaster(tmpras->tmpras.RasPtr, tmpras->x, tmpras->y);
   FreeMem(tmpras, sizeof(struct NewTmpRas));
   rp->TmpRas = NULL;
}

int AllocArea(struct RastPort *rp, long acnt, long x, long y)
{
   APTR areabuf;
   struct NewAreaInfo *areainf;

   if (!AllocTmpRas(rp, x, y)) return(FALSE);

   areainf = (struct NewAreaInfo *)AllocMem(sizeof(struct NewAreaInfo), 0);
   if (areainf == NULL) {
      FreeTmpRas(rp);
      return(FALSE);
   }

   areabuf = (APTR)AllocMem(5 * acnt, 0);
   if (areabuf == NULL) {
      FreeTmpRas(rp);
      FreeMem(areainf,sizeof(struct NewAreaInfo));
      return(FALSE);
   }

   InitArea(&areainf->area, (short *)areabuf, acnt);
   rp->AreaInfo = &areainf->area;
   areainf->acnt = acnt;
   areainf->areabuf = areabuf;

   return(TRUE);
}

void FreeArea(struct RastPort *rp)
{
   struct NewAreaInfo *areainf = (struct NewAreaInfo *)(rp->AreaInfo);

   FreeTmpRas(rp);

   FreeMem(areainf->areabuf, 5 * areainf->acnt);
   FreeMem(areainf, sizeof(struct NewAreaInfo));
   rp->AreaInfo = NULL;
}

Am I doing anything wrong ?

Also, the code is used (more or less) as follows:

if (AllocArea(&rp2, 4, w, h))
{
    AreaEllipse(&rp2, w/2, h/2, w/4, h/4);
    AreaEnd(&rp2);
    FreeArea(&rp2);
}

Freeing the AreaInfo & TmpRas immediately shouldn't cause any problems,
should it ?
If I comment out the above code, the crashes (seem) to disappear.

(*) I can actually reproduce the problem fairly consistently, but this involves
setting all memory to a given value, rebooting, running the program. On the
fifth call to the above code, the bitmap being written to gets trashed, and
the Guru soon follows ... And of course, using CPR, I can't consitently get
the bug to happen :-(


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
David Gay                                  6 x 9 = 42

GAY@ELDE.EPFL.CH, or GAY%ELDE.EPFL.CH@CLSEPF51.bitnet

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Technical Details
Message-ID: <890403170253.204022be@elcc.epfl.ch>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!ucbvax!elde.epfl.ch!gay

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!ucbvax!elde.epfl.ch!gay
From: gay@elde.epfl.ch (David Gay)
Newsgroups: comp.sys.amiga.tech
Subject: 2 unrelated questions (long?)
Message-ID: <890403170253.204022be@elcc.epfl.ch>
Date: 3 Apr 89 16:02:53 GMT
Sender: daemon@ucbvax.BERKELEY.EDU
Lines: 151