psFile(API)

From EosPedia
Revision as of 04:33, 9 October 2014 by Kinoshita (Talk | contribs)

Jump to: navigation, search

Objects/DataExpress/psFile is API for PostScript file.

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, Footer, Trailer

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されているので,こちらが反映されます.