[AQT-commit] CVS: adapters/fortran demo.f,NONE,1.1 demo_old.f,NONE,1.1 eventdemo1,NONE,1.1 eventdemo
Brought to you by:
persquare
From: Per P. <per...@us...> - 2003-12-29 15:05:50
|
Update of /cvsroot/aquaterm/adapters/fortran In directory sc8-pr-cvs1:/tmp/cvs-serv4780 Modified Files: f2aqt.m test.f Added Files: demo.f demo_old.f eventdemo1 eventdemo1.f f2aquaterm.m Makefile tiny.f Log Message: Updating to AQT1.0. --- NEW FILE: demo.f --- C demo.f C AquaTerm C C Created by Per Persson on Fri Nov 07 2003. C Copyright (c) 2003 __MyCompanyName__. All rights reserved. C C C This file contains an example of what can be done with C AquaTerm and the corresponding library: libaquaterm.dylib C C This code can be build as a stand-alone executable (tool) C from the command line: C gcc -o demo demo.c -laquaterm -lobjc program demo integer i character*64 strBuf real xPtr, yPtr, x, y, f, lw, r dimension xPtr(128) dimension yPtr(128) parameter (pi = 3.14152692) integer middle, baseline, bottom, top, left, center, right integer rgbImage(2,2) C labels (probably better ways to do this...) C C verticalAlign: {middle, baseline, bottom, top} = {0,4,8,16} middle = 0 baseline = 4 bottom = 8 top = 16 C horizontalAlign: {left, center, right} = {0,1,2} left = 0 center = 1 right = 2 C C Initialize. Do it or fail miserably... call aqtInit() C Open up a plot for drawing call aqtOpenPlot(1) call aqtSetPlotSize(620.0,420.0) call aqtSetPlotTitle('Testview') C Set colormap C white call aqtSetColormapEntry(0, 1.0, 1.0, 1.0) C black call aqtSetColormapEntry(1, 0.0, 0.0, 0.0) C red call aqtSetColormapEntry(2, 1.0, 0.0, 0.0) C green call aqtSetColormapEntry(3, 0.0, 1.0, 0.0) C blue call aqtSetColormapEntry(4, 0.0, 0.0, 1.0) C purple call aqtSetColormapEntry(5, 1.0, 0.0, 1.0) C yellow call aqtSetColormapEntry(6, 1.0, 1.0, 0.5) C dark green call aqtSetColormapEntry(7, 0.0, 0.5, 0.5) C Set color explicitly call aqtSetColor(0.0, 0.0, 0.0) call aqtSetFontname('Helvetica') call aqtSetFontsize(12.0) call aqtAddLabel('Testview', 4.0, 412.0, 0.0, 0) C Frame plot call aqtMoveTo(20., 20.) call aqtAddLineTo(600.,20.) call aqtAddLineTo(600.,400.) call aqtAddLineTo(20.,400.) call aqtAddLineTo(20.,20.) call aqtAddLabel('Frame 600x400 pt', 24., 30., 0.0, 0) C Colormap call aqtAddLabel('Custom colormap', 30., 390., 0.0, 0) C Display the colormap, but first create a background for the white box... call aqtSetColor(0.8, 0.8, 0.8) call aqtAddFilledRect(28., 348., 24., 24.) f = 0.0 do 10 i = 0, 7 call aqtTakeColorFromColormapEntry(i) call aqtAddFilledRect(30.+f*30., 350., 20., 20.) C Print the color index call aqtSetColor(0.5, 0.5, 0.5) C FIXME: how do I create formatted strings? call aqtAddLabel('X', 40.+f*30., 360., 0.0, middle+center) f = f+1.0 10 end do C Continuos colors call aqtRenderPlot() call aqtTakeColorFromColormapEntry(1) call aqtAddLabel('Continuous colors',320., 390., 0.0, 0) call aqtSetLinewidth(1.0) f = 0.0 do 20 i = 0, 255 call aqtSetColor(1.0, f/256.0, f/512.0) call aqtMoveTo(320.+f, 370.) call aqtAddLineTo(320.+f, 350.) call aqtSetColor(0.0, f/256.0, (1.0-f/256.0)) call aqtMoveTo(320.+f, 348.) call aqtAddLineTo(320.+f, 328.) call aqtSetColor((1.0-f/256.0), (1.0-f/256.0), (1.0-f/256.0)) call aqtMoveTo(320.+f, 326.) call aqtAddLineTo(320.+f, 306.) f = f+1.0 20 end do C Lines call aqtTakeColorFromColormapEntry(1) do 30 f = 1.0, 12.0, 2.0 call aqtSetLinewidth(f/2.0) call aqtMoveTo(30., 200.5+f*10.) call aqtAddLineTo(200., 200.5+f*10.) C FIXME: how do I create formatted strings? C sprintf(strBuf, "linewidth %3.1f", lw) call aqtAddLabel('linewidth x.x', 210., 201.5+f*10., 0.0, left) 30 end do C linecap styles call aqtSetLinewidth(11.0) call aqtTakeColorFromColormapEntry(1) call aqtSetLineCapStyle(0) call aqtMoveTo(40.5, 170.5) call aqtAddLineTo(150.5, 170.5) call aqtAddLabel('AQTButtLineCapStyle', 160.5, 170.5, 0.0, 0) call aqtSetLinewidth(1.0) call aqtTakeColorFromColormapEntry(6) call aqtMoveTo(40.5, 170.5) call aqtAddLineTo(150.5, 170.5) call aqtSetLinewidth(11.0) call aqtTakeColorFromColormapEntry(1) call aqtSetLineCapStyle(1) call aqtMoveTo(40.5, 150.5) call aqtAddLineTo(150.5, 150.5) call aqtAddLabel('AQTRoundLineCapStyle', 160.5, 150.5, 0.0, 0) call aqtSetLinewidth(1.0) call aqtTakeColorFromColormapEntry(6) call aqtMoveTo(40.5, 150.5) call aqtAddLineTo(150.5, 150.5) call aqtSetLinewidth(11.0) call aqtTakeColorFromColormapEntry(1) call aqtSetLineCapStyle(2) call aqtMoveTo(40.5, 130.5) call aqtAddLineTo(150.5, 130.5) call aqtAddLabel('AQTSquareLineCapStyle', 160.5, 130.5, 0.0, 0) call aqtSetLinewidth(1.0) call aqtTakeColorFromColormapEntry(6) call aqtMoveTo(40.5, 130.5) call aqtAddLineTo(150.5, 130.5) C line joins call aqtTakeColorFromColormapEntry(1) call aqtAddLabel('Line joins:', 40., 90., 0.0, 0) call aqtSetLinewidth(11.0) call aqtSetLineCapStyle(0) call aqtMoveTo(40., 50.) call aqtAddLineTo(75., 70.) call aqtAddLineTo(110., 50.) call aqtSetLinewidth(1.0) call aqtTakeColorFromColormapEntry(6) call aqtMoveTo(40., 50.) call aqtAddLineTo(75., 70.) call aqtAddLineTo(110., 50.) call aqtSetLinewidth(11.0) call aqtTakeColorFromColormapEntry(1) call aqtMoveTo(130., 50.) call aqtAddLineTo(150., 70.) call aqtAddLineTo(170., 50.) call aqtSetLinewidth(1.0) call aqtTakeColorFromColormapEntry(6) call aqtMoveTo(130., 50.) call aqtAddLineTo(150., 70.) call aqtAddLineTo(170., 50.) call aqtSetLinewidth(11.0) call aqtTakeColorFromColormapEntry(1) call aqtSetLineCapStyle(0) call aqtMoveTo(190., 50.) call aqtAddLineTo(200., 70.) call aqtAddLineTo(210., 50.) call aqtSetLinewidth(1.0) call aqtTakeColorFromColormapEntry(6) call aqtMoveTo(190., 50.) call aqtAddLineTo(200., 70.) call aqtAddLineTo(210., 50.) C Polygons call aqtTakeColorFromColormapEntry(1) call aqtAddLabel('Polygons', 320., 290., 0.0, left) f = 0.0 r = 20.0 do 40 i = 1, 4 xPtr(i) = 340.0+r*cos(f*pi/2.0) yPtr(i) = 255.0+r*sin(f*pi/2.0) f=f+1.0 40 end do call aqtTakeColorFromColormapEntry(2) call aqtAddPolygon(xPtr, yPtr, 4); f = 0.0 r = 20.0 do 50 i = 1, 5 xPtr(i) = 400.0+r*cos(f*pi*0.8) yPtr(i) = 255.0+r*sin(f*pi*0.8) f=f+1.0 50 end do call aqtTakeColorFromColormapEntry(3) call aqtAddPolygon(xPtr, yPtr, 5); C Overlay a polyline call aqtTakeColorFromColormapEntry(1) xPtr(6) = xPtr(1) yPtr(6) = yPtr(1) call aqtAddPolyline(xPtr, yPtr, 6) C Alternative to polyline: f = 0.0 r = 20.0 call aqtTakeColorFromColormapEntry(4) call aqtMoveToVertex(460.0+r, 255.0) do 60 i = 1, 8 x = 460.0+r*cos(f*pi/4.0) y = 255.0+r*sin(f*pi/4.0) call aqtAddEdgeToVertex(x, y) f=f+1.0 60 end do f = 0.0 r = 20.0 do 70 i = 1, 32 xPtr(i) = 520.0+r*cos(f*pi/16.0) yPtr(i) = 255.0+r*sin(f*pi/16.0) f=f+1.0 70 end do call aqtTakeColorFromColormapEntry(5) call aqtAddPolygon(xPtr, yPtr, 32); C FIXME Images rgbImage(1,1)=65280 rgbImage(2,1)=65280 rgbImage(1,2)=65280 rgbImage(2,2)=65280 call aqtTakeColorFromColormapEntry(1) call aqtAddLabel('FIXME: Images', 320., 220., 0.0, left) call aqtAddImageWithBitmap(rgbImage, 2, 2, 328., 200., 4., 4.) call aqtAddLabel('bits', 330., 180., 0.0, center) call aqtAddImageWithBitmap(rgbImage, 2,2, 360., 190., 40., 15.) call aqtAddLabel('fit bounds', 380., 180., 0.0, center) call aqtSetImageTransform(9.23880, 3.82683, -3.82683, 9.23880, $ 494.6, 186.9 ) call aqtAddTransformedImageWithBitmap(rgbImage, 2,2, $ 0., 0., 600., 400.) call aqtAddLabel('scale, rotate & translate', 500., 180., 0.0, $ center) call aqtResetImageTransform() C Text call aqtTakeColorFromColormapEntry(1) call aqtSetFontname('Times-Roman') call aqtSetFontsize(16.0) call aqtAddLabel('Times-Roman 16pt', 320.,150., 0.0, 0) call aqtTakeColorFromColormapEntry(2) call aqtSetFontname('Times-Italic') call aqtSetFontsize(16.0) call aqtAddLabel('Times-Italic 16pt', 320.,130.,0.0, 0) call aqtTakeColorFromColormapEntry(4) call aqtSetFontname('Zapfino') call aqtSetFontsize(12.0) call aqtAddLabel('Zapfino 12pt', 320., 104., 0.0, 0) call aqtTakeColorFromColormapEntry(2) call aqtSetLinewidth(0.5) call aqtMoveTo(510.5, 160.) call aqtAddLineTo(510.5, 100.) x = 540.5 y = 75.5 call aqtMoveTo(x+5., y) call aqtAddLineTo(x-5., y) call aqtMoveTo(x, y+5.) call aqtAddLineTo(x, y-5.) call aqtTakeColorFromColormapEntry(1) call aqtSetFontname('Verdana') call aqtSetFontsize(10.0) call aqtAddLabel('left aligned', 510.5, 150., 0.0, left+middle) call aqtAddLabel('centered', 510.5, 130., 0.0, center+middle) call aqtAddLabel('right aligned', 510.5, 110., 0.0, right+middle) call aqtSetFontname('Times-Roman') call aqtSetFontsize(14.0) call aqtAddLabel('-rotate', x, y, 90.0, 0) call aqtAddLabel('-rotate', x, y, 45.0, 0) call aqtAddLabel('-rotate', x, y, -30.0, 0) call aqtAddLabel('-rotate', x, y, -60.0, 0) call aqtAddLabel('-rotate', x, y, -90.0, 0) C String styling is _not_ possible from Fortran call aqtSetFontsize(12.0) call aqtAddLabel('No underline, sub- or superscript in fortran' $ ,320.,75.,0.0,0) call aqtTakeColorFromColormapEntry(2) call aqtSetLinewidth(0.5) call aqtMoveTo(320., 45.5) call aqtAddLineTo(520., 45.5) call aqtTakeColorFromColormapEntry(1) call aqtSetFontname('Times-Italic') call aqtSetFontsize(14.0) call aqtAddLabel('Top', 330., 45.5, 0.0, left+top) call aqtAddLabel('Bottom', 360., 45.5, 0.0, left+bottom) call aqtAddLabel('Middle', 410., 45.5, 0.0, left+middle) call aqtAddLabel('Baseline', 460., 45.5,0.0,left+baseline) C Draw it call aqtRenderPlot() C Let go of plot _when done_ call aqtClosePlot() end --- NEW FILE: demo_old.f --- C Testing all functions in f2aqt.h C INTEGER i CHARACTER*64 string REAL x, y, xpos, ypos, w, h, x_max, y_max, pi DIMENSION x(16) DIMENSION y(16) PARAMETER (pi = 3.14152692) C C C Initialize AquaTerm adapter CALL aqtInit() C C Open a new graph for drawing into CALL aqtOpenPlot(1) CALL aqtSetPlotSize(800.,600.) CALL aqtMoveTo(0.,0.) CALL aqtAddLineTo(800., 600.) C Set the title (Default is 'Figure n') C CALL aqtSetPlotTitle('Test of f2aqt') C C Set color entries in colortable C Black C CALL aqtSetColormapEntry(0, 0.0, 0.0, 0.0) C Red C CALL aqtSetColormapEntry(1, 1.0, 0.0, 0.0) C Green C CALL aqtSetColormapEntry(2, 0.0, 1.0, 0.0) C Blue C CALL aqtSetColormapEntry(3, 0.0, 0.0, 1.0) C Set text justification: 0 = left, 1 = center, 2 = right C CALL aqt_textjust(0) C DO 10 i = 0, 3 C Select the pen color (default is 0) C CALL aqtTakeColorFromColormapEntry(i) C Set the linewidth (default is 1.0) C CALL aqtSetLinewidth((i+1.0)*0.5) C Add a line using current attributes C NB. The .5 makes the line look better wrt anti-aliasing... C CALL aqtMoveTo(100.5, i*50.0+100.5) C CALL aqtAddLineTo(400.5, i*50.0+100.5) C Select font and size (default is Times-Roman 16pt) C CALL aqtSetFontname('Times-Italic') C CALL aqtSetFontsize(10.0+i*10.0) C Add the text with the current attributes C CALL aqtAddLabel('Hello World!', 400.0, i*50.0+100.0, 0.0, 0) C 10 END DO C Draw it CALL aqtRenderPlot() C Close current graph C CALL aqt_close() C C C C Open a new graph for drawing into C CALL aqt_open(2) C C C C Set color entries in colortable C C Black C CALL aqt_set_color(0, 0.0, 0.0, 0.0) C C Red C CALL aqt_set_color(1, 1.0, 0.0, 0.0) C C Green C CALL aqt_set_color(2, 0.0, 1.0, 0.0) C C Blue C CALL aqt_set_color(3, 0.0, 0.0, 1.0) C C C C Get the size of the canvas C CALL aqt_get_size(x_max, y_max) C C Set the title (Default is 'Figure n') C CALL aqt_title('More tests of f2aqt') C C Set the linewidth (default is 1.0) C CALL aqt_linewidth(1.0) C C Draw a circle C CALL aqt_use_color(1) C CALL aqt_circle(x_max/2.0, y_max/2.0, 200.0, 0) C C Create a nice polygon C DO 20 i = 0, 4 C x(i+1) = 200.0*cos(i*2.0*pi/5.0)+x_max/2 C y(i+1) = 200.0*sin(i*2.0*pi/5.0)+y_max/2 C 20 END DO C C Draw a filled polygon inside it C CALL aqt_use_color(2) C CALL aqt_polygon(x, y, 5, 1) C C Draw a filled circle inside the polygon C CALL aqt_use_color(3) C CALL aqt_circle(x_max/2, y_max/2, 100.0, 1) C C Create another polygon (a polyline really...) C DO 30 i = 0, 15, 1 C x(i+1) = 50.0*i+50.0 C y(i+1) = 100.0*sin(i*2.0*pi/15.0)+y_max/2.0 C 30 END DO C C Draw the polygon (no fill) C CALL aqt_use_color(1) C CALL aqt_polygon(x, y, 16, 0) C C Flush pending lines, otherwise they may obscure the images (comment out to see!) C CALL aqt_flush() C xpos = 100.0 C ypos = 200.0 C w = 300.0 C h = 400.0 C C Nil-terminate strings since they are padded with ' ' characters: C string = '/Library/User Pictures/Animals/Orangutan.tif\0' C CALL aqt_image(string, xpos, ypos, w, h) C C Constant strings don't _need_ nil-termination, but seem to have a max length of 32 C CALL aqt_image('~/Pictures/m31.jpg', 10.0, 10.0, 101.0, 102.0) C C Draw it C CALL aqt_render() C C Close current graph C CALL aqt_close() END --- NEW FILE: eventdemo1 --- þíúÎ J9J À eÀ ec éü@Ðü Øü ü ðü ý! ! 9! AºA¹AAAAAM~A° CÿAþAýAüAûAúAùBÜAÝAÞAßA DÝAÞAßA À à $ !$& = EÀ Fà G$ H V d s ¬ É& ä& --- NEW FILE: eventdemo1.f --- * eventdemo1.f * AquaTerm * * Created by Per Persson on Tue Dec 16 2003. * Copyright (c) 2003 __MyCompanyName__. All rights reserved. program demo integer i, running, eventNum character*64 buffer integer middle, center * Initialize middle = 0 ! verticalAlign: {middle, baseline, bottom, top} = {0,4,8,16} center = 1 ! horizontalAlign: {left, center, right} = {0,1,2} call aqtInit() call aqtOpenPlot(1) call aqtSetPlotSize(100.0, 200.0) call aqtSetFontsize(18.0) call aqtSetFontname('Verdana') call aqtSetPlotTitle('Menu') * The menu call aqtAddLabel('Menu', 50.0, 175.0, 0.0, middle+center) call aqtSetColor(0.8, 0.8, 0.8) call aqtAddFilledRect(10., 110., 80., 30.) call aqtSetColor(1.0, 0.0, 0.0) call aqtAddLabel('Red', 50.0, 125.0, 0.0, middle+center) call aqtSetColor(0.8, 0.8, 0.8) call aqtAddFilledRect(10., 60., 80., 30.) call aqtSetColor(0.0, 0.0, 1.0) call aqtAddLabel('Blue', 50.0, 75.0, 0.0, middle+center) call aqtSetColor(0.8, 0.8, 0.8) call aqtAddFilledRect(10., 10., 80., 30.) call aqtSetColor(1.0, 1.0, 1.0) call aqtAddLabel('Quit', 50.0, 25.0, 0.0, middle+center) * Draw the menu call aqtRenderPlot() * Set up 2nd window for output call aqtOpenPlot(2) call aqtSetPlotSize(400.0, 400.0) call aqtSetPlotTitle('Display') * Eventloop 100 running = 1 call aqtSelectPlot(1) call aqtWaitNextEvent(buffer) call decodeEvent(buffer, eventNum) goto(110, 120, 130, 140),eventNum+1 write(*,*) '*** Error ***' stop 110 write(*,*) 'No action, ignoring' goto 999 * Menu choice 1 120 call aqtSelectPlot(2) call aqtSetColor(1.0, 0.0, 0.0) call aqtAddFilledRect(100., 100., 200., 200.) call aqtRenderPlot() goto 999 * Menu choice 2 130 call aqtSelectPlot(2) call aqtSetColor(0.0, 0.0, 1.0) call aqtAddFilledRect(100., 100., 200., 200.) call aqtRenderPlot() goto 999 * Menu choice 3 140 write(*,*) 'Exit selected. Bye' running = 0 999 if (running .GT. 0) then go to 100 end if * Cleaning call aqtSelectPlot(1) call aqtClosePlot() call aqtSelectPlot(2) call aqtClosePlot() end subroutine decodeEvent(event, res) CHARACTER*(*) event INTEGER res * * integer n, x, y, sep1, sep2 * write(*,*) event sep1 = index(event, ':') read(event(1:sep1-1), *) n if (n .GT. 2) then * Error event or unknown event res = -1 else if (n .EQ. 0) then * Nil-event res = 0 else * Key or mouse-down event lumped together sep2 = index(event(sep1+1:), ':') * Parse coordinates read(event(sep1+2:sep2+sep1-2), *) x, y * Use y-pos to determine menu choice res = 3-(y/50) end if end --- NEW FILE: f2aquaterm.m --- // // f2aquaterm.m // AquaTerm // // Created by Per Persson on Sat Jul 12 2003. // Copyright (c) 2003 AquaTerm. All rights reserved. // #include <aquaterm/aquaterm.h> void _f2aqtConvertString(char *dst, int dstLen, const char *src, int srcLen) { int n = (srcLen > dstLen-1)?dstLen-1:srcLen; (void)strncpy(dst, src, n); dst[n] = '\0'; printf("Converted: %s, (%d)\n", dst, strlen(dst)); } /*" Class initialization etc."*/ int aqtInit_(void) // FIXME: retval? { return aqtInit(); } void aqtTerminate_(void) { aqtTerminate(); } /*" Control operations "*/ void aqtOpenPlot_(int *refNum) // FIXME: retval? { aqtOpenPlot(*refNum); } int aqtSelectPlot_(int *refNum) // FIXME: retval? { return aqtSelectPlot(*refNum); } void aqtSetPlotSize_(float *width, float *height) { aqtSetPlotSize(*width, *height); } void aqtSetPlotTitle_(const char *title, int strLen) // FIXME: Fortran calling conventions { char strBuf[32]; _f2aqtConvertString(strBuf, sizeof(strBuf), title, strLen); aqtSetPlotTitle(strBuf); } void aqtRenderPlot_(void) { aqtRenderPlot(); } void aqtClearPlot_(void) { aqtClearPlot(); } void aqtClosePlot_(void) { aqtClosePlot(); } /*" Event handling "*/ int aqtWaitNextEvent_(char *buffer) // FIXME: retval? { return aqtWaitNextEvent(buffer); } /*" Plotting related commands "*/ /*" Colormap (utility "*/ int aqtColormapSize_(void) { return aqtColormapSize(); } void aqtSetColormapEntry_(int *entryIndex, float *r, float *g, float *b) { aqtSetColormapEntry(*entryIndex, *r, *g, *b); } void aqtGetColormapEntry_(int *entryIndex, float *r, float *g, float *b) { aqtGetColormapEntry(*entryIndex, r, g, b); } void aqtTakeColorFromColormapEntry_(int *index) { aqtTakeColorFromColormapEntry(*index); } void aqtTakeBackgroundColorFromColormapEntry_(int *index) { aqtTakeBackgroundColorFromColormapEntry(*index); } /*" Color handling "*/ void aqtSetColor_(float *r, float *g, float *b) { aqtSetColor(*r, *g, *b); } void aqtSetBackgroundColor_(float *r, float *g, float *b) { aqtSetBackgroundColor(*r, *g, *b); } void aqtGetCurrentColor_(float *r, float *g, float *b) { aqtGetCurrentColor(r, g, b); } /*" Text handling "*/ void aqtSetFontname_(const char *newFontname, int strLen) { char strBuf[64]; _f2aqtConvertString(strBuf, sizeof(strBuf), newFontname, strLen); aqtSetFontname(strBuf); } void aqtSetFontsize_(float *newFontsize) { aqtSetFontsize(*newFontsize); } void aqtAddLabel_(const char *text, float *x, float *y, float *angle, int *align, int strLen) { char strBuf[64]; _f2aqtConvertString(strBuf, sizeof(strBuf), text, strLen); aqtAddLabel(strBuf, *x, *y, *angle, *align); } /*" Line handling "*/ void aqtSetLinewidth_(float *newLinewidth) { aqtSetLinewidth(*newLinewidth); } void aqtSetLineCapStyle_(int *capStyle) { aqtSetLineCapStyle(*capStyle); } void aqtMoveTo_(float *x, float *y) { aqtMoveTo(*x, *y); } void aqtAddLineTo_(float *x, float *y) { aqtAddLineTo(*x, *y); } void aqtAddPolyline_(float *x, float *y, int *pc) { aqtAddPolyline(x, y, *pc); } /*" Rect and polygon handling"*/ void aqtMoveToVertex_(float *x, float *y) { aqtMoveToVertex(*x, *y); } void aqtAddEdgeToVertex_(float *x, float *y) { aqtAddEdgeToVertex(*x, *y); } void aqtAddPolygon_(float *x, float *y, int *pc) { aqtAddPolygon(x, y, *pc); } void aqtAddFilledRect_(float *originX, float *originY, float *width, float *height) { aqtAddFilledRect(*originX, *originY, *width, *height); } void aqtEraseRect_(float *originX, float *originY, float *width, float *height) { aqtEraseRect(*originX, *originY, *width, *height); } /*" Image handling "*/ void aqtSetImageTransform_(float *m11, float *m12, float *m21, float *m22, float *tX, float *tY) { aqtSetImageTransform(*m11, *m12, *m21, *m22, *tX, *tY); } void aqtResetImageTransform_(void) { aqtResetImageTransform(); } void aqtAddImageWithBitmap_(const void *bitmap, int *pixWide, int *pixHigh, float *originX, float *originY, float *width, float *height) { aqtAddImageWithBitmap(bitmap, *pixWide, *pixHigh, *originX, *originY, *width, *height); } void aqtAddTransformedImageWithBitmap_(const void *bitmap, int *pixWide, int *pixHigh, float *originX, float *originY, float *width, float *height) { aqtAddTransformedImageWithBitmap(bitmap, *pixWide, *pixHigh, *originX, *originY, *width, *height); } --- NEW FILE: Makefile --- all: tiny demo eventdemo1 tiny: tiny.f f2aquaterm.o xlf -o tiny -U -qextname tiny.f f2aquaterm.o -L$(HOME)/lib -laquaterm -lobjc demo: demo.f f2aquaterm.o xlf -o demo -U -qextname demo.f f2aquaterm.o -L$(HOME)/lib -laquaterm -lobjc eventdemo1: eventdemo1.f f2aquaterm.o xlf -o eventdemo1 -U -qextname eventdemo1.f f2aquaterm.o -L$(HOME)/lib -laquaterm -lobjc f2aquaterm.o: f2aquaterm.m gcc -c f2aquaterm.m -I$(HOME)/include --- NEW FILE: tiny.f --- PROGRAM demo C Initialize. Do it or fail miserably... CALL aqtInit() C Open up a plot for drawing CALL aqtOpenPlot(1) CALL aqtSetPlotSize(620.0,420.0) CALL aqtSetPlotTitle('Testview') C Set color explicitly CALL aqtSetColor(0.0, 0.0, 0.0) C Frame plot CALL aqtMoveTo(20., 20.) CALL aqtAddLineTo(600.,400.) CALL aqtRenderPlot() CALL aqtAddLabel('Testview', 4.0, 412.0, 0.0, AQTAlignLeft) END Index: f2aqt.m =================================================================== RCS file: /cvsroot/aquaterm/adapters/fortran/f2aqt.m,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- f2aqt.m 17 Mar 2003 08:15:37 -0000 1.6 +++ f2aqt.m 29 Dec 2003 15:05:35 -0000 1.7 @@ -1,421 +1,155 @@ -#import <Foundation/Foundation.h> -#import <AppKit/AppKit.h> -#import "AQTProtocol.h" #include "f2aqt.h" -// -// -static NSAutoreleasePool *arpool; // Objective-C autorelease pool -static id adapter; // Adapter object -// -// ---------------------------------------------------------------- -// --- Objective-C Adapter for AquaTerm -// ---------------------------------------------------------------- -// -// First we need some Cocoa magic incantations, documented at: -// http://developer.apple.com/techpubs/macosx/Cocoa/TasksAndConcepts/ProgrammingTopics/DistrObjects/ -// Look under "Making Substitutions During Message Encoding" -// -// The class NSBezierPath doesn't implement replacementObjectForPortCoder so -// we add that behaviour as a category for NSBezierPath -// -@interface NSBezierPath (NSBezierPathDOCategory) --(id)replacementObjectForPortCoder:(NSPortCoder *)portCoder; -@end - -@implementation NSBezierPath (NSBezierPathDOCategory) --(id)replacementObjectForPortCoder:(NSPortCoder *)portCoder -{ - if ([portCoder isBycopy]) - return self; - return [super replacementObjectForPortCoder:portCoder]; -} -@end +#include <math.h> +#include "aquaterm/aquaterm.h" // // ---------------------------------------------------------------- -// --- AQTAdapter - A class to mediate between C-function calls -// --- and AquaTerm Objective-C remote messages +// --- FORTRAN adapter for AquaTerm // ---------------------------------------------------------------- // -@interface AQTAdapter : NSObject -{ - NSBezierPath *filledPathBuffer; - NSBezierPath *pathBuffer; - NSMutableDictionary *termInfo; - float linewidth; - int orient; - int just; - int colorIndex; - @private - id aqtConnection; -} --(id)aqtConnection; --(NSMutableDictionary *)termInfo; --(BOOL)connectToAquaTerm; --(void)updateInfoFromServer; -// -// Obj-C methods implementing the functionality defined in C_API.h -// --(void)openGraph:(int)n; --(void)closeGraph; --(void)render; --(void)setTitle:(NSString *)title; --(void)setColor:(NSColor *)color forIndex:(int)index; --(void)useColor:(int)index; --(void)useLinewidth:(float)width; --(void)appendPath:(NSBezierPath *)path; --(void)appendFilledPath:(NSBezierPath *)path; --(void)setFontWithName:(NSString *)name size:(float)size; --(void)useOrientation:(int)orient; --(void)useJustification:(int)just; --(void)lineFromPoint:(NSPoint)startpoint toPoint:(NSPoint)endpoint; --(void)putText:(NSString *)str at:(NSPoint)point; --(void)addImageFromFile:(NSString *)filename bounds:(NSRect)bounds; -// --(void)flushBuffers; - -@end - -@implementation AQTAdapter --(id)init -{ - if (self = [super init]) - { - filledPathBuffer = [[NSBezierPath alloc] init]; - pathBuffer = [[NSBezierPath alloc] init]; - termInfo = [[NSMutableDictionary alloc] initWithCapacity:0]; - // - // Try to get a local proxy of the object in AquaTerm that manages communication - // - if ([self connectToAquaTerm]) - { - // - // This speeds up communication with the remote object, see - // http://developer.apple.com/techpubs/macosx/Cocoa/TasksAndConcepts/ProgrammingTopics/DistrObjects/ - // Look under "Connections and Proxies" - // - [aqtConnection setProtocolForProxy:@protocol(AQTProtocol)]; - } - } - return self; -} - --(void)dealloc -{ - [aqtConnection release]; - [filledPathBuffer release]; - [pathBuffer release]; - [termInfo release]; - [super dealloc]; -} - --(id)aqtConnection -{ - return aqtConnection; -} - --(NSMutableDictionary *)termInfo -{ - return termInfo; -} - --(BOOL)connectToAquaTerm -{ - BOOL didConnect = NO; - // - // Establish a connection to AquaTerm. - // First check if AquaTerm is already running, otherwise - // try to launch AquaTerm from standard locations. - // - aqtConnection = [NSConnection rootProxyForConnectionWithRegisteredName:@"aquatermServer" host:nil]; - if (aqtConnection) /* Server is running and ready to go */ - { - [aqtConnection retain]; - didConnect = YES; - } - else /* Server isn't running, we must fire it up */ - { - // - // Try to launch AquaTerm - // - if ([[NSWorkspace sharedWorkspace] launchApplication:@"AquaTerm"] == NO) - { - printf("Failed to launch AquaTerm.\n"); - printf("You must either put AquaTerm.app in \n"); - printf("the /Applications or ~/Applications folder\n"); - } - else - { - do { /* Wait for it to register with OS */ - aqtConnection =[NSConnection rootProxyForConnectionWithRegisteredName:@"aquatermServer" host:nil]; - } while (!aqtConnection); /* This could result in a hang if something goes wrong with registering! */ - [aqtConnection retain]; - didConnect = YES; - } - } - return didConnect; -} --(void) updateInfoFromServer -{ - [termInfo setDictionary:[aqtConnection getAquaTermInfo]]; -} - -// -// Adapter methods, this is where the translation takes place! -// -// The methods known to AquaTerm are defined in AQTProtocol.h -// --(void)openGraph:(int)n -{ - // Set default values - linewidth = 1; - orient = 0; - just = 1; - colorIndex = 0; - [aqtConnection openModel:n]; -} - --(void)closeGraph -{ - [self flushBuffers]; - [aqtConnection closeModel]; -} - --(void)render -{ - [self flushBuffers]; - [aqtConnection render]; -} - --(void)setTitle:(NSString *)title -{ - [aqtConnection setTitle:title]; -} - --(void)setColor:(NSColor *)color forIndex:(int)index -{ - [aqtConnection setColor:color forIndex:index]; -} --(void)useColor:(int)index -{ - // flush buffers before changing color... - if(index != colorIndex) - { - [self flushBuffers]; - colorIndex = index; - } - -} - --(void)useLinewidth:(float)width -{ - // flush buffers before changing linewidth... - if(width != linewidth) - { - [self flushBuffers]; - linewidth = width; - } -} - --(void)appendPath:(NSBezierPath *)path -{ - [pathBuffer appendBezierPath:path]; -} - --(void)appendFilledPath:(NSBezierPath *)path -{ - [filledPathBuffer appendBezierPath:path]; -} - --(void)setFontWithName:(NSString *)name size:(float)size -{ - [aqtConnection setFontWithName:name size:size]; -} - --(void)useOrientation:(int)newOrient -{ - orient = newOrient; -} - --(void)useJustification:(int)newJust -{ - just = newJust; -} --(void)lineFromPoint:(NSPoint)startpoint toPoint:(NSPoint)endpoint -{ - [pathBuffer moveToPoint:startpoint]; - [pathBuffer lineToPoint:endpoint]; -} - --(void)putText:(NSString *)str at:(NSPoint)point -{ - // - // Put a line of beautifully rendered Times Roman (AquaTerm default) - // at the point (x,y), left justified and horisontally (angle 0.0). - // Also, the client doesnt know the concept of color so we set the - // linecolor to a fix value. Hence: - // - [aqtConnection addString:str - atPoint:point - withJustification:just - atAngle:90.0*orient - withIndexedColor:colorIndex]; -} - --(void)addImageFromFile:(NSString *)filename bounds:(NSRect)bounds -{ - [aqtConnection addImageFromFile:filename bounds:bounds]; -} +#define MIN(A,B) (((A) < (B)) ? (A) : (B)) --(void)flushBuffers -{ - if (![pathBuffer isEmpty]) - { - [pathBuffer setLineWidth:linewidth]; - [aqtConnection addPolyline:pathBuffer withIndexedColor:colorIndex]; - [pathBuffer removeAllPoints]; - } - if (![filledPathBuffer isEmpty]) - { - [filledPathBuffer setLineWidth:linewidth]; - [aqtConnection addPolygon:filledPathBuffer withIndexedColor:colorIndex]; - [filledPathBuffer removeAllPoints]; - } -} +#define AQT_X_MAX 800 +#define AQT_Y_MAX 600 -@end /* AQTAdapter */ -// -// ---------------------------------------------------------------- -// --- FORTRAN example -// ---------------------------------------------------------------- -// -void aqt_init__(void) +void aqt_init_(void) { - // The autorelease pool and the adapter object must be initialized, - // this is the place to do it. But only once! - // - if (arpool == NULL) /* Make sure we don't leak mem by allocating every time */ - { - arpool = [[NSAutoreleasePool alloc] init]; - adapter = [[AQTAdapter alloc] init]; - } + aqtInit(); } -void aqt_open__(int *n) +void aqt_open_(int *n) { - [adapter openGraph:*n]; + aqtOpenPlot(*n); + aqtSetPlotSize(AQT_X_MAX, AQT_Y_MAX); + aqtSetPlotTitle("Untitled"); } -void aqt_close__(void) +void aqt_close_(void) { - [adapter closeGraph]; + aqtClosePlot(); } -void aqt_flush__(void) +void aqt_flush_(void) { - [adapter flushBuffers]; + // Not needed; } -void aqt_render__(void) +void aqt_render_(void) { - [adapter render]; + aqtRenderPlot(); } -void aqt_title__(char *title, unsigned len) +void aqt_title_(char *title, unsigned len) { - [adapter setTitle:[NSString stringWithCString:title length:MIN(strlen(title), len)]]; + char strBuf[64]; + strncpy(strBuf, title, MIN(MIN(strlen(title), len), 64)); + strBuf[63] = '\0'; + aqtSetPlotTitle(strBuf); } -void aqt_use_color__(int *col) +void aqt_use_color_(int *col) { - [adapter useColor:*col]; + aqtTakeColorFromColormapEntry(*col); } -void aqt_set_color__(int *col, float *r, float *g, float *b) +void aqt_set_color_(int *col, float *r, float *g, float *b) { - [adapter setColor:[NSColor colorWithCalibratedRed:*r green:*g blue:*b alpha:1] forIndex:*col]; + aqtSetColormapEntry(*col, *r, *g, *b); } -void aqt_linewidth__(float *width) +void aqt_linewidth_(float *width) { - [adapter useLinewidth:*width]; + aqtSetLinewidth(*width); } -void aqt_line__(float *x1, float *y1, float *x2, float *y2) +void aqt_line_(float *x1, float *y1, float *x2, float *y2) { - NSBezierPath *path = [NSBezierPath bezierPath]; - [path moveToPoint:NSMakePoint(*x1, *y1)]; - [path lineToPoint:NSMakePoint(*x2, *y2)]; - [adapter appendPath:path]; + aqtMoveTo(*x1, *y1); + aqtAddLineTo(*x2, *y2); } -void aqt_polygon__(float *x, float *y, int *n, int *isFilled) +void aqt_polygon_(float *x, float *y, int *n, int *isFilled) { int i; - NSBezierPath *path = [NSBezierPath bezierPath]; - [path moveToPoint:NSMakePoint(x[0], y[0])]; - for (i = 1; i < *n; i++) - { - [path lineToPoint:NSMakePoint(x[i], y[i])]; - } if (*isFilled) { - [path closePath]; - [adapter appendFilledPath:path]; + aqtMoveToVertex(x[0], y[0]); + for (i = 1; i < *n; i++) + { + aqtAddEdgeToVertex(x[i], y[i]); + } } else { - [adapter appendPath:path]; + aqtMoveTo(x[0], y[0]); + for (i = 1; i < *n; i++) + { + aqtAddLineTo(x[i], y[i]); + } } } -void aqt_circle__(float *x, float *y, float *radius, int *isFilled) +#define F2AQT_CIRCLE_POINTS 32 + +void aqt_circle_(float *x, float *y, float *radius, int *isFilled) { - NSBezierPath *path = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(*x-(*radius), *y-(*radius), (*radius)*2, (*radius)*2)]; - if (*isFilled) - { - [path closePath]; - [adapter appendFilledPath:path]; - } - else - { - [adapter appendPath:path]; - } + float xPtr[F2AQT_CIRCLE_POINTS], yPtr[F2AQT_CIRCLE_POINTS]; + double angle = 0.0; + double pi = 4.0*atan(1.0); + int n = F2AQT_CIRCLE_POINTS; + int i; + + for (i=0 ; i<n; i++) + { + xPtr[i] = (float)(*x + *radius * cos(angle)); + yPtr[i] = (float)(*y + *radius * sin(angle)); + angle += 2.0*pi/(double)n; + } + aqt_polygon_(xPtr, yPtr, &n, isFilled); } -void aqt_font__(char *fontname, float *size, unsigned len) +void aqt_font_(char *fontname, float *size, unsigned len) { - [adapter setFontWithName:[NSString stringWithCString:fontname length:MIN(strlen(fontname), len)] size:*size]; + char strBuf[64]; + strncpy(strBuf, fontname, MIN(MIN(strlen(fontname), len), 64)); + strBuf[63] = '\0'; + aqtSetFontname(strBuf); + aqtSetFontsize(*size); } -void aqt_textorient__(int *orient) +static float _textAngle = 0.0; +void aqt_textorient_(int *orient) { - [adapter useOrientation:*orient]; + if (*orient) + _textAngle = 90.0; + else + _textAngle = 0.0; } -void aqt_textjust__(int *just) +static int _textAlign = 0; +void aqt_textjust_(int *just) { - [adapter useJustification:*just]; + _textAlign = *just; } -void aqt_text__(float *x, float *y, char *str, unsigned len) +void aqt_text_(float *x, float *y, char *str, unsigned len) { - [adapter putText:[NSString stringWithCString:str length:MIN(strlen(str), len)] at:NSMakePoint(*x, *y)]; + char strBuf[64]; + strncpy(strBuf, str, MIN(MIN(strlen(str), len), 64)); + strBuf[63] = '\0'; + aqtAddLabel(strBuf, *x, *y, _textAngle, _textAlign); } -void aqt_image__(char *filename, float *x, float *y, float *w, float *h, unsigned len) +void aqt_image_(char *filename, float *x, float *y, float *w, float *h, unsigned len) { - NSString *path = [NSString stringWithCString:filename length:MIN(strlen(filename), len)]; - // NSLog(@"%@\n%f\n%f\n%f\n%f\n", path, *x, *y, *w, *h); - [adapter addImageFromFile:[path stringByStandardizingPath] bounds:NSMakeRect(*x, *y, *w, *h)]; + // Not implemented } -void aqt_get_size__(float *x_max, float *y_max) +void aqt_get_size_(float *x_max, float *y_max) { - [adapter updateInfoFromServer]; // Force an update of the termInfo dictionary - *x_max = [[[adapter termInfo] objectForKey:@"AQTXMax"] floatValue]; - *y_max = [[[adapter termInfo] objectForKey:@"AQTYMax"] floatValue]; + *x_max = AQT_X_MAX; + *y_max = AQT_Y_MAX; } // // ---------------------------------------------------------------- Index: test.f =================================================================== RCS file: /cvsroot/aquaterm/adapters/fortran/test.f,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- test.f 16 May 2002 17:55:32 -0000 1.3 +++ test.f 29 Dec 2003 15:05:35 -0000 1.4 @@ -11,6 +11,11 @@ C Initialize AquaTerm adapter CALL aqt_init() C +C Open a new graph for drawing into + CALL aqt_open(1) +C Set the title (Default is 'Figure n') + CALL aqt_title('Test of f2aqt') +C C Set color entries in colortable C Black CALL aqt_set_color(0, 0.0, 0.0, 0.0) @@ -20,11 +25,7 @@ CALL aqt_set_color(2, 0.0, 1.0, 0.0) C Blue CALL aqt_set_color(3, 0.0, 0.0, 1.0) -C -C Open a new graph for drawing into - CALL aqt_open(1) -C Set the title (Default is 'Figure n') - CALL aqt_title('Test of f2aqt') + C Set text justification: 0 = left, 1 = center, 2 = right CALL aqt_textjust(0) DO 10 i = 0, 3 @@ -40,11 +41,24 @@ C Add the text with the current attributes CALL aqt_text(400.0, i*50.0+100.0, 'Hello World!') 10 END DO -C Close current graph => render it in window +C Draw it + CALL aqt_render() +C Close current graph CALL aqt_close() C C Open a new graph for drawing into CALL aqt_open(2) +C +C Set color entries in colortable +C Black + CALL aqt_set_color(0, 0.0, 0.0, 0.0) +C Red + CALL aqt_set_color(1, 1.0, 0.0, 0.0) +C Green + CALL aqt_set_color(2, 0.0, 1.0, 0.0) +C Blue + CALL aqt_set_color(3, 0.0, 0.0, 1.0) +C C Get the size of the canvas CALL aqt_get_size(x_max, y_max) C Set the title (Default is 'Figure n') @@ -85,7 +99,9 @@ CALL aqt_image(string, xpos, ypos, w, h) C Constant strings don't _need_ nil-termination, but seem to have a max length of 32 CALL aqt_image('~/Pictures/m31.jpg', 10.0, 10.0, 101.0, 102.0) -C Close current graph => render it in window +C Draw it + CALL aqt_render() +C Close current graph CALL aqt_close() END |