psFile(API)
Objects/DataExpress/psFile is API for PostScript file.
Contents
constant
Define of ps file
#define MAX_STRING_LENGTH 256 #define PS_FILE_STATUS_ERROR (0) #define PS_FILE_STATUS_OK (1)
#define PROLOG_STRING_NUM (11)
#define PROLOG_VERSION (0) #define PROLOG_TITLE (1) #define PROLOG_CREATOR (2) #define PROLOG_CREATION_DATE (3) #define PROLOG_FOR (4) #define PROLOG_BOUND_BOX (5) #define PROLOG_PAGES (6) #define PROLOG_DOC_FONTS (7) #define PROLOG_END_DOC (8) #define PROLOG_END_PRO (9)
Draw Center marker
Size
#define PS_IMAGE_CENTRE_LINE_WIDTH (0.1) #define PS_IMAGE_CENTRE_MARK_LENGTH (0.01)
Draw Scale
Position
typedef enum psImageScaleMode { psImageScaleModeBottomLeft = 1, psImageScaleModeCenter = 2 } psImageScaleMode;
Size
#define PS_IMAGE_SCALE_LINE_WIDTH0 (0.2) #define PS_IMAGE_SCALE_LINE_WIDTH1 (0.1) #define PS_IMAGE_SCALE_LINE_LENGTH0 (10.0) #define PS_IMAGE_SCALE_LINE_LENGTH1 (5.0) #define PS_IMAGE_SCALE_LINE_LENGTH2 (3.0) #define PS_IMAGE_SCALE_LINE_LENGTH3 (2.0) #define PS_IMAGE_SCALE_LINE_LENGTH4 (1.0) #define PS_IMAGE_SCALE_LINE_LENGTH00 (-10.0) #define PS_IMAGE_SCALE_LINE_LENGTH10 (-5.0) #define PS_IMAGE_SCALE_LINE_LENGTH20 (-3.0) #define PS_IMAGE_SCALE_LINE_LENGTH30 (-2.0) #define PS_IMAGE_SCALE_LINE_LENGTH40 (-1.0)
Draw Contour Mode
#define psContourMode_DifferentLineWidthContour (0x01) #define psContourMode_SameLineWidthContour (0x02)
Draw Circle
Type
#define PS_LINE_CIRCLE_MODE (0) #define PS_FILL_WHITE_CIRCLE_MODE (1) #define PS_FILL_BLACK_CIRCLE_MODE (2)
Plot
#define PS_PLOT_MODE_AXIS (0x000000ff) #define PS_PLOT_MODE_AXIS_X_AXIS_POS (0x00000001) /* 0: Down 1: Up */ #define PS_PLOT_MODE_AXIS_Y_AXIS_POS (0x00000002) /* 0: Left 1: Write */ #define PS_PLOT_MODE_AXIS (0x000000ff)
#define PS_PLOT_SCALE_X_AXIS_Y_POSITION_DOWN ( -5.0) #define PS_PLOT_SCALE_X_AXIS_Y_POSITION_UP (105.0) #define PS_PLOT_SCALE_X_AXIS_LENGTH (1.0)
struct
Management data
Manage ps file data by using list.
typedef struct psFile { FILE* fpt; psInfo info; long headEnd; psPageInfo* current; psPageInfo* top; psPageInfo* end; long byte; } psFile;
typedef long psParaTypeInteger; typedef double psParaTypeReal;
struct of Drawing Setting
typedef struct psImageInfo { /* For Image Space */ psParaTypeReal scaleX; psParaTypeReal scaleY; psParaTypeReal translateX; psParaTypeReal translateY; psParaTypeReal angle; /* Image Size */ psParaTypeInteger width; psParaTypeInteger height; psParaTypeInteger section; /* For Contour */ psParaTypeInteger bps; psParaTypeInteger nContour; psParaTypeReal* contourLevel; /* For Density Image */ unsigned char* image; /* For Contour */ float* floatImage; psParaTypeReal contourLineColorChange; psParaTypeReal contourLineWidthStart; psParaTypeReal contourLineWidthStep; /* For 3D Contour */ psParaTypeReal eyeX; /* Eye Position */ psParaTypeReal eyeY; psParaTypeReal eyeZ; psParaTypeReal pointX; /* Projection Surface Position */ psParaTypeReal pointY; /* Surface Normal: (position - eye) */ psParaTypeReal pointZ; /* For Colour */ psParaTypeInteger flagRGBColor; psParaTypeInteger flagRGBGradientColor; psParaTypeReal Red; psParaTypeReal Green; psParaTypeReal Blue; psParaTypeReal RedFirst; psParaTypeReal GreenFirst; psParaTypeReal BlueFirst; psParaTypeReal RedLast; psParaTypeReal GreenLast; psParaTypeReal BlueLast; psParaTypeInteger flagHSBColor; psParaTypeInteger flagHSBGradientColor; psParaTypeReal Hue; psParaTypeReal Saturation; psParaTypeReal Brightness; psParaTypeReal HueFirst; psParaTypeReal SaturationFirst; psParaTypeReal BrightnessFirst; psParaTypeReal HueLast; psParaTypeReal SaturationLast; psParaTypeReal BrightnessLast; /* For Line Colour */ psParaTypeInteger flagLineRGBColor; psParaTypeInteger flagLineRGBGradientColor; psParaTypeReal LineRed; psParaTypeReal LineGreen; psParaTypeReal LineBlue; psParaTypeReal LineRedFirst; psParaTypeReal LineGreenFirst; psParaTypeReal LineBlueFirst; psParaTypeReal LineRedLast; psParaTypeReal LineGreenLast; psParaTypeReal LineBlueLast; psParaTypeInteger flagLineHSBColor; psParaTypeInteger flagLineHSBGradientColor; psParaTypeReal LineHue; psParaTypeReal LineSaturation; psParaTypeReal LineBrightness; psParaTypeReal LineHueFirst; psParaTypeReal LineSaturationFirst; psParaTypeReal LineBrightnessFirst; psParaTypeReal LineHueLast; psParaTypeReal LineSaturationLast; psParaTypeReal LineBrightnessLast; /* For Circle */ psParaTypeReal CircleRadius; long dummy; } psImageInfo;
ps file Information
typedef struct psInfo { psParaTypeInteger prologInfoNum; char** prologInfo; char label[MAX_STRING_LENGTH]; psParaTypeInteger page; psParaTypeInteger status; } psInfo;
Page Information
typedef struct psPageInfo psPageInfo;
struct psPageInfo { psParaTypeInteger page; psParaTypeInteger byte; long start; long end; psPageInfo* next; };
Plot
typedef struct psPlotInfo { psParaTypeReal scaleX; psParaTypeReal scaleY; psParaTypeReal translateX; psParaTypeReal translateY; psParaTypeReal dX; psParaTypeReal dXValue; psParaTypeReal minX; psParaTypeReal centreX; psParaTypeReal maxX; char* labelX; psParaTypeReal dY; psParaTypeReal dYValue; psParaTypeReal minY; psParaTypeReal centreY; psParaTypeReal maxY; char* labelY; psParaTypeInteger nData; psParaTypeReal *data; } psPlotInfo;
API
Initialize
Create new ps file Information ps->info->prologInfo allocating memory, and create new ps file ps->fpt.
In addition, define short PostScript commands to use these API.
extern void psFileInit(psFile* ps, psParaTypeInteger mode);
File Read
Read a file fpt, and store to ps.
extern void psFileRead(psFile* ps, FILE* fpt, long mode);
Write header to ps file ps->fpt. (Label: ps->info.label, Page No.: ps->info.page) If mode=0, set the origin to a point at side of each 1 cm right top from the left bottom end. Otherwise, set the origin to the left bottom end point.
extern void psFilePageStart(psFile* ps, psParaTypeInteger mode);
Write footer to ps file ps->fpt.
extern void psFilePageEnd(psFile* ps, psParaTypeInteger mode);
Write trailer to ps file ps->fpt.
extern void psFileEnd(psFile* ps);
Check data
If string s is Header, return 1. Otherwise, return 0.
extern long psFileIsStartPage(psFile* ps, char* s);
If string s is Footer, return 1. Otherwise, return 0.
extern long psFileIsEndPage(psFile* ps, char* s);
Draw
基本的にこれらのAPIは引数psImageInfoの(#描画Setting)を使用したSettingで描画します.
Image data
画像dataim.imageをpsfileps->fptへWriteます.
フラグ(imのメンバ)によって画像の種類をSettingできます.
extern void psFileImage (psFile* ps, psImageInfo im, psParaTypeInteger mode);
imのフラグ | Description |
---|---|
flagRGBColor | RGB形式で書き込む |
flagRGBGradientColor | RGB(グラデーション)形式で書き込む |
flagHSBColor | HSB形式で書き込む(未対応) |
flagHSBGradientColor | HSB(グラデーション)形式で書き込む(未対応) |
Otherwise | モノクロ256階調形式で書き込む |
各フラグは上の方が優先され,重複はしない.
Circle
im.image内の正のdataを半径[pt]とした円をcoordinates(im.width, imheight)[pt]まで描画します.
extern void psFileImageByCircles (psFile* ps, psImageInfo im, psParaTypeInteger mode);
psに中心(cx, cy)[pt],半径r[pt]の円を描画します.modeにより円のタイプが選択できます.
extern void psFileCircleCreate(psFile* ps, float cx, float cy, float r, long mode);
mode | 値 | 円のタイプ |
---|---|---|
PS_LINE_CIRCLE_MODE | 0 | 塗りつぶしなし |
PS_FILL_WHITE_CIRCLE_MODE | 1 | 白で塗りつぶす |
PS_FILL_BLACK_CIRCLE_MODE | 2 | 黒で塗りつぶす |
Line
psに描画する線のWidthlineWidthをSettingします.
extern void psFileLineWidthSet (psFile* ps, float lineWidth);
psに線(x1, y1) -> (x2, y2)を描画します.
extern void psFileLineDraw(psFile* ps, float x1,float y1,float x2,float y2);
Dendrogram
psに2つの点をつなぐ樹形図を描画します. width: 2点間の距離(Width), heightN: 要素Nに引く線の長さ(高さ)(N=1, 2), (x, y): 上段に引く線の中点
extern void psFileDendgramLineDraw(psFile* ps, float width,float height1, float height2, float x, float y);
String
psに表示する文字列のフォントfontname,サイズfontsizeをSettingします.
extern void psFileStringStatusSet(psFile* ps, char* fontname, double fontsize);
psに表示する文字列のフォント・サイズをデフォルトSettingします.
extern void psFileStringDefaultStatusSet(psFile* ps);
psに文字列messageをcoordinates(x, y)[pt]に表示します.
extern void psFileString (psFile* ps, char* message, double x, double y, psParaTypeInteger mode);
Contour
psに画像im.floatimageの境界線を描画します.
extern void psFileContour(psFile* ps, psImageInfo im, psParaTypeInteger mode);
Center marker
psに中心マーカを描画します.
extern void psFileImageCentre (psFile* ps, psImageInfo im, psParaTypeInteger mode);
Scale
psにスケールを描画します.mode=psImageScaleModeBottomLeftの場合は左下部に,mode=psImageScaleModeCenterの場合は左中部に描画します.
extern void psFileImageScale (psFile* ps, psImageInfo im, psParaTypeInteger mode);
Drawing Setting
文字及び点のスケールを(im.scaleX, im.scaleY)[pt]で,原点を(im.translateX, im.translateY)[inch]とします.
extern void psFileImageSpaceSet (psFile* ps, psImageInfo im, psParaTypeInteger mode);
文字及び点のスケール,原点を元に戻します.
extern void psFileImageSpaceRestore(psFile* ps, psImageInfo im, psParaTypeInteger mode);
文字及び点の回転角度im.angleをSettingします.
extern void psFileImageSpaceRotateSet (psFile* ps, psImageInfo im, psParaTypeInteger mode);
文字及び点の回転角度を元に戻します.
extern void psFileImageSpaceRotateRestore(psFile* ps, psImageInfo im, psParaTypeInteger mode);
これらのAPIは基本的に同じ~Setと~Restoreで処理を挟んで使用します.このとき,挟まれた処理にのみ~SetでのSettingが反映されます.
使用Example
psFileImageSpaceSet( Setting1 ) (処理1) psFileImageSpaceRotateSet( 角度Setting1 ) (処理2) psFileImageSpaceSet( Setting2 ) (処理3) psFileImageSpaceRestore( ... ) (処理4) psFileImageSpaceRotateRestore( ... ) (処理5) psFileImageSpaceRestore( ... )
このExampleで,(Setting1)の有効範囲は(処理1) ~ (処理5),(角度Setting1)の有効範囲は(処理2) ~ (処理4),(Setting2)の有効範囲は(処理3)となっています.但し,(処理3)のスケール・原点については(Setting2)の方が(Setting1)よりも後にSettingされているので,こちらが反映されます.