gdi.h
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:218k
源码类别:

GPS编程

开发平台:

C/C++

  1.  * param x1 x1,y1: The start point of the line.
  2.  * param y1 x1,y1: The start point of the line.
  3.  * param x2 x2,y2: The end point of the line.
  4.  * param y2 x2,y2: The end point of the line.
  5.  *
  6.  * note Only defined for _USE_NEWGAL and _ADV_2DAPI
  7.  *
  8.  * note This function does not change the pen position.
  9.  *
  10.  * sa LineTo, dc_attrs
  11.  */
  12. void GUIAPI LineEx (HDC hdc, int x1, int y1, int x2, int y2);
  13. /**
  14.  * fn void GUIAPI ArcEx (HDC hdc, int sx, int sy, int width, int height, int ang1, int ang2)
  15.  * brief Draws an arc with the current pen in a DC.
  16.  *
  17.  * This function draws an arc with the current pen in the DC a hdc. 
  18.  * The center of the arc is at a (sx, sy), the bounding box of the arc is a width wide
  19.  * and a height high, and the degree of start angle and end angle are a ang1 and a ang2 
  20.  * respectively.
  21.  * 
  22.  * param hdc The device context.
  23.  * param sx sx,sy: The center of the arc.
  24.  * param sy sx,sy: The center of the arc.
  25.  * param width The width of the bounding box of the arc.
  26.  * param height The height of the bounding box of the arc.
  27.  * param ang1 The start angle of the arc, relative to the 3 o'clock position, 
  28.  *              counter-clockwise, in 1/64ths of a degree.
  29.  * param ang2 The end angle of the arc, relative to angle1, in 1/64ths of a degree.
  30.  *
  31.  * note Only defined for _USE_NEWGAL
  32.  *
  33.  * sa CircleArc, dc_attrs
  34.  */
  35. void GUIAPI ArcEx (HDC hdc, int sx, int sy, int width, int height, int ang1, int ang2);
  36. /**
  37.  * fn void GUIAPI FillArcEx (HDC hdc, int x, int y, int width, int height, int ang1, int ang2)
  38.  * brief Fills an arc with the current brush in a DC.
  39.  *
  40.  * This function fills an arc with the current brush in the DC a hdc. 
  41.  * The center of the arc is at a (sx, sy), the bounding box of the arc is a width wide
  42.  * and a height high, and the degree of start angle and end angle are a ang1 and a ang2 
  43.  * respectively.
  44.  *
  45.  * param hdc The device context.
  46.  * param x the x coordinate of the left edge of the bounding rectangle.
  47.  * param y the y coordinate of the left edge of the bounding rectangle.
  48.  * param width The width of the bounding box of the arc.
  49.  * param height The height of the bounding box of the arc.
  50.  * param ang1 The start angle of the arc, relative to the 3 o'clock position, 
  51.  *              counter-clockwise, in 1/64ths of a degree.
  52.  * param ang2 The end angle of the arc, relative to angle1, in 1/64ths of a degree.
  53.  *
  54.  * sa ArcEx, dc_attrs
  55.  */
  56. void GUIAPI FillArcEx (HDC hdc, int x, int y, int width, int height, int ang1, int ang2);
  57. /**
  58.  * fn void GUIAPI PolyLineEx (HDC hdc, const POINT* pts, int nr_pts)
  59.  * brief Draws a polyline with the current pen in a DC.
  60.  *
  61.  * This function draws a polyline with the current pen in the DC a hdc.
  62.  *
  63.  * param hdc The device context.
  64.  * param pts The pointer to the vertex array of the polyline.
  65.  * param nr_pts The number of the vertices.
  66.  *
  67.  * sa LineEx 
  68.  */
  69. void GUIAPI PolyLineEx (HDC hdc, const POINT* pts, int nr_pts);
  70. /**
  71.  * Arc structure.
  72.  */
  73. typedef struct _ARC
  74. {
  75.     /** the x coordinate of the left edge of the bounding rectangle. */
  76.     int x;
  77.     /** the y coordinate of the left edge of the bounding rectangle. */
  78.     int y;
  79.     /** the width of the bounding box of the arc. */
  80.     int width;
  81.     /** the height of the bounding box of the arc. */
  82.     int height;
  83.     /**
  84.      * The start angle of the arc, relative to the 3 o'clock position, 
  85.      * counter-clockwise, in 1/64ths of a degree.
  86.      */
  87.     int angle1;
  88.     /** 
  89.      * The end angle of the arc, relative to angle1, in 1/64ths of a degree.
  90.      */
  91.     int angle2;
  92. } ARC;
  93. /**
  94.  * fn void GUIAPI PolyArcEx (HDC hdc, const ARC* arcs, int nr_arcs)
  95.  * brief Draws a polyarc with the current pen in a DC.
  96.  *
  97.  * This function draws a polyarc with the current pen in the DC a hdc.
  98.  *
  99.  * param hdc The device context.
  100.  * param arcs The pointer to an ARC array which defines the arcs.
  101.  * param nr_arcs The number of the arcs.
  102.  *
  103.  * sa ArcEx
  104.  */
  105. void GUIAPI PolyArcEx (HDC hdc, const ARC* arcs, int nr_arcs);
  106. /**
  107.  * fn void GUIAPI PolyFillArcEx (HDC hdc, const ARC* arcs, int nr_arcs)
  108.  * brief Fill a polyarc with the current brush in a DC.
  109.  *
  110.  * This function fill a polyarc with the current brush in the DC a hdc.
  111.  *
  112.  * param hdc The device context.
  113.  * param arcs The pointer to an ARC array which defines the arcs.
  114.  * param nr_arcs The number of the arcs.
  115.  *
  116.  * sa ArcEx
  117.  */
  118. void GUIAPI PolyFillArcEx (HDC hdc, const ARC* arcs, int nr_arcs);
  119.     /**
  120.      * @} end of draw_adv_2d_fns
  121.      */
  122. #endif
  123. #else
  124. /* Old GDI drawing functions */
  125. void GUIAPI MoveTo (HDC hdc, int x, int y);
  126. void GUIAPI LineTo (HDC hdc, int x, int y);
  127. void GUIAPI Rectangle (HDC hdc, int x0, int y0, int x1, int y1);
  128. void GUIAPI PolyLineTo (HDC hdc, const POINT* pts, int vertices);
  129. void GUIAPI Circle (HDC hdc, int sx, int sy, int r);
  130. void GUIAPI FillBox (HDC hdc, int x, int y, int w, int h);
  131. #endif
  132.     /** @} end of draw_fns */
  133.     /**
  134.      * defgroup map_fns Mapping Operations
  135.      *
  136.      * The mapping mode defines the unit of measure used to transform 
  137.      * page-space units into device-space units, and also defines 
  138.      * the orientation of the device's x and y axes. 
  139.      *
  140.      * So far, MiniGUI support only two mapping mode: 
  141.      *
  142.      *      - MM_TEXTn
  143.      *        Each logical unit is mapped to on device pixel. 
  144.      *        Positive x is to the right; positive y is down.
  145.      *      - MM_ANISOTROPICn
  146.      *        Logical units are mapped to arbitrary units with arbitrarily scaled axes; 
  147.      *        Use a SetWindowExt and a SetViewportExt functions to specify the units, 
  148.      *        orientation, and scaling required.
  149.      *
  150.      * The following formula shows the math involved in converting a point 
  151.      * from page space to device space:
  152.      *
  153.      * code
  154.      *      Dx = ((Lx - WOx) * VEx / WEx) + VOx
  155.      * endcode
  156.      *
  157.      * The following variables are involved:
  158.      *
  159.      *      - Dx    x value in device units
  160.      *      - Lx    x value in logical units (also known as page space units)
  161.      *      - WO    window x origin
  162.      *      - VO    viewport x origin
  163.      *      - WE    window x-extent
  164.      *      - VE    viewport x-extent
  165.      *
  166.      * The same equation with y replacing x transforms the y component of a point.
  167.      * The formula first offsets the point from its coordinate origin. 
  168.      * This value, no longer biased by the  origin, is then scaled into 
  169.      * the destination coordinate system by the ratio of the extents. 
  170.      * Finally, the scaled value is offset by the destination origin to 
  171.      * its final mapping.
  172.      *
  173.      * @{
  174.      */
  175. #define MM_TEXT               0
  176. #define MM_ANISOTROPIC        1
  177. #ifdef _USE_NEWGAL
  178. /**
  179.  * def GetMapMode(hdc)
  180.  * brief Retrives the current mapping mode of a DC.
  181.  *
  182.  * This function retrives the current mapping mode of the DC a hdc. 
  183.  *
  184.  * So far, MiniGUI support two mapping modes: MM_TEXT and MM_ANISOTROPIC.
  185.  *
  186.  * param hdc The device context.
  187.  * return The current mapping mode, can be either a MM_TEXT or a MM_ANISOTROPIC.
  188.  *
  189.  * note Defined as a macro calling a GetDCAttr for _USE_NEWGAL. 
  190.  *       If _USE_NEWGAL is not defined, a GetMapMode is defined as 
  191.  *       a function, and have the same semantics as this macro.
  192.  *
  193.  * sa SetWindowExt, SetViewportExt, SetMapMode
  194.  */
  195. #define GetMapMode(hdc)         (int)GetDCAttr (hdc, DC_ATTR_MAP_MODE)
  196. /**
  197.  * def SetMapMode(hdc, mapmode)
  198.  * brief Sets the mapping mode of a display context.
  199.  *
  200.  * This function sets the mapping mode of the specified display context a hdc.
  201.  *
  202.  * So far, MiniGUI support two mapping modes: MM_TEXT and MM_ANISOTROPIC.
  203.  *
  204.  * param hdc The device context.
  205.  * param mapmode The new mapping mode, should be either a MM_TEXT or a MM_ANISOTROPIC.
  206.  * return The old mapping mode, either a MM_TEXT or a MM_ANISOTROPIC.
  207.  *
  208.  * note Defined as a macro calling a SetDCAttr for _USE_NEWGAL. 
  209.  *       If _USE_NEWGAL is not defined, a SetMapMode is defined as 
  210.  *       a function, and have the same semantics as this macro.
  211.  *
  212.  * sa SetWindowExt, SetViewportExt, SetMapMode
  213.  */
  214. #define SetMapMode(hdc, mapmode)    (int)SetDCAttr (hdc, DC_ATTR_MAP_MODE, (DWORD)mapmode)
  215. #else
  216. int GUIAPI GetMapMode (HDC hdc);
  217. void GUIAPI SetMapMode (HDC hdc, int mapmode);
  218. #endif /* _USE_NEWGAL */
  219. #ifdef _USE_NEWGAL
  220. /**
  221.  * fn void GUIAPI GetDCLCS (HDC hdc, int which, POINT* pt)
  222.  * brief Retrives mapping parameters of a device context.
  223.  *
  224.  * This function retrives mapping paramters of the specified device context a hdc
  225.  * when the mapping mode is not a MM_TEXT.
  226.  *
  227.  * param hdc The device context.
  228.  * param which Which parameter you want to retrive, can be one of the following values:
  229.  *
  230.  *      - DC_LCS_VORGn
  231.  *        Retrives the x-coordinates and y-coordinates of the viewport origin.
  232.  *      - DC_LCS_VEXTn
  233.  *        Retrives the x-extents and y-extents of the current viewport.
  234.  *      - DC_LCS_WORGn
  235.  *        Retrives the x-coordinates and y-coordinates of the window origin.
  236.  *      - DC_LCS_WEXTn
  237.  *        Retrives the x-extents and y-extents of the window.
  238.  *        
  239.  * param pt The coordinates or extents will be returned through this buffer.
  240.  * 
  241.  * note Only defined for _USE_NEWGAL
  242.  *
  243.  * sa GetMapMode, SetMapMode, SetDCLCS
  244.  */
  245. void GUIAPI GetDCLCS (HDC hdc, int which, POINT* pt);
  246. /**
  247.  * fn void GUIAPI SetDCLCS (HDC hdc, int which, const POINT* pt)
  248.  * brief Sets mapping parameters of a device context.
  249.  *
  250.  * This function sets mapping paramters of the specified device context a hdc
  251.  * when the mapping mode is not a MM_TEXT.
  252.  *
  253.  * param hdc The device context.
  254.  * param which Which parameter you want to retrive, can be one of the following values:
  255.  *
  256.  *      - DC_LCS_VORGn
  257.  *        Sets the x-coordinates and y-coordinates of the viewport origin.
  258.  *      - DC_LCS_VEXTn
  259.  *        Sets the x-extents and y-extents of the current viewport.
  260.  *      - DC_LCS_WORGn
  261.  *        Sets the x-coordinates and y-coordinates of the window origin.
  262.  *      - DC_LCS_WEXTn
  263.  *        Sets the x-extents and y-extents of the window.
  264.  *        
  265.  * param pt The coordinates or extents will be set.
  266.  * 
  267.  * note Only defined for _USE_NEWGAL
  268.  *
  269.  * sa GetMapMode, SetMapMode, GetDCLCS
  270.  */
  271. void GUIAPI SetDCLCS (HDC hdc, int which, const POINT* pt);
  272. #define DC_LCS_VORG     0
  273. #define DC_LCS_VEXT     1
  274. #define DC_LCS_WORG     2
  275. #define DC_LCS_WEXT     3
  276. #define NR_DC_LCS_PTS   4
  277. /**
  278.  * def GetViewportOrg(hdc, pPt)
  279.  * brief Retrieves the x-coordinates and y-coordinates of the viewport origin for a device context.
  280.  *
  281.  * This function retrives the x-coordinates and y-coordinates of 
  282.  * the viewport origin of the specified device context a hdc.
  283.  *
  284.  * param hdc The device context.
  285.  * param pPt The viewport origin will be returned through this buffer.
  286.  *
  287.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  288.  *       If _USE_NEWGAL is not defined, a GetViewportOrg is defined as 
  289.  *       a function, and have the same semantics as this macro.
  290.  *
  291.  * sa GetMapMode, SetViewportOrg
  292.  */
  293. #define GetViewportOrg(hdc, pPt)    GetDCLCS(hdc, DC_LCS_VORG, pPt)
  294. /**
  295.  * def GetViewportExt(hdc, pPt)
  296.  * brief Retrieves the x-extents and y-extents of the current viewport for a device context.
  297.  *
  298.  * This function retrives the x-extents and y-extens of the current viewport of 
  299.  * the specified device context a hdc.
  300.  *
  301.  * param hdc The device context.
  302.  * param pPt The viewport extents will be returned through this buffer.
  303.  *
  304.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  305.  *       If _USE_NEWGAL is not defined, a GetViewportExt is defined as 
  306.  *       a function, and have the same semantics as this macro.
  307.  *
  308.  * sa GetMapMode, SetViewportExt
  309.  */
  310. #define GetViewportExt(hdc, pPt)    GetDCLCS(hdc, DC_LCS_VEXT, pPt)
  311. /**
  312.  * def GetWindowOrg(hdc, pPt)
  313.  * brief Retrieves the x-coordinates and y-coordinates of the window for a device context.
  314.  *
  315.  * This function retrives the x-coordinates and y-coordinates of 
  316.  * the window origin of the specified device context a hdc.
  317.  *
  318.  * param hdc The device context.
  319.  * param pPt The window origin will be returned through this buffer.
  320.  *
  321.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  322.  *       If _USE_NEWGAL is not defined, a GetWindowOrg is defined as 
  323.  *       a function, and have the same semantics as this macro.
  324.  *
  325.  * sa GetMapMode, SetWindowOrg
  326.  */
  327. #define GetWindowOrg(hdc, pPt)      GetDCLCS(hdc, DC_LCS_WORG, pPt)
  328. /**
  329.  * def GetWindowExt(hdc, pPt)
  330.  * brief Retrieves the x-extents and y-extents of the current window for a device context.
  331.  *
  332.  * This function retrives the x-extents and y-extens of the current window of 
  333.  * the specified device context a hdc.
  334.  *
  335.  * param hdc The device context.
  336.  * param pPt The window extents will be returned through this buffer.
  337.  *
  338.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  339.  *       If _USE_NEWGAL is not defined, a GetWindowExt is defined as 
  340.  *       a function, and have the same semantics as this macro.
  341.  *
  342.  * sa GetMapMode, SetWindowExt
  343.  */
  344. #define GetWindowExt(hdc, pPt)      GetDCLCS(hdc, DC_LCS_WEXT, pPt)
  345. /**
  346.  * def SetViewportOrg(hdc, pPt)
  347.  * brief Sets the x-coordinates and y-coordinates of the viewport origin for a device context.
  348.  *
  349.  * This function sets the x-coordinates and y-coordinates of 
  350.  * the viewport origin of the specified device context a hdc.
  351.  *
  352.  * param hdc The device context.
  353.  * param pPt The viewport origin will be set.
  354.  *
  355.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  356.  *       If _USE_NEWGAL is not defined, a SetViewportOrg is defined as 
  357.  *       a function, and have the same semantics as this macro.
  358.  *
  359.  * sa GetMapMode, GetViewportOrg
  360.  */
  361. #define SetViewportOrg(hdc, pPt)    SetDCLCS(hdc, DC_LCS_VORG, pPt)
  362. /**
  363.  * def SetViewportExt(hdc, pPt)
  364.  * brief Sets the x-extents and y-extents of the current viewport for a device context.
  365.  *
  366.  * This function sets the x-extents and y-extens of the current viewport of 
  367.  * the specified device context a hdc.
  368.  *
  369.  * param hdc The device context.
  370.  * param pPt The viewport extents will be set.
  371.  *
  372.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  373.  *       If _USE_NEWGAL is not defined, a SetViewportExt is defined as 
  374.  *       a function, and have the same semantics as this macro.
  375.  *
  376.  * sa GetMapMode, GetViewportExt
  377.  */
  378. #define SetViewportExt(hdc, pPt)    SetDCLCS(hdc, DC_LCS_VEXT, pPt)
  379. /**
  380.  * def SetWindowOrg(hdc, pPt)
  381.  * brief Sets the x-coordinates and y-coordinates of the window for a device context.
  382.  *
  383.  * This function sets the x-coordinates and y-coordinates of 
  384.  * the window origin of the specified device context a hdc.
  385.  *
  386.  * param hdc The device context.
  387.  * param pPt The window origin will be set.
  388.  *
  389.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  390.  *       If _USE_NEWGAL is not defined, a SetWindowOrg is defined as 
  391.  *       a function, and have the same semantics as this macro.
  392.  *
  393.  * sa GetMapMode, GetWindowOrg
  394.  */
  395. #define SetWindowOrg(hdc, pPt)      SetDCLCS(hdc, DC_LCS_WORG, pPt)
  396. /**
  397.  * def SetWindowExt(hdc, pPt)
  398.  * brief Sets the x-extents and y-extents of the current window for a device context.
  399.  *
  400.  * This function sets the x-extents and y-extens of the current window of 
  401.  * the specified device context a hdc.
  402.  *
  403.  * param hdc The device context.
  404.  * param pPt The window extents will be set.
  405.  *
  406.  * note Defined as a macro calling a GetDCLCS for _USE_NEWGAL. 
  407.  *       If _USE_NEWGAL is not defined, a SetWindowExt is defined as 
  408.  *       a function, and have the same semantics as this macro.
  409.  *
  410.  * sa GetMapMode, GetWindowExt
  411.  */
  412. #define SetWindowExt(hdc, pPt)      SetDCLCS(hdc, DC_LCS_WEXT, pPt)
  413. #else
  414. void GUIAPI GetViewportExt (HDC hdc, POINT* pPt);
  415. void GUIAPI GetViewportOrg (HDC hdc, POINT* pPt);
  416. void GUIAPI GetWindowExt (HDC hdc, POINT* pPt);
  417. void GUIAPI GetWindowOrg (HDC hdc, POINT* pPt);
  418. void GUIAPI SetViewportExt (HDC hdc, POINT* pPt);
  419. void GUIAPI SetViewportOrg (HDC hdc, POINT* pPt);
  420. void GUIAPI SetWindowExt (HDC hdc, POINT* pPt);
  421. void GUIAPI SetWindowOrg (HDC hdc, POINT* pPt);
  422. #endif /* _USE_NEWGAL */
  423. /**
  424.  * fn void GUIAPI DPtoLP (HDC hdc, POINT* pPt)
  425.  * brief Converts device coordinates into logical coordinates.
  426.  * 
  427.  * This function converts device coordinates into logical coordinates 
  428.  * in the device context a hdc.
  429.  *
  430.  * The conversion depends on the mapping mode of the display context, 
  431.  * the settings of the origins and extents for the window and viewport. 
  432.  * The x-coordinate and y-coordinate contained in struct a pPt will be 
  433.  * transformed.
  434.  * 
  435.  * param hdc The device context.
  436.  * param pPt The coordinates to be converted, and the transformed coordinates
  437.  *        will be contained in this buffer after the function returns.
  438.  *
  439.  * sa LPtoDP
  440.  */
  441. void GUIAPI DPtoLP (HDC hdc, POINT* pPt);
  442. /**
  443.  * fn void GUIAPI LPtoDP (HDC hdc, POINT* pPt)
  444.  * brief Converts logical coordinates into device coordinates.
  445.  * 
  446.  * This function converts logical coordinates into device coordinates 
  447.  * in the device context a hdc.
  448.  *
  449.  * The conversion depends on the mapping mode of the display context, 
  450.  * the settings of the origins and extents for the window and viewport.
  451.  * The x-coordinate and y-coordinate contained in struct a pPt will be 
  452.  * transformed.
  453.  * 
  454.  * param hdc The device context.
  455.  * param pPt The coordinates to be converted, and the transformed coordinates
  456.  *        will be contained in this buffer after the function returns.
  457.  *
  458.  * sa DPtoLP
  459.  */
  460. void GUIAPI LPtoDP (HDC hdc, POINT* pPt);
  461.     /** @} end of map_fns */
  462.     /**
  463.      * defgroup clip_fns Clipping operations
  464.      * @{
  465.      */
  466. /**
  467.  * fn void GUIAPI ExcludeClipRect (HDC hdc, const RECT* prc)
  468.  * brief Excludes the specified rectangle from the current visible region of a DC.
  469.  *
  470.  * This function excludes the specified rect a prc from the current visible region
  471.  * of the device context a hdc.
  472.  *
  473.  * param hdc The device context.
  474.  * param prc The rectangle to be excluded.
  475.  *
  476.  * sa IncludeClipRect, region_fns
  477.  */
  478. void GUIAPI ExcludeClipRect (HDC hdc, const RECT* prc);
  479. /**
  480.  * fn void GUIAPI IncludeClipRect (HDC hdc, const RECT* prc)
  481.  * brief Includes the specified rectangle to the current visible region of a DC.
  482.  *
  483.  * This function includes the specified rectangle a prc to the current visible region
  484.  * of the device context a hdc.
  485.  *
  486.  * param hdc The device context.
  487.  * param prc The rectangle to be included.
  488.  *
  489.  * sa ExcludeClipRect, region_fns
  490.  */
  491. void GUIAPI IncludeClipRect (HDC hdc, const RECT* prc);
  492. /**
  493.  * fn BOOL GUIAPI PtVisible (HDC hdc, int x, int y)
  494.  * brief Checks whether a point is visible.
  495.  * 
  496.  * This function checks whether the point specified by a (x,y) is visible, i.e.
  497.  * it is within the current visible clipping region of the device context a hdc.
  498.  *
  499.  * param hdc The device context.
  500.  * param x x,y: The coordinates of the point.
  501.  * param y x,y: The coordinates of the point.
  502.  * return TRUE for visible, else for not.
  503.  *
  504.  * sa RectVisible, region_fns
  505.  */
  506. BOOL GUIAPI PtVisible (HDC hdc, int x, int y);
  507. /**
  508.  * fn void GUIAPI ClipRectIntersect (HDC hdc, const RECT* prc)
  509.  * brief Intersects the specified rectangle with the visible region of the DC.
  510.  *
  511.  * This function intersects the specified rectangle a prc with the visible region
  512.  * of the device context a hdc.
  513.  *
  514.  * param hdc The device context.
  515.  * param prc Pointer to the rectangle.
  516.  * 
  517.  * sa IncludeClipRect, ExcludeClipRect, region_fns
  518.  */
  519. void GUIAPI ClipRectIntersect (HDC hdc, const RECT* prc);
  520. /**
  521.  * fn void GUIAPI SelectClipRect (HDC hdc, const RECT* prc)
  522.  * brief Sets the visible region of a DC to be a rectangle. 
  523.  *
  524.  * This function sets the visible region of the device context a hdc 
  525.  * to the rectangle pointed to by a prc.
  526.  *
  527.  * param hdc The device context.
  528.  * param prc Pointer to the rectangle.
  529.  * 
  530.  * sa SelectClipRegion, region_fns
  531.  */
  532. void GUIAPI SelectClipRect (HDC hdc, const RECT* prc);
  533. /**
  534.  * fn void GUIAPI SelectClipRegion (HDC hdc, const CLIPRGN* pRgn)
  535.  * brief Sets the visible region of a DC to be a region. 
  536.  *
  537.  * This function sets the visible region of the device context a hdc 
  538.  * to the region pointed to by a pRgn.
  539.  *
  540.  * param hdc The device context.
  541.  * param pRgn Pointer to the region.
  542.  * 
  543.  * sa SelectClipRect, region_fns
  544.  */
  545. void GUIAPI SelectClipRegion (HDC hdc, const CLIPRGN* pRgn);
  546. /**
  547.  * fn void GUIAPI GetBoundsRect (HDC hdc, RECT* pRect)
  548.  * brief Retrives the bounding rectangle of the current visible region of a DC.
  549.  *
  550.  * This function retrives the bounding rectangle of the current visible region 
  551.  * of the specified device context a hdc, and returned through a pRect.
  552.  *
  553.  * param hdc The device context.
  554.  * param pRect The bounding rectangle will be returned through this buffer.
  555.  *
  556.  * sa region_fns
  557.  */
  558. void GUIAPI GetBoundsRect (HDC hdc, RECT* pRect);
  559. /**
  560.  * fn BOOL GUIAPI RectVisible (HDC hdc, const RECT* pRect)
  561.  * brief Checks whether the specified rectangle is visible.
  562.  *
  563.  * This function checks whether the rectangle pointed to by a pRect is visible, i.e.
  564.  * it is intersected with the current visible region of the device context a hdc.
  565.  *
  566.  * param hdc The device context.
  567.  * param pRect Pointer to the rectangle.
  568.  *
  569.  * sa PtVisible, region_fns
  570.  *
  571.  * Example:
  572.  *
  573.  * include rectvisible.c
  574.  */
  575. BOOL GUIAPI RectVisible (HDC hdc, const RECT* pRect);
  576.     /** @} end of clip_fns */
  577.     /**
  578.      * defgroup bmp_fns BITMAP and blitting operations
  579.      *
  580.      * Example:
  581.      *
  582.      * include blitting.c
  583.      *
  584.      * @{
  585.      */
  586. #ifdef _USE_NEWGAL
  587. /**
  588.  * fn BOOL GUIAPI GetBitmapFromDC (HDC hdc, int x, int y, int w, int h, BITMAP* bmp)
  589.  * brief Gets image box on a DC and saves it into a BITMAP object. 
  590.  *
  591.  * This function gets image box on the specified device context a hdc,
  592.  * and saves the image bits into the BITMAP object pointed to by a bmp. 
  593.  * The image box begins at a (x,y), and is a w wide and a h high. 
  594.  * You must make sure that a bmp->bits is big enough to store the image.
  595.  *
  596.  * param hdc The device context.
  597.  * param x The x coordinate in pixels of upper-left corner of the image box.
  598.  * param y The y coordinate in pixels of upper-left corner of the image box.
  599.  * param w The width of the image box.
  600.  * param h The height of the image box.
  601.  * param bmp The pointer to the BITMAP object.
  602.  *
  603.  * note Only defined for _USE_NEWGAL. If _USE_NEWGAL not defined, there is
  604.  * will be an analogous function called a SaveScreenBox:
  605.  *
  606.  * code
  607.  * void GUIAPI SaveScreenBox (int x, int y, int w, int h, void* vbuf)
  608.  * endcode
  609.  *
  610.  * sa FillBoxWithBitmap, bmp_struct
  611.  */
  612. BOOL GUIAPI GetBitmapFromDC (HDC hdc, int x, int y, int w, int h, BITMAP* bmp);
  613. #else
  614. void GUIAPI SaveScreenBox (int x, int y, int w, int h, void* vbuf);
  615. void* GUIAPI SaveCoveredScreenBox (int x, int y, int w, int h);
  616. void GUIAPI PutSavedBoxOnScreen (int x, int y, int w, int h, void* vbuf);
  617. void GUIAPI PutSavedBoxOnDC (HDC hdc, int x, int y, int w, int h, void* vbuf);
  618. void GUIAPI ScreenCopy (int sx, int sy, HDC hdc, int dx, int dy);
  619. #endif /* _USE_NEWGAL */
  620. /**
  621.  * fn BOOL GUIAPI FillBoxWithBitmap (HDC hdc, int x, int y, int w, int h, const BITMAP *bmp)
  622.  * brief Fills a box with a BITMAP object.
  623.  *
  624.  * This function fills a box with a BITMAP object pointed to by a bmp. 
  625.  * a (x,y) is the upper-left corner of the box, and a w, a h are 
  626.  * the width and the height of the box respectively. 
  627.  *
  628.  * This function will scale the bitmap when necessary; that is, when 
  629.  * the width or the height of the box is not equal to the with or 
  630.  * the height of the BITMAP object.
  631.  *
  632.  * param hdc The device context.
  633.  * param x The x coordinate of the upper-left corner of the box.
  634.  * param y The y coordinate of the upper-left corner of the box.
  635.  * param w The width of the box. Can be zero, means the width
  636.  *        or the height will be equal to the width or the height of the BITMAP object.
  637.  * param h The height of the box. Can be zero, means the width
  638.  *        or the height will be equal to the width or the height of the BITMAP object.
  639.  * param bmp The pointer to the BITMAP object.
  640.  * return TRUE on success, otherwise FALSE.
  641.  *
  642.  * note You can specify the alpha value or the color key of the BITMAP object if 
  643.  * _USE_NEWGAL defined, and the current raster operation was set by a SetRasterOperation 
  644.  * for the DC will override the alpha value of color key if ROP is not ROP_SET.
  645.  * If _USE_NEWGAL is not defined, this function will not return anything, and
  646.  * you can not specify the alpha value and the color key of the BITMAP object.
  647.  *
  648.  * sa FillBoxWithBitmapPart, GetBitmapFromDC, bmp_load_fns
  649.  */
  650. BOOL GUIAPI FillBoxWithBitmap (HDC hdc, int x, int y, int w, int h,
  651.                 const BITMAP *bmp);
  652. /**
  653.  * fn BOOL GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h, int bw, int bh, const BITMAP* bmp, int xo, int yo)
  654.  * brief Fills a box with a part of a bitmap oject.
  655.  *
  656.  * This function fills a box with a part of a bitmap object pointed to by a bmp. 
  657.  * a (x,y) is the upper-left corner of the box, and a w, a h are the width and 
  658.  * the height of the box respectively. a (xo, yo) is the start position of the 
  659.  * part box in the bitmap relative to upper-left corner of the bitmap, 
  660.  * and a bw, a bh are the width and the height of the full bitmap expected. 
  661.  *
  662.  * If a bw or a bh is less than or equal to zero, this function will use 
  663.  * the original width and height of the bitmap, else it will scale 
  664.  * the BITMAP object when necessary; that is, when the width or the height of 
  665.  * the box is not equal to the with or the height of the BITMAP object.
  666.  *
  667.  * param hdc The device context.
  668.  * param x The x coordinate of the upper-left corner of the box.
  669.  * param y The y coordinate of the upper-left corner of the box.
  670.  * param w The width of the box. 
  671.  * param h The height of the box. 
  672.  * param bw The width of the full bitmap expected. 
  673.  *        Can be zero, means the width or the height will be equal to 
  674.  *        the width or the height of the BITMAP object.
  675.  * param bh The height of the full bitmap expected. 
  676.  *        Can be zero, means the width or the height will be equal to 
  677.  *        the width or the height of the BITMAP object.
  678.  * param xo xo,yo: The start position of the part box in the bitmap 
  679.  *        relative to upper-left corner of the BITMAP object.
  680.  * param yo xo,yo: The start position of the part box in the bitmap 
  681.  *        relative to upper-left corner of the BITMAP object.
  682.  * param bmp The pointer to the BITMAP object.
  683.  * return TRUE on success, otherwise FALSE.
  684.  *
  685.  * note You can specify the alpha value or the color key of the BITMAP object if 
  686.  *       _USE_NEWGAL defined, and the current raster operation was set by 
  687.  *       a SetRasterOperation for the DC will override the alpha value or 
  688.  *       the color key if ROP is not ROP_SET. If _USE_NEWGAL not defined, 
  689.  *       this function will not return anything, and you can not specify 
  690.  *       the alpha value and the color key of the BITMAP object.
  691.  *
  692.  * sa FillBoxWithBitmap, GetBitmapFromDC, bmp_struct
  693.  */
  694. BOOL GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h,
  695.                 int bw, int bh, const BITMAP* bmp, int xo, int yo);
  696. /**
  697.  * fn void GUIAPI BitBlt (HDC hsdc, int sx, int sy, int sw, int sh, HDC hddc, int dx, int dy, DWORD dwRop)
  698.  * brief Performs a bit-block transfer from a device context into another device context.
  699.  *
  700.  * This function performs a bit-block transfer of the color data cooresponding to 
  701.  * a rectangle of pixels from the specified source device context a hsdc into 
  702.  * a destination device context a hddc. a (sx,sy,sw,sh) specifies the rectangle 
  703.  * in the source DC, and a (dx,dy) specifies the position of the rectangle 
  704.  * in the destination DC. Note that the size of the two rectangles are identical.
  705.  *
  706.  * Note that all coordinates should be in the device space.
  707.  *
  708.  * param hsdc The source device context.
  709.  * param sx The x coordinate of the upper-left corner of the rectangle in the source DC.
  710.  * param sy The y coordinate of the upper-left corner of the rectangle in the source DC.
  711.  * param sw The width of the source rectangle.
  712.  * param sh The height of the source rectangle.
  713.  * param hddc The destination device context a hddc.
  714.  * param dx The x coordinate of the upper-left corner of the rectangle in the destination DC.
  715.  * param dy The y coordinate of the upper-left corner of the rectangle in the destination DC.
  716.  * param dwRop The raster operation, currently ignored.
  717.  *
  718.  * note If _USE_NEWGAL defined, the alpha and color key settings of the source DC 
  719.  *       will come into play.
  720.  *
  721.  * sa StretchBlt, SetMemDCAlpha, SetMemDCColorKey
  722.  */
  723. void GUIAPI BitBlt (HDC hsdc, int sx, int sy, int sw, int sh, 
  724.                 HDC hddc, int dx, int dy, DWORD dwRop);
  725. /**
  726.  * fn void GUIAPI StretchBlt (HDC hsdc, int sx, int sy, int sw, int sh, HDC hddc, int dx, int dy, int dw, int dh, DWORD dwRop)
  727.  * brief Copies a bitmap from a source rectangle into a destination rectangle, streches the bitmap if necessary.
  728.  *
  729.  * This function copies a bitmap from a source rectangle into a destination rectangle, 
  730.  * streching or compressing the bitmap to fit the dimension of the destination rectangle, 
  731.  * if necessary. This function is similar with sa BitBlt function except the former scaling the bitmap. 
  732.  * a (dw,dh) specifies the size of the destination rectangle.
  733.  * 
  734.  * param hsdc The source device context.
  735.  * param sx The x coordinate of the upper-left corner of the rectangle in the source DC.
  736.  * param sy The y coordinate of the upper-left corner of the rectangle in the source DC.
  737.  * param sw The width of the source rectangle.
  738.  * param sh The height of the source rectangle.
  739.  * param hddc The destination device context a hddc.
  740.  * param dx The x coordinate of the upper-left corner of the rectangle in the destination DC.
  741.  * param dy The y coordinate of the upper-left corner of the rectangle in the destination DC.
  742.  * param dw The width of the destination rectangle.
  743.  * param dh The height of the destination rectangle.
  744.  * param dwRop The raster operation, currently ignored.
  745.  *
  746.  * note The source rect should be contained in the device space entirely,
  747.  * and all coordinates should be in the device space.
  748.  *
  749.  * note The alpha and color key settings of the source DC will not come into play.
  750.  * 
  751.  * sa BitBlt, SetMemDCAlpha, SetMemDCColorKey
  752.  */
  753. void GUIAPI StretchBlt (HDC hsdc, int sx, int sy, int sw, int sh, 
  754.                 HDC hddc, int dx, int dy, int dw, int dh, DWORD dwRop);
  755. /**
  756.  * fn BOOL GUIAPI ScaleBitmap (BITMAP* dst, const BITMAP* src)
  757.  * brief Scales a BITMAP object into another BITMAP object by using DDA algorithm.
  758.  *
  759.  * This function scales a BITMAP object a src into another BITMAO object a dst
  760.  * by using DDA algorithm. The source rectangle and the destination rectangle 
  761.  * both are defined in the BITMAP objects.
  762.  *
  763.  * param dst The destination BITMAP object.
  764.  * param src The srouce BITMAP object.
  765.  * return TRUE on success, otherwise FALSE.
  766.  *
  767.  * note Only defined for _USE_NEWGAL.
  768.  *
  769.  * sa FillBoxWithBitmap, StretchBlt, bmp_struct
  770.  */
  771. BOOL GUIAPI ScaleBitmap (BITMAP* dst, const BITMAP* src);
  772. /**
  773.  * fn gal_pixel GUIAPI GetPixelInBitmap (const BITMAP* bmp, int x, int y)
  774.  * brief Returns the pixel value in a BITMAP object.
  775.  *
  776.  * This function returns the pixel value at the position a (x,y) in 
  777.  * the BITMAP object a bmp.
  778.  *
  779.  * param bmp The BITMAP object.
  780.  * param x x,y: The position of the pixel in the bitmap relative to 
  781.  *        the upper-left corner of the bitmap.
  782.  * param y x,y: The position of the pixel in the bitmap relative to 
  783.  *        the upper-left corner of the bitmap.
  784.  * return The pixel value, if the position is out of the bitmap,
  785.  *         zero returned.
  786.  *
  787.  * note Only defined for _USE_NEWGAL.
  788.  *
  789.  * sa SetPixelInBitmap, bmp_struct
  790.  */
  791. gal_pixel GUIAPI GetPixelInBitmap (const BITMAP* bmp, int x, int y);
  792. /**
  793.  * fn BOOL GUIAPI SetPixelInBitmap (const BITMAP* bmp, int x, int y, gal_pixel pixel)
  794.  * brief Sets pixel value in a BITMAP object.
  795.  *
  796.  * This function sets the pixel value at the position a (x,y) in 
  797.  * the BITMAP object a bmp.
  798.  *
  799.  * param bmp The BITMAP object.
  800.  * param x x,y: The position of the pixel in the bitmap relative to 
  801.  *        the upper-left corner of the bitmap.
  802.  * param y x,y: The position of the pixel in the bitmap relative to 
  803.  *        the upper-left corner of the bitmap.
  804.  * param pixel The pixel value.
  805.  * return TRUE on success. If the position is out of the bitmap, FALSE returned.
  806.  *
  807.  * note Only defined for _USE_NEWGAL.
  808.  *
  809.  * sa GetPixelInBitmap, bmp_struct
  810.  */
  811. BOOL GUIAPI SetPixelInBitmap (const BITMAP* bmp, int x, int y, gal_pixel pixel);
  812. #ifdef _MISC_SAVESCREEN
  813. /**
  814.  * fn BOOL GUIAPI SaveMainWindowContent (HWND hWnd, const char* filename)
  815.  * brief Saves content of a main window to a file.
  816.  *
  817.  * This function saves the content of the main window a hWnd to the iamge file a filename.
  818.  * MiniGUI uses the extension name of the file to determine the format of the image file.
  819.  *
  820.  * param hWnd Handle to the main window.
  821.  * param filename The name of the iamge file.
  822.  * return TRUE on success, otherwise FALSE.
  823.  *
  824.  * note Only defined for _MISC_SAVESCREEN.
  825.  *
  826.  * sa bmp_load_fns
  827.  */
  828. BOOL GUIAPI SaveMainWindowContent (HWND hWnd, const char* filename);
  829. #endif
  830.     /** @} end of bmp_fns */
  831.     /**
  832.      * defgroup icon_fns Icon operations
  833.      * @{
  834.      */
  835. /**
  836.  * fn HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which)
  837.  * brief Loads an icon from a Windows ICO file.
  838.  *
  839.  * This function loads an icon from a Windows ICO file named a filename 
  840.  * and creates an icon object. This function can load mono- and 16-color icons. 
  841.  * Some Windows ICO file contain two icons in different sizes. You can tell 
  842.  * this function to load which icon though a which, 0 for the first icon, 
  843.  * and 1 for the second icon. Generally, the later icon is the larger icon.
  844.  *
  845.  * param hdc The device context.
  846.  * param filename The file name of the ICO file.
  847.  * param which Tell the function to load which icon.
  848.  * return The handle to the icon object, zero means error occurred.
  849.  *
  850.  * sa CreateIcon
  851.  */
  852. HICON GUIAPI LoadIconFromFile (HDC hdc, const char* filename, int which);
  853. /**
  854.  * fn HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which)
  855.  * brief Loads an icon from a memory area.
  856.  *
  857.  * This function loads an icon from a memroy area pointed to by a area.
  858.  * The memory area has the same layout as the M$ Windows ICO file.
  859.  *
  860.  * This function can load mono- and 16-color icons. 
  861.  * Some Windows ICO file contain two icons in different sizes. You can tell 
  862.  * this function to load which icon though a which, 0 for the first icon, 
  863.  * and 1 for the second icon. Generally, the later icon is the larger icon.
  864.  *
  865.  * param hdc The device context.
  866.  * param area The pointer to the memory area.
  867.  * param which Tell the function to load which icon.
  868.  * return The handle to the icon object, zero means error occurred.
  869.  *
  870.  * sa CreateIcon
  871.  */
  872. HICON GUIAPI LoadIconFromMem (HDC hdc, const void* area, int which);
  873. /**
  874.  * fn HICON GUIAPI CreateIcon (HDC hdc, int w, int h, const BYTE* AndBits, const BYTE* XorBits, int colornum)
  875.  * brief Creates an icon object from the memory.
  876.  *
  877.  * This function creates an icon from memory data rather than icon file. 
  878.  * a w and a h are the width and the height of the icon respectively. 
  879.  * a pANDBits and a pXORBits are AND bitmask and XOR bitmask of the icon. 
  880.  * MiniGUI currently support mono-color cursor and 16-color icon, a colornum 
  881.  * specifies the cursor's color depth. For mono-color, it should be 1, and for
  882.  * 16-color cursor, it should be 4.
  883.  *
  884.  * param hdc The device context.
  885.  * param w The width of the icon.
  886.  * param h The height of the icon.
  887.  * param AndBits The pointer to the AND bits of the icon.
  888.  * param XorBits The pointer to the XOR bits of the icon.
  889.  * param colornum The bit-per-pixel of XOR bits.
  890.  * return The handle to the icon object, zero means error occurred.
  891.  *
  892.  * sa LoadIconFromFile
  893.  */
  894. HICON GUIAPI CreateIcon (HDC hdc, int w, int h, 
  895.                         const BYTE* AndBits, const BYTE* XorBits, int colornum);
  896. /**
  897.  * fn BOOL GUIAPI DestroyIcon (HICON hicon)
  898.  * brief Destroys an icon object.
  899.  *
  900.  * This function destroys the icon object a hicon.
  901.  *
  902.  * param hicon The icon object.
  903.  * return TRUE on success, otherwise FALSE.
  904.  *
  905.  * sa CreateIcon, LoadIconFromFile
  906.  */
  907. BOOL GUIAPI DestroyIcon (HICON hicon);
  908. /**
  909.  * fn BOOL GUIAPI GetIconSize (HICON hicon, int* w, int* h)
  910.  * brief Gets the size of an icon object.
  911.  *
  912.  * This function gets the size of the icon object a hicon.
  913.  *
  914.  * param hicon The icon object.
  915.  * param w The width of the icon will be returned throught this buffer.
  916.  * param h The height of the icon will be returned throught this buffer.
  917.  * return TRUE on success, otherwise FALSE.
  918.  *
  919.  * sa CreateIcon, LoadIconFromFile
  920.  */
  921. BOOL GUIAPI GetIconSize (HICON hicon, int* w, int* h);
  922. /**
  923.  * fn void GUIAPI DrawIcon (HDC hdc, int x, int y, int w, int h, HICON hicon)
  924.  * brief Draws an icon into a box.
  925.  *
  926.  * This function draws an icon object a hicon into a box specified by a (x,y,w,h).
  927.  *
  928.  * param hdc The device context.
  929.  * param x The x coordinate of the upper-left corner of the box.
  930.  * param y The y coordinate of the upper-left corner of the box.
  931.  * param w The width of the box.
  932.  * param h The height of the box.
  933.  * param hicon The icon object.
  934.  *
  935.  * sa CreateIcon, LoadIconFromFile
  936.  */
  937. void GUIAPI DrawIcon (HDC hdc, int x, int y, int w, int h, HICON hicon);
  938.     /** @} end of icon_fns */
  939.     /**
  940.      * defgroup rect_fns Rectangle operations
  941.      * @{
  942.      */
  943. #ifdef _USE_NEWGAL
  944. /**
  945.  * fn void SetRect (RECT* prc, int left, int top, int right, int bottom)
  946.  * brief Sets a rectangle.
  947.  *
  948.  * This function sets the rectangle with specified values.
  949.  *
  950.  * param prc The pointer to the rectangle.
  951.  * param left The x coordinate of the upper-left corner of the rectangle.
  952.  * param top The y coordinate of the upper-left corner of the rectangle.
  953.  * param right The x coordinate of the lower-right corner of the rectangle.
  954.  * param bottom The y coordinate of the lower-right corner of the rectangle.
  955.  *
  956.  * note Defined as an inline function for _USE_NEWGAL. 
  957.  *
  958.  * sa SetRectEmpty
  959.  */
  960. static inline void SetRect (RECT* prc, int left, int top, int right, int bottom)
  961. {
  962.     (prc)->left = left; (prc)->top = top; (prc)->right = right; (prc)->bottom = bottom;
  963. }
  964. /**
  965.  * fn void SetRectEmpty (RECT* prc)
  966.  * brief Empties a rectangle.
  967.  *
  968.  * This function empties the rectangle pointed to by a prc. 
  969.  * An empty rectangle in MiniGUI is a rectangle whose width and height both are zero. 
  970.  * This function will sets all coordinates of the rectangle to be zero.
  971.  *
  972.  * param prc The pointer to the rectangle.
  973.  *
  974.  * note Defined as an inline function for _USE_NEWGAL. 
  975.  *
  976.  * sa SetRect
  977.  */
  978. static inline void SetRectEmpty (RECT* prc)
  979. {
  980.     (prc)->left = (prc)->top = (prc)->right = (prc)->bottom = 0;
  981. }
  982. /**
  983.  * fn void CopyRect (RECT* pdrc, const RECT* psrc)
  984.  * brief Copies one rectangle to another.
  985.  *
  986.  * This function copies the coordinates of the source rectangle 
  987.  * pointed to by a psrc to the destination rectangle pointed to by a pdrc.
  988.  *
  989.  * param pdrc The pointer to the destination rectangle.
  990.  * param psrc The pointer to the source rectangle.
  991.  *
  992.  * note Defined as an inline function for _USE_NEWGAL. 
  993.  *
  994.  * sa SetRect
  995.  */
  996. static inline void CopyRect (RECT* pdrc, const RECT* psrc)
  997. {
  998.     (pdrc)->left = (psrc)->left; (pdrc)->top = (psrc)->top;
  999.     (pdrc)->right = (psrc)->right; (pdrc)->bottom = (psrc)->bottom;
  1000. }
  1001. /**
  1002.  * fn void OffsetRect (RECT* prc, int x, int y)
  1003.  * brief Moves a rectangle by offsets.
  1004.  *
  1005.  * This function moves the specified rectangle by the specified offsets. 
  1006.  * a x and a y specify the amount to move the rectangle left/right or up/down 
  1007.  * respectively. a x must be a negative value to move the rectangle to
  1008.  * the left, and a y must be a negative value to move the rectangle up.
  1009.  *
  1010.  * param prc The pointer to the rectangle.
  1011.  * param x The x offset.
  1012.  * param y The y offset.
  1013.  *
  1014.  * note Defined as an inline function for _USE_NEWGAL. 
  1015.  *
  1016.  * sa InflateRect
  1017.  */
  1018. static inline void OffsetRect (RECT* prc, int x, int y)
  1019. {
  1020.     (prc)->left += x; (prc)->top += y; (prc)->right += x; (prc)->bottom += y;
  1021. }
  1022. /**
  1023.  * fn void InflateRect (RECT* prc, int cx, int cy)
  1024.  * brief Increases or decreases the width and height of an rectangle.
  1025.  *
  1026.  * This function increases or decreases the width and height of 
  1027.  * the specified rectangle a prc. This function adds a cx units 
  1028.  * to the left and right ends of the rectangle and a cy units to the 
  1029.  * top and bottom. the cx and cy are signed values; positive values 
  1030.  * increases the width and height, and negative values decreases them.
  1031.  *
  1032.  * param prc The pointer to the rectangle.
  1033.  * param cx The inflating x value.
  1034.  * param cy The inflating y value.
  1035.  *
  1036.  * note Defined as an inline function for _USE_NEWGAL. 
  1037.  *
  1038.  * sa InflateRectToPt
  1039.  */
  1040. static inline void InflateRect (RECT* prc, int cx, int cy)
  1041. {
  1042.     (prc)->left -= cx; (prc)->top -= cy; (prc)->right += cx; (prc)->bottom += cy;
  1043. }
  1044. /**
  1045.  * fn void InflateRectToPt (RECT* prc, int x, int y)
  1046.  * brief Inflates a rectangle to contain a point.
  1047.  *
  1048.  * This function inflates the rectangle a prc to contain the specified point a (x,y).
  1049.  *
  1050.  * param prc The pointer to the rectangle.
  1051.  * param x x,y: The point.
  1052.  * param y x,y: The point.
  1053.  *
  1054.  * note Defined as an inline function for _USE_NEWGAL. 
  1055.  *
  1056.  * sa InflateRect
  1057.  */
  1058. static inline void InflateRectToPt (RECT* prc, int x, int y)
  1059. {
  1060.     if ((x) < (prc)->left) (prc)->left = (x); 
  1061.     if ((y) < (prc)->top) (prc)->top = (y);
  1062.     if ((x) > (prc)->right) (prc)->right = (x);
  1063.     if ((y) > (prc)->bottom) (prc)->bottom = (y);
  1064. }
  1065. /**
  1066.  * fn BOOL PtInRect(const RECT* prc, int x, int y)
  1067.  * brief Determines whether a point lies within an rectangle.
  1068.  *
  1069.  * This function determines whether the specified point a (x,y) lies within 
  1070.  * the specified rectangle a prc.
  1071.  *
  1072.  * A point is within a rectangle if it lies on the left or top side or is 
  1073.  * within all four sides. A point on the right or bottom side is considered 
  1074.  * outside the rectangle.
  1075.  *
  1076.  * param prc The pointer to the rectangle.
  1077.  * param x x,y: The point.
  1078.  * param y x,y: The point.
  1079.  *
  1080.  * note Defined as an inline function for _USE_NEWGAL. 
  1081.  */
  1082. static inline BOOL PtInRect(const RECT* prc, int x, int y)
  1083. {
  1084.     if (x >= prc->left && x < prc->right && y >= prc->top && y < prc->bottom)
  1085.         return TRUE;
  1086.     return FALSE;
  1087. }
  1088. #else
  1089. void GUIAPI SetRect (RECT* prc, int left, int top, int right, int bottom);
  1090. void GUIAPI SetRectEmpty (RECT* prc);
  1091. void GUIAPI CopyRect (RECT* pdrc, const RECT* psrc);
  1092. void GUIAPI OffsetRect (RECT* prc, int x, int y);
  1093. void GUIAPI InflateRect (RECT* prc, int cx, int cy);
  1094. void GUIAPI InflateRectToPt (RECT* prc, int x, int y);
  1095. BOOL GUIAPI PtInRect (const RECT* prc, int x, int y);
  1096. #endif
  1097. /**
  1098.  * fn BOOL GUIAPI IsRectEmpty (const RECT* prc)
  1099.  * brief Determines whether an rectangle is empty.
  1100.  *
  1101.  * This function determines whether the specified rectangle a prc is empty. 
  1102.  * An empty rectangle is one that has no area; that is, the coordinates 
  1103.  * of the right side is equal to the coordinate of the left side, or the
  1104.  * coordinates of the bottom side is equal to the coordinate of the top side.
  1105.  *
  1106.  * param prc The pointer to the rectangle.
  1107.  * return TRUE for empty, otherwise FALSE.
  1108.  */
  1109. BOOL GUIAPI IsRectEmpty (const RECT* prc);
  1110. /**
  1111.  * fn BOOL GUIAPI EqualRect (const RECT* prc1, const RECT* prc2)
  1112.  * brief Determines whether two rectangles are equal.
  1113.  *
  1114.  * This function determines whether the two specified rectangles 
  1115.  * (a prc1 and a prc2) are equal by comparing the coordinates of 
  1116.  * the upper-left and lower-right corners.
  1117.  *
  1118.  * param prc1 The pointers to the first rectangles.
  1119.  * param prc2 The pointers to the second rectangles.
  1120.  * return TRUE for equal, otherwise FALSE.
  1121.  */
  1122. BOOL GUIAPI EqualRect (const RECT* prc1, const RECT* prc2);
  1123. /**
  1124.  * fn void GUIAPI NormalizeRect (RECT* pRect)
  1125.  * brief Normalizes a rectangle.
  1126.  *
  1127.  * This function normalizes the rectangle pointed to by a prc 
  1128.  * so that both the height and width are positive.
  1129.  *
  1130.  * param pRect The pointer to the rectangle.
  1131.  */
  1132. void GUIAPI NormalizeRect (RECT* pRect);
  1133. /**
  1134.  * fn BOOL GUIAPI IntersectRect (RECT* pdrc, const RECT* psrc1, const RECT* psrc2)
  1135.  * brief Calculates the intersection of two rectangles.
  1136.  *
  1137.  * This function calculates the intersection of two source rectangles (a psrc1 and a psrc2) 
  1138.  * and places the coordinates of the intersection rectangle into the destination rectangle
  1139.  * pointed to by a pdrc. If the source rectangles do not intersect, and empty rectangle 
  1140.  * (in which all coordinates are set to zero) is placed into the destination rectangle.
  1141.  *
  1142.  * param pdrc The pointer to the destination rectangle.
  1143.  * param psrc1 The first source rectangles.
  1144.  * param psrc2 The second source rectangles.
  1145.  * return TRUE if the source rectangles intersect, otherwise FALSE.
  1146.  *
  1147.  * sa DoesIntersect, IsCovered
  1148.  */
  1149. BOOL GUIAPI IntersectRect (RECT* pdrc, const RECT* psrc1, const RECT* psrc2);
  1150. /**
  1151.  * fn BOOL GUIAPI IsCovered (const RECT* prc1, const RECT* prc2)
  1152.  * brief Determines whether one rectangle is covered by another.
  1153.  *
  1154.  * This function determines whether one rectangle (a prc1) 
  1155.  * is covered by another rectangle (a prc2).
  1156.  *
  1157.  * param prc1 The first rectangles.
  1158.  * param prc2 The second rectangles.
  1159.  * return TRUE if the first rectangle is covered by the second, otherwise FALSE.
  1160.  *
  1161.  * sa DoesIntersect
  1162.  */
  1163. BOOL GUIAPI IsCovered (const RECT* prc1, const RECT* prc2);
  1164. /**
  1165.  * fn BOOL GUIAPI DoesIntersect (const RECT* psrc1, const RECT* psrc2)
  1166.  * brief Determines whether two rectangles intersect.
  1167.  *
  1168.  * This function determines whether two rectangles (a psrc1 and a psrc2) intersect.
  1169.  *
  1170.  * param psrc1 The first source rectangles.
  1171.  * param psrc2 The second source rectangles.
  1172.  * return TRUE if the source rectangles intersect, otherwise FALSE.
  1173.  *
  1174.  * sa IntersectRect
  1175.  */
  1176. BOOL GUIAPI DoesIntersect (const RECT* psrc1, const RECT* psrc2);
  1177. /**
  1178.  * fn BOOL GUIAPI UnionRect (RECT* pdrc, const RECT* psrc1, const RECT* psrc2)
  1179.  * brief Unions two source rectangles.
  1180.  *
  1181.  * This function creates the union (a pdrc) of two rectangles (a psrc1 and a psrc2),
  1182.  * if the source rectangles are border upon and not stagger.
  1183.  *
  1184.  * param pdrc The unioned rectangle.
  1185.  * param psrc1 The first source rectangles.
  1186.  * param psrc2 The second source rectangles.
  1187.  * return TRUE if the source rectangles are border upon and not stagger, otherwise FALSE.
  1188.  *
  1189.  * sa GetBoundRect
  1190.  */
  1191. BOOL GUIAPI UnionRect (RECT* pdrc, const RECT* psrc1, const RECT* psrc2);
  1192. /**
  1193.  * fn void GUIAPI GetBoundRect (PRECT pdrc,  const RECT* psrc1, const RECT* psrc2)
  1194.  * brief Gets the bound rectangle of two source rectangles.
  1195.  *
  1196.  * This function creates the bound rect (a pdrc) of two rectangles (a psrc1 and a prsrc2). 
  1197.  * The bound rect is the smallest rectangle that contains both source rectangles.
  1198.  *
  1199.  * param pdrc The destination rectangle.
  1200.  * param psrc1 The first source rectangle.
  1201.  * param psrc2 The second source rectangle.
  1202.  *
  1203.  * sa UnionRect
  1204.  */
  1205. void GUIAPI GetBoundRect (PRECT pdrc,  const RECT* psrc1, const RECT* psrc2);
  1206. /**
  1207.  * fn int GUIAPI SubtractRect (RECT* rc, const RECT* psrc1, const RECT* psrc2)
  1208.  * brief Obtains the rectangles when substracting one rectangle from another.
  1209.  *
  1210.  * This function obtains the rectangles substracting the rectangle a psrc1 
  1211.  * from the other a psrc2. a rc should be an array of RECT struct, and 
  1212.  * may contain at most four rectangles. This function returns 
  1213.  * the number of result rectangles.
  1214.  *
  1215.  * param rc The pointer to the resule rectangle array.
  1216.  * param psrc1 The pointer to the minuend rectangle.
  1217.  * param psrc2 The pointer to the subtrahend rectangle.
  1218.  * return The number of result rectangles.
  1219.  *
  1220.  * sa UnionRect
  1221.  */
  1222. int GUIAPI SubtractRect (RECT* rc, const RECT* psrc1, const RECT* psrc2);
  1223. /**
  1224.  * def RECTWP(prc)
  1225.  * brief Gets the width of a RECT object by using the pointer to it.
  1226.  */
  1227. #define RECTWP(prc)  (prc->right - prc->left)
  1228. /**
  1229.  * def RECTHP(prc)
  1230.  * brief Gets the height of a RECT object by using the pointer to it.
  1231.  */
  1232. #define RECTHP(prc)  (prc->bottom - prc->top)
  1233. /**
  1234.  * def RECTW(rc)
  1235.  * brief Gets the width of a RECT object.
  1236.  */
  1237. #define RECTW(rc)    (rc.right - rc.left)
  1238. /**
  1239.  * def RECTH(rc)
  1240.  * brief Gets the height of a RECT object.
  1241.  */
  1242. #define RECTH(rc)    (rc.bottom - rc.top)
  1243.     /** @} end of rect_fns */
  1244.     /**
  1245.      * defgroup font_fns Logical font operations
  1246.      *
  1247.      * MiniGUI uses logical font to render text in a DC. You can create a logical
  1248.      * font by using a CreateLogFont and select it into a DC by using a SelectFont,
  1249.      * then you can use this logical font to render text by using a TextOutLen or a DrawTextEx.
  1250.      *
  1251.      * @{
  1252.      */
  1253. /* Font-related structures */
  1254. #define LEN_FONT_NAME               15
  1255. #define LEN_DEVFONT_NAME            79
  1256. #define LEN_UNIDEVFONT_NAME         127
  1257. #define FONT_WEIGHT_NIL             ''
  1258. #define FONT_WEIGHT_ALL             '*'
  1259. #define FONT_WEIGHT_BLACK           'c'
  1260. #define FONT_WEIGHT_BOLD            'b'
  1261. #define FONT_WEIGHT_BOOK            'k'
  1262. #define FONT_WEIGHT_DEMIBOLD        'd'
  1263. #define FONT_WEIGHT_LIGHT           'l'
  1264. #define FONT_WEIGHT_MEDIUM          'm'
  1265. #define FONT_WEIGHT_REGULAR         'r'
  1266. #define FS_WEIGHT_MASK              0x000000FF
  1267. #define FS_WEIGHT_BLACK             0x00000001
  1268. #define FS_WEIGHT_BOLD              0x00000002
  1269. #define FS_WEIGHT_BOOK              0x00000004
  1270. #define FS_WEIGHT_DEMIBOLD          0x00000006 /* BOOK | BOLD */
  1271. #define FS_WEIGHT_LIGHT             0x00000010
  1272. #define FS_WEIGHT_MEDIUM            0x00000020
  1273. #define FS_WEIGHT_REGULAR           0x00000000
  1274. #define FONT_SLANT_NIL              ''
  1275. #define FONT_SLANT_ALL              '*'
  1276. #define FONT_SLANT_ITALIC           'i'
  1277. #define FONT_SLANT_OBLIQUE          'o'
  1278. #define FONT_SLANT_ROMAN            'r'
  1279. #define FS_SLANT_MASK               0x00000F00
  1280. #define FS_SLANT_ITALIC             0x00000100
  1281. #define FS_SLANT_OBLIQUE            0x00000200
  1282. #define FS_SLANT_ROMAN              0x00000000
  1283. #define FONT_SETWIDTH_NIL           ''
  1284. #define FONT_SETWIDTH_ALL           '*'
  1285. #define FONT_SETWIDTH_BOLD          'b'
  1286. #define FONT_SETWIDTH_CONDENSED     'c'
  1287. #define FONT_SETWIDTH_SEMICONDENSED 's'
  1288. #define FONT_SETWIDTH_NORMAL        'n'
  1289. #define FS_SETWIDTH_MASK            0x0000F000
  1290. #define FS_SETWIDTH_BOLD            0x00001000
  1291. #define FS_SETWIDTH_CONDENSED       0x00002000
  1292. #define FS_SETWIDTH_SEMICONDENSED   0x00004000
  1293. #define FS_SETWIDTH_NORMAL          0x00000000
  1294. #define FONT_SPACING_NIL            ''
  1295. #define FONT_SPACING_ALL            '*'
  1296. #define FONT_SPACING_MONOSPACING    'm'
  1297. #define FONT_SPACING_PROPORTIONAL   'p'
  1298. #define FONT_SPACING_CHARCELL       'c'
  1299. #define FS_SPACING_MASK             0x000F0000
  1300. #define FS_SPACING_MONOSPACING      0x00010000
  1301. #define FS_SPACING_PROPORTIONAL     0x00020000
  1302. #define FS_SPACING_CHARCELL         0x00000000
  1303. #define FONT_UNDERLINE_NIL          ''
  1304. #define FONT_UNDERLINE_ALL          '*'
  1305. #define FONT_UNDERLINE_LINE         'u'
  1306. #define FONT_UNDERLINE_NONE         'n'
  1307. #define FS_UNDERLINE_MASK           0x00F00000
  1308. #define FS_UNDERLINE_LINE           0x00100000
  1309. #define FS_UNDERLINE_NONE           0x00000000
  1310. #define FONT_STRUCKOUT_NIL          ''
  1311. #define FONT_STRUCKOUT_ALL          '*'
  1312. #define FONT_STRUCKOUT_LINE         's'
  1313. #define FONT_STRUCKOUT_NONE         'n'
  1314. #define FS_STRUCKOUT_MASK           0x0F000000
  1315. #define FS_STRUCKOUT_LINE           0x01000000
  1316. #define FS_STRUCKOUT_NONE           0x00000000
  1317. #define FONT_TYPE_NAME_BITMAP_RAW   "rbf"
  1318. #define FONT_TYPE_NAME_BITMAP_VAR   "vbf"
  1319. #define FONT_TYPE_NAME_BITMAP_QPF   "qpf"
  1320. #define FONT_TYPE_NAME_SCALE_TTF    "ttf"
  1321. #define FONT_TYPE_NAME_SCALE_T1F    "t1f"
  1322. #define FONT_TYPE_NAME_ALL          "*"
  1323. #define FONT_TYPE_BITMAP_RAW        0x0001  /* "rbf" */
  1324. #define FONT_TYPE_BITMAP_VAR        0x0002  /* "vbf" */
  1325. #define FONT_TYPE_BITMAP_QPF        0x0003  /* "qpf" */
  1326. #define FONT_TYPE_SCALE_TTF         0x0010  /* "ttf" */
  1327. #define FONT_TYPE_SCALE_T1F         0x0011  /* "t1f" */
  1328. #define FONT_TYPE_ALL               0xFFFF  /* "all" */
  1329. #define FONT_CHARSET_US_ASCII       "US-ASCII"
  1330. #define FONT_CHARSET_ISO8859_1      "ISO8859-1"
  1331. #define FONT_CHARSET_ISO8859_2      "ISO8859-2"
  1332. #define FONT_CHARSET_ISO8859_3      "ISO8859-3"
  1333. #define FONT_CHARSET_ISO8859_4      "ISO8859-4"
  1334. #define FONT_CHARSET_ISO8859_5      "ISO8859-5"
  1335. #define FONT_CHARSET_ISO8859_6      "ISO8859-6"
  1336. #define FONT_CHARSET_ISO8859_7      "ISO8859-7"
  1337. #define FONT_CHARSET_ISO8859_8      "ISO8859-8"
  1338. #define FONT_CHARSET_ISO8859_9      "ISO8859-9"
  1339. #define FONT_CHARSET_ISO8859_10     "ISO8859-10"
  1340. #define FONT_CHARSET_ISO8859_11     "ISO8859-11"
  1341. #define FONT_CHARSET_ISO8859_12     "ISO8859-12"
  1342. #define FONT_CHARSET_ISO8859_13     "ISO8859-13"
  1343. #define FONT_CHARSET_ISO8859_14     "ISO8859-14"
  1344. #define FONT_CHARSET_ISO8859_15     "ISO8859-15"
  1345. #define FONT_CHARSET_ISO8859_16     "ISO8859-16"
  1346. #define FONT_CHARSET_EUC_CN         "EUC-CN"
  1347. #define FONT_CHARSET_GB1988_0       "GB1988-0"      /* EUC encoding of GB1988 charset, treat as ISO8859-1 */
  1348. #define FONT_CHARSET_GB2312_0       "GB2312-0"      /* EUC encoding of GB2312 charset */
  1349. #define FONT_CHARSET_GBK            "GBK"
  1350. #define FONT_CHARSET_GB18030_0      "GB18030-0"     /* EUC encoding of GB18030 charset */
  1351. #define FONT_CHARSET_BIG5           "BIG5"
  1352. #define FONT_CHARSET_EUCTW          "EUC-TW"        /* EUC encoding of CNS11643 charset, not supported */
  1353. #define FONT_CHARSET_EUCKR          "EUC-KR"
  1354. #define FONT_CHARSET_KSC5636_0      "KSC5636-0"     /* EUC encoding of KSC5636 charset, treat as ISO8859-1 */
  1355. #define FONT_CHARSET_KSC5601_0      "KSC5601-0"     /* EUC encoding of KSC5601 charset */
  1356. #define FONT_CHARSET_EUCJP          "EUC-JP"
  1357. #define FONT_CHARSET_JISX0201_0     "JISX0201-0"    /* EUC encoding of JISX0201 charset */
  1358. #define FONT_CHARSET_JISX0208_0     "JISX0208-0"    /* EUC encoding of JISX0208 charset */
  1359. #define FONT_CHARSET_SHIFTJIS       "SHIFT-JIS"
  1360. #define FONT_CHARSET_JISX0201_1     "JISX0201-1"    /* Shift-JIS encoding of JISX0201 charset */
  1361. #define FONT_CHARSET_JISX0208_1     "JISX0208-1"    /* Shift-JIS encoding of JISX0208 charset */
  1362. #define FONT_CHARSET_ISO_10646_1    "ISO-10646-1"   /* UCS-2 encoding of UNICODE */
  1363. #define FONT_CHARSET_UTF8           "UTF-8"
  1364. #define FONT_MAX_SIZE               256
  1365. #define FONT_MIN_SIZE               4
  1366. struct _DEVFONT;
  1367. typedef struct _DEVFONT DEVFONT;
  1368. /** The logical font structure. */
  1369. typedef struct _LOGFONT {
  1370.     /** The type of the logical font. */
  1371.     char type [LEN_FONT_NAME + 1];
  1372.     /** The family name of the logical font. */
  1373.     char family [LEN_FONT_NAME + 1];
  1374.     /** The charset of the logical font. */
  1375.     char charset [LEN_FONT_NAME + 1];
  1376.     /** The styles of the logical font. */
  1377.     DWORD style;
  1378.     /** The size of the logical font. */
  1379.     int size;
  1380.     /** The rotation angle of the logical font. */
  1381.     int rotation;
  1382.     DEVFONT* sbc_devfont;
  1383.     DEVFONT* mbc_devfont;
  1384. } LOGFONT;
  1385. typedef LOGFONT*    PLOGFONT;
  1386. struct _WORDINFO;
  1387. typedef struct _WORDINFO WORDINFO;
  1388. #define MAX_LEN_MCHAR               4
  1389. typedef struct _CHARSETOPS
  1390. {
  1391.     int nr_chars;
  1392.     int bytes_per_char;
  1393.     int bytes_maxlen_char;
  1394.     const char* name;
  1395.     char def_char [MAX_LEN_MCHAR];
  1396.     int (*len_first_char) (const unsigned char* mstr, int mstrlen);
  1397.     unsigned int (*char_offset) (const unsigned char* mchar);
  1398.     int (*nr_chars_in_str) (const unsigned char* mstr, int mstrlen);
  1399.     int (*is_this_charset) (const unsigned char* charset);
  1400.     int (*len_first_substr) (const unsigned char* mstr, int mstrlen);
  1401.     const unsigned char* (*get_next_word) (const unsigned char* mstr, 
  1402.                 int strlen, WORDINFO* word_info);
  1403.     int (*pos_first_char) (const unsigned char* mstr, int mstrlen);
  1404. #ifdef _UNICODE_SUPPORT
  1405.     unsigned short (*conv_to_uc16) (const unsigned char* mchar, int len);
  1406. #endif /* LITE_VERSION */
  1407. } CHARSETOPS;
  1408. typedef struct _FONTOPS
  1409. {
  1410.     int (*get_char_width) (LOGFONT* logfont, DEVFONT* devfont, 
  1411.             const unsigned char* mchar, int len);
  1412.     int (*get_str_width) (LOGFONT* logfont, DEVFONT* devfont, 
  1413.             const unsigned char* mstr, int n, int cExtra);
  1414.     int (*get_ave_width) (LOGFONT* logfont, DEVFONT* devfont);
  1415.     int (*get_max_width) (LOGFONT* logfont, DEVFONT* devfont);
  1416.     int (*get_font_height) (LOGFONT* logfont, DEVFONT* devfont);
  1417.     int (*get_font_size) (LOGFONT* logfont, DEVFONT* devfont, int expect);
  1418.     int (*get_font_ascent) (LOGFONT* logfont, DEVFONT* devfont);
  1419.     int (*get_font_descent) (LOGFONT* logfont, DEVFONT* devfont);
  1420. /* TODO: int (*get_font_ABC) (LOGFONT* logfont); */
  1421.     
  1422.     size_t (*char_bitmap_size) (LOGFONT* logfont, DEVFONT* devfont, 
  1423.             const unsigned char* mchar, int len);
  1424.     size_t (*max_bitmap_size) (LOGFONT* logfont, DEVFONT* devfont);
  1425.     const void* (*get_char_bitmap) (LOGFONT* logfont, DEVFONT* devfont, 
  1426.             const unsigned char* mchar, int len);
  1427.     
  1428.     const void* (*get_char_pixmap) (LOGFONT* logfont, DEVFONT* devfont, 
  1429.             const unsigned char* mchar, int len, int* pitch);
  1430.          /* Can be NULL */
  1431.     void (*start_str_output) (LOGFONT* logfont, DEVFONT* devfont);
  1432.          /* Can be NULL */
  1433.     int (*get_char_bbox) (LOGFONT* logfont, DEVFONT* devfont,
  1434.             const unsigned char* mchar, int len,
  1435.             int* px, int* py, int* pwidth, int* pheight);
  1436.          /* Can be NULL */
  1437.     void (*get_char_advance) (LOGFONT* logfont, DEVFONT* devfont,
  1438.             const unsigned char* mchar, int len, int* px, int* py);
  1439.          /* Can be NULL */
  1440.     DEVFONT* (*new_instance) (LOGFONT* logfont, DEVFONT* devfont, 
  1441.             BOOL need_sbc_font);
  1442.          /* Can be NULL */
  1443.     void (*delete_instance) (DEVFONT* devfont);
  1444.          /* Can be NULL */
  1445. } FONTOPS;
  1446. struct _DEVFONT
  1447. {
  1448.     char             name [LEN_UNIDEVFONT_NAME + 1];
  1449.     DWORD            style;
  1450.     FONTOPS*         font_ops;
  1451.     CHARSETOPS*      charset_ops;
  1452.     struct _DEVFONT* sbc_next;
  1453.     struct _DEVFONT* mbc_next;
  1454.     void*            data;
  1455. };
  1456. #define SBC_DEVFONT_INFO(logfont) (logfont.sbc_devfont)
  1457. #define MBC_DEVFONT_INFO(logfont) (logfont.mbc_devfont)
  1458. #define SBC_DEVFONT_INFO_P(logfont) (logfont->sbc_devfont)
  1459. #define MBC_DEVFONT_INFO_P(logfont) (logfont->mbc_devfont)
  1460. #define INV_LOGFONT     0
  1461. /** The font metrics structure. */
  1462. typedef struct _FONTMETRICS
  1463. {
  1464.     /** the height of the logical font. */
  1465.     int font_height;
  1466.     /** the ascent of the logical font. */
  1467.     int ascent;
  1468.     /** the descent of the logical font. */
  1469.     int descent;
  1470.     /** the maximal width of the logical font. */
  1471.     int max_width;
  1472.     /** the average width of the logical font. */
  1473.     int ave_width;
  1474. } FONTMETRICS;
  1475. /**
  1476.  * fn void GUIAPI GetFontMetrics (LOGFONT* log_font, FONTMETRICS* font_metrics)
  1477.  * brief Gets metrics information of a logical font.
  1478.  *
  1479.  * This function returns the font metrics information of the specified
  1480.  * logical font a log_font.
  1481.  *
  1482.  * param log_font The pointer to the logical font.
  1483.  * param font_metrics The buffer receives the metrics information.
  1484.  * return None.
  1485.  *
  1486.  * sa GetGlyphBitmap, FONTMETRICS
  1487.  */
  1488. void GUIAPI GetFontMetrics (LOGFONT* log_font, FONTMETRICS* font_metrics);
  1489. /** The glyph bitmap structure. */
  1490. typedef struct _GLYPHBITMAP
  1491. {
  1492.     /** The bounding box of the glyph. */
  1493.     int bbox_x, bbox_y, bbox_w, bbox_h;
  1494.     /** The advance value of the glyph. */
  1495.     int advance_x, advance_y;
  1496.     /** The size of the glyph bitmap. */
  1497.     size_t bmp_size;
  1498.     /** The pitch of the glyph bitmap. */
  1499.     int bmp_pitch;
  1500.     /** The pointer to the buffer of glyph bitmap bits. */
  1501.     const unsigned char* bits;
  1502. } GLYPHBITMAP;
  1503. /**
  1504.  * fn void GUIAPI GetGlyphBitmap (LOGFONT* log_font, const unsigned char* mchar, int mchar_len, GLYPHBITMAP* glyph_bitmap)
  1505.  * brief Gets the glyph bitmap information when uses a logical font to output a character.
  1506.  *
  1507.  * This function gets the glyph bitmap of one multi-byte character
  1508.  * (specified by a mchar and a mchar_len) and returns the bitmap information
  1509.  * through a font_bitmap when using a log_font to render the character.
  1510.  *
  1511.  * param log_font The logical font used to render the character.
  1512.  * param mchar The pointer to the multi-byte character.
  1513.  * param mchar_len The length of the multi-byte character.
  1514.  * param glyph_bitmap The buffer receives the glyph bitmap information.
  1515.  * return None.
  1516.  *
  1517.  * Example:
  1518.  * code
  1519.  *      GLYPHBITMAP glyph_bitmap = {0};
  1520.  *
  1521.  *      GetFontBitmap (log_font, "A", 1, &glyph_bitmap);
  1522.  * endcode
  1523.  *
  1524.  * sa GetFontMetrics, GLYPHBITMAP
  1525.  */
  1526. void GUIAPI GetGlyphBitmap (LOGFONT* log_font, const unsigned char* mchar, int mchar_len, 
  1527.                 GLYPHBITMAP* glyph_bitmap);
  1528. #ifdef _LITE_VERSION
  1529. /**
  1530.  * fn BOOL GUIAPI InitVectorialFonts (void)
  1531.  * brief Initializes vectorial font renderer.
  1532.  *
  1533.  * This function initializes vectorial font renderer for MiniGUI-Lite application.
  1534.  * For the performance reason, MiniGUI-Lite does not load vetorical fonts, such as
  1535.  * TrueType or Adobe Type1, at startup. If you want to render text in vectorial fonts,
  1536.  * you must call this function to initialize TrueType and Type1 font renderer.
  1537.  *
  1538.  * return TRUE on success, FALSE on error.
  1539.  *
  1540.  * note Only defined for _LITE_VERSION. If your MiniGUI configured as MiniGUI-Threads,
  1541.  *       no need to initialize TrueType and Type1 font renderer explicitly.
  1542.  *
  1543.  * sa TermVectorialFonts
  1544.  */
  1545. BOOL GUIAPI InitVectorialFonts (void);
  1546. /**
  1547.  * fn void GUIAPI TermVectorialFonts (void)
  1548.  * brief Terminates vectorial font renderer.
  1549.  *
  1550.  * This function terminates the vectorial font renderer.
  1551.  * When you are done with vectorial fonts, you should call this function to 
  1552.  * unload the vectorial fonts to save memory.
  1553.  *
  1554.  * note Only defined for _LITE_VERSION. 
  1555.  *
  1556.  * sa InitVectorialFonts
  1557.  */
  1558. void GUIAPI TermVectorialFonts (void);
  1559. #endif
  1560. /**
  1561.  * fn PLOGFONT GUIAPI CreateLogFont (const char* type, const char* family, const char* charset, char weight, char slant, char set_width, char spacing, char underline, char struckout, int size, int rotation)
  1562.  * brief Creates a logical font.
  1563.  *
  1564.  * This function creates a logical font. 
  1565.  *
  1566.  * param type The type of the logical font, can be one of the values:
  1567.  *      - FONT_TYPE_NAME_BITMAP_RAWn
  1568.  *        Creates a logical font by using raw bitmap device font, i.e. mono-space bitmap font.
  1569.  *      - FONT_TYPE_NAME_BITMAP_VARn
  1570.  *        Creates a logical font by using var-width bitmap device font.
  1571.  *      - FONT_TYPE_NAME_SCALE_TTFn
  1572.  *        Creates a logical font by using scalable TrueType device font.
  1573.  *      - FONT_TYPE_NAME_SCALE_T1Fn
  1574.  *        Creates a logical font by using scalable Adobe Type1 device font.
  1575.  *      - FONT_TYPE_NAME_ALLn
  1576.  *        Creates a logical font by using any type device font.
  1577.  * param family The family of the logical font, such as "Courier", "Helvetica", and so on.
  1578.  * param charset The charset of the logical font. You can specify a sigle-byte charset
  1579.  *        like "ISO8859-1", or a multi-byte charset like "GB2312.1980-0".
  1580.  * param weight The weight of the logical font, can be one of the values:
  1581.  *      - FONT_WEIGHT_ALLn
  1582.  *        Any one.
  1583.  *      - FONT_WEIGHT_REGULARn
  1584.  *        Regular font.
  1585.  *      - FONT_WEIGHT_BOLDn
  1586.  *        Bold font.
  1587.  * param slant The slant of the logical font, can be one of the values:
  1588.  *      - FONT_SLANT_ALLn
  1589.  *        Any one.
  1590.  *      - FONT_SLANT_ROMANn
  1591.  *        Regular font.
  1592.  *      - FONT_SLANT_ITALICn
  1593.  *        Italic font.
  1594.  * param set_width Not used so far.
  1595.  * param spacing Not used so far.
  1596.  * param underline The underline of the logical font, can be one of the values:
  1597.  *      - FONT_UNDERLINE_ALLn
  1598.  *        Any one.
  1599.  *      - FONT_UNDERLINE_LINEn
  1600.  *        With underline.
  1601.  *      - FONT_UNDERLINE_NONEn
  1602.  *        Without underline.
  1603.  * param struckout The struckout line of the logical font, can be one of the values:
  1604.  *      - FONT_STRUCKOUT_ALLn
  1605.  *        Any one.
  1606.  *      - FONT_STRUCKOUT_LINEn
  1607.  *        With struckout line.
  1608.  *      - FONT_STRUCKOUT_NONEn
  1609.  *        Without struckout line.
  1610.  * param size The size, i.e. the height, of the logical font. Note that the size of 
  1611.  *        the created logical font may be different from the size expected.
  1612.  * param rotation The rotation of the logical font, it is in units of tenth degrees.
  1613.  *        Note that you can specify rotation only for TrueType and Adobe Type1 fonts.
  1614.  * return The pointer to the logical font created, NULL on error.
  1615.  *
  1616.  * sa CreateLogFontIndirect, SelectFont
  1617.  *
  1618.  * Example:
  1619.  *
  1620.  * include createlogfont.c
  1621.  *
  1622.  */
  1623. PLOGFONT GUIAPI CreateLogFont (const char* type, const char* family, 
  1624.         const char* charset, char weight, char slant, char set_width, 
  1625.         char spacing, char underline, char struckout, 
  1626.         int size, int rotation);
  1627. /**
  1628.  * fn PLOGFONT GUIAPI CreateLogFontByName (const char* font_name)
  1629.  * brief Creates a logical font by a font name.
  1630.  *
  1631.  * This function creates a logical font by a font name specified by a font_name.
  1632.  *
  1633.  * param font_name The name of the font.
  1634.  * return The pointer to the logical font created, NULL on error.
  1635.  *
  1636.  * sa CreateLogFont, SelectFont
  1637.  */
  1638. PLOGFONT GUIAPI CreateLogFontByName (const char* font_name);
  1639. /**
  1640.  * fn PLOGFONT GUIAPI CreateLogFontIndirect (LOGFONT* logfont)
  1641.  * brief Creates a logical font indirectly from a LOGFONT structure.
  1642.  *
  1643.  * This function creates a logical font from information in a LOGFONT object.
  1644.  *
  1645.  * param logfont The pointer to the reference logical font structure.
  1646.  * return The pointer to the logical font created, NULL on error.
  1647.  *
  1648.  * sa CreateLogFont, SelectFont
  1649.  */
  1650. PLOGFONT GUIAPI CreateLogFontIndirect (LOGFONT* logfont);
  1651. /**
  1652.  * fn void GUIAPI DestroyLogFont (PLOGFONT log_font)
  1653.  * brief Destroies a logical font.
  1654.  *
  1655.  * This function destroies the specified logical font a log_font.
  1656.  *
  1657.  * param log_font The logical font will be destroied.
  1658.  *
  1659.  * sa CreateLogFont, CreateLogFontIndirect
  1660.  */
  1661. void GUIAPI DestroyLogFont (PLOGFONT log_font);
  1662. /**
  1663.  * fn void GUIAPI GetLogFontInfo (HDC hdc, LOGFONT* log_font)
  1664.  * brief Gets logical font information of a DC.
  1665.  *
  1666.  * This function gets the logical font information of the specified DC a hdc,
  1667.  * and copies to the LOGFONT structure pointed to by a log_font.
  1668.  *
  1669.  * param hdc The device context.
  1670.  * param log_font The pointer to the LOGFONT structure to save the logical font info.
  1671.  *
  1672.  * sa GetCurFont
  1673.  */
  1674. void GUIAPI GetLogFontInfo (HDC hdc, LOGFONT* log_font);
  1675. /**
  1676.  * fn PLOGFONT GUIAPI GetCurFont (HDC hdc)
  1677.  * brief Gets the pointer to the current logical font of a DC.
  1678.  *
  1679.  * This function returns the pointer to the current logical font selected to the DC a hdc.
  1680.  *
  1681.  * param hdc The device context.
  1682.  * return The pointer to the current logical font.
  1683.  *
  1684.  * sa GetLogFontInfo, SelectFont
  1685.  */
  1686. PLOGFONT GUIAPI GetCurFont (HDC hdc);
  1687. /**
  1688.  * fn PLOGFONT GUIAPI SelectFont (HDC hdc, PLOGFONT log_font)
  1689.  * brief Selects a logical font into a DC.
  1690.  *
  1691.  * This function selects the specified logical font a log_font into the device context a hdc.
  1692.  *
  1693.  * param hdc The device context.
  1694.  * param log_font The pointer to the logical font to be selected into the DC.
  1695.  * return The old logical font of the DC.
  1696.  *
  1697.  * sa GetCurFont
  1698.  *
  1699.  * Example:
  1700.  *
  1701.  * include drawtext.c
  1702.  *
  1703.  */
  1704. PLOGFONT GUIAPI SelectFont (HDC hdc, PLOGFONT log_font);
  1705. /**
  1706.  * fn const DEVFONT* GUIAPI GetNextDevFont (const DEVFONT* dev_font)
  1707.  * brief Get next devfont information.
  1708.  *
  1709.  * This function can be used to enumerate all device fonts loaded by MiniGUI.
  1710.  *
  1711.  * param dev_font The pointer to the current device font, can be NULL to get
  1712.  *                 the first device font.
  1713.  * return The next device font.
  1714.  */
  1715. const DEVFONT* GUIAPI GetNextDevFont (const DEVFONT* dev_font);
  1716.     /** @} end of font_fns */
  1717.     /**
  1718.      * defgroup system_font System charset and font operations
  1719.      *
  1720.      * MiniGUI creates a few system fonts to draw menu text, window caption, or
  1721.      * other general items. MiniGUI at least creates two system fonts: one mono-space
  1722.      * logical font for single-byte charset, and one mono-space logical font for
  1723.      * multi-byte charset. For the multi-byte charset, 
  1724.      * the width of one multi-byte character should be equal to the width of 
  1725.      * two single-byte characters.
  1726.      *
  1727.      * @{
  1728.      */
  1729. #define SYSLOGFONT_DEFAULT          0
  1730. #define SYSLOGFONT_WCHAR_DEF        1
  1731. #define SYSLOGFONT_FIXED            2
  1732. #define SYSLOGFONT_CAPTION          3
  1733. #define SYSLOGFONT_MENU             4
  1734. #define SYSLOGFONT_CONTROL          5
  1735. #define NR_SYSLOGFONTS              6
  1736. extern PLOGFONT g_SysLogFont [];
  1737. /**
  1738.  * fn PLOGFONT GUIAPI GetSystemFont (int font_id)
  1739.  * brief Gets the system logical font through an font identifier.
  1740.  *
  1741.  * This function returns the system logical font through the font identifier a font_id.
  1742.  *
  1743.  * param font_id The identifier of a system font, can be one of the following values:
  1744.  *      - SYSLOGFONT_DEFAULTn
  1745.  *        The default system logical font in single-byte charset, must be rbf.
  1746.  *      - SYSLOGFONT_WCHAR_DEFn
  1747.  *        The default system logical font in multi-byte charset, must be rbf.
  1748.  *      - SYSLOGFONT_FIXEDn
  1749.  *        The fixed space system logical font.
  1750.  *      - SYSLOGFONT_CAPTIONn
  1751.  *        The system logical font used to draw caption text.
  1752.  *      - SYSLOGFONT_MENUn
  1753.  *        The system logical font used to draw menu items.
  1754.  *      - SYSLOGFONT_CONTROLn
  1755.  *        The system logical font used to draw controls.
  1756.  * return The pointer to the system logical font. NULL on error.
  1757.  */
  1758. static inline PLOGFONT GUIAPI GetSystemFont (int font_id)
  1759. {
  1760.     if (font_id >= 0 && font_id < NR_SYSLOGFONTS)
  1761.         return g_SysLogFont [font_id];
  1762.     else
  1763.         return (PLOGFONT)NULL;
  1764. }
  1765. /**
  1766.  * fn int GUIAPI GetSysFontMaxWidth (int font_id)
  1767.  * brief Gets the maximal width of a single-byte character of a system font.
  1768.  *
  1769.  * This function returns the maximal width of a single-byte character of one system font.
  1770.  *
  1771.  * param font_id The identifier of a system font.
  1772.  * return The maximal width of single-byte character of the default system font.
  1773.  *
  1774.  * sa GetSystemFont
  1775.  */
  1776. int GUIAPI GetSysFontMaxWidth (int font_id);
  1777. /**
  1778.  * fn int GUIAPI GetSysFontAveWidth (int font_id)
  1779.  * brief Gets the average width of a single-byte character of a system font.
  1780.  *
  1781.  * This function returns the average width of a single-byte character of one system font.
  1782.  *
  1783.  * param font_id The identifier of a system font.
  1784.  * return The average width of single-byte character of the default system font.
  1785.  *
  1786.  * sa GetSystemFont
  1787.  */
  1788. int GUIAPI GetSysFontAveWidth (int font_id);
  1789. /**
  1790.  * fn int GUIAPI GetSysFontHeight (int font_id)
  1791.  * brief Gets the height of a single-byte character of a system font.
  1792.  *
  1793.  * This function returns the height of a single-byte character of one system font.
  1794.  *
  1795.  * param font_id The identifier of a system font.
  1796.  * return The height of single-byte character of the default system font.
  1797.  *
  1798.  * sa GetSystemFont
  1799.  */
  1800. int GUIAPI GetSysFontHeight (int font_id);
  1801. /**
  1802.  * fn const char* GUIAPI GetSysCharset (BOOL wchar)
  1803.  * brief Gets the current system charset.
  1804.  *
  1805.  * This function gets the current system charset and returns the charset name.
  1806.  * By default, the system charset is ISO8859-1 (for single-byte charset) or 
  1807.  * GB2312.1980-0 (for wide charset), but you can change it by modifying a MiniGUI.cfg. 
  1808.  *
  1809.  * param wchar Whether to retrive the wide charset supported currently.
  1810.  * return The read-only buffer of charset name. If you pass a wchar TRUE,
  1811.  *         This function may return NULL, if there is not any wide charset supported.
  1812.  */
  1813. const char* GUIAPI GetSysCharset (BOOL wchar);
  1814. /**
  1815.  * fn int GUIAPI GetSysCharHeight (void)
  1816.  * brief Gets the height of a character of the default system font.
  1817.  *
  1818.  * This function returns the height of a character of 
  1819.  * the system default font. MiniGUI uses mono-space font as the default system font.
  1820.  *
  1821.  * Normally, the width of one multi-byte character is equal to 
  1822.  * the width of two single-byte character when using the default system font.
  1823.  *
  1824.  * return The character height of the default system font.
  1825.  *
  1826.  * sa GetSysCharWidth, GetSysCCharWidth
  1827.  */
  1828. int GUIAPI GetSysCharHeight (void);
  1829. /**
  1830.  * fn int GUIAPI GetSysCharWidth (void)
  1831.  * brief Gets the width of a single-byte character of the default system font.
  1832.  *
  1833.  * This function returns the width of a single-byte character of the default system font.
  1834.  * MiniGUI uses mono-space font as the default system font, but you can specify a 
  1835.  * different font to output text in windows of MiniGUI.
  1836.  *
  1837.  * return The width of single-byte character of the default system font.
  1838.  *
  1839.  * sa GetSysCharHeight, GetSysCCharWidth, SelectFont, CreateLogFont
  1840.  */
  1841. int GUIAPI GetSysCharWidth (void);
  1842. /**
  1843.  * fn int GUIAPI GetSysCCharWidth (void)
  1844.  * brief Gets the width of a multi-byte character of the default system font.
  1845.  *
  1846.  * This function returns the width of a multi-byte character of 
  1847.  * the default system font. MiniGUI uses mono-space font as the system default font.
  1848.  *
  1849.  * return The width of multi-byte character of the default system font.
  1850.  *
  1851.  * sa GetSysCharHeight, GetSysCharWidth
  1852.  */
  1853. int GUIAPI GetSysCCharWidth (void);
  1854. #if 0
  1855. /**
  1856.  * fn void GUIAPI GetSysTabbedTextExtent (const char* spText, SIZE* pSize)
  1857.  * brief Gets the output extent of a formatted string when using the system font.
  1858.  *
  1859.  * This function gets the output extent of the formatted string pointed to by a spText 
  1860.  * when using the system font, nnd returns the extent in SIZE struct pointed to by a pSize.
  1861.  *
  1862.  * param spText The pointer to the formatted string.
  1863.  * param pSize The output extent will be returned through this buffer.
  1864.  *
  1865.  * note Obsolete
  1866.  *
  1867.  * sa GetSysCharWidth, GetSysCharHeight
  1868.  */
  1869. void GUIAPI GetSysTabbedTextExtent (const char* spText, SIZE* pSize);
  1870. /**
  1871.  * fn BOOL GUIAPI DoesSupportCharset (const char* charset)
  1872.  * brief Determines whether MiniGUI supports a system charset.
  1873.  *
  1874.  * This function determines whether MiniGUI 
  1875.  * supports the specified system charset a charset.
  1876.  *
  1877.  * param charset The name of the charset.
  1878.  * return TRUE for supported charset, otherwise FALSE.
  1879.  *
  1880.  * note Obsolete
  1881.  *
  1882.  * sa GetSysCharset
  1883.  */
  1884. BOOL GUIAPI DoesSupportCharset (const char* charset);
  1885. /**
  1886.  * fn BOOL GUIAPI SetSysCharset (const char* charset)
  1887.  * brief Sets a charset to be the system charset.
  1888.  *
  1889.  * This function sets the specified charset a charset to be the system charset.
  1890.  *
  1891.  * param charset The name of the charset.
  1892.  * return 0 on success, -1 on error.
  1893.  *
  1894.  * note Obsolete
  1895.  *
  1896.  * sa GetSysCharset
  1897.  */
  1898. BOOL GUIAPI SetSysCharset (const char* charset);
  1899. #endif
  1900.     /** @} end of system_font */
  1901.     /**
  1902.      * defgroup text_parse_fns Text parsing functions
  1903.      *
  1904.      * MiniGUI uses logical font to output text, also uses
  1905.      * logical font to parsing the multi-byte characters and
  1906.      * words in the text.
  1907.      *
  1908.      * @{
  1909.      */
  1910. /** Word information structure */
  1911. struct _WORDINFO
  1912. {
  1913.     /** the length of the word. */
  1914.     int len;
  1915.     /** the delimiter after the word. */
  1916.     unsigned char delimiter;
  1917.     /** the number of delimiters after the word. */
  1918.     int nr_delimiters;
  1919. };
  1920. /**
  1921.  * fn int GUIAPI GetTextMCharInfo (PLOGFONT log_font, const char* mstr, int len, int* pos_chars)
  1922.  * brief Retrives positions of multi-byte characters in a string.
  1923.  *
  1924.  * This function retrives position of multi-byte characters in 
  1925.  * the string a mstr which is len bytes long. It returns the positions 
  1926.  * of characters in the string in an integer array pointed to by a pos_chars.
  1927.  *
  1928.  * param log_font The logical font used to parse the multi-byte string.
  1929.  * param mstr The multi-byte string.
  1930.  * param len The length of the string.
  1931.  * param pos_chars The position of characters will be returned through this array if it is not NULL.
  1932.  * return The number of characters in the multi-byte string.
  1933.  *
  1934.  * sa GetTextWordInfo
  1935.  */
  1936. int GUIAPI GetTextMCharInfo (PLOGFONT log_font, const char* mstr, int len, 
  1937.                 int* pos_chars);
  1938. /**
  1939.  * fn int GUIAPI GetTextWordInfo (PLOGFONT log_font, const char* mstr, int len, int* pos_words, WORDINFO* info_words)
  1940.  * brief Retrives information of multi-byte words in a string.
  1941.  *
  1942.  * This function retrives information of multi-byte words in the string a mstr which is 
  1943.  * a len bytes long. It returns the positions of words in the string in an integer 
  1944.  * array pointed to by a pos_words if the pointer is not NULL. This function also 
  1945.  * returns the information of words in a WORDINFO struct array pointed to by a info_words 
  1946.  * when the pointer is not NULL.
  1947.  *
  1948.  * param log_font The logical font used to parse the multi-byte string.
  1949.  * param mstr The multi-byte string.
  1950.  * param len The length of the string.
  1951.  * param pos_words The position of words will be returned through this array if it is not NULL.
  1952.  * param info_words The words' information will be returned through this array if it is not NULL.
  1953.  * return The number of words in the multi-byte string.
  1954.  *
  1955.  * sa GetTextMCharInfo, WORDINFO
  1956.  */
  1957. int GUIAPI GetTextWordInfo (PLOGFONT log_font, const char* mstr, int len, 
  1958.                 int* pos_words, WORDINFO* info_words);
  1959. /**
  1960.  * fn int GUIAPI GetFirstMCharLen (PLOGFONT log_font, const char* mstr, int len)
  1961.  * brief Retrives the length of the first multi-byte character in a string.
  1962.  *
  1963.  * This function retrives and returns the length of the first multi-byte 
  1964.  * character in the string a mstr which is a len bytes long.
  1965.  *
  1966.  * param log_font The logical font used to parse the multi-byte string.
  1967.  * param mstr The multi-byte string.
  1968.  * param len The length of the string.
  1969.  * return The length of the first multi-byte character.
  1970.  *
  1971.  * sa GetFirstWord
  1972.  */
  1973. int GUIAPI GetFirstMCharLen (PLOGFONT log_font, const char* mstr, int len);
  1974. /**
  1975.  * fn int GUIAPI GetFirstWord (PLOGFONT log_font, const char* mstr, int len, WORDINFO* word_info)
  1976.  * brief Retrives the length and info of the first multi-byte word in a string.
  1977.  *
  1978.  * This function retrives the information of the first multi-byte character in the string a mstr
  1979.  * which is a len bytes long, and returns it through a word_info. 
  1980.  * It also returns the full length of the word including the delimiters after the word.
  1981.  *
  1982.  * param log_font The logical font used to parse the multi-byte string.
  1983.  * param mstr The multi-byte string.
  1984.  * param len The length of the string.
  1985.  * param word_info The pointer to a WORDINFO structure used to return the word information.
  1986.  * return The length of the first multi-byte word.
  1987.  *
  1988.  * sa GetFirstMCharLen, WORDINFO
  1989.  */
  1990. int GUIAPI GetFirstWord (PLOGFONT log_font, const char* mstr, int len,
  1991.                             WORDINFO* word_info);
  1992. /**
  1993.  * fn int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len, int max_extent, int* fit_chars, int* pos_chars, int* dx_chars, SIZE* size)
  1994.  * brief Computes the extent of a string when output the string in a limited space.
  1995.  *
  1996.  * This function computes the extent of the specified string of text a text which is 
  1997.  * a len bytes long when output the text in a limited space (a max_extent wide). 
  1998.  * If a pos_chars and a dx_chars are not NULL, this function will return the 
  1999.  * positions of each character in the text, and the output position of each character.
  2000.  * This function returns the text extent in a SIZE struct pointed to by a size, and 
  2001.  * the width of text as return value.
  2002.  * 
  2003.  * param hdc The device context.
  2004.  * param text The multi-byte string.
  2005.  * param len The length of the string.
  2006.  * param max_extent The width of the limited space.
  2007.  * param fit_chars The number of the characters actually outputed.
  2008.  * param pos_chars The positions of each character in the text will be returned through this pointer.
  2009.  * param dx_chars The output positions of each character in the text will be returned through this pointer.
  2010.  * param size The output extent of the text in the limited space will be returned through this pointer.
  2011.  *
  2012.  * return The number of the characters which can be fit to the limited space.
  2013.  *
  2014.  * sa GetFirstMCharLen, GetFirstWord
  2015.  */
  2016. int GUIAPI GetTextExtentPoint (HDC hdc, const char* text, int len, int max_extent, 
  2017.                 int* fit_chars, int* pos_chars, int* dx_chars, SIZE* size);
  2018. /**
  2019.  * fn int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text, int len, int max_extent, int* fit_chars, int* pos_chars, int* dx_chars, SIZE* size)
  2020.  *
  2021.  * brief Computes the extent of a string when output the formatted string in a limited space.
  2022.  */
  2023. int GUIAPI GetTabbedTextExtentPoint (HDC hdc, const char* text, int len, int max_extent,
  2024.                                 int* fit_chars, int* pos_chars, int* dx_chars, SIZE* size);
  2025.     /** @} end of text_parse_fns */
  2026.     /**
  2027.      * defgroup text_output_fns Text output functions
  2028.      * @{
  2029.      */
  2030. /**
  2031.  * fn int GUIAPI GetFontHeight (HDC hdc)
  2032.  * brief Retrives the height of the current logical font in a DC.
  2033.  *
  2034.  * This function retrives the height of the current logical font in the DC a hdc.
  2035.  *
  2036.  * param hdc The device context.
  2037.  * return The height of the current logical font.
  2038.  *
  2039.  * sa GetMaxFontWidth
  2040.  */
  2041. int GUIAPI GetFontHeight (HDC hdc);
  2042. /**
  2043.  * fn int GUIAPI GetMaxFontWidth (HDC hdc)
  2044.  * brief Retrives the maximal character width of the current logical font in a DC.
  2045.  *
  2046.  * This function retrives the maximal character width of the current logical font 
  2047.  * in the DC a hdc.
  2048.  *
  2049.  * param hdc The device context.
  2050.  * return The maximal character width of the current logical font.
  2051.  *
  2052.  * sa GetFontHeight
  2053.  */
  2054. int GUIAPI GetMaxFontWidth (HDC hdc);
  2055. /**
  2056.  * fn void GUIAPI GetTextExtent (HDC hdc, const char* spText, int len, SIZE* pSize)
  2057.  * brief Computes the output extent of a string of text.
  2058.  *
  2059.  * This function computes the output extent of the text (a spText) with length of a len. 
  2060.  * This function returns the extent in a SIZE struct pointed to by a pSize and the width 
  2061.  * of text as the return value.
  2062.  *
  2063.  * param hdc The device context.
  2064.  * param spText The pointer to the string of text.
  2065.  * param len The length of the text.
  2066.  * param pSize The output extent will be returned through this buffer.
  2067.  *
  2068.  * sa GetTabbedTextExtent
  2069.  */
  2070. void GUIAPI GetTextExtent (HDC hdc, const char* spText, int len, SIZE* pSize);
  2071. /**
  2072.  * fn void GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len, SIZE* pSize)
  2073.  * brief Computes the output extent of a formatted text.
  2074.  *
  2075.  * This function computes the output extent of the formatted text (a spText) with length of a len.
  2076.  * This function returns the extent in a SIZE struct pointed to by a pSize and the width of text as 
  2077.  * the return value. The output extent will be affected by the default tab size if there are some 
  2078.  * TAB characters in the text.
  2079.  *
  2080.  * param hdc The device context.
  2081.  * param spText The pointer to the string of text.
  2082.  * param len The length of the text.
  2083.  * param pSize The output extent will be returned through this buffer.
  2084.  *
  2085.  * sa GetTextExtent
  2086.  */
  2087. void GUIAPI GetTabbedTextExtent (HDC hdc, const char* spText, int len, SIZE* pSize);
  2088. #ifdef _USE_NEWGAL
  2089. /**
  2090.  * def GetTextCharacterExtra(hdc)
  2091.  * brief Retrives the current intercharacter spacing for the DC.
  2092.  * 
  2093.  * note Defined as a macro calling a GetDCAttr for _USE_NEWGAL.
  2094.  *       If _USE_NEWGAL is not defined, a GetTextCharacterExtra is defined as
  2095.  *       a function, and have the same semantics as this macro.
  2096.  *
  2097.  * sa SetTextCharacterExtra
  2098.  */
  2099. #define GetTextCharacterExtra(hdc)  (int)GetDCAttr (hdc, DC_ATTR_CHAR_EXTRA)
  2100. /**
  2101.  * def GetTextAboveLineExtra(hdc)
  2102.  * brief Retrives the current spacing above line for the DC.
  2103.  *
  2104.  * note Defined as a macro calling a GetDCAttr for _USE_NEWGAL.
  2105.  *       If _USE_NEWGAL is not defined, a GetTextAboveLineExtra is defined as
  2106.  *       a function, and have the same semantics as this macro.
  2107.  *
  2108.  * sa SetTextAboveLineExtra
  2109.  */
  2110. #define GetTextAboveLineExtra(hdc)  (int)GetDCAttr (hdc, DC_ATTR_ALINE_EXTRA)
  2111. /**
  2112.  * def GetTextBellowLineExtra(hdc)
  2113.  * brief Retrives the current spacing bellow line for the DC.
  2114.  *
  2115.  * note Defined as a macro calling a GetDCAttr for _USE_NEWGAL.
  2116.  *       If _USE_NEWGAL is not defined, a GetTextBellowLineExtra is defined as
  2117.  *       a function, and have the same semantics as this macro.
  2118.  *
  2119.  * sa SetTextBellowLineExtra
  2120.  */
  2121. #define GetTextBellowLineExtra(hdc) (int)GetDCAttr (hdc, DC_ATTR_BLINE_EXTRA)
  2122. /**
  2123.  * def SetTextCharacterExtra(hdc, extra)
  2124.  * brief Sets the intercharacter spacing for the DC and returns the old spacing value.
  2125.  * 
  2126.  * note Defined as a macro calling a SetDCAttr for _USE_NEWGAL.
  2127.  *       If _USE_NEWGAL is not defined, a SetTextCharacterExtra is defined as
  2128.  *       a function, and have the same semantics as this macro.
  2129.  *
  2130.  * sa GetTextCharacterExtra
  2131.  */
  2132. #define SetTextCharacterExtra(hdc, extra)   (int)SetDCAttr (hdc, DC_ATTR_CHAR_EXTRA, (DWORD) extra)
  2133. /**
  2134.  * def SetTextAboveLineExtra(hdc, extra)
  2135.  * brief Sets the spacing above line for the DC and returns the old value.
  2136.  *
  2137.  * note Defined as a macro calling a SetDCAttr for _USE_NEWGAL.
  2138.  *       If _USE_NEWGAL is not defined, a SetTextAboveLineExtra is defined as
  2139.  *       a function, and have the same semantics as this macro.
  2140.  *
  2141.  * sa GetTextAboveLineExtra
  2142.  */
  2143. #define SetTextAboveLineExtra(hdc, extra)   (int)SetDCAttr (hdc, DC_ATTR_ALINE_EXTRA, (DWORD) extra)
  2144. /**
  2145.  * def SetTextBellowLineExtra(hdc, extra)
  2146.  * brief Sets the spacing bellow line for the DC and returns the old value.
  2147.  *
  2148.  * note Defined as a macro calling a SetDCAttr for _USE_NEWGAL.
  2149.  *       If _USE_NEWGAL is not defined, a SetTextBellowLineExtra is defined as
  2150.  *       a function, and have the same semantics as this macro.
  2151.  *
  2152.  * sa GetTextBellowLineExtra
  2153.  */
  2154. #define SetTextBellowLineExtra(hdc, extra)  (int)SetDCAttr (hdc, DC_ATTR_BLINE_EXTRA, (DWORD) extra)
  2155. #else
  2156. int GUIAPI GetTextCharacterExtra (HDC hdc);
  2157. int GUIAPI SetTextCharacterExtra (HDC hdc, int extra);
  2158. int GUIAPI GetTextAboveLineExtra (HDC hdc);
  2159. int GUIAPI SetTextAboveLineExtra (HDC hdc, int extra);
  2160. int GUIAPI GetTextBellowLineExtra (HDC hdc);
  2161. int GUIAPI SetTextBellowLineExtra (HDC hdc, int extra);
  2162. #endif /* _USE_NEWGAL */
  2163. /**
  2164.  * fn int GUIAPI TextOutLen (HDC hdc, int x, int y, const char* spText, int len)
  2165.  * brief Outputs a string of text.
  2166.  *
  2167.  * This function outputs the text a spText with length of a len at a (x,y). 
  2168.  * This function returns the width of text.
  2169.  *
  2170.  * param hdc The device context.
  2171.  * param x x,y: The output start position.
  2172.  * param y x,y: The output start position.
  2173.  * param spText The string of the text.
  2174.  * param len The length of the text. If it is less than 0, MiniGUI will treat it as 
  2175.  *        a null-terminated string.
  2176.  * return The output width of the text.
  2177.  *
  2178.  * sa TabbedTextOutLen
  2179.  */
  2180. int GUIAPI TextOutLen (HDC hdc, int x, int y, const char* spText, int len);
  2181. /**
  2182.  * fn int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y, const char* spText, int len)
  2183.  * brief Outputs a formatted text.
  2184.  *
  2185.  * This function outputs the formatted text a spText with length of a len at a (x,y).
  2186.  * This function returns the width of text. The output will be affected by 
  2187.  * the default tab size if there are some TAB characters in the text.
  2188.  *
  2189.  * param hdc The device context.
  2190.  * param x x,y: The output start position.
  2191.  * param y x,y: The output start position.
  2192.  * param spText The formatted text.
  2193.  * param len The length of the text. If it is less than 0, MiniGUI will treat it as 
  2194.  *        a null-terminated string.
  2195.  * return The output width of the text.
  2196.  *
  2197.  * sa TextOutLen
  2198.  */
  2199. int GUIAPI TabbedTextOutLen (HDC hdc, int x, int y, const char* spText, int len); 
  2200. /**
  2201.  * fn int GUIAPI TabbedTextOutEx (HDC hdc, int x, int y, const char* spText, int nCount, int nTabPositions, int *pTabPositions, int nTabOrigin)
  2202.  * brief Writes a character string at a specified location, expanding tabs to the values
  2203.  *        specified in an anrry of tab-stop positions.
  2204.  *
  2205.  * This function writes the string a spText with length of a nCount at a specified locations, 
  2206.  * expanding tabs to the value spcified in the array a pTabPositions of tab-stop positions.
  2207.  *
  2208.  * param hdc The device context.
  2209.  * param x x,y: The output start position.
  2210.  * param y x,y: The output start position.
  2211.  * param spText The formatted text.
  2212.  * param nCount The length of the text. If it is less than 0, MiniGUI will treat it as 
  2213.  *        a null-terminated string.
  2214.  * param nTabPositions The length of the array of the tab-stop positions.
  2215.  * param pTabPositions The array of the tab-stop positions.
  2216.  * param nTabOrigin The origin of the tab-stops.
  2217.  * return The output width of the text.
  2218.  *
  2219.  * sa TabbedTextOutLen
  2220.  */
  2221. int GUIAPI TabbedTextOutEx (HDC hdc, int x, int y, const char* spText, int nCount,
  2222.             int nTabPositions, int *pTabPositions, int nTabOrigin);
  2223. /**
  2224.  * fn void GUIAPI GetLastTextOutPos (HDC hdc, POINT* pt)
  2225.  * brief Retrives the last text output position.
  2226.  *
  2227.  * param hdc The device context.
  2228.  * param pt The last text output position will be returned through this pointer.
  2229.  *
  2230.  */
  2231. void GUIAPI GetLastTextOutPos (HDC hdc, POINT* pt);
  2232. /**
  2233.  * def TextOut(hdc, x, y, text)
  2234.  * brief Outputs text.
  2235.  *
  2236.  * Defined as a macro calling a TextOutLen passing a len as -1.
  2237.  *
  2238.  * sa TextOutLen
  2239.  */
  2240. #define TextOut(hdc, x, y, text)    TextOutLen (hdc, x, y, text, -1)
  2241. /**
  2242.  * def TabbedTextOut(hdc, x, y, text)
  2243.  * brief Outputs formatted text.
  2244.  *
  2245.  * Defined as a macro calling a TabbedTextOutLen passing a len as -1.
  2246.  *
  2247.  * sa TextOutLen
  2248.  */
  2249. #define TabbedTextOut(hdc, x, y, text)  TabbedTextOutLen (hdc, x, y, text, -1)
  2250. #define DT_TOP              0x00000000
  2251. #define DT_LEFT             0x00000000
  2252. #define DT_CENTER           0x00000001
  2253. #define DT_RIGHT            0x00000002
  2254. #define DT_VCENTER          0x00000004
  2255. #define DT_BOTTOM           0x00000008
  2256. #define DT_WORDBREAK        0x00000010
  2257. #define DT_SINGLELINE       0x00000020
  2258. #define DT_EXPANDTABS       0x00000040
  2259. #define DT_TABSTOP          0x00000080
  2260. #define DT_NOCLIP           0x00000100
  2261. #define DT_EXTERNALLPADING  0x00000200
  2262. #define DT_CALCRECT         0x00000400
  2263. #define DT_NOPREFIX         0x00000800
  2264. #define DT_INTERNAL         0x00001000
  2265. /**
  2266.  * First line information of DrawTextEx2
  2267.  */
  2268. typedef struct _DTFIRSTLINE
  2269. {   
  2270.     /** The number of the characters of first line in bytes. */
  2271.     int nr_chars;
  2272.     /** The output x-coordinate of the fist line. */
  2273.     int startx;
  2274.     /** The output y-coordinate of the fist line. */
  2275.     int starty;
  2276.     /** The output width of the fist line. */
  2277.     int width;
  2278.     /** The output height of the fist line. */
  2279.     int height;
  2280. } DTFIRSTLINE;
  2281. /**
  2282.  * fn int GUIAPI DrawTextEx2 (HDC hdc, const char* pText, int nCount, RECT* pRect, int nIndent, UINT nFormat, DTFIRSTLINE* firstline)
  2283.  * brief Draws a formatted text in a rectangle.
  2284.  *
  2285.  * This function draws formatted text (a pText) in the specified rectangle (a pRect).
  2286.  * It formats the text according to the specified method (through a nFormat, 
  2287.  * including expanding tabs, justifying characters, breaking lines, and so forth). 
  2288.  *
  2289.  * param hdc The device context.
  2290.  * param pText The formatted text.
  2291.  * param nCount The length of the text. If it is less than 0, MiniGUI will treat it as 
  2292.  *        a null-terminated string.
  2293.  * param pRect The output rectangle.
  2294.  * param nIndent The indent value of the first line.
  2295.  * param nFormat The methods used to format the text. MiniGUI support 
  2296.  *        the following method to format text so far:
  2297.  *
  2298.  *  - DT_TOPn
  2299.  *    Top-justifies text (single line only).
  2300.  *  - DT_LEFTn
  2301.  *    Aligns text to the left.
  2302.  *  - DT_CENTERn
  2303.  *    Centers text horizontally in the rectangle.
  2304.  *  - DT_RIGHTn
  2305.  *    Aligns text to the right.
  2306.  *  - DT_VCENTERn
  2307.  *    Centers text vertically (single line only).
  2308.  *  - DT_BOTTOMn
  2309.  *    Justify the text to the bottom of the rectangle. This value must be combined with DT_SINGLELINE.
  2310.  *  - DT_WORDBREAKn
  2311.  *    Break words. Lines are automatically broken beteween words if a word would extend past 
  2312.  *    the edge of the rectangle specified by the the pRect parameter. 
  2313.  *    A carriage return or linefeed also breaks the line.
  2314.  *  - DT_SINGLELINEn
  2315.  *    Display text ont the single line only. Carriage returns and linefeeds do not break the line.
  2316.  *  - DT_EXPANDTABSn
  2317.  *    Expands tab characters. The default number of character per tab is eight.
  2318.  *  - DT_TABSTOPn
  2319.  *    Set tab stops. Bits 15-8 (hight-order byte of the low-order word) of the a uForma parameter specify 
  2320.  *    the number of characters for each tab. The default number of characters per tab is eight.
  2321.  *  - DT_NOCLIPn
  2322.  *    Draws without clipping. a DrawText is somewhat faster when DT_NOCLIP is used.
  2323.  *  - DT_CALCRECTn
  2324.  *    Determines the width and the height of the rectangle. If there are multiple lines of text,  
  2325.  *    a DrawText uses the width of the rectangle pointed to by the a lpRect parameter and extends 
  2326.  *    the base of the rectangle to bound the last line of text. If there is only one line of text, 
  2327.  *    a DrawText modifies the right side of the rectangle so that it bounds 
  2328.  *    the last character in the line. In either case, a DrawText returns the height of 
  2329.  *    the formatted text but does not draw the text.
  2330.  *
  2331.  * param firstline If not null, DrawTextEx2 will only calculate the first line will be output in the
  2332.  *    rectangle, and return the number of the characters and the output width.
  2333.  *
  2334.  * return The output height of the formatted text.
  2335.  *
  2336.  * sa DrawText
  2337.  *
  2338.  * Example:
  2339.  *
  2340.  * include drawtext.c
  2341.  */
  2342. int GUIAPI DrawTextEx2 (HDC hdc, const char* pText, int nCount, 
  2343.                 RECT* pRect, int nIndent, UINT nFormat, DTFIRSTLINE *firstline);
  2344. /**
  2345.  * def DrawText(hdc, text, n, rc, format)
  2346.  * brief Draws a formatted text in a rectangle.
  2347.  *
  2348.  * Defined as a macro calling a DrawTextEx2 passing a nIndent as 0 and a firstline as NULL.
  2349.  *
  2350.  * sa DrawTextEx2
  2351.  */
  2352. #define DrawText(hdc, text, n, rc, format)      DrawTextEx2 (hdc, text, n, rc, 0, format, NULL)
  2353. /**
  2354.  * def DrawTextEx(hdc, text, n, rc, indent, format)
  2355.  * brief Draws a formatted text in a rectangle.
  2356.  *
  2357.  * Defined as a macro calling a DrawTextEx2 passing a firstline as NULL.
  2358.  *
  2359.  * sa DrawTextEx2
  2360.  */
  2361. #define DrawTextEx(hdc, text, n, rc, indent, format)      DrawTextEx2 (hdc, text, n, rc, indent, format, NULL)
  2362.     /** @} end of text_output_fns */
  2363.     /**
  2364.      * defgroup bmp_struct Bitmap structure
  2365.      *
  2366.      * MiniGUI uses a MYBITMAP structure to represent a device-independent bitmap,
  2367.      * and BITMAP structure to represent a device-dependent bitmap.
  2368.      *
  2369.      * Note that if _USE_NEWGAL is not defined, the BITMAP structure 
  2370.      * has a different definition:
  2371.      *
  2372.      * code
  2373.      * struct _BITMAP
  2374.      * {
  2375.      *      Uint8   bmType;
  2376.      *      Uint8   bmBitsPerPixel;
  2377.      *      Uint8   bmBytesPerPixel;
  2378.      *      Uint8   bmReserved;
  2379.      *
  2380.      *      Uint32  bmColorKey;
  2381.      *
  2382.      *      Uint32  bmWidth;
  2383.      *      Uint32  bmHeight;
  2384.      *      Uint32  bmPitch;
  2385.      *
  2386.      *      void*   bmBits;
  2387.      *      Uint32  bmReserved1;
  2388.      * };
  2389.      * endcode
  2390.      *
  2391.      * @{
  2392.      */
  2393. #define MYBMP_TYPE_NORMAL       0x00000000
  2394. #define MYBMP_TYPE_RLE4         0x00000001
  2395. #define MYBMP_TYPE_RLE8         0x00000002
  2396. #define MYBMP_TYPE_RGB          0x00000003
  2397. #define MYBMP_TYPE_BGR          0x00000004
  2398. #define MYBMP_TYPE_RGBA         0x00000005
  2399. #define MYBMP_TYPE_MASK         0x0000000F
  2400. #define MYBMP_FLOW_DOWN         0x00000010
  2401. #define MYBMP_FLOW_UP           0x00000020
  2402. #define MYBMP_FLOW_MASK         0x000000F0
  2403. #define MYBMP_TRANSPARENT       0x00000100
  2404. #define MYBMP_ALPHACHANNEL      0x00000200
  2405. #define MYBMP_ALPHA             0x00000400
  2406. #define MYBMP_RGBSIZE_3         0x00001000
  2407. #define MYBMP_RGBSIZE_4         0x00002000
  2408. #define MYBMP_LOAD_GRAYSCALE    0x00010000
  2409. #define MYBMP_LOAD_NONE         0x00000000
  2410. /** Device-independent bitmap structure. */
  2411. struct _MYBITMAP
  2412. {
  2413.     /**
  2414.      * Flags of the bitmap, can be OR'ed by the following values:
  2415.      *  - MYBMP_TYPE_NORMALn
  2416.      *    A normal palette bitmap.
  2417.      *  - MYBMP_TYPE_RGBn
  2418.      *    A RGB bitmap.
  2419.      *  - MYBMP_TYPE_BGRn
  2420.      *    A BGR bitmap.
  2421.      *  - MYBMP_TYPE_RGBAn
  2422.      *    A RGBA bitmap.
  2423.      *  - MYBMP_FLOW_DOWNn
  2424.      *    The scanline flows from top to bottom.
  2425.      *  - MYBMP_FLOW_UPn
  2426.      *    The scanline flows from bottom to top.
  2427.      *  - MYBMP_TRANSPARENTn
  2428.      *    Have a trasparent value.
  2429.      *  - MYBMP_ALPHACHANNELn
  2430.      *    Have a alpha channel.
  2431.      *  - MYBMP_ALPHAn
  2432.      *    Have a per-pixel alpha value.
  2433.      *  - MYBMP_RGBSIZE_3n
  2434.      *    Size of each RGB triple is 3 bytes.
  2435.      *  - MYBMP_RGBSIZE_4n
  2436.      *    Size of each RGB triple is 4 bytes.
  2437.      *  - MYBMP_LOAD_GRAYSCALEn
  2438.      *    Tell bitmap loader to load a grayscale bitmap.
  2439.      */
  2440.     DWORD flags;
  2441.     /** The number of the frames. */
  2442.     int   frames;
  2443.     /** The pixel depth. */
  2444.     Uint8 depth;
  2445.     /** The alpha channel value. */
  2446.     Uint8 alpha;
  2447.     Uint8 reserved [2];
  2448.     /** The transparent pixel. */
  2449.     Uint32 transparent;
  2450.     /** The width of the bitmap. */
  2451.     Uint32 w;
  2452.     /** The height of the bitmap. */
  2453.     Uint32 h;
  2454.     /** The pitch of the bitmap. */
  2455.     Uint32 pitch;
  2456.     /** The size of the bits of the bitmap. */
  2457.     Uint32 size;
  2458.     /** The pointer to the bits of the bitmap. */
  2459.     BYTE* bits;
  2460. };
  2461. #ifdef _USE_NEWGAL
  2462. #define BMP_TYPE_NORMAL         0x00
  2463. #define BMP_TYPE_RLE            0x01
  2464. #define BMP_TYPE_ALPHA          0x02
  2465. #define BMP_TYPE_ALPHACHANNEL   0x04
  2466. #define BMP_TYPE_COLORKEY       0x10
  2467. #define BMP_TYPE_PRIV_PIXEL     0x20
  2468. #ifdef _FOR_MONOBITMAP
  2469.   #define BMP_TYPE_MONOKEY      0x40
  2470. #endif
  2471. /** Expanded device-dependent bitmap structure. */
  2472. struct _BITMAP
  2473. {
  2474.     /**
  2475.      * Bitmap types, can be OR'ed by the following values:
  2476.      *  - BMP_TYPE_NORMALn
  2477.      *    A nomal bitmap, without alpha and color key.
  2478.      *  - BMP_TYPE_RLEn
  2479.      *    A RLE encoded bitmap, not used so far.
  2480.      *  - BMP_TYPE_ALPHAn
  2481.      *    Per-pixel alpha in the bitmap.
  2482.      *  - BMP_TYPE_ALPHACHANNELn
  2483.      *    The a bmAlpha is a valid alpha channel value.
  2484.      *  - BMP_TYPE_COLORKEYn
  2485.      *    The a bmColorKey is a valid color key value.
  2486.      *  - BMP_TYPE_PRIV_PIXELn
  2487.      *    The bitmap have a private pixel format.
  2488.      */
  2489.     Uint8   bmType;
  2490.     /** The bits per piexel. */
  2491.     Uint8   bmBitsPerPixel;
  2492.     /** The bytes per piexel. */
  2493.     Uint8   bmBytesPerPixel;
  2494.     /** The alpha channel value. */
  2495.     Uint8   bmAlpha;
  2496.     /** The color key value. */
  2497.     Uint32  bmColorKey;
  2498. #ifdef _FOR_MONOBITMAP
  2499.     Uint32  bmColorRep;
  2500. #endif
  2501.     /** The width of the bitmap */
  2502.     Uint32  bmWidth;
  2503.     /** The height of the bitmap */
  2504.     Uint32  bmHeight;
  2505.     /** The pitch of the bitmap */
  2506.     Uint32  bmPitch;
  2507.     /** The bits of the bitmap */
  2508.     Uint8*  bmBits;
  2509.     /** The private pixel format */
  2510.     void*   bmAlphaPixelFormat;
  2511. };
  2512. #else
  2513. #define BMP_TYPE_NORMAL         0x00
  2514. #define BMP_TYPE_COLORKEY       0x01
  2515. /* expanded bitmap struct */
  2516. struct _BITMAP
  2517. {
  2518.     Uint8   bmType;
  2519.     Uint8   bmBitsPerPixel;
  2520.     Uint8   bmBytesPerPixel;
  2521.     Uint8   bmReserved;
  2522.     Uint32  bmColorKey;
  2523.     Uint32  bmWidth;
  2524.     Uint32  bmHeight;
  2525.     Uint32  bmPitch;
  2526.     void*   bmBits;
  2527.     Uint32  bmReserved1;
  2528. };
  2529. #endif /* _USE_NEWGAL */
  2530.     /** @} end of bmp_struct */
  2531.     /**
  2532.      * defgroup bmp_load_fns Bitmap file load/save operations
  2533.      * @{
  2534.      *
  2535.      * Example:
  2536.      *
  2537.      * include bitmap.c
  2538.      */
  2539. #include <stdio.h>
  2540. #include "endianrw.h"
  2541. /**
  2542.  * fn BOOL GUIAPI RegisterBitmapFileType (const char *ext, int (*load) (MG_RWops* fp, MYBITMAP *bmp, RGB *pal), int (*save) (MG_RWops* fp, MYBITMAP *bmp, RGB *pal), BOOL (*check) (MG_RWops* fp))
  2543.  *
  2544.  * brief Registers a bitmap file loader, saver, and checker.
  2545.  *
  2546.  * This function registers a new bitmap file loader, saver, and checker. 
  2547.  * You should pass the extension of the bitmap files, the function to 
  2548.  * load this type of bitmap file, the function to save, and the 
  2549.  * function to check the type.
  2550.  *
  2551.  * param ext The extension name of the type of bitmap file, like "jpg" or "gif".
  2552.  * param load The loader of the bitmap file.
  2553.  * param save The saver of the bitmap file, can be NULL.
  2554.  * param check The checker of the bitmap file.
  2555.  * return TRUE on success, FALSE on error.
  2556.  *
  2557.  * sa CheckBitmapType, LoadBitmapEx, general_rw_fns
  2558.  */
  2559. BOOL GUIAPI RegisterBitmapFileType (const char *ext,
  2560.             int (*load) (MG_RWops* fp, MYBITMAP *bmp, RGB *pal),
  2561.             int (*save) (MG_RWops* fp, MYBITMAP *bmp, RGB *pal),
  2562.             BOOL (*check) (MG_RWops* fp));
  2563. /**
  2564.  * fn const char* GUIAPI CheckBitmapType (MG_RWops* fp)
  2565.  * brief Checks the type of the bitmap in a data source.
  2566.  * 
  2567.  * This function checks the type of the bitmap in the data source a fp,
  2568.  * and returns the extension of this type of bitmap file.
  2569.  *
  2570.  * param fp The pointer to the data source.
  2571.  * return The extension of the type of bitmap file. NULL for not recongnized bitmap type.
  2572.  *
  2573.  * sa RegisterBitmapFileType
  2574.  */
  2575. const char* GUIAPI CheckBitmapType (MG_RWops* fp);
  2576. #define ERR_BMP_OK              0
  2577. #define ERR_BMP_IMAGE_TYPE      -1
  2578. #define ERR_BMP_UNKNOWN_TYPE    -2
  2579. #define ERR_BMP_CANT_READ       -3
  2580. #define ERR_BMP_CANT_SAVE       -4
  2581. #define ERR_BMP_NOT_SUPPORTED   -5   
  2582. #define ERR_BMP_MEM             -6
  2583. #define ERR_BMP_LOAD            -7
  2584. #define ERR_BMP_FILEIO          -8
  2585. #define ERR_BMP_OTHER           -9
  2586. #define ERR_BMP_ERROR_SOURCE    -10
  2587. /**
  2588.  * fn int GUIAPI LoadBitmapEx (HDC hdc, PBITMAP pBitmap, MG_RWops* area, const char* ext)
  2589.  * brief Loads a device-dependent bitmap from a general data source.
  2590.  * 
  2591.  * This function loads a device-dependent bitmap from the data source a area.
  2592.  * 
  2593.  * param hdc The device context.
  2594.  * param pBitmap The pointer to the BITMAP object.
  2595.  * param area The data source.
  2596.  * param ext The extension of the type of this bitmap.
  2597.  * return 0 on success, less than 0 on error.
  2598.  *
  2599.  * retval ERR_BMP_OK Loading successfully
  2600.  * retval ERR_BMP_IMAGE_TYPE Not a valid bitmap.
  2601.  * retval ERR_BMP_UNKNOWN_TYPE Not recongnized bitmap type.
  2602.  * retval ERR_BMP_CANT_READ Read error.
  2603.  * retval ERR_BMP_CANT_SAVE Save error.
  2604.  * retval ERR_BMP_NOT_SUPPORTED Not supported bitmap type.
  2605.  * retval ERR_BMP_MEM Memory allocation error.
  2606.  * retval ERR_BMP_LOAD Loading error.
  2607.  * retval ERR_BMP_FILEIO I/O failed.
  2608.  * retval ERR_BMP_OTHER Other error.
  2609.  * retval ERR_BMP_ERROR_SOURCE A error data source.
  2610.  *
  2611.  * sa LoadBitmapFromFile, LoadBitmapFromMemory
  2612.  */
  2613. int GUIAPI LoadBitmapEx (HDC hdc, PBITMAP pBitmap, MG_RWops* area, const char* ext);
  2614. /**
  2615.  * fn int GUIAPI LoadBitmapFromFile (HDC hdc, PBITMAP pBitmap, const char* spFileName)
  2616.  * brief Loads a device-dependent bitmap from a file.
  2617.  *
  2618.  * sa LoadBitmapEx
  2619.  */
  2620. int GUIAPI LoadBitmapFromFile (HDC hdc, PBITMAP pBitmap, const char* spFileName);
  2621. /**
  2622.  * def LoadBitmap
  2623.  * brief An alias of a LoadBitmapFromFile.
  2624.  *
  2625.  * sa LoadBitmapFromFile
  2626.  */
  2627. #define LoadBitmap  LoadBitmapFromFile
  2628. /**
  2629.  * fn int GUIAPI LoadBitmapFromMem (HDC hdc, PBITMAP pBitmap, const void* mem, int size, const char* ext)
  2630.  * brief Loads a device-dependent bitmap from memory.
  2631.  *
  2632.  * sa LoadBitmapEx
  2633.  */
  2634. int GUIAPI LoadBitmapFromMem (HDC hdc, PBITMAP pBitmap, const void* mem, int size, const char* ext);
  2635. #define LoadBitmapFromMemory LoadBitmapFromMem
  2636. /**
  2637.  * fn void GUIAPI UnloadBitmap (PBITMAP pBitmap)
  2638.  * brief Unloads a bitmap.
  2639.  *
  2640.  * This function unloads the specified bitmap a pBitmap.
  2641.  * It will free the private pixel format and the bits of the bitmap.
  2642.  *
  2643.  * param pBitmap The BITMAP object.
  2644.  *
  2645.  * sa LoadBitmapEx
  2646.  */
  2647. void GUIAPI UnloadBitmap (PBITMAP pBitmap);
  2648. /**
  2649.  * fn void GUIAPI ReplaceBitmapColor (HDC hdc, PBITMAP pBitmap, gal_pixel iOColor, gal_pixel iNColor)
  2650.  * brief Replaces a specific pixels in a bitmap with another pixel.
  2651.  *
  2652.  * This function replaces the specific pixels with value a iOColor with the other pixel value a iNcolor
  2653.  * in the bitmap a pBitmap.
  2654.  *
  2655.  * param hdc The device context.
  2656.  * param pBitmap The BITMAP object.
  2657.  * param iOColor The pixel value of the color will be replaced.
  2658.  * param iNColor The pixel value of the new color.
  2659.  *
  2660.  */
  2661. void GUIAPI ReplaceBitmapColor (HDC hdc, PBITMAP pBitmap, gal_pixel iOColor, gal_pixel iNColor);
  2662. /**
  2663.  * fn int GUIAPI LoadMyBitmapEx (PMYBITMAP my_bmp, RGB* pal, MG_RWops* area, const char* ext)
  2664.  * brief Loads a MYBITMAP object from a data source.
  2665.  *
  2666.  * This function loads a MYBITMAP object from the data source a area.
  2667.  *
  2668.  * param my_bmp The pointer to the MYBITMAP object.
  2669.  * param area The data source.
  2670.  * param pal The palette will be returned.
  2671.  * param ext The extension of the type of this bitmap.
  2672.  * return 0 on success, less than 0 on error.
  2673.  *
  2674.  * sa LoadBitmapEx
  2675.  */
  2676. int GUIAPI LoadMyBitmapEx (PMYBITMAP my_bmp, RGB* pal, MG_RWops* area, const char* ext);
  2677. /**
  2678.  * fn int GUIAPI LoadMyBitmapFromFile (PMYBITMAP my_bmp, RGB* pal, const char* file_name)
  2679.  * brief Loads a MYBITMAP object from a file.
  2680.  *
  2681.  * sa LoadMyBitmapEx
  2682.  */
  2683. int GUIAPI LoadMyBitmapFromFile (PMYBITMAP my_bmp, RGB* pal, const char* file_name);
  2684. /**
  2685.  * def LoadMyBitmap
  2686.  * brief Alias of a LoadMyBitmapFromFile.
  2687.  *
  2688.  * sa LoadMyBitmapFromFile
  2689.  */
  2690. #define LoadMyBitmap    LoadMyBitmapFromFile
  2691. /**
  2692.  * fn int GUIAPI LoadMyBitmapFromMem (PMYBITMAP my_bmp, RGB* pal, const void* mem, int size, const char* ext)
  2693.  * brief Loads a MYBITMAP object from memory.
  2694.  *
  2695.  * This function loads a MYBITMAP object from memory.
  2696.  *
  2697.  * param my_bmp The pointer to the MYBITMAP object.
  2698.  * param pal The palette will be retruned through this pointer.
  2699.  * param mem The pointer to the memory area.
  2700.  * param size The size of the memory area.
  2701.  * param ext The extension name used to determine the type of the bitmap.
  2702.  *
  2703.  * sa LoadMyBitmapEx, MYBITMAP
  2704.  */
  2705. int GUIAPI LoadMyBitmapFromMem (PMYBITMAP my_bmp, RGB* pal, const void* mem, int size, const char* ext);
  2706. #define LoadMyBitmapFromMemory LoadMyBitmapFromMem
  2707. /**
  2708.  * fn void GUIAPI UnloadMyBitmap (PMYBITMAP my_bmp)
  2709.  * brief Unloads a bitmap.
  2710.  *
  2711.  * This function unloads the specified MYBITMAP object a my_bmp.
  2712.  * It will free the bits of the bitmap.
  2713.  *
  2714.  * param my_bmp The pointer to the MYBITMAP object.
  2715.  *
  2716.  * sa LoadMyBitmapEx
  2717.  */
  2718. void GUIAPI UnloadMyBitmap (PMYBITMAP my_bmp);
  2719. #ifdef _SAVE_BITMAP
  2720. /**
  2721.  * fn int GUIAPI SaveMyBitmapToFile (PMYBITMAP my_bmp, RGB* pal, const char* spFileName)
  2722.  * brief Saves a MYBITMAP object to a bitmap file.
  2723.  * 
  2724.  * This function saves the MYBITMAP object a my_bmp to the bitmap file named a spFileName.
  2725.  *
  2726.  * param my_bmp The MYBITMAP object.
  2727.  * param pal The palette.
  2728.  * param spFileName The file name.
  2729.  * return 0 on success, less than 0 on error.
  2730.  *
  2731.  * sa SaveBitmapToFile
  2732.  */
  2733. int GUIAPI SaveMyBitmapToFile (PMYBITMAP my_bmp, RGB* pal, const char* spFileName);
  2734. /**
  2735.  * fn int GUIAPI SaveBitmapToFile (HDC hdc, PBITMAP pBitmap, const char* spFileName)
  2736.  * brief Saves a BITMAP object to a bitmap file.
  2737.  * 
  2738.  * This function saves the BITMAP object a pBitmap to the bitmap file named a spFileName.
  2739.  *
  2740.  * param hdc The device context.
  2741.  * param pBitmap The BITMAP object.
  2742.  * param spFileName The file name.
  2743.  * return 0 on success, less than 0 on error.
  2744.  *
  2745.  * sa SaveMyBitmapToFile
  2746.  */
  2747. int GUIAPI SaveBitmapToFile (HDC hdc, PBITMAP pBitmap, const char* spFileName);
  2748. #define SaveBitmap  SaveBitmapToFile 
  2749. #endif
  2750. /**
  2751.  * fn BOOL GUIAPI InitBitmap (HDC hdc, Uint32 w, Uint32 h, Uint32 pitch, BYTE* bits, PBITMAP bmp)
  2752.  * brief Initializes a BITMAP object as a normal bitmap.
  2753.  *
  2754.  * This function initializes the bitmap pointed to by a bmp as a normal bitmap.
  2755.  * It sets the bitmap structure fields, and allocates the bits if a bits is NULL.
  2756.  *
  2757.  * param hdc The device context.
  2758.  * param w The width of the bitmap.
  2759.  * param h The height of the bitmap.
  2760.  * param pitch The pitch of the bitmap.
  2761.  * param bits The bits of the bitmap.
  2762.  * param bmp The BITMAP object to be initialized.
  2763.  * return TRUE on success, FALSE on error.
  2764.  *
  2765.  * note a LoadBitmapEx will initialize the BITMAP object itself.
  2766.  *
  2767.  * sa InitBitmapPixelFormat, UnloadBitmap, bmp_struct
  2768.  */
  2769. BOOL GUIAPI InitBitmap (HDC hdc, Uint32 w, Uint32 h, Uint32 pitch, BYTE* bits, PBITMAP bmp);
  2770. #ifdef _USE_NEWGAL
  2771. /**
  2772.  * fn BOOL GUIAPI InitBitmapPixelFormat (HDC hdc, PBITMAP bmp)
  2773.  * brief Initializes the bitmap pixel format information of a BITMAP object.
  2774.  *
  2775.  * This function initializes the bitmap pixel format information of the BITMAP object
  2776.  * pointed to by a bmp. This includes a bmBitsPerPixel and a bmBytesPerPixel fields,
  2777.  * and the private pixel format if the bitmap is a bitmap with alpha.
  2778.  *
  2779.  * param hdc The device context.
  2780.  * param bmp The BITMAP object to be initialized.
  2781.  * return TRUE on success, FALSE on error.
  2782.  *
  2783.  * sa InitBitmap, bmp_struct
  2784.  */
  2785. BOOL GUIAPI InitBitmapPixelFormat (HDC hdc, PBITMAP bmp);
  2786. /**
  2787.  * fn void GUIAPI DeleteBitmapAlphaPixel (PBITMAP bmp)
  2788.  * brief Deletes the bitmap alpha pixel format information of a BITMAP object.
  2789.  *
  2790.  * This function deletes the bitmap alpha pixel format information of the BITMAP object a bmp.
  2791.  *
  2792.  * sa InitBitmapPixelFormat
  2793.  */
  2794. void GUIAPI DeleteBitmapAlphaPixel (PBITMAP bmp);
  2795. /**
  2796.  * fn int GUIAPI ExpandMyBitmap (HDC hdc, PBITMAP bmp, const MYBITMAP* my_bmp, const RGB* pal, int frame)
  2797.  * brief Expands a MYBITMAP object to a BITMAP object.
  2798.  *
  2799.  * This function expands the MYBITMAP object pointed to by a my_bmp
  2800.  * to a BITMAP object (a bmp).
  2801.  *
  2802.  * param hdc The device context.
  2803.  * param bmp The expanded BITMAP object.
  2804.  * param my_bmp The MYBITMAP object to be expanded.
  2805.  * param pal The palette of the MYBITMAP object.
  2806.  * param frame The frame of the MYBITMAP object.
  2807.  * return 0 on success, non-zero on error.
  2808.  */
  2809. int GUIAPI ExpandMyBitmap (HDC hdc, PBITMAP bmp, const MYBITMAP* my_bmp, const RGB* pal, int frame);
  2810. void GUIAPI ExpandMonoBitmap (HDC hdc, BYTE* bits, Uint32 pitch, const BYTE* my_bits, Uint32 my_pitch, 
  2811.                 Uint32 w, Uint32 h, DWORD flags, Uint32 bg, Uint32 fg);
  2812. void GUIAPI Expand16CBitmap (HDC hdc, BYTE* bits, Uint32 pitch, const BYTE* my_bits, Uint32 my_pitch, 
  2813.                 Uint32 w, Uint32 h, DWORD flags, const RGB* pal);
  2814. void GUIAPI Expand256CBitmap (HDC hdc, BYTE* bits, Uint32 pitch, const BYTE* my_bits, Uint32 my_pitch, 
  2815.                 Uint32 w, Uint32 h, DWORD flags, const RGB* pal);
  2816. void GUIAPI CompileRGBABitmap (HDC hdc, BYTE* bits, Uint32 pitch, const BYTE* my_bits, Uint32 my_pitch, 
  2817.                 Uint32 w, Uint32 h, DWORD flags, void* pixel_format);
  2818. #define CompileRGBBitmap CompileRGBABitmap 
  2819. #else
  2820. int GUIAPI ExpandMyBitmap (HDC hdc, const MYBITMAP* pMyBitmap, const RGB* pal, PBITMAP pBitmap);
  2821. void GUIAPI ExpandMonoBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow, 
  2822.                                 BYTE* bitmap, int pitch, int bg, int fg);
  2823. void GUIAPI Expand16CBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow,
  2824.                                 BYTE* bitmap, int pitch, const RGB* pal);
  2825. void GUIAPI Expand256CBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow,
  2826.                                 BYTE* bitmap, int pitch, const RGB* pal);
  2827. void GUIAPI CompileRGBBitmap (HDC hdc, int w, int h, const BYTE* my_bits, int my_pitch, int bits_flow,
  2828.                              BYTE* bitmap, int pitch, int rgb_order);
  2829. #endif /* _USE_NEWGAL */
  2830.     /** @} end of bmp_load_fns */
  2831.     /** @} end of gdi_fns */
  2832.     /** @} end of fns */
  2833. #ifdef __cplusplus
  2834. }
  2835. #endif  /* __cplusplus */
  2836. #endif  /* _MGUI_GDI_H */