123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871 |
- #ifndef cmGr_h
- #define cmGr_h
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- enum
- {
- kAliceBlueGrId = 0xf0f8ff,
- kAntiqueWhiteGrId = 0xfaebd7,
- kAquaGrId = 0x00ffff,
- kAquamarineGrId = 0x7fffd4,
- kAzureGrId = 0xf0ffff,
- kBeigeGrId = 0xf5f5dc,
- kBisqueGrId = 0xffe4c4,
- kBlackGrId = 0x000000,
- kBlanchedAlmondGrId = 0xffebcd,
- kBlueGrId = 0x0000ff,
- kBlueVioletGrId = 0x8a2be2,
- kBrownGrId = 0xa52a2a,
- kBurlyWoodGrId = 0xdeb887,
- kCadetBlueGrId = 0x5f9ea0,
- kChartreuseGrId = 0x7fff00,
- kChocolateGrId = 0xd2691e,
- kCoralGrId = 0xff7f50,
- kCornflowerBlueGrId = 0x6495ed,
- kCornsilkGrId = 0xfff8dc,
- kCrimsonGrId = 0xdc143c,
- kCyanGrId = 0x00ffff,
- kDarkBlueGrId = 0x00008b,
- kDarkCyanGrId = 0x008b8b,
- kDarkGoldenRodGrId = 0xb8860b,
- kDarkGrayGrId = 0xa9a9a9,
- kDarkGreyGrId = 0xa9a9a9,
- kDarkGreenGrId = 0x006400,
- kDarkKhakiGrId = 0xbdb76b,
- kDarkMagentaGrId = 0x8b008b,
- kDarkOliveGreenGrId = 0x556b2f,
- kDarkorangeGrId = 0xff8c00,
- kDarkOrchidGrId = 0x9932cc,
- kDarkRedGrId = 0x8b0000,
- kDarkSalmonGrId = 0xe9967a,
- kDarkSeaGreenGrId = 0x8fbc8f,
- kDarkSlateBlueGrId = 0x483d8b,
- kDarkSlateGrayGrId = 0x2f4f4f,
- kDarkSlateGreyGrId = 0x2f4f4f,
- kDarkTurquoiseGrId = 0x00ced1,
- kDarkVioletGrId = 0x9400d3,
- kDeepPinkGrId = 0xff1493,
- kDeepSkyBlueGrId = 0x00bfff,
- kDimGrayGrId = 0x696969,
- kDimGreyGrId = 0x696969,
- kDodgerBlueGrId = 0x1e90ff,
- kFireBrickGrId = 0xb22222,
- kFloralWhiteGrId = 0xfffaf0,
- kForestGreenGrId = 0x228b22,
- kFuchsiaGrId = 0xff00ff,
- kGainsboroGrId = 0xdcdcdc,
- kGhostWhiteGrId = 0xf8f8ff,
- kGoldGrId = 0xffd700,
- kGoldenRodGrId = 0xdaa520,
- kGrayGrId = 0x808080,
- kGreyGrId = 0x808080,
- kGreenGrId = 0x008000,
- kGreenYellowGrId = 0xadff2f,
- kHoneyDewGrId = 0xf0fff0,
- kHotPinkGrId = 0xff69b4,
- kIndianRedGrId = 0xcd5c5c,
- kIndigoGrId = 0x4b0082,
- kIvoryGrId = 0xfffff0,
- kKhakiGrId = 0xf0e68c,
- kLavenderGrId = 0xe6e6fa,
- kLavenderBlushGrId = 0xfff0f5,
- kLawnGreenGrId = 0x7cfc00,
- kLemonChiffonGrId = 0xfffacd,
- kLightBlueGrId = 0xadd8e6,
- kLightCoralGrId = 0xf08080,
- kLightCyanGrId = 0xe0ffff,
- kLightGoldenRodYellowGrId = 0xfafad2,
- kLightGrayGrId = 0xd3d3d3,
- kLightGreyGrId = 0xd3d3d3,
- kLightGreenGrId = 0x90ee90,
- kLightPinkGrId = 0xffb6c1,
- kLightSalmonGrId = 0xffa07a,
- kLightSeaGreenGrId = 0x20b2aa,
- kLightSkyBlueGrId = 0x87cefa,
- kLightSlateGrayGrId = 0x778899,
- kLightSlateGreyGrId = 0x778899,
- kLightSteelBlueGrId = 0xb0c4de,
- kLightYellowGrId = 0xffffe0,
- kLimeGrId = 0x00ff00,
- kLimeGreenGrId = 0x32cd32,
- kLinenGrId = 0xfaf0e6,
- kMagentaGrId = 0xff00ff,
- kMaroonGrId = 0x800000,
- kMediumAquaMarineGrId = 0x66cdaa,
- kMediumBlueGrId = 0x0000cd,
- kMediumOrchidGrId = 0xba55d3,
- kMediumPurpleGrId = 0x9370d8,
- kMediumSeaGreenGrId = 0x3cb371,
- kMediumSlateBlueGrId = 0x7b68ee,
- kMediumSpringGreenGrId = 0x00fa9a,
- kMediumTurquoiseGrId = 0x48d1cc,
- kMediumVioletRedGrId = 0xc71585,
- kMidnightBlueGrId = 0x191970,
- kMintCreamGrId = 0xf5fffa,
- kMistyRoseGrId = 0xffe4e1,
- kMoccasinGrId = 0xffe4b5,
- kNavajoWhiteGrId = 0xffdead,
- kNavyGrId = 0x000080,
- kOldLaceGrId = 0xfdf5e6,
- kOliveGrId = 0x808000,
- kOliveDrabGrId = 0x6b8e23,
- kOrangeGrId = 0xffa500,
- kOrangeRedGrId = 0xff4500,
- kOrchidGrId = 0xda70d6,
- kPaleGoldenRodGrId = 0xeee8aa,
- kPaleGreenGrId = 0x98fb98,
- kPaleTurquoiseGrId = 0xafeeee,
- kPaleVioletRedGrId = 0xd87093,
- kPapayaWhipGrId = 0xffefd5,
- kPeachPuffGrId = 0xffdab9,
- kPeruGrId = 0xcd853f,
- kPinkGrId = 0xffc0cb,
- kPlumGrId = 0xdda0dd,
- kPowderBlueGrId = 0xb0e0e6,
- kPurpleGrId = 0x800080,
- kRedGrId = 0xff0000,
- kRosyBrownGrId = 0xbc8f8f,
- kRoyalBlueGrId = 0x4169e1,
- kSaddleBrownGrId = 0x8b4513,
- kSalmonGrId = 0xfa8072,
- kSandyBrownGrId = 0xf4a460,
- kSeaGreenGrId = 0x2e8b57,
- kSeaShellGrId = 0xfff5ee,
- kSiennaGrId = 0xa0522d,
- kSilverGrId = 0xc0c0c0,
- kSkyBlueGrId = 0x87ceeb,
- kSlateBlueGrId = 0x6a5acd,
- kSlateGrayGrId = 0x708090,
- kSlateGreyGrId = 0x708090,
- kSnowGrId = 0xfffafa,
- kSpringGreenGrId = 0x00ff7f,
- kSteelBlueGrId = 0x4682b4,
- kTanGrId = 0xd2b48c,
- kTealGrId = 0x008080,
- kThistleGrId = 0xd8bfd8,
- kTomatoGrId = 0xff6347,
- kTurquoiseGrId = 0x40e0d0,
- kVioletGrId = 0xee82ee,
- kWheatGrId = 0xf5deb3,
- kWhiteGrId = 0xffffff,
- kWhiteSmokeGrId = 0xf5f5f5,
- kYellowGrId = 0xffff00,
- kYellowGreenGrId = 0x9acd32
- };
-
-
- typedef enum
- {
- kHomeGrId = 5, // 5
- kPageUpGrId, // 6
- kEndGrId, // 7
- kBackSpaceGrId = 8, // 8
- kTabGrId = 9, // 9
- kPageDownGrId, // 10
- kLeftGrId, // 11
- kUpGrId, // 12
- kEnterGrId = 13, // 13
- kRightGrId, // 14
- kDownGrId, // 15
- kInsertGrId, // 16
- kPrintGrId, // 17
- kScrollLockGrId, // 18
- kPauseGrId, // 19
- kMenuGrId, // 20
- kLShiftGrId, // 21
- kRShiftGrId, // 22
- kLCtrlGrId, // 23
- kRCtrlGrId, // 24
- kLAltGrId, // 25
- kRAltGrId, // 26
- kEscapeGrId = 27, // 27
- kLSuperGrId, // 28
- kRSuperGrId, // 29
- kNumLockGrId, // 30
- kCapsLockGrId, // 31
- kSpaceGrId = 32, // 32 Min. printable ASCII
- kExclMarkGrId, // 33
- kDQuoteGrId, // 34
- kPoundGrId, // 35
- kDollarGrId, // 36
- kPercentGrId, // 37
- kAmpersandGrId, // 38
- kApostropheGrId, // 39
- kLParenGrId, // 40
- kRParenGrId, // 41
- kAsteriskGrId, // 42
- kPlusGrId, // 43
- kCommaGrId, // 44
- kHyphenGrId, // 45
- kPeriodGrId, // 46
- kForwardSlashGrId, // 47
- k0GrId, // 48
- k1GrId, // 49
- k2GrId, // 50
- k3GrId, // 51
- k4GrId, // 52
- k5GrId, // 53
- k6GrId, // 54
- k7GrId, // 55
- k8GrId, // 56
- k9GrId, // 57
- kColonGrId, // 58
- kSemiColonGrId, // 59
- kLesserGrId, // 60
- kEqualGrId, // 61
- kGreaterGrId, // 62
- kQMarkGrId, // 63
- kAtGrId, // 64
- kA_GrId, // 65
- kB_GrId, // 66
- kC_GrId, // 67
- kD_GrId, // 68
- kE_GrId, // 69
- kF_GrId, // 70
- kG_GrId, // 71
- kH_GrId, // 72
- kI_GrId, // 73
- kJ_GrId, // 74
- kK_GrId, // 75
- kL_GrId, // 76
- kM_GrId, // 77
- kN_GrId, // 78
- kO_GrId, // 79
- kP_GrId, // 80
- kQ_GrId, // 81
- kR_GrId, // 82
- kS_GrId, // 83
- kT_GrId, // 84
- kU_GrId, // 85
- kV_GrId, // 86
- kW_GrId, // 87
- kX_GrId, // 88
- kY_GrId, // 89
- kZ_GrId, // 90
- kLBracketGrId, // 91
- kBackSlashGrId, // 92
- kRBracketGrId, // 93
- kCaretGrId, // 94
- kUnderScoreGrId, // 95
- kAccentGrId, // 96
- ka_GrId, // 97
- kb_GrId, // 98
- kc_GrId, // 99
- kd_GrId, // 100
- ke_GrId, // 101
- kf_GrId, // 102
- kg_GrId, // 103
- kh_GrId, // 104
- ki_GrId, // 105
- kj_GrId, // 106
- kk_GrId, // 107
- kl_GrId, // 108
- km_GrId, // 109
- kn_GrId, // 110
- ko_GrId, // 111
- kp_GrId, // 112
- kq_GrId, // 113
- kr_GrId, // 114
- ks_GrId, // 115
- kt_GrId, // 116
- ku_GrId, // 117
- kv_GrId, // 118
- kw_GrId, // 119
- kx_GrId, // 120
- ky_GrId, // 121
- kz_GrId, // 122
- kLBraceGrId, // 123
- kPipeGrId, // 124
- kRBraceGrId, // 125
- kTildeGrId, // 126
- kDeleteGrId, // 127
- kNP_MultGrId, // 128
- kNP_PlusGrId, // 129
- kNP_MinusGrId, // 130
- kNP_DecPtGrId, // 131
- kNP_DivGrId, // 132
- kNP_0GrId, // 133
- kNP_1GrId, // 134
- kNP_2GrId, // 135
- kNP_3GrId, // 136
- kNP_4GrId, // 137
- kNP_5GrId, // 138
- kNP_6GrId, // 139
- kNP_7GrId, // 140
- kNP_8GrId, // 141
- kNP_9GrId, // 142
- kNP_EqualGrId, // 143
- kNP_EnterGrId, // 144
- kFunc_1GrId, // 145
- kFunc_2GrId, // 146
- kFunc_3GrId, // 147
- kFunc_4GrId, // 148
- kFunc_5GrId, // 149
- kFunc_6GrId, // 150
- kFunc_7GrId, // 151
- kFunc_8GrId, // 152
- kFunc_9GrId, // 153
- kFunc_10GrId, // 154
- kFunc_11GrId, // 155
- kFunc_12GrId, // 156
- kBrightUpGrId, // 157
- kBrightDnGrId, // 158
- kAudio_PrevGrId, // 159
- kAudio_PlayGrId, // 160
- kAudio_NextGrId, // 161
- kAudio_MuteGrId, // 162
- kAudio_UpGrId, // 163
- kAudio_DnGrId, // 164
- kEjectGrId, // 165
- kInvalidKeyCodeGrId
- } cmGrKeyCodeId_t;
-
- enum
- {
- kMinAsciiGrId = kSpaceGrId,
- kMaxAsciiGrId = kDeleteGrId
- };
-
- enum
- {
- kOkGrRC,
- kLHeapFailGrRC,
- kAppErrGrRC,
- kRootObjCreateFailGrRC,
- kInvalidCoordsGrRC,
- kExtsErrGrRC
- };
-
- enum
- {
- kLeftGrFl = 0x01,
- kTopGrFl = 0x02,
- kRightGrFl = 0x04,
- kBottomGrFl = 0x08,
- };
-
- typedef enum
- {
- kLeftGrIdx = 0, // min-x
- kTopGrIdx = 1, // max-y
- kRightGrIdx = 2, // max-x
- kBottomGrIdx = 3, // min-y
- kAxisGrCnt = 4
- } cmGrAxisIdx_t;
-
-
- typedef cmHandle_t cmGrH_t;
- typedef cmHandle_t cmGrObjH_t;
- typedef cmHandle_t cmGrDcH_t;
- typedef unsigned cmGrRC_t;
-
- extern cmGrH_t cmGrNullHandle;
- extern cmGrObjH_t cmGrObjNullHandle;
-
- typedef cmReal_t cmGrV_t;
-
- //====================================================================================================
-
- // Calculate the width and height between two pixels.
- // This implies that the first and last pixel are inside the valid range.
- #define cmGrXtoW(x0,x1) (abs((x1)-(x0))+1)
- #define cmGrWtoX(x0,w) (((x0)+(w))-1)
-
- #define cmGrYtoH(y0,y1) (abs((y1)-(y0))+1)
- #define cmGrHtoY(y0,h) (((y0)+(h))-1)
-
- #define cmGrPIsXInRange(x,x0,w) ((x0)<=(x)&&(x)<=cmGrWtoX((x0),(w)))
- #define cmGrPIsYInRange(y,y0,h) ((y0)<=(y)&&(y)<=cmGrHtoY((y0),(h)))
-
- #define cmGrVIsXInRange(x,x0,w) ((x0)<=(x)&&(x)<=((x0)+(w)))
- #define cmGrVIsYInRange(y,y0,h) ((y0)<=(y)&&(y)<=((y0)+(h)))
-
- typedef struct
- {
- int x;
- int y;
- } cmGrPPt_t;
-
- #define cmGrPPtSet( p, xx, yy ) do{ (p)->x=(xx); (p)->y=(yy); }while(0)
- #define cmGrPPtIsEqual(p0,p1) ((p0)->x==(p1)->x && (p0)->y==(p1)->y)
- #define cmGrPPtPrint(lbl,p) printf("%s x=%i y=%i\n",(lbl),(p)->x,(p)->y)
-
- //====================================================================================================
- typedef struct
- {
- int w;
- int h;
- } cmGrPSz_t;
-
- #define cmGrPSzSet( s, ww, hh ) do{ (s)->w=(ww); (s)->h=(hh);}while(0)
- #define cmGrPSzSetD( s, x0, y0, x1, y1 ) cmGrPSzSet(cmGrXtoW(x0,x1),cmGrYtoH(y0,y1))
-
- #define cmGrPSzSetEmpty( s ) ((s)->w = (s)->h = 0)
- #define cmGrPSzSetNull( s ) ((s)->w = (s)->h = -1)
- #define cmGrPSzIsEmpty( s ) ((s)->w== 0 && (s)->h== 0)
- #define cmGrPSzIsNull( s ) ((s)->w==-1 && (s)->h==-1)
- #define cmGrPSzIsEqual(s0,s1) ((s0)->w==(s1)->w && (s0)->h==(s1)->h)
- #define cmGrPSzPrint(lbl,s) printf("%s w=%i h=%i\n",(lbl),(s)->w,(s)->h)
-
- //====================================================================================================
- typedef struct
- {
- cmGrPPt_t loc;
- cmGrPSz_t sz;
- } cmGrPExt_t;
-
- #define cmGrPExtSet( e, x, y, w, h ) do{ cmGrPPtSet(&(e)->loc,(x),(y)); cmGrPSzSet(&(e)->sz,(w),(h)); }while(0)
- #define cmGrPExtSetD(e, x0, y0, x1, y1) cmGrPExtSet(e,cmMin(x0,x1),cmMin(y0,y1),cmGrXtoW(x0,x1),cmGrYtoH(y0,y1))
-
- #define cmGrPExtL(e) ((e)->loc.x)
- #define cmGrPExtT(e) ((e)->loc.y)
- #define cmGrPExtR(e) (cmGrWtoX((e)->loc.x,(e)->sz.w))
- #define cmGrPExtB(e) (cmGrHtoY((e)->loc.y,(e)->sz.h))
- #define cmGrPExtW(e) ((e)->sz.w)
- #define cmGrPExtH(e) ((e)->sz.h)
-
- #define cmGrPExtSetL(e,v) ((e)->loc.x = (v))
- #define cmGrPExtSetT(e,v) ((e)->loc.y = (v))
- #define cmGrPExtSetR(e,v) cmGrPExtSetW(e,cmGrXtoW((e)->loc.x,(v)))
- #define cmGrPExtSetB(e,v) cmGrPExtSetH(e,cmGrYtoH((e)->loc.y,(v)))
- #define cmGrPExtSetW(e,v) ((e)->sz.w = (v))
- #define cmGrPExtSetH(e,v) ((e)->sz.h = (v))
-
- #define cmGrPExtCtrX(e) ((e)->loc.x + (e)->sz.w / 2)
- #define cmGrPExtCtrY(e) ((e)->loc.y + (e)->sz.h / 2)
- #define cmGrPExtCtr(e,pt) do{ (pt)->x=cmGrPExtCtrX(e); (pt)->y=cmGrPExtCtrY(e); }while(0)
-
- #define cmGrPExtSetEmpty( e ) do{ cmGrPSzSetEmpty(&(e)->sz); cmGrPPtSet(&(e)->loc,0,0); }while(0)
- #define cmGrPExtSetNull( e ) do{ cmGrPSzSetNull( &(e)->sz); cmGrPPtSet(&(e)->loc,0,0); }while(0)
- #define cmGrPExtIsEmpty( e ) cmGrPSzIsEmpty( &(e)->sz )
- #define cmGrPExtIsNull( e ) cmGrPSzIsNull( &(e)->sz )
- #define cmGrPExtIsNullOrEmpty(e) (cmGrPExtIsNull(e)||cmGrPExtIsEmpty(e))
- #define cmGrPExtIsNotEmpty(e) (!cmGrPExtIsEmpty(e))
- #define cmGrPExtIsNotNull(e) (!cmGrPExtIsNull(e))
- #define cmGrPExtIsNotNullOrEmpty(e) (cmGrPExtIsNotNull(e)||cmGrPExtIsNoEmpty(e))
-
- #define cmGrPExtIsEqual( e0, e1 ) (cmGrPPtIsEqual(&(e0)->loc,&(e1)->loc) && cmGrPSzIsEqual(&(e0)->sz, &(e1)->sz))
-
- #define cmGrPExtIsXyInside( e, xx, yy) (cmGrPIsXInRange((xx),(e)->loc.x,(e)->sz.w) && cmGrPIsYInRange((yy), (e)->loc.y, (e)->sz.h) )
- #define cmGrPExtIsPtInside( e, pt ) (cmGrPExtIsXyInside((e),(pt)->x,(pt)->y))
- #define cmGrPExtIsExtInside(e0, e1) (cmGrPExtIsPtInside((e0),&((e1)->loc)) && cmGrPExtIsXyInside((e0), cmGrWtoX((e1)->loc.x,(e1)->sz.w), cmGrHtoY((e1)->loc.y,(e1)->sz.h)))
-
- #define cmGrPExtExpand(e,l,t,r,b) do{(e)->loc.x+=(l); (e)->loc.y+=(t); (e)->sz.w+=(abs(l)+abs(r)); (e)->sz.h+=(abs(t)+abs(b));}while(0)
-
- #define cmGrPExtRpt(e,rpt) cmRptPrintf(rpt,"x:%i y:%i w:%i h:%i",(e)->loc.x,(e)->loc.y,(e)->sz.w,(e)->sz.h)
- #define cmGrPExtPrint(lbl,e) printf("%s %i %i %i %i\n",lbl,(e)->loc.x,(e)->loc.y,(e)->sz.w,(e)->sz.h)
-
- void cmGrPExtIntersect( cmGrPExt_t* r, const cmGrPExt_t* e0, const cmGrPExt_t* e1 );
-
-
- //====================================================================================================
-
- typedef struct
- {
- cmGrV_t x;
- cmGrV_t y;
- } cmGrVPt_t;
-
- #define cmGrVPtSet( p, xx, yy ) do{ (p)->x=(xx); (p)->y=(yy); }while(0)
- #define cmGrVPtIsEqual(p0,p1) ((p0)->x==(p1)->x && (p0)->y==(p1)->y)
- #define cmGrVPtIsNotEqual(p0,p1) (!cmGrVPtIsEqual(p0,p1))
-
- //====================================================================================================
- typedef struct
- {
- cmGrV_t w;
- cmGrV_t h;
- } cmGrVSz_t;
-
- #define cmGrVSzSet( s, ww, hh ) do{ (s)->w=(ww); (s)->h=(hh);}while(0)
- #define cmGrVSzSetD( s, x0, y0, x1, y1 ) cmGrVSzSet((x1)-(x0),(y1)-(y0))
-
- #define cmGrVSzSetEmpty( s ) ((s)->w = (s)->h = 0)
- #define cmGrVSzSetNull( s ) ((s)->w = (s)->h = -1)
- #define cmGrVSzIsEmpty( s ) ((s)->w== 0 && (s)->h== 0)
- #define cmGrVSzIsNull( s ) ((s)->w==-1 || (s)->h==-1)
- #define cmGrVSzIsEqual(s0,s1) ((s0)->w==(s1)->w && (s0)->h==(s1)->h)
-
- //====================================================================================================
- typedef struct
- {
- cmGrVPt_t loc;
- cmGrVSz_t sz;
- } cmGrVExt_t;
-
- #define cmGrVExtIsNorm( e ) ((e)->sz.w>=0 && (e)->sz.h>=0)
- #define cmGrVExtNorm( e ) do{ if( cmGrVExtIsNotNull(e) ){ if((e)->sz.w<0){(e)->loc.x += (e)->sz.w; (e)->sz.w*=-1;} if((e)->sz.h<0){(e)->loc.y += (e)->sz.h; (e)->sz.h*=-1;}} }while(0)
- #define cmGrVExtSet( e, x, y, w, h ) do{ cmGrVPtSet(&(e)->loc,(x),(y)); cmGrVSzSet(&(e)->sz,(w),(h)); cmGrVExtNorm(e); }while(0)
- #define cmGrVExtSetD(e, x0, y0, x1, y1) cmGrVExtSet((e),(x0),(y0),(x1)-(x0),(y1)-(y0))
-
- //
- // l,t minx,maxy
- // r,b maxx,miny
- //
- #define cmGrVExtMinX(e) ((e)->loc.x)
- #define cmGrVExtMinY(e) ((e)->loc.y)
- #define cmGrVExtMaxX(e) ((e)->loc.x + (e)->sz.w)
- #define cmGrVExtMaxY(e) ((e)->loc.y + (e)->sz.h)
- #define cmGrVExtW(e) ((e)->sz.w)
- #define cmGrVExtH(e) ((e)->sz.h)
-
- #define cmGrVExtSetMinX(e,v) ((e)->loc.x = (v))
- #define cmGrVExtSetMinY(e,v) ((e)->loc.y = (v))
-
- // Beware: setting maxx and maxy depends on the current value of minx and miny.
- // If both minx and maxx are being changed then be sure to set minx first.
- // If both miny and maxy are being changed then be sure to set miny first.
- #define cmGrVExtSetMaxX(e,v) ((e)->sz.w = (v) - cmGrVExtMinX(e))
- #define cmGrVExtSetMaxY(e,v) ((e)->sz.h = (v) - cmGrVExtMinY(e))
- #define cmGrVExtSetW(e,v) ((e)->sz.w = (v))
- #define cmGrVExtSetH(e,v) ((e)->sz.h = (v))
-
- #define cmGrVExtSetEmpty( e ) do{ cmGrVSzSetEmpty(&(e)->sz); cmGrVPtSet(&(e)->loc,0,0); }while(0)
- #define cmGrVExtSetNull( e ) do{ cmGrVSzSetNull(&(e)->sz); cmGrVPtSet(&(e)->loc,0,0); }while(0)
- #define cmGrVExtIsEmpty( e ) cmGrVSzIsEmpty(&(e)->sz)
- #define cmGrVExtIsNull( e ) cmGrVSzIsNull( &(e)->sz)
- #define cmGrVExtIsNullOrEmpty(e) (cmGrVExtIsNull(e)||cmGrVExtIsEmpty(e))
- #define cmGrVExtIsNotEmpty(e) (!cmGrVExtIsEmpty(e))
- #define cmGrVExtIsNotNull(e) (!cmGrVExtIsNull(e))
- #define cmGrVExtIsNotNullOrEmpty(e) (cmGrVExtIsNotNull(e)||cmGrVExtIsNotEmpty(e))
- #define cmGrVExtIsEqual( e0, e1 ) (cmGrVPtIsEqual(&(e0)->loc,&(e1)->loc) && cmGrVSzIsEqual(&(e0)->sz, &(e1)->sz))
-
-
- #define cmGrVExtIsXyInside( e, xx, yy) (cmGrVIsXInRange((xx),(e)->loc.x,(e)->sz.w) && cmGrVIsYInRange((yy),(e)->loc.y,(e)->sz.h))
- #define cmGrVExtIsPtInside( e, pt ) (cmGrVExtIsXyInside((e),(pt)->x,(pt)->y))
-
- // e1 is inside e0
- #define cmGrVExtIsExtInside(e0, e1) (cmGrVExtIsXyInside((e0),cmGrVExtMinX(e1),cmGrVExtMinY(e1)) && cmGrVExtIsXyInside((e0), cmGrVExtMaxX(e1), cmGrVExtMaxY(e1)))
-
- #define cmGrVExtRpt(e,rpt) cmRptPrintf(rpt,"x:%f y:%f w:%f h:%f",(e)->loc.x,(e)->loc.y,(e)->sz.w,(e)->sz.h)
- #define cmGrVExtPrint(lbl,e) printf("%s %f %f %f %f\n",lbl,(e)->loc.x,(e)->loc.y,(e)->sz.w,(e)->sz.h)
-
-
- // Shift and expand e0 to contain e1. Return true if e0 actually changes.
- bool cmGrVExtExpandToContain( cmGrVExt_t* e0, const cmGrVExt_t* e1 );
-
- // Force e1 to be contained by e0 by shifting e1's location. This function
- // will never change the width or height of e1. Return true if e1 is changed.
- bool cmGrVExtContain( const cmGrVExt_t* e0, cmGrVExt_t* e1 );
-
- // Return the intersection of 'e0' with 'e1' in 'r'.
- void cmGrVExtIntersect( cmGrVExt_t* r, const cmGrVExt_t* e0, const cmGrVExt_t* e1 );
-
- //====================================================================================================
-
-
- #define cmGrRgbToColor( r, g, b ) (((r) << 16) + ((g) << 8) + (b))
- #define cmGrColorToR( c ) (((c) >> 16) & 0x000000ff)
- #define cmGrColorToG( c ) (((c) >> 8) & 0x000000ff)
- #define cmGrColorToB( c ) (((c) ) & 0x000000ff)
-
- typedef unsigned cmGrColor_t;
- enum { kGrDefaultColorMapIdx = 0, kGrDefaultColorMapId=0 };
-
- unsigned cmGrColorMapCount( cmGrH_t grH );
- unsigned cmGrColorMapId( cmGrH_t grH, unsigned mapIdx );
- const cmChar_t* cmGrColorMapLabel( cmGrH_t grH, unsigned id );
- unsigned cmGrColorMapRegister( cmGrH_t grH, cmChar_t* label, const cmGrColor_t* array, unsigned cnt );
- cmGrColor_t* cmGrColorMap( cmGrH_t grH, unsigned mapId );
- unsigned cmGrColorMapEleCount( cmGrH_t grH, unsigned mapId );
-
- //====================================================================================================
- typedef struct
- {
- cmCtx_t* ctx; // application context
- cmGrH_t grH; // graphics system handle to which this graphic object belongs
- cmGrObjH_t objH; // this graphics object handle
- void* cbArg; // user callback arg
-
- cmGrPPt_t msDnPPt; // mouse down phys point
- cmGrVPt_t msDnVPt; // mouse down virt point inside op->parent->wext
- cmGrVSz_t msDnVOffs; // virtual offset from mouse down point to msDnObj->vext
- cmGrObjH_t msDnObjH; // handle of object which recv'd mouse down
- cmGrVPt_t msVPt; // cur ms virtual point
-
- } cmGrObjFuncArgs_t;
-
-
- typedef cmGrRC_t (*cmGrCreateObjCb_t)( cmGrObjFuncArgs_t* args );
- typedef void (*cmGrDestroyObjCb_t)( cmGrObjFuncArgs_t* args );
- typedef bool (*cmGrRenderObjCb_t)( cmGrObjFuncArgs_t* args, cmGrDcH_t dcH );
- typedef int (*cmGrDistanceObjCb_t)( cmGrObjFuncArgs_t* args, int x, int y );
- typedef bool (*cmGrEventObjCb_t)( cmGrObjFuncArgs_t* args, unsigned flags, unsigned key, int px, int py );
- typedef void (*cmGrVExtObjCb_t)( cmGrObjFuncArgs_t* args, cmGrVExt_t* vext );
- typedef bool (*cmGrIsInsideObjCb_t)( cmGrObjFuncArgs_t* args, int px, int py, cmGrV_t vx, cmGrV_t vy );
-
- typedef struct cmGrObjFunc_str
- {
- // User defined constructor.
- cmGrCreateObjCb_t createCbFunc;
- void* createCbArg;
-
- // User defined destructor.
- cmGrDestroyObjCb_t destroyCbFunc;
- void* destroyCbArg;
-
- // Draw the object by calling back to the cmGrDrawXXX() functions
- cmGrRenderObjCb_t renderCbFunc;
- void* renderCbArg;
-
- // Return the physical distance from a physical view location to the object.
- // (NOT USED)
- cmGrDistanceObjCb_t distanceCbFunc;
- void* distanceCbArg;
-
- // Handle an event. gx,gy are in the same coord's as args.objH.vext (they are inside args.objH.parent.wext).
- // Return true if the event objects dirty flag should be set.
- cmGrEventObjCb_t eventCbFunc;
- void* eventCbArg;
-
- // Return the objects location and size inside op->parent->wext
- cmGrVExtObjCb_t vextCbFunc;
- void* vextCbArg;
-
- // Return true if the point is inside this obj. vx,vy is in the the same coord's as op->vext (i.e. vx,vy is inside op->parent->wext)
- // The simple answer to this call is cmGrVExtIsXyInside( *vext, vx, vy ).
- // Called to determine which object is under the mouse.
- cmGrIsInsideObjCb_t isInsideCbFunc;
- void* isInsideCbArg;
- } cmGrObjFunc_t;
-
-
- // Create a graphic object. This function calls the user defined (*create)() function.
- cmGrRC_t cmGrObjCreate( cmGrH_t h, cmGrObjH_t* hp, cmGrObjH_t parentH, cmGrObjFunc_t* f, unsigned id, unsigned flags, const cmGrVExt_t* wext );
-
- // Destroy a graphic object and all of it's children.
- // This function calls the user defined (*destroy)() function.
- cmGrRC_t cmGrObjDestroy( cmGrH_t h, cmGrObjH_t* hp );
-
- // Return true if 'oh' is a valid handle.
- cmGrRC_t cmGrObjIsValid( cmGrH_t h, cmGrObjH_t oh );
-
- // Return the user id associated with this object.
- unsigned cmGrObjId( cmGrObjH_t oh );
- void cmGrObjSetId( cmGrObjH_t oh, unsigned id );
-
- // Return the handle to the parent object.
- cmGrObjH_t cmGrObjParent( cmGrObjH_t oh );
-
- // An object world coord's are used to place child objects.
- cmGrRC_t cmGrObjSetWorldExt( cmGrH_t h, cmGrObjH_t oh, const cmGrVExt_t* vext );
- void cmGrObjWorldExt( cmGrObjH_t oh, cmGrVExt_t* vext );
-
- cmGrRC_t cmGrObjSetWorldLimitExt( cmGrH_t h, cmGrObjH_t oh, const cmGrVExt_t* vext, unsigned limitFlags );
- void cmGrObjWorldLimitExt( cmGrObjH_t oh, cmGrVExt_t* vext, unsigned* limitFlags );
-
- void cmGrObjSetCreateCb( cmGrObjH_t oh, cmGrCreateObjCb_t cbFunc, void* cbArg );
- void cmGrObjSetDestroyCb( cmGrObjH_t oh, cmGrDestroyObjCb_t cbFunc, void* cbArg );
- void cmGrObjSetRenderCb( cmGrObjH_t oh, cmGrRenderObjCb_t cbFunc, void* cbArg );
- void cmGrObjSetDistanceCb( cmGrObjH_t oh, cmGrDistanceObjCb_t cbFunc, void* cbArg );
- void cmGrObjSetEventCb( cmGrObjH_t oh, cmGrEventObjCb_t cbFunc, void* cbArg );
- void cmGrObjSetVExtCb( cmGrObjH_t oh, cmGrVExtObjCb_t cbFunc, void* cbArg );
- void cmGrObjSetIsInsideCb( cmGrObjH_t oh, cmGrIsInsideObjCb_t cbFunc, void* cbArg );
-
- cmGrCreateObjCb_t cmGrObjCreateCbFunc( cmGrObjH_t oh );
- cmGrDestroyObjCb_t cmGrObjDestroyCbFunc( cmGrObjH_t oh );
- cmGrRenderObjCb_t cmGrObjRenderCbFunc( cmGrObjH_t oh );
- cmGrDistanceObjCb_t cmGrObjDistanceCbFunc( cmGrObjH_t oh );
- cmGrEventObjCb_t cmGrObjEventCbFunc( cmGrObjH_t oh );
- cmGrVExtObjCb_t cmGrObjVExtCbFunc( cmGrObjH_t oh );
- cmGrIsInsideObjCb_t cmGrObjIsInsideCbFunc( cmGrObjH_t oh );
-
- void* cmGrObjCreateCbArg( cmGrObjH_t oh );
- void* cmGrObjDestroyCbArg( cmGrObjH_t oh );
- void* cmGrObjRenderCbArg( cmGrObjH_t oh );
- void* cmGrObjDistanceCbArg( cmGrObjH_t oh );
- void* cmGrObjEventCbArg( cmGrObjH_t oh );
- void* cmGrObjVExtCbArg( cmGrObjH_t oh );
- void* cmGrObjIsInsideCbArg( cmGrObjH_t oh );
-
-
- // Same as call to user defined (*vect)().
- void cmGrObjLocalVExt( cmGrH_t h, cmGrObjH_t oh, cmGrVExt_t* vext );
-
- // Given an objects id return it's handle.
- cmGrObjH_t cmGrObjIdToHandle( cmGrH_t h, unsigned id );
-
- // Move 'aoH' such that it is drawn above 'boH' in the z-order.
- // This means that 'boH' will be drawn before 'aoH'.
- void cmGrObjDrawAbove( cmGrObjH_t boH, cmGrObjH_t aoH );
-
- void cmGrObjReport( cmGrH_t h, cmGrObjH_t oh, cmRpt_t* rpt );
- void cmGrObjReportR( cmGrH_t h, cmGrObjH_t oh, cmRpt_t* rpt ); // print children
-
-
- //====================================================================================================
- // Drawing Functions - called by objects to draw themselves
-
- int cmGrX_VtoP( cmGrH_t hh, cmGrObjH_t oh, cmGrV_t y );
- int cmGrY_VtoP( cmGrH_t hh, cmGrObjH_t oh, cmGrV_t x );
-
- void cmGrXY_VtoP( cmGrH_t hh, cmGrObjH_t oh, cmGrV_t x, cmGrV_t y, cmGrPPt_t* rp );
- void cmGrXYWH_VtoP( cmGrH_t hh, cmGrObjH_t oh, cmGrV_t x, cmGrV_t y, cmGrV_t w, cmGrV_t h, cmGrPExt_t* pext );
- void cmGrVExt_VtoP( cmGrH_t hh, cmGrObjH_t oh, const cmGrVExt_t* vext, cmGrPExt_t* pext );
-
- void cmGrXY_PtoV( cmGrH_t hh, cmGrObjH_t oh, int x, int y, cmGrVPt_t* rp );
- void cmGrXYWH_PtoV( cmGrH_t hh, cmGrObjH_t oh, int x, int y, int w, int h, cmGrVExt_t* vext );
- void cmGrPExt_PtoV( cmGrH_t hh, cmGrObjH_t oh, const cmGrPExt_t* pext, cmGrVExt_t* vext );
-
- void cmGrDrawVLine( cmGrH_t hh, cmGrDcH_t dcH, cmGrObjH_t oh, cmGrV_t x0, cmGrV_t y0, cmGrV_t x1, cmGrV_t y1 );
- void cmGrDrawVRect( cmGrH_t hh, cmGrDcH_t dcH, cmGrObjH_t oh, cmGrV_t x, cmGrV_t y, cmGrV_t w, cmGrV_t h );
-
- //====================================================================================================
-
- // Callback identifiers
- typedef enum
- {
- kCreateCbGrId,
- kDestroyCbGrId,
- kLocalPtCbGrId,
- kGlobalPtCbGrId,
- kPhysExtCbGrId,
- kViewExtCbGrId,
- kSelectExtCbGrId,
- kFocusCbGrId,
- kKeyUpCbGrId,
- kKeyDnCbGrId
- } cmGrCbId_t;
-
- // Callback function associated with this canvas.
- typedef void (*cmGrCbFunc_t)( void* arg, cmGrH_t grH, cmGrCbId_t id, unsigned evtFlags, cmGrKeyCodeId_t keycode );
-
- // Configuration Flags
- enum
- {
- kExpandViewGrFl = 0x01, // expand the view to show new objects
- kSelectHorzGrFl = 0x02, // select along x-axis only
- kSelectVertGrFl = 0x04 // select along y-axis only
- };
-
- // 'wext' is optional.
- // 'id' is an arbitrary user definable identifier - although it is used
- // as the view index by cmGrPage().
- cmGrRC_t cmGrCreate(
- cmCtx_t* ctx,
- cmGrH_t* hp,
- unsigned id,
- unsigned cfgFlags,
- cmGrCbFunc_t cbFunc,
- void* cbArg,
- const cmGrVExt_t* wext ); // Optional internal world extents for this object
-
- // Destroy this canvas.
- cmGrRC_t cmGrDestroy( cmGrH_t* hp );
-
- // Remove all objects from the root object and restore the canvas to it's default state.
- cmGrRC_t cmGrClear( cmGrH_t h );
-
- // Get the root object handle
- cmGrObjH_t cmGrRootObjH( cmGrH_t h );
-
- // Get and set the configuration flags (e.g. kExpandViewGrFl | kSelectHorzGrFl | kSelectVertHorzGrFl )
- unsigned cmGrCfgFlags( cmGrH_t h );
- void cmGrSetCfgFlags( cmGrH_t h, unsigned cfgFlags );
-
- // Draw the objects on the canvas.
- cmGrRC_t cmGrDraw( cmGrH_t h, cmGrDcH_t dcH );
-
- // event flags
- enum
- {
- kMsDownGrFl = 0x0001,
- kMsUpGrFl = 0x0002,
- kMsMoveGrFl = 0x0004,
- kMsWheelGrFl= 0x0008,
- kMsDragGrFl = 0x0010,
- kMsClickGrFl= 0x0020,
- kKeyDnGrFl = 0x0040,
- kKeyUpGrFl = 0x0080,
-
- kMsEvtMask = 0x02f,
- kEvtMask = 0x00ff,
-
- kMsLBtnGrFl = 0x0100,
- kMsCBtnGrFl = 0x0200,
- kMsRBtnGrFl = 0x0400,
-
- kShiftKeyGrFl = 0x0800,
- kAltKeyGrFl = 0x1000,
- kCtlKeyGrFl = 0x2000,
- };
-
- // Receive a UI event.
- bool cmGrEvent( cmGrH_t h, unsigned flags, cmGrKeyCodeId_t key, int x, int y );
-
- // Return true if 'h' is valid.
- bool cmGrIsValid( cmGrH_t h );
-
- // Return the user defined 'id' set in cmGrCreate()
- unsigned cmGrId( cmGrH_t h );
-
- // Return the last mouse location in root object coordinates.
- const cmGrVPt_t* cmGrGlobalPt( cmGrH_t h );
-
- // Return the last mouse location in coordinates of the object the mouse was over.
- const cmGrVPt_t* cmGrLocalPt( cmGrH_t h );
-
-
- // The new view extents must fit inside the world extents.
- // Return true if the view extents actually changed.
- bool cmGrSetViewExtents( cmGrH_t hh, cmGrV_t minx, cmGrV_t miny, cmGrV_t maxx, cmGrV_t maxy );
- bool cmGrSetViewExtentsE(cmGrH_t h, const cmGrVExt_t* ext );
- void cmGrViewExtents( cmGrH_t h, cmGrVExt_t* exts );
-
- // View Location
- // Return true if the phys extents actually changed.
- bool cmGrSetPhysExtents( cmGrH_t hh, int x, int y, int w, int h );
- bool cmGrSetPhysExtentsE(cmGrH_t h, const cmGrPExt_t* ext );
- void cmGrPhysExtents( cmGrH_t h, cmGrPExt_t* exts );
-
- // Return some scroll bar values for this canvas.
- // tot=world pixels, vis=vis pixels, max=max scroll pos pos=cur scroll pos
- // All return values are optional.
- void cmGrScrollExtents( cmGrH_t h, cmGrPSz_t* tot, cmGrPSz_t* vis, cmGrPSz_t* max, cmGrPPt_t* pos );
-
- // Return true if the view location actually changed.
- bool cmGrSetScrollH( cmGrH_t h, int x );
- int cmGrScrollH( cmGrH_t h );
- bool cmGrSetScrollV( cmGrH_t h, int y );
- int cmGrScrollV( cmGrH_t h );
-
- // Get the current selection extents.
- // If the selection extents are not valid then the function returns false
- // and sets the return extents to their null state.
- bool cmGrSelectExtents( cmGrH_t h, cmGrVExt_t* vext, cmGrPExt_t* pext );
-
- // Both pts are optional
- void cmGrSetSelectPoints(cmGrH_t h, const cmGrVPt_t* pt0, const cmGrVPt_t* pt1 );
- void cmGrSelectPoints( cmGrH_t h, cmGrVPt_t* pt0, cmGrVPt_t* pt1 );
-
- enum { kZoomInGrFl=0x01, kXAxisGrFl=0x02, kYAxisGrFl=0x04, kSelectGrFl=0x08, kShowAllGrFl=0x10 };
-
- // 1) If kSelectGrFl is not set then the center 1/3 of the current view
- // becomes the new view.
- // 2) If kSelectGrFl is set then the selection area becomes the view.
- // 3) If kSelectGrFl is set but no selection area exists then
- // option 1) is selected used and using the selection point as center.
- void cmGrZoom( cmGrH_t h, unsigned flags );
-
- // Synchronize the 'syncGrH' horz. and/or verical, world,view,select extents to
- // this gr's extents. Changes to this gr's extents will be automatically
- // applied to 'syncGrH'.
- // If 'syncGrH' was used in a previous call to this function then flags will
- // modify the previously set flags value.
- // Clear the kHorzSyncFl and kVertSyncFl to disable the synchronization.
- // Set flags to 0 to prevent future sync calls.
- enum { kWorldSyncGrFl=0x01, kViewSyncGrFl=0x02, kSelectSyncGrFl=0x04, kHorzSyncGrFl=0x08, kVertSyncGrFl=0x10 };
- void cmGrSetSync( cmGrH_t h, cmGrH_t syncGrH, unsigned flags );
-
-
- void cmGrReport( cmGrH_t h, cmRpt_t* rpt );
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif
|