Solved

Saving pict file after drawing with LineTo()

Posted on 1999-01-26
5
290 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

[Live Webinar] The Cloud Skills Gap

As Cloud technologies come of age, business leaders grapple with the impact it has on their team's skills and the gap associated with the use of a cloud platform.

Join experts from 451 Research and Concerto Cloud Services on July 27th where we will examine fact and fiction.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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. …
Have you tried to learn about Unicode, UTF-8, and multibyte text encoding and all the articles are just too "academic" or too technical? This article aims to make the whole topic easy for just about anyone to understand.
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.
Michael from AdRem Software outlines event notifications and Automatic Corrective Actions in network monitoring. Automatic Corrective Actions are scripts, which can automatically run upon discovery of a certain undesirable condition in your network.…

627 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