|
|
1.1 ! root 1: /* ! 2: paint.c -- Paints the clock ! 3: ! 4: Created by Microsoft Corporation, 1989 ! 5: */ ! 6: #define INCL_WIN ! 7: #define INCL_GPI ! 8: #include <os2.h> ! 9: #include "clock.h" ! 10: #include "dialogs.h" ! 11: ! 12: #define MATLF_SIZE ( sizeof ( MATRIXLF ) / sizeof ( LONG ) ) ! 13: ! 14: #define CLK_MAJORTICKS 0x0001 ! 15: #define CLK_MINORTICKS 0x0002 ! 16: ! 17: extern BOOL fIconic , fShowSecondHand ; ! 18: extern DATETIME dt ; ! 19: extern HPS hps ; ! 20: ! 21: VOID ClkPaint ( HWND ) ; ! 22: VOID ClkDrawHand ( HPS , SHORT , SHORT ) ; ! 23: VOID ClkDrawFace ( HPS ) ; ! 24: VOID ClkDrawTicks ( HPS , USHORT ) ; ! 25: ! 26: static FIXED fxSin [60] = { ! 27: 0x00000000, 0x00001ac2, 0x00003539, 0x00004f1b, 0x0000681f, 0x00007fff, ! 28: 0x00009679, 0x0000ab4c, 0x0000be3e, 0x0000cf1b, 0x0000ddb3, 0x0000e9de, ! 29: 0x0000f378, 0x0000fa67, 0x0000fe98, 0x0000ffff, 0x0000fe98, 0x0000fa67, ! 30: 0x0000f378, 0x0000e9de, 0x0000ddb3, 0x0000cf1b, 0x0000be3e, 0x0000ab4c, ! 31: 0x00009679, 0x00008000, 0x00006820, 0x00004f1b, 0x00003539, 0x00001ac2, ! 32: 0x00000000, 0xffffe53e, 0xffffcac7, 0xffffb0e5, 0xffff97e1, 0xffff8001, ! 33: 0xffff6988, 0xffff54b5, 0xffff41c2, 0xffff30e5, 0xffff224d, 0xffff1622, ! 34: 0xffff0c88, 0xffff0599, 0xffff0168, 0xffff0001, 0xffff0167, 0xffff0599, ! 35: 0xffff0c88, 0xffff1622, 0xffff224d, 0xffff30e5, 0xffff41c2, 0xffff54b4, ! 36: 0xffff6987, 0xffff8000, 0xffff97e0, 0xffffb0e4, 0xffffcac6, 0xffffe53e ! 37: } ; ! 38: ! 39: USHORT usMajorTickPref = CLKTM_ALWAYS ; ! 40: USHORT usMinorTickPref = CLKTM_NOTICONIC ; ! 41: LONG clrBackground = CLR_DARKCYAN ; ! 42: LONG clrFace = CLR_CYAN ; ! 43: LONG clrHourHand = CLR_PINK ; ! 44: LONG clrMinuteHand = CLR_DARKPINK ; ! 45: ! 46: ! 47: /* ! 48: ClkPaint() -- Paints the clock client window ! 49: */ ! 50: VOID ClkPaint ( HWND hwnd ) ! 51: { ! 52: RECTL rclUpdate ; ! 53: ! 54: /* fill the invalid rectangle */ ! 55: WinBeginPaint ( hwnd , hps , & rclUpdate ) ; ! 56: WinFillRect ( hps , & rclUpdate , clrBackground ) ; ! 57: ! 58: /* draw the face, the hour hand, and the minute hand */ ! 59: ClkDrawFace ( hps ) ; ! 60: ClkDrawHand ( hps , HT_HOUR , dt . hours ) ; ! 61: ClkDrawHand ( hps , HT_MINUTE , dt . minutes ) ; ! 62: ! 63: /* draw the tick marks */ ! 64: if ( ( usMajorTickPref == CLKTM_ALWAYS ) || ! 65: ( ( usMajorTickPref == CLKTM_NOTICONIC ) && ! fIconic ) ) ! 66: ClkDrawTicks ( hps , CLK_MAJORTICKS ) ; ! 67: ! 68: if ( ( usMinorTickPref == CLKTM_ALWAYS ) || ! 69: ( ( usMinorTickPref == CLKTM_NOTICONIC ) && ! fIconic ) ) ! 70: ClkDrawTicks ( hps , CLK_MINORTICKS ) ; ! 71: ! 72: /* draw the second hand last, so xor will work */ ! 73: if ( fShowSecondHand ) ! 74: ClkDrawHand ( hps , HT_SECOND , dt . seconds ) ; ! 75: ! 76: /* restore the presentation space */ ! 77: WinEndPaint ( hps ) ; ! 78: } ! 79: ! 80: ! 81: /* ! 82: ClkDrawHand() -- Draws specified hand at specified hour in given PS ! 83: */ ! 84: VOID ClkDrawHand ( HPS hps , SHORT sHandType , SHORT sAngle ) ! 85: { ! 86: static POINTL aptlHour [ ] = { { 8 , 0 } , { 0 , 60 } , { -8 , 0 } , ! 87: { 0 , -10 } , { 8 , 0 } } ; ! 88: static POINTL aptlMinute [ ] = { { 6 , 0 } , { 0 , 80 } , { -6 , 0 } , ! 89: { 0 , -15 } , { 6 , 0 } } ; ! 90: static POINTL aptlSecond [ ] = { { 0 , -15 } , { 0 , 85 } } ; ! 91: static LONG cptlHour = sizeof ( aptlHour ) / sizeof ( POINTL ) ; ! 92: static LONG cptlMinute = sizeof ( aptlMinute ) / sizeof ( POINTL ) ; ! 93: static LONG cptlSecond = sizeof ( aptlSecond ) / sizeof ( POINTL ) ; ! 94: BOOL f ; ! 95: static MATRIXLF matlfModel = { ! 96: MAKEFIXED ( 1 , 0 ) , MAKEFIXED ( 0 , 0 ) , 0L , ! 97: MAKEFIXED ( 0 , 0 ) , MAKEFIXED ( 1 , 0 ) , 0L , ! 98: 100L , 100L , 1L } ; ! 99: ! 100: /* prepare a rotation transform and set it into the ps */ ! 101: /* cos x - sin x 0 *\ ! 102: | sin x cos x 0 | ! 103: \* 100 100 1 */ ! 104: ! 105: matlfModel . fxM11 = ! 106: matlfModel . fxM22 = fxSin [ ( sAngle + 15 ) % 60 ] ; ! 107: matlfModel . fxM12 = fxSin [ ( sAngle + 30 ) % 60 ] ; ! 108: matlfModel . fxM21 = fxSin [ sAngle ] ; ! 109: f = GpiSetModelTransformMatrix ( hps , ( LONG ) MATLF_SIZE , ! 110: & matlfModel , TRANSFORM_REPLACE ) ; ! 111: ! 112: /* draw the specified hand */ ! 113: ! 114: switch ( sHandType ) { ! 115: ! 116: case HT_HOUR: ! 117: GpiSetColor ( hps , clrHourHand ) ; ! 118: GpiBeginPath ( hps , 1L ) ; ! 119: GpiSetCurrentPosition ( hps , aptlHour ) ; ! 120: GpiPolyLine ( hps , cptlHour , aptlHour ) ; ! 121: GpiEndPath ( hps ) ; ! 122: GpiFillPath ( hps , 1L , FPATH_ALTERNATE ) ; ! 123: break; ! 124: ! 125: case HT_MINUTE: ! 126: GpiSetColor ( hps , clrMinuteHand ) ; ! 127: GpiBeginPath ( hps , 1L ) ; ! 128: GpiSetCurrentPosition ( hps , aptlMinute ) ; ! 129: GpiPolyLine ( hps , cptlMinute , aptlMinute ) ; ! 130: GpiEndPath ( hps ) ; ! 131: GpiFillPath ( hps , 1L , FPATH_ALTERNATE ) ; ! 132: break; ! 133: ! 134: case HT_SECOND: ! 135: /* draw in XOR mixmode, so we can undraw later */ ! 136: GpiSetMix ( hps , FM_INVERT ) ; ! 137: GpiSetCurrentPosition ( hps , aptlSecond ) ; ! 138: GpiPolyLine ( hps , cptlSecond , aptlSecond ) ; ! 139: GpiSetMix ( hps , FM_OVERPAINT ) ; ! 140: break; ! 141: } ! 142: } ! 143: ! 144: ! 145: /* ! 146: ClkDrawFace() -- Draws clock face and tick marks ! 147: */ ! 148: VOID ClkDrawFace ( HPS hps ) ! 149: { ! 150: BOOL f ; ! 151: LONG l ; ! 152: static POINTL ptlOrigin = { 0L , 0L } ; ! 153: ! 154: /* 1 0 0 *\ ! 155: * 0 1 0 * ! 156: \* 100 100 1 */ ! 157: ! 158: static MATRIXLF matlfModel = { ! 159: MAKEFIXED ( 1 , 0 ) , MAKEFIXED ( 0 , 0 ) , 0L , ! 160: MAKEFIXED ( 0 , 0 ) , MAKEFIXED ( 1 , 0 ) , 0L , ! 161: 100L , 100L , 1L } ; ! 162: ! 163: /* center at (100, 100) and draw the clock face */ ! 164: f = GpiSetModelTransformMatrix ( hps , ( LONG ) MATLF_SIZE , ! 165: & matlfModel , TRANSFORM_REPLACE ) ; ! 166: GpiSetColor ( hps , clrFace ) ; ! 167: GpiSetCurrentPosition ( hps , & ptlOrigin ) ; ! 168: l = GpiFullArc ( hps , DRO_OUTLINEFILL , MAKEFIXED ( 85 , 0 ) ) ; ! 169: } ! 170: ! 171: ! 172: /* ! 173: ClkDrawTicks() -- Draws clock ticks ! 174: */ ! 175: VOID ClkDrawTicks ( HPS hps , USHORT usTicks ) ! 176: { ! 177: BOOL f ; ! 178: USHORT usAngle ; ! 179: ! 180: /* prepare a transform to use when rotating the ticks */ ! 181: /* cos x - sin x 0 *\ ! 182: | sin x cos x 0 | ! 183: \* 100 100 1 */ ! 184: ! 185: static MATRIXLF matlfModel = { ! 186: MAKEFIXED ( 1 , 0 ) , MAKEFIXED ( 0 , 0 ) , 0L , ! 187: MAKEFIXED ( 0 , 0 ) , MAKEFIXED ( 1 , 0 ) , 0L , ! 188: 100L , 100L , 1L } ; ! 189: ! 190: /* define what the tick marks look like */ ! 191: static POINTL aptlMajorTick [ ] = { { -3 , 94 } , { 3 , 100 } } ; ! 192: static POINTL aptlMinorTick [ ] = { { 0 , 94 } , { 0 , 95 } } ; ! 193: ! 194: /* draw in the default color */ ! 195: GpiSetColor ( hps , CLR_DEFAULT ) ; ! 196: ! 197: /* have we been asked to draw the major ticks? */ ! 198: if ( usTicks & CLK_MAJORTICKS ) ! 199: for ( usAngle = 0 ; usAngle < 60 ; usAngle += 5 ) { ! 200: ! 201: /* set the rotation transform */ ! 202: matlfModel . fxM11 = ! 203: matlfModel . fxM22 = fxSin [ ( usAngle + 15 ) % 60 ] ; ! 204: matlfModel . fxM12 = fxSin [ ( usAngle + 30 ) % 60 ] ; ! 205: matlfModel . fxM21 = fxSin [ usAngle ] ; ! 206: f = GpiSetModelTransformMatrix ( hps , ( LONG ) MATLF_SIZE , ! 207: & matlfModel , ! 208: TRANSFORM_REPLACE ) ; ! 209: ! 210: /* draw a major tick mark */ ! 211: GpiSetCurrentPosition ( hps , & aptlMajorTick [ 0 ] ) ; ! 212: GpiBox ( hps , DRO_FILL , & aptlMajorTick [ 1 ] , 0L , 0L ) ; ! 213: } ! 214: ! 215: /* have we been asked to draw the minor ticks? */ ! 216: if ( usTicks & CLK_MINORTICKS ) ! 217: for ( usAngle = 0 ; usAngle < 60 ; usAngle ++ ) { ! 218: ! 219: matlfModel . fxM11 = ! 220: matlfModel . fxM22 = fxSin [ ( usAngle + 15 ) % 60 ] ; ! 221: matlfModel . fxM12 = fxSin [ ( usAngle + 30 ) % 60 ] ; ! 222: matlfModel . fxM21 = fxSin [ usAngle ] ; ! 223: ! 224: /* set the transform */ ! 225: f = GpiSetModelTransformMatrix ( hps , ( LONG ) MATLF_SIZE , ! 226: & matlfModel , ! 227: TRANSFORM_REPLACE ) ; ! 228: ! 229: /* draw a minor tick mark */ ! 230: GpiSetCurrentPosition ( hps , & aptlMinorTick [ 0 ] ) ; ! 231: GpiLine ( hps , & aptlMinorTick [ 1 ] ) ; ! 232: } ! 233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.