draw6.c
0000/**************************************
0001 draw6.c IPC MakeView-chain
0002**************************************/
0003#include <stdio.h>
0004#include <stdlib.h>
0005#include <math.h>
0006#include <sys/types.h>
0007#include <sys/ipc.h>
0008#include <sys/shm.h>
0009#include <sys/sem.h>
0010#include "draw6.h"
0011#include <string.h>
0012
0013extern int semid; /* semaphore identifier */
0014extern struct sembuf sb;
0015extern void *shmx;
0016extern char *outbuf;
0017
0018int sendMsg()
0019{
0020 sb.sem_num=5; /* call from a function program */
0021 sb.sem_op=1;
0022 semop(semid,&sb,1);
0023 sb.sem_num=7; /* wake up f024 */
0024 sb.sem_op=1;
0025 semop(semid,&sb,1);
0026 sb.sem_num=6; /* wait */
0027 sb.sem_op=-1;
0028 sb.sem_flg=0;
0029 semop(semid,&sb,1);
0030 sb.sem_num=1; /* test if error */
0031 sb.sem_op=0;
0032 sb.sem_flg=IPC_NOWAIT;
0033 if(semop(semid,&sb,1)!=0){
0034 sb.sem_num=1;
0035 sb.sem_op=-1;
0036 sb.sem_flg=0;
0037 semop(semid,&sb,1); /* wait */
0038 return 1;
0039 }
0040 return 0;
0041}
0042
0043int MakeView(int width, int height)
0044{
0045 *((int*)shmx+1)=width;
0046 *((int*)shmx+2)=height;
0047 *(int*)shmx=0;
0048 return sendMsg();
0049}
0050
0051int SetColor(int r,int g,int b)
0052{
0053 *((int*)shmx+1)=r;
0054 *((int*)shmx+2)=g;
0055 *((int*)shmx+3)=b;
0056 *(int*)shmx=1;
0057 return sendMsg();
0058}
0059
0060int MoveTo(int x,int y)
0061{
0062 *((int*)shmx+1)=x;
0063 *((int*)shmx+2)=y;
0064 *(int*)shmx=2;
0065 return sendMsg();
0066}
0067
0068int LineTo(int x,int y)
0069{
0070 *((int*)shmx+1)=x;
0071 *((int*)shmx+2)=y;
0072 *(int*)shmx=3;
0073 return sendMsg();
0074}
0075
0076int GifOutMin()
0077{
0078 *(int*)shmx=4;
0079 return sendMsg();
0080}
0081
0082int GifOut()
0083{
0084 *(int*)shmx=5;
0085 return sendMsg();
0086}
0087
0088int OpenPoly()
0089{
0090 *(int*)shmx=6;
0091 return sendMsg();
0092}
0093
0094int ClosePoly()
0095{
0096 *(int*)shmx=7;
0097 return sendMsg();
0098}
0099
0100int FontInfo(int font,int direc,int mode)
0101{
0102 *((int*)shmx+1)=font;
0103 *((int*)shmx+2)=direc;
0104 *((int*)shmx+3)=mode;
0105 *(int*)shmx=8;
0106 return sendMsg();
0107}
0108
0109int DrawString(char *c)
0110{
0111 strcpy((char*)((int*)shmx+1),c);
0112 *(int*)shmx=9;
0113 return sendMsg();
0114}
0115
0116int MakeGraph(int left,int top,int right,int bottom)
0117{
0118 *((int*)shmx+1)=left;
0119 *((int*)shmx+2)=top;
0120 *((int*)shmx+3)=right;
0121 *((int*)shmx+4)=bottom;
0122 *(int*)shmx=10;
0123 return sendMsg();
0124}
0125
0126int HorizTime()
0127{
0128 *(int*)shmx=11;
0129 return sendMsg();
0130}
0131
0132int HorizScale(char *c,double left,double right)
0133{
0134 char *pc;
0135 double *pd;
0136 pc=(char*)((int*)shmx+1);
0137 strcpy(pc,c);
0138 pd=(double *)(pc+strlen(c)+1);
0139 *pd=left;
0140 *(pd+1)=right;
0141 *(int*)shmx=12;
0142 return sendMsg();
0143}
0144
0145int VertScale(char *c,double bottom,double top)
0146{
0147 char *pc;
0148 double *pd;
0149 pc=(char*)((int*)shmx+1);
0150 strcpy(pc,c);
0151 pd=(double *)(pc+strlen(c)+1);
0152 *pd=bottom;
0153 *(pd+1)=top;
0154 *(int*)shmx=13;
0155 return sendMsg();
0156}
0157
0158int MoveToG(double x,double y)
0159{
0160 double *pd;
0161 pd=(double *)((int *)shmx+1);
0162 *pd=x;
0163 *(pd+1)=y;
0164 *(int*)shmx=14;
0165 return sendMsg();
0166}
0167
0168int LineToG(double x,double y)
0169{
0170 double *pd;
0171 pd=(double *)((int *)shmx+1);
0172 *pd=x;
0173 *(pd+1)=y;
0174 *(int*)shmx=15;
0175 return sendMsg();
0176}
0177
0178int PlotG(int mark,double x,double y)
0179{
0180 int *pi;
0181 double *pd;
0182 pi=(int *)((int *)shmx+1);
0183 *pi=mark;
0184 pd=(double *)(pi+1);
0185 *pd=x;
0186 *(pd+1)=y;
0187 *(int*)shmx=16;
0188 return sendMsg();
0189}
0190
0191int DrawNum(int num)
0192{
0193 *((int*)shmx+1)=num;
0194 *(int*)shmx=17;
0195 return sendMsg();
0196}
0197
0198int DrawFNum(char *fmt,double x)
0199{
0200 char *pc;
0201 double *pd;
0202 pc=(char*)((int*)shmx+1);
0203 strcpy(pc,fmt);
0204 pd=(double *)(pc+strlen(fmt)+1);
0205 *pd=x;
0206 *(int*)shmx=18;
0207 return sendMsg();
0208}
0209
0210int PngOut()
0211{
0212 *(int*)shmx=19;
0213 return sendMsg();
0214}
0215
0216int HorizLog()
0217{
0218 *(int*)shmx=20;
0219 return sendMsg();
0220}
0221
0222int VertLog()
0223{
0224 *(int*)shmx=21;
0225 return sendMsg();
0226}
0227
0228int MakePixmap(int type,int wid,int hei)
0229{
0230 *((int*)shmx+2)=type;
0231 *((int*)shmx+3)=wid;
0232 *((int*)shmx+4)=hei;
0233 *(int*)shmx=22;
0234 sendMsg();
0235 return *((int*)shmx+1); /* reference number */
0236}
0237
0238int DestroyPixmap(int ref)
0239{
0240 *((int*)shmx+1)=ref;
0241 *(int*)shmx=23;
0242 sendMsg();
0243 return 0;
0244}
0245
0246int XferPixmap(int ref,PixMap *p)
0247{
0248 int i,j,k,l,m;
0249 char *pc;
0250 *((int*)shmx+1)=ref;
0251 *(int*)shmx=24;
0252// sendMsg();
0253 sb.sem_num=5; /* call from a function program */
0254 sb.sem_op=1;
0255 semop(semid,&sb,1);
0256 sb.sem_num=7; /* wake up f024 */
0257 sb.sem_op=1;
0258 semop(semid,&sb,1);
0259 sb.sem_num=6; /* wait */
0260 sb.sem_op=-1;
0261 sb.sem_flg=0;
0262 semop(semid,&sb,1);
0263
0264 m=(char *)shmx-outbuf;
0265 m-=10;
0266 l=p->size;
0267 j=0;
0268 pc=(char *)p;
0269 while(l>0){
0270 if(l>m) k=m;
0271 else k=l;
0272 *((int *)outbuf-1)=k;
0273 for(i=0;i<k;i++) outbuf[i]=pc[j++];
0274 l-=k;
0275 sb.sem_num=7; /* wake up f024 */
0276 sb.sem_op=1;
0277 semop(semid,&sb,1);
0278 sb.sem_num=6; /* wait */
0279 sb.sem_op=-1;
0280 sb.sem_flg=0;
0281 semop(semid,&sb,1);
0282 }
0283 return 0;
0284}
0285
0286/****************************************************
0287 Paste a pixmap to the view
0288
0289 ref pixmap id
0290 (xdst,ydst) upperleft corner of pixmap in the view
0291 mode 0 : paste all pixels
0292 1 : paste except white pixels
0293****************************************************/
0294int PastePixmap(int ref,int xdst,int ydst,int mode)
0295{
0296 *((int*)shmx+1)=ref;
0297 *((int*)shmx+2)=xdst;
0298 *((int*)shmx+3)=ydst;
0299 *((int*)shmx+4)=mode;
0300 *(int*)shmx=25;
0301 return sendMsg();
0302}
0303
0304
0305int JpgOut(int ref)
0306{
0307 *((int*)shmx+1)=ref;
0308 *(int*)shmx=26;
0309 return sendMsg();
0310}
0311
0312void drawGrid()
0313{
0314 *(int*)shmx=27;
0315 sendMsg();
0316}
0317
0318void GifPatent()
0319{
0320 *(int*)shmx=28;
0321 sendMsg();
0322}
0323
0324void ChangeSize(int deno)
0325{
0326 *((int*)shmx+1)=deno;
0327 *(int*)shmx=29;
0328 sendMsg();
0329}
0330
0331int MakeView1(int type,int width, int height)
0332{
0333 *((int*)shmx+1)=type;
0334 *((int*)shmx+2)=width;
0335 *((int*)shmx+3)=height;
0336 *(int*)shmx=30;
0337 sendMsg();
0338 return 0;
0339}
0340
0341int SetColor1(int r,int g,int b)
0342{
0343 *((int*)shmx+1)=r;
0344 *((int*)shmx+2)=g;
0345 *((int*)shmx+3)=b;
0346 *(int*)shmx=31;
0347 sendMsg();
0348 return 0;
0349}
0350
0351void GifSave(int num)
0352{
0353 *((int*)shmx+1)=num;
0354 *(int*)shmx=32;
0355 sendMsg();
0356}
0357
0358void GifSaveMin(int num)
0359{
0360 *((int*)shmx+1)=num;
0361 *(int*)shmx=33;
0362 sendMsg();
0363}
0364
0365int SetColorId(int id)
0366{
0367 *((int*)shmx+1)=id;
0368 *(int*)shmx=34;
0369 sendMsg();
0370 return 0;
0371}
0372
0373int PalettePeek(int id,int *r,int *g,int *b)
0374{
0375 *((int*)shmx+1)=id;
0376 *(int*)shmx=35;
0377 sendMsg();
0378 *r=*((int*)shmx+2);
0379 *g=*((int*)shmx+3);
0380 *b=*((int*)shmx+4);
0381 return 0;
0382}
0383
0384int PalettePoke(int id,int r,int g,int b)
0385{
0386 *((int*)shmx+1)=id;
0387 *((int*)shmx+2)=r;
0388 *((int*)shmx+3)=g;
0389 *((int*)shmx+4)=b;
0390 *(int*)shmx=36;
0391 sendMsg();
0392 return 0;
0393}
0394
0395int GifOutFile(char *s)
0396{
0397 strcpy((char*)((int*)shmx+1),s);
0398 *(int*)shmx=37;
0399 return sendMsg();
0400}
0401
0402int GifPaste(char *s,int left,int top)
0403{
0404 char *pc;
0405 int *pi;
0406 pc=(char*)((int*)shmx+1);
0407 strcpy(pc,s);
0408 pi=(int *)(pc+strlen(s)+1);
0409 *pi=left;
0410 *(pi+1)=top;
0411 *(int*)shmx=38;
0412 return sendMsg();
0413}
0414
0415int CopyPixmap(int ref,int xsrc,int ysrc)
0416{
0417 *((int*)shmx+1)=ref;
0418 *((int*)shmx+2)=xsrc;
0419 *((int*)shmx+3)=ysrc;
0420 *(int*)shmx=39;
0421 return sendMsg();
0422}
0423
0424int gifsize(int size)
0425{
0426 *((int*)shmx+1)=size;
0427 *(int*)shmx=40;
0428 sendMsg();
0429 return 0;
0430}
0431
0432int SeedFill(int on)
0433{
0434 *((int*)shmx+1)=on;
0435 *(int*)shmx=41;
0436 sendMsg();
0437 return 0;
0438}
0439
0440int GifOutMode(int mode)
0441{
0442 *((int*)shmx+1)=mode;
0443 *(int*)shmx=42;
0444 sendMsg();
0445 return 0;
0446}
0447