Annotation of pmsdk/samples/clock/paint.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.