From: pottier@clipper.ens.fr (Francois Pottier) Subject: csmp-digest-v3-041 Date: Sat, 2 Jul 1994 17:46:50 +0200 (MET DST) C.S.M.P. Digest Sat, 02 Jul 94 Volume 3 : Issue 41 Today's Topics: Detecting pre-68020 CPU for 68020 code Fast Animations (WAS: Fast full screen scrolling: impossible?) FlattenMovieData bug??? Here's how to get OpenDoc How to know the cursor is into a polygon? PowerPC load-store (was Re: Fast full screen scrolling: impossible?) Q: Default button & Return key in Modeless Dialog Questions about Tmon? Saving PICT files - Here's CODE!! Scroll Bars in DLOG? Why should't you move baseAddrs? cntl-opt-esc scroll bars in modal dialogs The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier (pottier@clipper.ens.fr). The digest is a collection of article threads from the internet newsgroup comp.sys.mac.programmer. It is designed for people who read c.s.m.p. semi- regularly and want an archive of the discussions. If you don't know what a newsgroup is, you probably don't have access to it. Ask your systems administrator(s) for details. If you don't have access to news, you may still be able to post messages to the group by using a mail server like anon.penet.fi (mail help@anon.penet.fi for more information). Each issue of the digest contains one or more sets of articles (called threads), with each set corresponding to a 'discussion' of a particular subject. The articles are not edited; all articles included in this digest are in their original posted form (as received by our news server at nef.ens.fr). Article threads are not added to the digest until the last article added to the thread is at least two weeks old (this is to ensure that the thread is dead before adding it to the digest). Article threads that consist of only one message are generally not included in the digest. The digest is officially distributed by two means, by email and ftp. If you want to receive the digest by mail, send email to listserv@ens.fr with no subject and one of the following commands as body: help Sends you a summary of commands subscribe csmp-digest Your Name Adds you to the mailing list signoff csmp-digest Removes you from the list Once you have subscribed, you will automatically receive each new issue as it is created. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest. Questions related to the ftp site should be directed to scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP digest are available there. Also, the digests are available to WAIS users. To search back issues with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html. ------------------------------------------------------- >From nagle@netcom.com (John Nagle) Subject: Detecting pre-68020 CPU for 68020 code Date: Thu, 16 Jun 1994 16:44:14 GMT Organization: NETCOM On-line Communication Services (408 261-4700 guest) Now that Symantec C++ is finally generating 68020 code when asked to do so (for years, that switch did nothing), it's worth nothing that this creates a problem in C++. In C programs, even Think C type programs, the first code executed is in "main", so it's sufficient to check CPU type there. But in C++, static constructors run before "main". Now that TCL is starting to use constructors, and constructors are starting to work right in SC++, it's more likely that code with a 68020 instruction might be executed before "main". It's hard to deal with this in a way that's guaranteed to work from the user program. The check for 68020 needs to be made in "CODE 1", the startup code block cranked out by the compiler for every C++ program. The user can't do this; only Symantec can. Anybody still care about pre-68020 machines, anyway? John Nagle +++++++++++++++++++++++++++ >From jwbaxter@olympus.net (John W. Baxter) Date: Thu, 16 Jun 1994 19:10:32 -0700 Organization: Internet for the Olympic Peninsula In article <nagleCrI15q.Kru@netcom.com>, nagle@netcom.com (John Nagle) wrote: > > Anybody still care about pre-68020 machines, anyway? I don't, and I have two of them (a Plus, and a first 100-days Mac now in 512KE form). However, there still are some Mac Portable owners around who do. By now, they must be used to programs which claim to require a 68020 or better crashing on their machine, but it certainly isn't a nice thing to do to them. Do the constructors for the static objects actually *use* any 68020 instructions on a regular basis? [Gestalt is available if you really want to check in each such constructor...or in a phoney or real object you arrange to have constructed first.] -- John Baxter Port Ludlow, WA, USA [West shore, Puget Sound] No hablo Intel. jwbaxter@pt.olympus.net +++++++++++++++++++++++++++ >From nagle@netcom.com (John Nagle) Date: Fri, 17 Jun 1994 15:39:19 GMT Organization: NETCOM On-line Communication Services (408 261-4700 guest) jwbaxter@olympus.net (John W. Baxter) writes: >Do the constructors for the static objects actually *use* any 68020 >instructions on a regular basis? [Gestalt is available if you really want >to check in each such constructor...or in a phoney or real object you >arrange to have constructed first.] If you do any subscript calculations involving 2D arrays or arrays of structures, you'll probably use the 32-bit multiply on a 68020. On 68000 machines, a subroutine is called for every 32-bit multiply. You can't have an object you "arrange to have constructed first". It's a feature of C++ that order of static constructor execution is random across file boundaries. ARM 12.6.1. You can't even call Gestalt from the constructor usefully unless your class is a base class. Base class constructors get called first, so if your class is derived from another class, its constructor will be called only after the base class constructor has already run. It won't help to override functions in the base class, either; the base class versions will be called when the base class constructor is called. So there really isn't a sound way to do this. John Nagle John Nagle --------------------------- >From cfranz@home.malg.imp.com (Christian Franz) Subject: Fast Animations (WAS: Fast full screen scrolling: impossible?) Date: Thu, 16 Jun 1994 09:14:27 GMT Organization: Union Bank of Switzerland, CH In article <1994Jun13.212936.24879@dal1>, seanmcd@ac.dal.ca wrote: > > In article <CrCFxp.79K@park.uvsc.edu>, stay@park.uvsc.edu (Steve Taylor) writes: > > From article <1994Jun12.232257.24853@dal1>, by seanmcd@ac.dal.ca: > >> I think Chuck Yeager's Air Combat does this too. You can see interlacing > >> in the terrain if you rock the plane back and forth. > >> > >> Sean > > > > Could someone describe this technique in more detail? Are you talking > > about leaving the other lines there and blitting the other half or > > are you talking about doubling the height of the lines or what? > > Thanks. > > > Well the description given above makes AstroChase 3D sound like CYAC, > although the only thing I've seen in AstroChase 3D is the venetian blind > style, rendering the frame onto every other line. Deliverance also has the > option to do this, as does a game called Gate. It looks to me like CYAC > does interlacing, i.e., there are no black lines alternating with the > graphics, but if you rock the plane > or turn rapidly, you can see the interlacing effect fairly easy in large > polygons. I'm currently developing a 3D space game and of course, I have the same problems. I have tried many things, among them the alternate line modes used by Astrochase (draw every other line) and CYAC (draw even lines on even frames, odd lines on odd frames). All these algorithms make one main assumption: You draw the image in an off-screen buffer and after you are done drawing it, you blast the image to screen. It usually takes three steps: 1. erase offscreen buffer 2. draw new frame offscreen 3. blast offscreen image on-screen. Tuning step 3 can speed up your program, but usually only by 1/6 max (optimized blitting is usually one third of the time per frame and I assume you double the speed of blitting by halving the lines to copy). I have found out that there is a much better method (however, I doubt if this technique can be applied to moving backgrounds as is the main title of this thread). Actually I didn't find out myself but Juri Munkki, Mac Animations Guru DeLuxe, did. Since my program uses polygon-oriented graphics, you collect all your polygons as if you would draw them. Then you compare them with all polygons drawn in the last frame and output *the*difference* to screen. This eliminates the need to erase your offscreen map and since two successive frames are usually similar to each other, you just draw a fraction of what you usually do. Although the overhead for collecting the polygons is probably a bit more than drawing them, the subsequent elimination of 90% that needs to be redrawn makes up for this. Also, if you just output the difference, this eliminates the need to as this is included into the algorithm. Mhhh. On second thought, this doesn't work at all for a scrolling background... But then, neither CYAC nor AC3D have moving background. > I don't know enough about 3D graphics to know whether you could > actually render even/odd scanlines or whether he's just splitting an > off-screen drawing into two blits. Well, I have some experience with 3D graphics and there are to fundamental different approaches. On is called object-space, the other scan-space (well, at least in german. They seem to translate badly). In object space you calculate all surfaces of the objects and project them on your (off)screen using normal projection methods. To tune your animation you use object coherencies (you take advantage of the fact that an object doesn't change much between two frames). In this algorithm you can't render only for odd lines. You have to render the whole scene and then transfer every other line. In scan space you take the inverted approach. For each pixel you decide which surface is frontmost and set this pixel to the appropriate color/texture. To tune this algorithm you can use scan-line coherencies (the fact that two pixels in any direction usually don't change much in color, both in x and y direction). With scan-space, you *can* render every other line directly. The third possibility is a combination of both methods. It's what Juri's program does (as I suspect. I havn't seen a single line of his code, but the performance of the demos he sent me leave no other explanation). You use object space to pre-calculate all objects (i.e. all vertices that define your surfaces), collect them to polygons that are not drawn but *mathematically* compared to the last frame, collect the difference to other polygons and finally draw the new polygons (using scan coherencies). You can draw directly to screen since you change so few things that it seems instantaneous. Juri claims that his algorithm is a bit faster than the one used in FA-18 (I think they use a similar approach) and quite frankly, I believe every word of it. > > Sean OK, sorry to have held you up with this rather lengthy discussion of some arcane and irrelevant topic, but I have spent a lot of time investigating this and maybe someone can make some use out of it. Have a nice day. Cheers, Christian - - Christian Franz * Union Bank of Switzerland, CH cfranz@home.malg.imp.com <- at home -> +41-1-261 26 96 --------------------------- >From Frank Manshande <frankm@and.nl> Subject: FlattenMovieData bug??? Date: Mon, 13 Jun 1994 14:47:53 GMT Organization: AND Software BV Hi, According to the Q/A in Develop 16 (page 130)... "Since FlattenMovieData" will simply append to a data fork of a file, you can pass it any data file and it will append the movie data to that file. Quicktime doesn't care what's stored before or after the movie data, as long as you don't reposition the movie data within the data dile." Well, if I try this, and append a movie using FlattenMovieData", the first 8 bytes will be overwritten with 4 bytes and then 'mdat'. Even if I pass the flag 'flattenAddMovieToDataFork' ! It seems like this is a bug! I don't want that data stored before the movie overwritten. My solution now is to read the first 8 bytes, then FlattenMovieData one or more quicktimes movie files and then restore the first 8 bytes. But I am not certain that replacing those 8 bytes won't have any side effects. What I do is store the "Movie" structure, using PutMovieIntoDataFork at a specific offset. My datafile looks like this: - ------------------------------- | some data (other than movies) | - ------------------------------- | flattened movie | - ------------------------------- | "Movie" structure | - ------------------------------- | flattened movie | - ------------------------------- | "Movie" structure | - ------------------------------- | flattened movie | - ------------------------------- | "Movie" structure | - ------------------------------- This works. But the first 8 bytes are overwritten in "some data". Any info would be very much appreciated! Frank Manshande frankm@and.nl +++++++++++++++++++++++++++ >From ivanski@world.std.com (Ivan M CaveroBelaunde) Date: Mon, 13 Jun 1994 18:05:25 GMT Organization: The World Public Access UNIX, Brookline, MA Frank Manshande <frankm@and.nl> writes: >This works. But the first 8 bytes are overwritten in "some data". What happens is that QT stores the info in a Bento-like atomic form. The single-fork movie (flattened means "self-contained", not "single-fork"). must contain "atoms" in order for QT to properly navigate it. Atoms are structured as follows: { long atomSize; // includes atomSize+atomType OSType atomType; ... atom specific data ... } So for your multimovie file to work it needs to contain atom headers before each movie data atom of the right size. It also needs an atom header in front of your data to allow QT to traverse the movie. This isn't a bug AFAIK; it seems Develop 16 was wrong in the general case (you can't just append the movie data for single fork files). If you control the file format, however, and you can add the atom header yourself, then it is feasible to do what they say. Given this structure, however, I'd avoid "restoring" the first 8 bytes as you were doing, since it's bound to affect your ability to access the multiple movies... Additionally, you might want to check out John Wang's article in Develop 17 ("Somewhere in QuickTime"), since I seem to remember there is a bug in FlattenMovieData in which the size field is not properly set when using multiple movies, and a fix (BetterFlattenMovieData) is discussed in it. Hope this helps, -Ivan - - Ivan Cavero Belaunde (ivanski@world.std.com) Avid VideoShop Project Lead Avid Technology, Inc. +++++++++++++++++++++++++++ >From Frank Manshande <frankm@and.nl> Date: Tue, 14 Jun 1994 06:51:11 GMT Organization: AND Software BV In article <CrCKx2.952@world.std.com> Ivan M CaveroBelaunde, ivanski@world.std.com writes: >If you control the file format, however, and you can add the atom header >yourself, then it is feasible to do what they say. Given this structure, >however, I'd avoid "restoring" the first 8 bytes as you were doing, >since it's bound to affect your ability to access the multiple movies... Well, First of all thanks for your time! I have written two small programs. One that adds a movie to ANY kind of file, and displays the offset of the 'movie resource' using the PutMovieIntoDataFork call. And another program that can play the movies at the specified offsets. This does seem to work correctly. The only side-effect I have encountered so far is that the file which I added the movies to cannot be played by SimplePlayer. SimplePlayer can play the first movie if I don't save and restore the first 8 bytes of the file. But because I don't want to play the movies using a general movie player, but only from my own program, this should not be a problem. The reason I have to restore the first 8 bytes of the file is that the quicktime movies are added to a specific database file (the database file is of proprietary format), and the database engine doesn't work if the first 8 bytes are overwritten. The reason why I don't just create two seperate files (one with the database and one with all the quicktime movies) is that our customers (and our company) only wants ONE file, which contains all the data. Does anybody know if saving and restoring the first 8 bytes that FlattenMovieData overwrites has any other side effects then not allowing programs such as SimplePlayer to play a movie? Thanks! Frank Manshande frankm@and.nl +++++++++++++++++++++++++++ >From Peter Vanags <peterv@uclink.berkeley.edu> Date: 15 Jun 1994 20:43:47 GMT Organization: UCB In article <CrDKDC.30H@and.nl> Frank Manshande, frankm@and.nl writes: >Does anybody know if saving and restoring the first 8 bytes that >FlattenMovieData overwrites has any other side effects then not >allowing programs such as SimplePlayer to play a movie? Nope, not a problem. The only caveat is you MUST use NewMoveFromDataFork() with the offset to the 'mdat' or 'moov' atom to retrieve the movie, if the other data in the data fork is not stored in "atom" form. To be clean about using FlattenMovieData(), you should use the following procedure: - store the first 8 bytes of the data fork - store the file's length - append a dummy 'mdat' atom to the end of the data fork - call FlattenMovieData() - check the offset to the end of the movie data, which is now in the first 4 bytes of the data fork, compare to the length before FlattenMovieData() was called and update your dummy atom - restore the first 8 bytes of the file's data fork I talked with John Wang at MacDTS (author of the "Somewhere in QuickTime" column in develop) quite a bit about this issue right before he published the article. Peter Vanags peterv@uclink.berkeley.edu +++++++++++++++++++++++++++ >From jywang@apple.com (John Wang) Date: 16 Jun 1994 00:27:12 GMT Organization: Apple Computer, Inc. FYI. The bug fix for the problem described in issue #17 of my article has been added to QuickTime 2.0. If you use my BetterFlattenMovie or BetterFlattenMovieData routine, you will be all set since BetterFlattenMovie only patches FlattenMovie when QuickTime 1.6.X or earlier is used. John --------------------------- >From Jens Alfke <jens_alfke@powertalk.apple.com> Subject: Here's how to get OpenDoc Date: Wed, 15 Jun 1994 23:30:31 GMT Organization: Apple Computer I just got off the phone with our evangelist, Mark "Rev. Billy-Bob" Thomas, to get the true facts about OpenDoc seeding. Here's the scoop. * The current (a6) version of OpenDoc is _not_ going to be distributed more widely than to the WWDC attendees. They decided against a blanket mailing to all registered developers because, as Mark put it, "You only get one chance to make a good first impression". The a6 build is still a bit flaky, requires MPW, and doesn't come with much in the way of documentation. Their fear was that, if everybody got it, many would play with it a little, run into problems, and not look at it again later when things are more polished. * The beta seed _is_ going to be distributed widely. It'll be on the developer CD. It'll be on the 'develop' bookmark CD, and we're hoping to get a number of OpenDoc articles in that issue of 'develop'. (Note that anyone can order single issues of 'develop' from APDA for $10.) This will probably be in September given the lead time involved in pressing CDs. By that time the code will be more stable, you'll be able to build with CodeWarrior (hope hope hope), and there will be at least draft versions of the official documentation for both OpenDoc and the framework. * But! If you're interested in getting started with OpenDoc _now_ (and how can I blame you?) you can send mail to OpenDoc@applelink.apple.com and get a CD with version a6 in return for filling out a short form. * Feel free to post OpenDoc questions here; I'll try to answer them. There is an OpenDoc mailing list; send mail to <majordomo@cil.org> with body "subscribe opendoc-interest" to subscribe. There is also a discussion board on AppleLink somewhere. I hope this answers your questions. Sorry about any misinformation I've posted in the past ... --Jens Alfke jens_alfke@powertalk Rebel girl, rebel girl, .apple.com Rebel girl you are the queen of my world +++++++++++++++++++++++++++ >From chuck@molecule.Physics.Drexel.Edu (Chuck Browne) Date: Thu, 16 Jun 1994 16:35:00 GMT Organization: Drexel University Jens Alfke (jens_alfke@powertalk.apple.com) wrote: : I just got off the phone with our evangelist, Mark "Rev. Billy-Bob" Thomas, : to get the true facts about OpenDoc seeding. Here's the scoop. : * The beta seed _is_ going to be distributed widely. It'll be on the : developer CD. It'll be on the 'develop' bookmark CD, and we're hoping to get Thanks, Jens Is there any problem with lending it to Metrowerks for shipping on the DR4 CD, which roughly comes out at the same time? (Not that I'm trying to save a couple of bucks or anything... :-) ) Chuck +++++++++++++++++++++++++++ >From Jens Alfke <jens_alfke@powertalk.apple.com> Date: Thu, 16 Jun 1994 22:55:44 GMT Organization: Apple Computer Chuck Browne, chuck@molecule.Physics.Drexel.Edu writes: > Is there any problem with lending it to Metrowerks for shipping on the > DR4 CD, which roughly comes out at the same time? I think Mark wants people to go directly to Apple to obtain it. He wants to keep tabs on how many people have it and who they are (in case we need to send out any mass mailings, or sell your names and addresses to The Sharper Image :) > (Not that I'm trying to save a couple of bucks or anything... :-) ) I don't think we're charging anything for the OpenDoc seed. --Jens Alfke jens_alfke@powertalk Rebel girl, rebel girl, .apple.com Rebel girl you are the queen of my world +++++++++++++++++++++++++++ >From chuck@molecule.Physics.Drexel.Edu (Chuck Browne) Date: Fri, 17 Jun 1994 00:58:43 GMT Organization: Drexel University Jens Alfke (jens_alfke@powertalk.apple.com) wrote: : Chuck Browne, chuck@molecule.Physics.Drexel.Edu writes: : > Is there any problem with lending it to Metrowerks for shipping on the : > DR4 CD, which roughly comes out at the same time? : I think Mark wants people to go directly to Apple to obtain it. He wants to : keep tabs on how many people have it and who they are (in case we need to : send out any mass mailings, or sell your names and addresses to The Sharper : Image :) : > (Not that I'm trying to save a couple of bucks or anything... :-) ) : I don't think we're charging anything for the OpenDoc seed. I meant the $10 for develop, but what you say is good to hear. (Not that I need OpenDoc or anything, I'm just curious about it and what it will mean to software in the next couple of years... maybe I'll try it out, if I manage to get my PhD on schedule..) Thanks, Chuck : --Jens Alfke : jens_alfke@powertalk Rebel girl, rebel girl, : .apple.com Rebel girl you are the queen of my world --------------------------- >From belanger@bach.ulaval.ca (Yves Belanger) Subject: How to know the cursor is into a polygon? Date: Tue, 14 Jun 1994 18:09:32 GMT Organization: Universite Laval, Ste-Foy (Quebec), Canada Hello, I am writing an application where districts are drawn on a geographic map. Districts are made with many points, like a polygon in MacDraw. Each point is given a longitude and a latitude. I have functions that translate back and forth these coordinates into screen coordinates. My problem is how to determine that a user has clicked inside one of those polygon or the click was outside them all? If the solution could work with longitude and latitude, that would be greater, since less computing would be involved. Thank you. S. Beaudry +++++++++++++++++++++++++++ >From Mark Hanrek <hanrek@cts.com> Date: Tue, 14 Jun 1994 22:49:07 GMT Organization: The Information Workshop In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger, belanger@bach.ulaval.ca writes: > I am writing an application where districts are drawn on a geographic > map. Districts are made with many points, like a polygon in MacDraw. > Each point is given a longitude and a latitude. I have functions that > translate back and forth these coordinates into screen coordinates. The most common approach is to take advantage of the Macintosh's built-in region capabilities. They are incredibly powerful, and very easy to use. You can easily take any polygon and create the equivalent region from it, which is kept in a RegionHandle. Keep a list of these RegionHandles handy, one for each district, and when the user clicks, take the location of the click and then in a loop use the PtInRgn() toolbox call to test whether that point is within each of the regions. When the result is true, bingo. If there are overlapping regions, be sure they are set up and tested in front to back order. That's all there is to it, unless I misunderstood your situation. I forget the exact calls to make a region from a polygon, but the whole process is exceedingly simple. This is the only approach I know of, really. Mark Hanrek +++++++++++++++++++++++++++ >From jwbaxter@olympus.net (John W. Baxter) Date: Tue, 14 Jun 1994 21:09:23 -0700 Organization: Internet for the Olympic Peninsula In article <CrEFrx.LDq@athena.ulaval.ca>, belanger@bach.ulaval.ca (Yves Belanger) wrote: > Hello, > > I am writing an application where districts are drawn on a geographic > map. Districts are made with many points, like a polygon in MacDraw. > Each point is given a longitude and a latitude. I have functions that > translate back and forth these coordinates into screen coordinates. > > My problem is how to determine that a user has clicked inside one of > those polygon or the click was outside them all? If the solution could > work with longitude and latitude, that would be greater, since less > computing would be involved. Thank you. My approach would be based on creating a QD region which covers the same "territory" as the polygon, and using the provided PtInRgn call against the region. Only if that were not "fast enough" would I probe further. Or...better...switch to QuickDraw GX, where you're likely to be working with a polygon shape, and you can easily hit-test that (or any other shape). That may put things a little more into the future than you want, though. -- John Baxter Port Ludlow, WA, USA [West shore, Puget Sound] No hablo Intel. jwbaxter@pt.olympus.net +++++++++++++++++++++++++++ >From Jens Alfke <jens_alfke@powertalk.apple.com> Date: Wed, 15 Jun 1994 22:21:34 GMT Organization: Apple Computer In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger, belanger@bach.ulaval.ca writes: > My problem is how to determine that a user has clicked inside one of > those polygon or the click was outside them all? As has been said, the easiest solution is to create a region of the same shape as the polygon, then call PtInRegion. This does have the drawback that regions containing diagonal lines eat up lots of memory. (Think of the boundary of the region as a polygon, including little stairsteps at pixel edges on diagonal lines. The region then occupies about two to four bytes per vertex of that polygon.) Unfortunately, regions larger than 64kbytes will crash QuickDraw. This shouldn't be a problem unless your polygons are very large or complex. To create a region from a polygon: * Call OpenRgn * MoveTo the first point in the polygon, LineTo each succeeding point. Make sure to end with a LineTo back to the first point. * Call CloseRgn. Your other alternative is to use a real "point in polygon" test. You could either be the four millionth person this month to ask about this on comp.graphics.algorithms, or you could get a standard computer graphics textbook like "Computer Graphics: Principles and Practice" by Foley, Van Dam et al. There may also be source code available by ftp, but I have no idea where. --Jens Alfke jens_alfke@powertalk Rebel girl, rebel girl, .apple.com Rebel girl you are the queen of my world +++++++++++++++++++++++++++ >From mxmora@unix.sri.com (Matt Mora) Date: 16 Jun 1994 09:28:11 -0700 Organization: SRI International, Menlo Park, CA In article <1994Jun15.222134.21946@gallant.apple.com> Jens Alfke <jens_alfke@powertalk.apple.com> writes: >In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger, >belanger@bach.ulaval.ca writes: >> My problem is how to determine that a user has clicked inside one of >> those polygon or the click was outside them all? > >As has been said, the easiest solution is to create a region of the same >shape as the polygon, then call PtInRegion. This does have the drawback that >regions containing diagonal lines eat up lots of memory. (Think of the >boundary of the region as a polygon, including little stairsteps at pixel >edges on diagonal lines. The region then occupies about two to four bytes per >vertex of that polygon.) Unfortunately, regions larger than 64kbytes will >crash QuickDraw. This shouldn't be a problem unless your polygons are very >large or complex. > >To create a region from a polygon: >* Call OpenRgn >* MoveTo the first point in the polygon, LineTo each succeeding point. Make >sure to end with a LineTo back to the first point. >* Call CloseRgn. > >Your other alternative is to use a real "point in polygon" test. You could >either be the four millionth person this month to ask about this on >comp.graphics.algorithms, or you could get a standard computer graphics >textbook like "Computer Graphics: Principles and Practice" by Foley, Van Dam >et al. There may also be source code available by ftp, but I have no idea >where. >From the UMPG Vol II Subject: Re: Point in Polygon routine needed From: fry@zariski.harvard.edu (David Fry) In article <8fxkxAO00WB7M=nOFO@andrew.cmu.edu> Andrew Lewis Tepper <at15+@andrew.cmu.edu> writes: >I don't know if this routine is "standard", I just came up with it recently: > >For a polygon of points p1...pn, and a point P, make a table as follows: > >T(1)= angle from p1 to P to p2 >T(2)= angle from p2 to P to p3 >... >T(n)= angle from pn to P to p1 > >express all angles as: -PI < angle < PI. > >Add all entries in the table. If the sum = 0, the point is outside. If >the sum is +/- PI, the point is inside. If the point is +/- xPI, you >have a strange polygon. If ANY angle was = +/-PI, the point is on the >border. > >Does anyone know if this is considered a good (known?) algorithm? It >took a long time to come up with! You have the essence of the "good," standard algorithm, but if you're working with thousands of polygons, those floating point calculations will be too slow and will probably lead to round-off error at some point. Round-off error is a huge pain in computational geometry problems. The hard part is finding ways to avoid it. The trick is that you don't need to know the angle between the lines, you just need to know its sign, called the *circulation*. For every line AB in the polygon, form the triangle PAB and you want to know does it lie inside the polygon or not. That is, if you were riding a bike counterclockwise around the boundary of the polygon, would P lie on your left or your right when you crossed AB? You can find this by calculating PA x PB = (A.x-P.x)*(B.y-P.y) - (A.y-P.y)*(B.x-P.x). The circulation (the sign of PA x PB) can be found without doing a multiplication in many cases, but this is good enough. Remember, we've oriented the polygon so that you come to A before coming to B as your traverse its boundary. Then the algorithm is: In = 0 foreach edge AB in the polygon if A.y < P.y and B.y >= P.y and PA x PB > 0 In = In + 1 if A.y >= P.y and B.y < P.y and PA x PB < 0 In = In - 1 Then if In = 1, P is inside the polygon, and is outside if I = 0. This doesn't handle the case where P lies on some edge AB of the polygon. David Fry fry@math.harvard.edu Division of Applied Sciences fry@huma1.bitnet Harvard University ...!harvard!huma1!fry Cambridge, MA 02138 - ---------- end of artile Xavier -- ___________________________________________________________ Matthew Xavier Mora Matt_Mora@sri.com SRI International mxmora@unix.sri.com 333 Ravenswood Ave Menlo Park, CA. 94025 +++++++++++++++++++++++++++ >From Rick Wong <rick@jessica.stanford.edu> Date: 16 Jun 1994 17:59:54 GMT Organization: Stanford University In article <CrEFrx.LDq@athena.ulaval.ca> Yves Belanger, belanger@bach.ulaval.ca writes: > My problem is how to determine that a user has clicked inside one of > those polygon or the click was outside them all? One approach is to create an offscreen bitmap with its origin set up so that the bitmap is centered around the click locaction. The bitmap doesn't have to be very big at all, just enough for your hit tolerance. For each polygon you want to test, clear the bitmap, then draw the polygon into it (if you want to see if the point is inside the polygon, you should draw it with a black fill pattern). You can then examine the individual bits around the click location to see if any are set. Of course, such "cleverness" is unnecessary under QuickDraw GX.... --Rick Wong --------------------------- >From platypus@cirrus.som.cwru.edu (Gary Kacmarcik) Subject: PowerPC load-store (was Re: Fast full screen scrolling: impossible?) Date: 15 Jun 1994 15:23:53 GMT Organization: Case Western Reserve University, Cleveland, Ohio (USA) In article <1994Jun12.182803.1@west.cscwc.pima.edu> 103t_english@west.cscwc.pima.edu writes: > And finally, what happened to the load/store multiple instructions that are > (I assume?) faster on the 601, but will probably be slower "in future > implementations?" the load/store multiple instructions are not faster than a series of loads and stores (except perhaps if there are stalls from the instruction cache). they take 1 cycle per load or store. these instructions are present to make saving and restoring registers (GPRs only) to the stack a little bit easier. that's really the only benefit to them. many of the PowerPC architects do not like these instructions because they do not fit the RISC model very well, thus they complicate the processor implementation. don't expect IBM/Motorola to invest much time on these instructions. witness the lack of equivalent instructions for floating- point registers or for 64-bit GPRs. these instructions will become slower when they decide to eliminate them and handle them via trap-and-emulate. (hey, at least they're telling you all this up front) -gary j kacmarcik platypus@cirrus.som.cwru.edu +++++++++++++++++++++++++++ >From zstern@adobe.com (Zalman Stern) Date: Wed, 15 Jun 1994 20:34:44 GMT Organization: Adobe Systems Incorporated Gary Kacmarcik writes > the load/store multiple instructions are not faster than a series of loads > and stores (except perhaps if there are stalls from the instruction cache). > they take 1 cycle per load or store. Which will happen relatively often on the 601. (For example anytime you save 8 or more registers, its guaranteed to happen.) > these instructions are present to make saving and restoring registers > (GPRs only) to the stack a little bit easier. that's really the only benefit > to them. They improve code density somewhat. Given the size of native apps that's a concern. > many of the PowerPC architects do not like these instructions because they > do not fit the RISC model very well, thus they complicate the processor > implementation. don't expect IBM/Motorola to invest much time on these > instructions. witness the lack of equivalent instructions for floating- > point registers or for 64-bit GPRs. Bottom line: the architecture would be better without load/store multiple. However since the architects could not reach agreement to remove these instructions, the implementors should support them. As it stands now, some implementors will makes these instructions competitive and some won't. Applications developers will be stuck with a choice which way to go. For load/store multiple, this doesn't bother me that much. (One might take a minor speed hit to win on code space most places anyway.) However the manual says similar things about load/store update instructions vs. using a load/store and an add instruction. This causes a much bigger performance tradeoff right in the middle of your inner loops. A PowerPC implementation where the two instruction sequence is faster than an update form instruction would be braindead. -- Zalman Stern zalman@adobe.com (415) 962 3824 Adobe Systems, 1585 Charleston Rd., POB 7900, Mountain View, CA 94039-7900 `Wait a second! This is just an octahedron suspended in blue liquid.' - JT +++++++++++++++++++++++++++ >From platypus@cirrus.som.cwru.edu (Gary Kacmarcik) Date: 16 Jun 1994 18:34:53 GMT Organization: Case Western Reserve University, Cleveland, Ohio (USA) In article <1994Jun15.203444.3373@adobe.com> zstern@adobe.com (Zalman Stern) writes: > > Gary Kacmarcik writes > > these instructions are present to make saving and restoring registers > > (GPRs only) to the stack a little bit easier. that's really the only > > benefit to them. > > They improve code density somewhat. Given the size of native apps that's a > concern. but they don't affect code density all that much. the recommended way doing the load/store sequence of instructions is to have a series of loads (or stores) somewhere in the app or OS like lwz r13,0(r0) lwz r14,4(r0) ... lwz r31,68(r0) bcctr (or something like that - i believe that the standard save/restore glue does a few other things, but i don't have the exact sequence handy). then a function that wants to save a bunch of registers just calculates the address of where the first register should be saved and branches to appropriate lwz instruction. you have to do this anyway for floating- point and 64-bit reg's, so it's not a big deal. the end result is that if it's done this way, it won't have a big impact on code density. performance is basically to same too, since the branches (both of which are unconditional) are "free" and the glue code may already be in the i-cache (from previous functions). -gary j kacmarcik platypus@cirrus.som.cwru.edu +++++++++++++++++++++++++++ >From Bruce@hoult.actrix.gen.nz (Bruce Hoult) Date: Fri, 17 Jun 1994 04:23:38 +1200 (NZST) Organization: (none) platypus@cirrus.som.cwru.edu (Gary Kacmarcik) writes: > many of the PowerPC architects do not like these instructions because they > do not fit the RISC model very well, thus they complicate the processor > implementation. don't expect IBM/Motorola to invest much time on these > instructions. witness the lack of equivalent instructions for floating- > point registers or for 64-bit GPRs. > > these instructions will become slower when they decide to eliminate them > and handle them via trap-and-emulate. (hey, at least they're telling you > all this up front) That won't be too bad -- everyone sees it coming, and coming (fairly) soon, and if you're saving a number of registers the speed hit won't be *that* horrible (but horrible enough), and most people don't use it inside of tight loops, and it's no faster than the alternative anyway. The really, *really* horrible one will come when the "load with update" and "store with update" instructions get the trap-and-emulate treatment. For the non PPC-savvy folk, those instructions get used to implement the C constructs *++p and *--p (and *p++ and *p-- with a smart optomising compiler that can transform your code). They're used a *lot*, they're a big speed win on the 601 (less on the 603 and 604 if you don't mind tying up two units for a load and an addi in parallel becasue you've got nothing better to do with them), and they occur in speed-critical inner loops. -- Bruce --------------------------- >From efisch@cs.tamu.edu (Eric A Fisch) Subject: Q: Default button & Return key in Modeless Dialog Date: 16 Jun 1994 18:56:00 GMT Organization: Texas A&M Computer Science Department, College Station, TX I am working with modeless dialogs and am quite pleased with the results. I am having a problem defining a default button and making the return (or enter) key activate it. Right now, when the return key is pressed it is passed into the active editable text field. I do have the OK button at item number 1, but I am clearly missing something. Any thoughts? Thanks, Eric Fisch efisch@cs.tamu.edu +++++++++++++++++++++++++++ >From egurney@vcd.hp.com (Eddy J. Gurney) Date: Thu, 16 Jun 1994 20:01:29 GMT Organization: Hewlett-Packard VCD Eric A Fisch (efisch@cs.tamu.edu) wrote: >I am working with modeless dialogs and am quite pleased with the >results. I am having a problem defining a default button and making >the return (or enter) key activate it. Right now, when the return key >is pressed it is passed into the active editable text field. I do have >the OK button at item number 1, but I am clearly missing something. Any >thoughts? Yes. After calling IsDialogEvent() from your event loop and determining that this is an event for an open modeless dialog, you need to "pre-process" the event before passing it on to DialogSelect() and check for a "keyDown" or "autoKey" event when theEvent.message & charCodeMask is equal to the Enter or Return key and process it appropriately... being sure to NOT pass the event on to DialogSelect() afterwards. You need to do a similar thing anyway to catch Command-key equivalents, which DialogSelect() also just "pushes" through to TEKey... -- Eddy J. Gurney N8FPW Hewlett-Packard Company, Vancouver (USA!) Division egurney@vcd.hp.com #include <standard-disclaimer.h> "Failures are divided into two classes-- those who thought and never did, and those who did and never thought." John Charles Salak +++++++++++++++++++++++++++ >From dubois@primate.wisc.edu (Paul DuBois) Date: 16 Jun 1994 15:46:39 -0500 Organization: Castra Parvulorum >From article <2tq780$3i8@news.tamu.edu>, by efisch@cs.tamu.edu (Eric A Fisch): > I am working with modeless dialogs and am quite pleased with the > results. I am having a problem defining a default button and making > the return (or enter) key activate it. Right now, when the return key > is pressed it is passed into the active editable text field. I do have > the OK button at item number 1, but I am clearly missing something. Any > thoughts? You have to handle it yourself in a modeless dialog. -- Paul DuBois dubois@primate.wisc.edu --------------------------- >From apabla@hercules.cs.uregina.ca (jaime apablaza) Subject: Questions about Tmon? Date: Wed, 01 Jun 1994 03:19:37 GMT Organization: University of Regina How much does Tmon Pro cost and where can I order it from? I read in the faq that Tmon has a rather steep learning curve so I was wondering is that because the manual is rather cryptic. If so are there third party books on using Tmon? Email preferred. +++++++++++++++++++++++++++ >From hall_j@sat.mot.com (Joseph Hall) Date: Wed, 1 Jun 1994 05:42:03 GMT Organization: Motorola Inc., Satellite Communications Seems it was apabla@hercules.cs.uregina.ca (jaime apablaza) who said: >How much does Tmon Pro cost and where can I order it from? I read in the >faq that Tmon has a rather steep learning curve so I was wondering is >that because the manual is rather cryptic. If so are there third party >books on using Tmon? Email preferred. I'm not aware of any books on TMON (other than the fairly good documentation that comes with it), but at least TMON seems to have a future now. For a while it looked as if it had been dropped on the floor and left for dead. The current trend is STRONGLY toward Jasik's The Debugger, though. Obviously there is no TMON for PowerPC at this time. -- Joseph Nathan Hall | Joseph's Law of Interface Design: Never give your users Software Architect | a choice between the easy way and the right way. Gorca Systems Inc. | joseph@joebloe.maple-shade.nj.us (home) (on assignment) | (602) 732-2549 (work) Joseph_Hall-SC052C@email.mot.com +++++++++++++++++++++++++++ >From chewy@shell.portal.com (Paul F. Snively) Date: 1 Jun 1994 14:26:07 GMT Organization: tumbolia.com In article <1994Jun01.031937.138522@sue.cc.uregina.ca> apabla@hercules.cs.uregina.ca (jaime apablaza) writes: > How much does Tmon Pro cost and where can I order it from? I read in the > faq that Tmon has a rather steep learning curve so I was wondering is > that because the manual is rather cryptic. If so are there third party > books on using Tmon? Email preferred. I would mail, but others might want to read this, too... TMON Pro does have a significant learning curve, as does probably any reasonably capable object-level debugger on the Mac. The Mac is a complex beast itself; to create a debugger that can interact with heaps, resources, code, registers, etc. is difficult (says a guy who used to work at ICOM Simulations, Inc.) Having said that, here are my brief pointers for happiness in TMON Pro: 1) Whenever you have a TMON Pro window open, note the little square box in the upper right corner. It looks like a zoom box, and in a sense, it is: it will expand the window to show a variety of hidden (ugh) options for use in that window. 2) Learn--and I mean _really_ learn--TMON Pro's expression syntax. Easily 90% of the cool things that you can do with TMON involve non-trivial use of expressions. For example, TMON Pro's "Stack Crawl" window is just a Memory window with a moderately hairy expression used to crawl up the stack. There's an even hairier expression used to create a Memory window that gives the names of all of the windows in the current world (hairy to do because the titleHandle is at different offsets in b&w vs. color windows). In particular, make sure that you fully understand delayed vs. immediate evaluation. 3) Remember that TMON Pro does, in fact, have a command line. Command-space will open it. You may think, "but I hate command lines!" So do I, but it's the only way to do certain things in TMON Pro, e.g. type: