Solved

Saving pict file after drawing with LineTo()

Posted on 1999-01-26
5
258 Views
Last Modified: 2013-12-26
Hi. I wrote a program which draw inside a window using MoveTo() and LineTo().
How do I save the drawing obtained inside the window?
Actually, I'm a able to open a PICT file, to draw on it, and save it. But when I open it again (even in another software) , the file look unchanged. I'm using a PicHandle to open and save the file. I've been learning C on the Mac by myself, just by looking at other pieces of code. I hope that you can help me. Thank you.
0
Comment
Question by:supersax
  • 3
5 Comments
 
LVL 2

Expert Comment

by:roov
ID: 1291766
I belive this example code from Think Reference should help you out:


/* CODE EXAMPLE #1 */
/*
 * How to spool a Picture to a File
 */
// Assumes inclusion of <MacHeaders>

pascal void PutPICTData(Ptr dataPtr, short byteCount);
void PictOut(void);

PicHandle      pHand2;
short      globalRef;

pascal void PutPICTData(Ptr dataPtr, short byteCount)
{
      long      longCount;

      longCount = byteCount;
      if (FSWrite(globalRef, &longCount, dataPtr) != noErr)
                  Debugger();
      if (pHand2)    /* Help QD take care of oddness in the picture */
        (**pHand2).picSize += longCount;
}

void PictOut()
{
      OSErr      err;
      short      i,
                  vrefnum;
      Point      where;      /* where to display dialog */
      long      longCount,
                  longZero;
      SFReply      reply;      /* reply record */
      CQDProcs      myProcs;

      CGrafPort      myPort;
      CGrafPtr      myPortPtr,
                              oldPort;

      Rect      myRect,
                              pictRect;

      GetPort(&oldPort);
      myPortPtr = &myPort;       /* initialize */
      OpenPort(myPortPtr);      /* set my port */

      where.h = 20;
      where.v = 20;
      SFPutFile(where, "\pSave picture as: ", "\puntitled", nil, &reply);
      if (!reply.good)
                  Debugger();
      err = Create(reply.fName, reply.vRefNum, '????', 'PICT');
      if (err != dupFNErr && err != noErr)
                              Debugger();
      err = FSOpen(reply.fName, reply.vRefNum, &globalRef);
      if (err)
                  Debugger();
      pHand2 = nil;

      SetStdCProcs(&myProcs);
      myPortPtr->grafProcs = &myProcs;
      myProcs.putPicProc = (Ptr)&PutPICTData;

      SetRect(&myRect,100,100,300,300);
      SetRect(&pictRect,0,0,500,500);

      longZero = 0;
      longCount = 4;
      for (i = 1; i <= (512 + sizeof(Picture)) / 4; ++i)
                  err = FSWrite (globalRef, &longCount, &longZero);
      if (err)
                  Debugger();
      pHand2 = OpenPicture(&pictRect);

      MoveTo(5,10);
      DrawString("\pThis is a picture saved to disk");
      PaintRect(&myRect);

      ClosePicture();

      if (SetFPos(globalRef, fsFromStart, 512) != noErr)
                  Debugger();
      longCount = sizeof(Picture);
      if (FSWrite(globalRef, &longCount, *pHand2) != noErr)
                  Debugger();

      if (FSClose(globalRef) != noErr)
                  Debugger();

      myPortPtr->grafProcs = nil;

       KillPicture (pHand2);
      SetPort(oldPort);
} /* OutPICT */

main()
{
      InitGraf(&thePort);
      InitFonts();
      InitWindows();
      InitMenus();
      TEInit();
      InitDialogs(nil);
      InitCursor();

      PictOut();
}

Let me know if you have a problem with it.

0
 

Author Comment

by:supersax
ID: 1291767
Unfortunately I was not able to make it work. There was a problem between converting CGrafPtr and GrafPtr which I solved by modifing in this way:
GrafPtr myPortPtr;
GetPort(&oldPort);

but I still have this problem:
Error: cannot convert
'char *' to
'pascal void (*)(char *, short)'
>QDProcs myProcs;
>myProcs.putPicProc = (Ptr)&PutPICTData;


0
 
LVL 3

Accepted Solution

by:
boonstra earned 200 total points
ID: 1291768
The Think Reference code roov posted is mostly correct, but it predates the Routine Descriptor changes introduced when the PowerPC came out.

You want to change the line with the error to:
      myProcs.putPicProc = (QDPutPicUPP)&PutPICTData;

See the definition of CQDProcs in <Quickdraw.h> for how to update the Think Reference code if you use any of the other bottleneck procs.
0
 

Author Comment

by:supersax
ID: 1291769
Thank you, both boonstra and roov.
I was able to work with the code after the change proposed by boonstra. However, when I hope the Pict file in Photoshop, PHotoshop says: "This does not appear to be a valid Quick Draw file. Attempt to open it anyway?". And if I say "Ok", Photoshop is able to open it. Maybe I should change "QDProcs" back to "CQDProcs", and both "GrafPort","GrafPtr" to "CGrafPort","CGrafPtr".
0
 

Author Comment

by:supersax
ID: 1291770
I changed the code a little bit. Now I'n writing also the first 512 of data, and no longer it is giving me problems.

Since MoveTo() and LineTo() act exactly like if you are giving orders to a plotter to draw, I was wondering if it is not too difficult to save the image as an .eps file, or eventually as HPGL or Illustrator.
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Suggested Solutions

Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
Introduction: Dialogs (1) modal - maintaining the database. Continuing from the ninth article about sudoku.   You might have heard of modal and modeless dialogs.  Here with this Sudoku application will we use one of each type: a modal dialog …
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now