sitetran.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:181k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: sitetran.cpp,v 1.2.40.1 2004/07/09 01:59:28 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #define _TRANSITIONS_ON_
  50. //#define _TESTING_TRANITIONS_   
  51. #ifdef _TESTING_TRANITIONS_
  52. #define INITGUID    // this must be befor pntypes
  53. #endif
  54. #include "hxtypes.h" // this must be before windows.h
  55. #ifdef _WIN32
  56. #include "windows.h"
  57. #endif
  58. #define PI 3.14159265358979323846
  59. #define Root2 1.414213562
  60. #include <math.h>
  61. #include <stdio.h>
  62. #include <stdlib.h>
  63. //#define NO_GRAPHICS
  64. #include "hxcom.h"
  65. #include "hxbuffer.h"
  66. #include "hxassert.h"
  67. #include "sitetran.h"
  68. #include "region.h"
  69. #include "poly.h"
  70. #include "tranmat.h"
  71. #include "hxstrutl.h"
  72. //=======================================================================
  73. //=======================================================================
  74. //               All Transistion effects
  75. //=======================================================================
  76. //=======================================================================
  77. void CopyRegion(HXREGION* dstrgn, HXREGION* rgn)
  78. {
  79.    if (dstrgn != rgn) /*  don't want to copy to itself */
  80.    {  
  81.       if (dstrgn->size < rgn->numRects)
  82.       {
  83.          if (dstrgn->rects)
  84.          {
  85.             HXBOX *prevRects = dstrgn->rects;
  86.                 
  87.             if (! (dstrgn->rects = (HXBOX *)
  88.                    realloc((char *) dstrgn->rects,
  89.                            (unsigned) rgn->numRects * (sizeof(HXBOX))))) {
  90.                free(prevRects);
  91.                return;
  92.             }
  93.          }
  94.          dstrgn->size = rgn->numRects;
  95.       }
  96.       dstrgn->numRects = rgn->numRects;
  97.       dstrgn->extents.x1 = rgn->extents.x1;
  98.       dstrgn->extents.y1 = rgn->extents.y1;
  99.       dstrgn->extents.x2 = rgn->extents.x2;
  100.       dstrgn->extents.y2 = rgn->extents.y2;
  101.       memcpy((char *) dstrgn->rects, (char *) rgn->rects, /* Flawfinder: ignore */
  102.              (int) (rgn->numRects * sizeof(HXBOX)));
  103.    }
  104. }
  105. HXREGION* InvertRGN(HXREGION* in, int x, int y, int x1, int y1)
  106. {
  107.    HXREGION* retRGN = HXCreateRectRegion(x,y,x1 - x,y1 - y);
  108.    HXCombineRgn(retRGN, retRGN, in, HX_RGN_DIFF);
  109.    HXDestroyRegion(in);
  110.    return retRGN;
  111. }
  112. int CompareRects(const void *arg1, const void *arg2)
  113. {
  114.    HXBOX* b1 = (HXBOX*)arg1;
  115.    HXBOX* b2 = (HXBOX*)arg2;
  116.    if (b1->y1 < b2->y1) 
  117.       return -1;
  118.    if (b1->y1 != b2->y1)
  119.       return 1;
  120.    if (b1->x1 < b2->x1)
  121.       return -1;
  122.    if (b1->x1 != b2->x1)
  123.       return 1;
  124.    return 0;
  125. }
  126. HXREGION* MirrorHorizontal(HXREGION* in, int y)
  127. {
  128.    int tmpY;
  129.    for (int i = 0; i < in->numRects; ++i)
  130.    {
  131.       in->rects[i].y1 = 2 * y - in->rects[i].y1;
  132.       in->rects[i].y2 = 2 * y - in->rects[i].y2;
  133.         
  134.       if (in->rects[i].y2 < in->rects[i].y1)
  135.       {
  136.          tmpY = in->rects[i].y1;
  137.          in->rects[i].y1 = in->rects[i].y2;
  138.          in->rects[i].y2 = tmpY;
  139.       }
  140.    }
  141.    qsort((void*)in->rects, in->numRects, sizeof(HXBOX), CompareRects);
  142.    return in;
  143. }
  144. HXREGION* MirrorVertical(HXREGION* in, int x)
  145. {
  146.    int tmpX;
  147.    for (int i = 0; i < in->numRects; ++i)
  148.    {
  149.       in->rects[i].x1 = 2 * x - in->rects[i].x1;
  150.       in->rects[i].x2 = 2 * x - in->rects[i].x2;
  151.         
  152.       if (in->rects[i].x2 < in->rects[i].x1)
  153.       {
  154.          tmpX = in->rects[i].x1;
  155.          in->rects[i].x1 = in->rects[i].x2;
  156.          in->rects[i].x2 = tmpX;
  157.       }
  158.       if( in->rects[i].x1 != 0 )
  159.           in->rects[i].x1 = in->rects[i].x1 -1;
  160.    }
  161.    qsort((void*)in->rects, in->numRects, sizeof(HXBOX), CompareRects);
  162.    return in;
  163. }
  164. void MirrorHorizontal(tranLines* lines, int y)
  165. {
  166.    for (int i = 0; i < lines->m_nLines; ++i)
  167.    {
  168.       lines->m_pLines[i].start.x = lines->m_pLines[i].start.x;
  169.       lines->m_pLines[i].start.y = 2 * y - lines->m_pLines[i].start.y;
  170.       lines->m_pLines[i].finish.x = lines->m_pLines[i].finish.x;
  171.       lines->m_pLines[i].finish.y = 2 * y - lines->m_pLines[i].finish.y;
  172.    }
  173. }
  174. void MirrorVertical(tranLines* lines, int x)
  175. {
  176.    for (int i = 0; i < lines->m_nLines; ++i)
  177.    {
  178.       lines->m_pLines[i].start.x = 2 * x - lines->m_pLines[i].start.x;
  179.       lines->m_pLines[i].start.y = lines->m_pLines[i].start.y;
  180.       lines->m_pLines[i].finish.x = 2 * x - lines->m_pLines[i].finish.x;
  181.       lines->m_pLines[i].finish.y = lines->m_pLines[i].finish.y;
  182.    }
  183. }
  184. tranLines::tranLines()
  185. {
  186.    m_nLines = 0;
  187.    m_pLines = NULL;
  188. }
  189. tranLines::~tranLines()
  190. {
  191.    Destroy();
  192. }
  193. LineSegment::LineSegment(const LineSegment& ls)
  194. {
  195.    *this = ls;
  196. }
  197. void LineSegment::operator=(const LineSegment& right)
  198. {
  199.    start.x = right.start.x;
  200.    start.y = right.start.y;
  201.    finish.x = right.finish.x;
  202.    finish.y = right.finish.y;
  203. }
  204. // returns TRUE if the line is within the boundary, FALSE if it lies completely outside
  205. BOOL LineSegment::Clip(int left, int top, int right, int bottom)
  206. {
  207.    BOOL retVal = TRUE;
  208.    double slope;
  209.    // make sure our start is left of finish
  210.    if (start.x > finish.x)
  211.    {
  212.       int tmp = start.x;
  213.       start.x = finish.x;
  214.       finish.x = tmp;
  215.       tmp = start.y;
  216.       start.y = finish.y;
  217.       finish.y = tmp;
  218.    }
  219.    if (start.x > right || finish.x < left ||
  220.        (start.y < top && finish.y < top) ||
  221.        (start.y > bottom && finish.y > bottom))
  222.    {
  223.       retVal = FALSE;
  224.       goto LineSegment_Clip_End;
  225.    }
  226.    slope = ((double)(finish.y - start.y + 1) / (double)(finish.x - start.x + 1));
  227.    if (start.x < left)
  228.    {
  229.       start.y += int((left - start.x) * slope);
  230.       start.x = left;
  231.    }
  232.    if (start.y > bottom)
  233.    {
  234.       start.x -= int((start.y - bottom) / slope);
  235.       start.y = bottom;
  236.    }
  237.    if(start.y < top)
  238.    {
  239.       start.x += int((top - start.y) / slope);
  240.       start.y = top;
  241.    }
  242.    if (finish.x > right)
  243.    {
  244.       finish.y -= int((finish.x - right) * slope);
  245.       finish.x = right;
  246.    }
  247.    if (finish.y > bottom)
  248.    {
  249.       finish.x -= int((finish.y - bottom) / slope);
  250.       finish.y = bottom;
  251.    }
  252.    if(finish.y < top)
  253.    {
  254.       finish.x += int((top - finish.y) / slope);
  255.       finish.y = top;
  256.    }
  257.    if (start.x < left || start.x > right ||
  258.        start.y < top || start.y > bottom ||
  259.        finish.x < left || finish.x > right || 
  260.        finish.y < top || finish.y > bottom)
  261.    {
  262.       //XXXSMJ currently there's a case were the line can exist with only
  263.       // an endpoint on border.  This means only one pixel of the line is
  264.       // inside the clipping region.  For now, we'll say this sucker is
  265.       // clipped.
  266.       retVal = FALSE;
  267.    }
  268.   LineSegment_Clip_End:
  269.    return retVal;
  270. }
  271. tranLines* operator+(const tranLines& left, const tranLines& right)
  272. {
  273.    tranLines* newLines = const_cast<tranLines*>(&left);
  274.     
  275.    if (right.m_nLines)
  276.    {
  277.       newLines = new tranLines;
  278.     
  279.       newLines->m_nLines = left.m_nLines + right.m_nLines;
  280.       newLines->m_pLines = new LineSegment[newLines->m_nLines];
  281.     
  282.       if (!newLines->m_pLines)
  283.       {
  284.          newLines->m_nLines = 0;
  285.       }
  286.       else
  287.       {
  288.          int i,c;
  289.          for (i = 0, c = 0; i < left.m_nLines; ++i, ++c)
  290.          {
  291.             newLines->m_pLines[c] = left.m_pLines[i];
  292.          }
  293.          for (i = 0; i < right.m_nLines; ++i, ++c)
  294.          {
  295.             newLines->m_pLines[c] = right.m_pLines[i];
  296.          }
  297.       }
  298.    }
  299.    return newLines;
  300. }
  301. void tranLines::operator=(const tranLines& right)
  302. {
  303.    Copy(right);
  304. }
  305. void tranLines::operator+=(const tranLines& right)
  306. {
  307.    if (right.m_nLines)
  308.    {
  309.       tranLines* newLines = *this + right;
  310.       Copy(*newLines);
  311.     
  312.       delete newLines;
  313.    }
  314. }
  315. void tranLines::operator+=(const LineSegment& right)
  316. {
  317.    tranLines newLines;
  318.     
  319.    newLines.m_nLines = 1;
  320.    newLines.m_pLines = new LineSegment[1];
  321.     
  322.    if (!newLines.m_pLines)
  323.    {
  324.       newLines.m_nLines = 0;
  325.    }
  326.    else
  327.    {
  328.       *newLines.m_pLines = right;
  329.    }
  330.    *this += newLines;
  331. }
  332. tranLines::tranLines(const tranLines& tl)
  333. {
  334.    m_nLines = 0;
  335.    m_pLines = NULL;
  336.    Copy(tl);
  337. }
  338. void tranLines::Copy(const tranLines& tl)
  339. {
  340.    Destroy();
  341.    m_nLines = tl.m_nLines;
  342.    if (m_nLines)
  343.    {
  344.       m_pLines = new LineSegment[m_nLines];
  345.       for (int i = 0; i < m_nLines; ++i)
  346.       {
  347.          m_pLines[i] = tl.m_pLines[i];
  348.       }
  349.    }
  350. }
  351. void tranLines::Offset(int x, int y)
  352. {
  353.    for (int i = 0; i < m_nLines; ++i)
  354.    {
  355.       m_pLines[i].start.x += x;
  356.       m_pLines[i].start.y += y;
  357.       m_pLines[i].finish.x += x;
  358.       m_pLines[i].finish.y += y;
  359.    }
  360. }
  361. void tranLines::Destroy()
  362. {
  363.    if (m_pLines)
  364.    {
  365.       delete [] m_pLines;
  366.       m_pLines = NULL;
  367.    }
  368.    m_nLines = 0;
  369. }
  370. void tranLines::Clip(int left, int top, int right, int bottom)
  371. {
  372.    int newlines = m_nLines;
  373.    for (int i = 0; i < m_nLines; ++i)
  374.    {
  375.       if (!m_pLines[i].Clip(left, top, right, bottom))
  376.       {
  377.          // the line is not within our area so mark it for clipping
  378.          m_pLines[i].start.x = m_pLines[i].start.y = m_pLines[i].finish.x = m_pLines[i].finish.y = -42;
  379.          --newlines;
  380.       }
  381.    }
  382.    if (newlines != m_nLines)  // do we need to remove any lines?
  383.    {
  384.       tranLines tmpLines;
  385.       tmpLines.m_nLines = newlines;
  386.       tmpLines.m_pLines = new LineSegment[newlines];
  387.       for (int i = 0, c = 0; c < newlines; ++i)
  388.       {
  389.          if (m_pLines[i].start.x != -42 && m_pLines[i].start.y != -42 &&
  390.              m_pLines[i].finish.x != -42 && m_pLines[i].finish.y != -42)
  391.          {
  392.             tmpLines.m_pLines[c++] = m_pLines[i];
  393.          }
  394.       }
  395.    }
  396. }
  397. void GetDiagonalStripCoords(HXxPoint topLeft, HXxPoint topRight, HXxPoint bottomRight, HXxPoint bottomLeft, HXxPoint* topPoint, HXxPoint* bottomPoint, int completeness)
  398. {
  399.    int topWidth = topRight.x - topLeft.x;
  400.    int bottomWidth = bottomRight.x - bottomLeft.x;
  401.    int height = max(bottomLeft.y - topLeft.y, bottomRight.y - topRight.y);
  402.    double angle;
  403.     
  404.    int length;
  405.    int mark;
  406.     
  407.    if (topWidth > bottomWidth)
  408.    {
  409.       int rightHeight = topLeft.y - topRight.y;
  410.       length = int(sqrt((double)(topWidth * topWidth + rightHeight * rightHeight)));
  411.       mark = int(double(length * completeness) / 1000.0);
  412.       angle = atan(double(topLeft.y - topRight.y) / double(topWidth));
  413.         
  414.       topPoint->x = int(topLeft.x + cos(angle) * mark);
  415.       topPoint->y = int(topLeft.y - sin(angle) * mark);
  416.         
  417.       int length2 = int(sin(angle) * height);
  418.         
  419.       bottomPoint->x = topPoint->x + int(cos(angle) * length2 + 1);
  420.       bottomPoint->y = topPoint->y + height - int(sin(angle) * length2);
  421.    }
  422.    else
  423.    {
  424.       int leftHeight = bottomLeft.y - bottomRight.y;
  425.       length = int(sqrt((double)(bottomWidth * bottomWidth + leftHeight * leftHeight)));
  426.       mark = int(double(length * completeness) / 1000.0);
  427.       angle = atan(double(bottomLeft.y - bottomRight.y) / double(bottomWidth));
  428.         
  429.       bottomPoint->x = int(bottomLeft.x + cos(angle) * mark + 1);
  430.       bottomPoint->y = int(bottomLeft.y - sin(angle) * mark);
  431.         
  432.       int length2 = int(sin(angle) * height);
  433.         
  434.       topPoint->x = bottomPoint->x - int(cos(angle) * length2 + 1);
  435.       topPoint->y = bottomPoint->y - height + int(sin(angle) * length2);
  436.    }
  437. }
  438. void PrintRgnData(HXREGION* retRGN)
  439. {
  440. #ifdef _WINDOWS
  441.    FILE* f1 = ::fopen("d:\expose.txt", "a+"); /* Flawfinder: ignore */
  442.    LPRGNDATA    lpRgnData;
  443.    DWORD sizeNeeed = GetRegionData((HRGN)retRGN, 0, NULL); 
  444.    lpRgnData = (LPRGNDATA) new char[sizeNeeed];
  445.    GetRegionData((HRGN)retRGN, sizeNeeed, lpRgnData); 
  446.    for(int j = 0; j < (int) lpRgnData->rdh.nCount;j++)
  447.    {
  448.       HXRECTANGLE* pRect = (HXRECTANGLE*) lpRgnData->Buffer;
  449.       ::fprintf(f1, "Rect (%d, %d) -(%d, %d)n", pRect[j].x, pRect[j].y, pRect[j].width, pRect[j].height);
  450.    }
  451.    delete lpRgnData;
  452.    fclose(f1);
  453. #else
  454.    HX_ASSERT(!"cant print rgn data");
  455. #endif
  456. }
  457. //#define _TESTING_TRANITIONS_
  458. /* 
  459.  * Table of all transition effects
  460.  */
  461. //          {DefaultTransition, ""},
  462. #ifdef _TRANSITIONS_ON_
  463. tranStruct z_barWipeTable[] =
  464. {
  465.    {EdgeWipe, 1,"leftToRight"},
  466.    {SlideVerticalEdgeWipe, 2, "topToBottom"}
  467. };
  468. tranStruct z_boxWipeTable[] =
  469. {
  470.    {TopLeftEdgeWipe, 3, "topLeft"},
  471.    {TopRightEdgeWipe, 4, "topRight"},
  472.    {BottomRightEdgeWipe, 5, "bottomRight"},
  473.    {BottomLeftEdgeWipe, 6, "bottomLeft"},
  474.    {TopCenterEdgeWipe, 23, "topCenter"},
  475.    {CenterRightEdgeWipe, 24, "rightCenter"},
  476.    {BottomCenterEdgeWipe, 25, "bottomCenter"},
  477.    {LeftCenterEdgeWipe, 26, "leftCenter"}
  478. };
  479. tranStruct z_fourBoxTable[] =
  480. {
  481.    {FourCornerEdgeWipe, 7, "cornersIn"},
  482.    {FourBoxEdgeWipe , 8, "cornersOut"}
  483. };
  484. tranStruct z_barnDoorTable[] =
  485. {
  486.    {BarnVerticalEdgeWipe , 21, "vertical"},
  487.    {BarnHorizontalEdgeWipe, 22, "horizontal"},
  488.    {DiagonaLeftOutEdgeWipe, 45, "diagonalBottomLeft"},
  489.    {DiagonaRightOutEdgeWipe, 46, "diagonalTopLeft"}
  490. };    
  491. tranStruct z_diagonalTable[] =
  492. {
  493.    {DiagonalLeftDownEdgeWipe, 41, "topLeft"},
  494.    {DiagonalRightDownEdgeWipe, 42, "topRight"}
  495. };
  496. tranStruct z_bowTieTable[] =
  497. {
  498.    {VerticalBowTieEdgeWipe, 43, "vertical"},
  499.    {HorizontalBowTieEdgeWipe, 44, "horizontal"}
  500. };
  501. tranStruct z_miscDiagonalTable[] =
  502. {
  503.    {DiagonaCrossEdgeWipe, 47, "doubleBarnDoor"},
  504.    {DiagonalBoxEdgeWipe, 48, "doubleDiamond"}
  505. };
  506. tranStruct z_veeTable[] =
  507. {
  508.    {FilledVEdgeWipe, 61, "down"},
  509.    {FilledVRightEdgeWipe, 62, "left"},
  510.    {FilledVBottomEdgeWipe, 63, "up"},
  511.    {FilledVLeftEdgeWipe, 64, "right"}
  512. };
  513. tranStruct z_barnVeeTable[] =
  514. {
  515.    {HollowVEdgeWipe, 65, "down"},
  516.    {HollowVRightEdgeWipe, 66, "left"},
  517.    {HollowVBottomEdgeWipe , 67, "up"},
  518.    {HollowVLeftEdgeWipe, 68, "right"}
  519. };
  520. tranStruct z_zigZagTable[] =
  521. {
  522.    {VerticalZigZagEdgeWipe, 71, "leftToRight"},
  523.    {HorizontalZigZagEdgeWipe, 72, "topToBottom"}
  524. };
  525. tranStruct z_barnZigZagTable[] =
  526. {
  527.    {VerticalBarnZigZagEdgeWipe, 73, "vertical"},
  528.    {HorizontalBarnZigZagEdgeWipe, 74, "horizontal"}
  529. };
  530. //-----------------------------------------------------------------------
  531. tranStruct z_irisTable[] =
  532. {
  533.    {RectangleIris, 101, "rectangle"},
  534.    {DiamondIris, 102, "diamond"}
  535. };
  536. tranStruct z_triangleTable[] =
  537. {
  538.    {TriangleIris, 103, "up"},
  539.    {TriangleRightIris, 104, "right"},
  540.    {TriangleUpsideDownIris, 105, "down"},
  541.    {TriangleLeftIris, 106, "left"}
  542. };
  543. tranStruct z_arrowHeadTable[] =
  544. {
  545.    {ArrowHeadIris, 107, "up"},
  546.    {ArrowHeadRightIris, 108, "right"},
  547.    {ArrowHeadUpsideDownIris, 109, "down"},
  548.    {ArrowHeadLeftIris, 110, "left"}
  549. };
  550. tranStruct z_pentagonTable[] =
  551. {
  552.    {PentagonIris, 111, "up"},
  553.    {PentagonUpsideDownLeftIris, 112, "down"}
  554. };
  555. tranStruct z_hexagonTable[] =
  556. {
  557.    {HexagonSideIris, 113, "horizontal"},
  558.    {HexagonIris, 114, "vertical"}
  559. };
  560. tranStruct z_ellipseTable[] =
  561. {
  562.    {CircleIris, 119, "circle"},
  563.    {OvalIris, 120, "horizontal"},
  564.    {OvalSideIris, 121, "vertical"}
  565. };
  566. tranStruct z_eyeTable[] =
  567. {
  568.    {CatEyeIris, 122, "horizontal"},
  569.    {CatEyeSideIris, 123, "vertical"}
  570. };
  571. tranStruct z_roundRectTable[] =
  572. {
  573.    {RoundRectHorizontal, 124, "horizontal"},
  574.    {RoundRectVeritical, 125, "vertical"}
  575. };
  576. tranStruct z_starTable[] =
  577. {
  578.    {FourPointStarIris, 127, "fourPoint"},
  579.    {FivePointStarIris, 128, "fivePoint"},
  580.    {SixPointStarIris, 129, "sixPoint"}
  581. };
  582. tranStruct z_miscShapeTable[] =
  583. {
  584.    {HeartIris, 130, "heart"},
  585.    {KeyHoleIris, 131, "keyhole"}
  586. };
  587. //-----------------------------------------------------------------------
  588. tranStruct z_clockTable[] =
  589. {
  590.    {RotatingTopRadial, 201, "clockwiseTwelve"},
  591.    {RotatingRightRadial, 202, "clockwiseThree"},
  592.    {RotatingBottomRadial , 203, "clockwiseSix"},
  593.    {RotatingLeftRadial, 204, "clockwiseNine"}
  594. };
  595. tranStruct z_pinWheelTable[] =
  596. {
  597.    {RotatingTopBottomRadial, 205, "twoBladeVertical"},
  598.    {RotatingLeftRightRadial, 206, "twoBladeHorizontal"},
  599.    {RotatingQuadrantRadial, 207, "fourBlade"}
  600. };
  601. tranStruct z_singleSweepTable[] =
  602. {
  603.    {Top180Radial, 221, "clockwiseTop"},
  604.    {Right180Radial, 222, "clockwiseRight"},
  605.    {Bottom180Radial, 223, "clockwiseBottom"},
  606.    {Left180Radial, 224, "clockwiseLeft"},
  607.    {RotatingTopLeftRadial, 241, "clockwiseTopLeft"},
  608.    {RotatingBottomLeftRadial, 242, "counterClockwiseBottomLeft"},
  609.    {RotatingBottomRightRadial, 243, "clockwiseBottomRight"},
  610.    {RotatingTopRightRadial, 244, "counterClockwiseTopRight"}
  611. };
  612. tranStruct z_fanTable[] =
  613. {
  614.     
  615.    {TopBottom180Radial, 211, "centerTop"},
  616.    {RightToLeft180Radial, 212, "centerRight"},
  617.    {OpenVTopRadial, 231, "top"},
  618.    {OpenVRightRadial, 232, "right"},
  619.    {OpenVBottomRadial, 233, "bottom"},
  620.    {OpenVLeftRadial, 234, "left"},
  621. };
  622. tranStruct z_doubleFanTable[] =
  623. {
  624.    {topBottom90Radial, 213, "fanOutVertical"},
  625.    {RightToLeft90Radial, 214, "fanOutHorizontal"},
  626.    {OpenVTopBottomRadial, 235, "fanInVertical"},
  627.    {OpenVLeftRightRadial, 236, "fanInHorizontal"}
  628. };
  629. tranStruct z_doubleSweepTable[] =
  630. {
  631.    {CounterRotatingTopBottomRadial, 225, "parallelVertical"},
  632.    {CounterRotatingLeftRightRadial, 226, "parallelDiagonal"},
  633.    {DoubleRotatingTopBottomRadial, 227, "oppositeVertical"},
  634.    {DoubleRotatingLeftRightRadial, 228, "oppositeHorizontal"},
  635.    {RotatingTopLeftBottomRightRadial, 245, "parallelDiagonalTopLeft"},
  636.    {RotatingBottomLeftTopRightRadial, 246, "parallelDiagonalBottomLeft"}
  637. };
  638. tranStruct z_saloonDoorTable[] =
  639. {
  640.    {RotatingTopLeftRightRadial, 251, "top"},
  641.    {RotatingLeftTopBottomRadial, 252, "left"},
  642.    {RotatingBottomLeftRightRadial, 253, "bottom"},
  643.    {RotatingRightTopBottomRadial, 254, "right"}
  644. };
  645. tranStruct z_windshieldTable[] =
  646. {
  647.    {RotatingDoubleCenterRightRadial, 261, "right"},
  648.    {RotatingDoubleCenterTopRadial, 262, "up"},
  649.    {RotatingDoubleCenterTopBottomRadial, 263, "vertical"},
  650.    {RotatingDoubleCenterLeftRightRadial, 264, "horizontal"}
  651. };
  652. //-----------------------------------------------------------------------
  653. tranStruct z_snakeTable[] =
  654. {
  655.    {HorizontalMatrix, 301, "topLeftHorizontal"},
  656.    {VerticalMatrix, 302, "topLeftVertical"},
  657.    {TopLeftDiagonalMatrix, 303, "topLeftDiagonal"},
  658.    {TopRightDiagonalMatrix, 304, "topRightDiagonal"},
  659.    {BottomRightDiagonalMatrix, 305, "bottomRightDiagonal"},
  660.    {BottomLeftDiagonalMatrix, 306, "bottomLeftDiagonal"}
  661. };
  662. tranStruct z_spiralTable[] =
  663. {
  664.    {ClockwiseTopLeftMatrix, 310, "topLeftClockwise"},
  665.    {ClockwiseTopRightMatrix, 311, "topRightClockwise"},
  666.    {ClockwiseBottomRightMatrix, 312, "bottomRightClockwise"},
  667.    {ClockwiseBottomLeftMatrix, 313, "bottomLeftClockwise"},
  668.    {CounterClockwiseTopLeftMatrix, 314, "topLeftCounterClockwise"},
  669.    {CounterClockwiseTopRightMatrix, 315, "topRightCounterClockwise"},
  670.    {CounterClockwiseBottomRightMatrix, 316, "bottomRightCounterClockwise"},
  671.    {CounterClockwiseBottomLeftMatrix, 317, "bottomLeftCounterClockwise"}
  672. };
  673. tranStruct z_parallelSnakesTable[] =
  674. {
  675.    {VerticalStartTopMatrix, 320, "verticalTopSame"},
  676.    {VerticalStartBottomMatrix, 321, "verticalBottomSame"},
  677.    {VerticalStartTopOppositeMatrix, 322, "verticalTopLeftOpposite"},
  678.    {VerticalStartBottomOppositeMatrix, 323, "verticalBottomLeftOpposite"},
  679.    {HorizontalStartLeftMatrix, 324, "horizontalLeftSame"},
  680.    {HorizontalStartRightMatrix, 325, "horizontalRightSame"},
  681.    {HorizontalStartLeftOppositeMatrix, 326, "horizontalTopLeftOpposite"},
  682.    {HorizontalStartRightOppositeMatrix, 327, "horizontalTopRightOpposite"},
  683.    {DoubleDiagonalBottom, 328, "diagonalBottomLeftOpposite"},
  684.    {DoubleDiagonalTop, 329, "diagonalTopLeftOpposite"}
  685. };
  686. tranStruct z_boxSnakesTable[] =
  687. {
  688.    {DoubleSpiralTopMatrix, 340, "twoBoxTop"},
  689.    {DoubleSpiralBottomMatrix, 341, "twoBoxBottom"},
  690.    {DoubleSpiralLeftMatrix, 342, "twoBoxLeft"},
  691.    {DoubleSpiralRightMatrix, 343, "twoBoxRight"},
  692.    {QuadSpiralVerticalMatrix, 344, "fourBoxVertical"},
  693.    {QuadSpiralHorizontalMatrix, 345, "fourBoxHorizontal"}
  694. };
  695. tranStruct z_waterfallTable[] =
  696. {
  697.    {VerticalWaterfallLeftMatrix, 350, "verticalLeft"},
  698.    {VerticalWaterfallRightMatrix, 351, "verticalRight"},
  699.    {HorizontalWaterfallLeftMatrix, 352, "horizontalLeft"},
  700.    {HorizontalWaterfallRightMatrix, 353, "horizontalRight"}
  701. };
  702. //-----------------------------------------------------------------------
  703. tranStruct z_slideTable[] =
  704. {
  705.    {SlideFromLeft, -1, "fromLeft"},
  706.    {SlideFromTop, -1, "fromTop"},
  707.    {SlideFromRight, -1, "fromRight"},
  708.    {SlideFromBottom, -1, "fromBottom"}
  709. };
  710. tranStruct z_fadeTable[] =
  711. {
  712.    {Crossfade,     -1, "crossfade"},
  713.    {FadeToColor,   -1, "fadeToColor"},
  714.    {FadeFromColor, -1, "fadeFromColor"}
  715. };
  716. tranStruct z_defaultTable[] =
  717. {
  718.    {DefaultTransition, -1, "DefaultTransition"}
  719. };
  720. //////////////////////////////////////
  721. #endif  //_TRANSITIONS_ON_
  722. tranType z_TransitionTable[] = 
  723. {
  724.    {z_defaultTable, "noTransition", sizeof(z_defaultTable) / sizeof(z_defaultTable[0])},
  725.         
  726. #ifdef _TRANSITIONS_ON_
  727.         
  728.    {z_barWipeTable, "barWipe", sizeof(z_barWipeTable) / sizeof(z_barWipeTable[0])},
  729.    {z_boxWipeTable, "boxWipe", sizeof(z_boxWipeTable) / sizeof(z_boxWipeTable[0])},
  730.    {z_fourBoxTable, "fourBoxWipe", sizeof(z_fourBoxTable) / sizeof(z_fourBoxTable[0])},
  731.    {z_barnDoorTable, "barnDoorWipe", sizeof(z_barnDoorTable) / sizeof(z_barnDoorTable[0])},
  732.    {z_diagonalTable, "diagonalWipe", sizeof(z_diagonalTable) / sizeof(z_diagonalTable[0])},
  733.    {z_bowTieTable, "bowTieWipe", sizeof(z_bowTieTable) / sizeof(z_bowTieTable[0])},
  734.    {z_miscDiagonalTable, "miscDiagonalWipe", sizeof(z_miscDiagonalTable) / sizeof(z_miscDiagonalTable[0])},
  735.    {z_veeTable, "veeWipe", sizeof(z_veeTable) / sizeof(z_veeTable[0])},
  736.    {z_barnVeeTable, "barnVeeWipe", sizeof(z_barnVeeTable) / sizeof(z_barnVeeTable[0])},
  737.    {z_zigZagTable, "zigZagWipe", sizeof(z_zigZagTable) / sizeof(z_zigZagTable[0])},
  738.    {z_barnZigZagTable, "barnZigZagWipe", sizeof(z_barnZigZagTable) / sizeof(z_barnZigZagTable[0])},
  739.    {z_irisTable, "irisWipe", sizeof(z_irisTable) / sizeof(z_irisTable[0])},
  740.    {z_triangleTable, "triangleWipe", sizeof(z_triangleTable) / sizeof(z_triangleTable[0])},
  741.    {z_arrowHeadTable, "arrowHeadWipe", sizeof(z_arrowHeadTable) / sizeof(z_arrowHeadTable[0])},
  742.    {z_pentagonTable, "pentagonWipe", sizeof(z_pentagonTable) / sizeof(z_pentagonTable[0])},
  743.    {z_hexagonTable, "hexagonWipe", sizeof(z_hexagonTable) / sizeof(z_hexagonTable[0])},
  744.    {z_ellipseTable, "ellipseWipe", sizeof(z_ellipseTable) / sizeof(z_ellipseTable[0])},
  745.    {z_eyeTable, "eyeWipe", sizeof(z_eyeTable) / sizeof(z_eyeTable[0])},
  746.    {z_roundRectTable, "roundRectWipe", sizeof(z_roundRectTable) / sizeof(z_roundRectTable[0])},
  747.    {z_starTable, "starWipe", sizeof(z_starTable) / sizeof(z_starTable[0])},
  748.    {z_miscShapeTable, "miscShapeWipe", sizeof(z_miscShapeTable) / sizeof(z_miscShapeTable[0])},
  749.    {z_clockTable, "clockWipe", sizeof(z_clockTable) / sizeof(z_clockTable[0])},
  750.    {z_pinWheelTable, "pinWheelWipe", sizeof(z_pinWheelTable) / sizeof(z_pinWheelTable[0])},
  751.    {z_singleSweepTable, "singleSweepWipe", sizeof(z_singleSweepTable) / sizeof(z_singleSweepTable[0])},
  752.    {z_fanTable, "fanWipe", sizeof(z_fanTable) / sizeof(z_fanTable[0])},
  753.    {z_doubleFanTable, "doubleFanWipe", sizeof(z_doubleFanTable) / sizeof(z_doubleFanTable[0])},
  754.    {z_doubleSweepTable, "doubleSweepWipe", sizeof(z_doubleSweepTable) / sizeof(z_doubleSweepTable[0])},
  755.    {z_saloonDoorTable, "saloonDoorWipe", sizeof(z_saloonDoorTable) / sizeof(z_saloonDoorTable[0])},
  756.    {z_windshieldTable, "windshieldWipe", sizeof(z_windshieldTable) / sizeof(z_windshieldTable[0])},
  757.    {z_snakeTable, "snakeWipe", sizeof(z_snakeTable) / sizeof(z_snakeTable[0])},
  758.    {z_spiralTable, "spiralWipe", sizeof(z_spiralTable) / sizeof(z_spiralTable[0])},
  759.    {z_parallelSnakesTable, "parallelSnakesWipe", sizeof(z_parallelSnakesTable) / sizeof(z_parallelSnakesTable[0])},
  760.    {z_boxSnakesTable, "boxSnakesWipe", sizeof(z_boxSnakesTable) / sizeof(z_boxSnakesTable[0])},
  761.    {z_waterfallTable, "waterfallWipe", sizeof(z_waterfallTable) / sizeof(z_waterfallTable[0])},
  762.    {z_slideTable, "slideWipe", sizeof(z_slideTable) / sizeof(z_slideTable[0])},
  763.    {z_fadeTable, "fade", sizeof(z_fadeTable) / sizeof(z_fadeTable[0])}
  764. #endif //_TRANSITIONS_ON_
  765. };
  766. INT32 z_nNumberTransitionTypes = sizeof(z_TransitionTable) / sizeof(z_TransitionTable[0]);
  767. #ifdef _TRANSITIONS_ON_
  768. void CalcMatrixLines(tranLines* lines, LineSegment* src, LineSegment* mod, BOOL* blocked)
  769. {
  770.    LineSegment ls;
  771.    *blocked = TRUE;
  772.    lines->Destroy();
  773.    if (src->start.y == src->finish.y) // horizontal lines
  774.    {
  775.       if (mod->start.x <= src->start.x && mod->finish.x >= src->start.x && mod->finish.x < src->finish.x)
  776.       {
  777.          ls.start.x = mod->finish.x;
  778.          ls.finish.x = src->finish.x;
  779.          ls.start.y = ls.finish.y = src->start.y;
  780.          *lines += ls;
  781.       }
  782.       else if (mod->start.x <= src->finish.x && mod->start.x > src->start.x && mod->finish.x >= src->finish.x)
  783.       {
  784.          ls.start.x = src->start.x;
  785.          ls.finish.x = mod->start.x;
  786.          ls.start.y = ls.finish.y = src->start.y;
  787.          *lines += ls;
  788.       }
  789.       else if (mod->start.x > src->start.x && mod->finish.x < src->finish.x)
  790.       {
  791.          ls.start.x = mod->finish.x;
  792.          ls.finish.x = src->finish.x;
  793.          ls.start.y = ls.finish.y = src->start.y;
  794.          *lines += ls;
  795.          ls.start.x = src->start.x;
  796.          ls.finish.x = mod->start.x;
  797.          ls.start.y = ls.finish.y = src->start.y;
  798.          *lines += ls;
  799.       }
  800.       else if (mod->start.x >= src->finish.x || mod->finish.x <= src->start.x)
  801.       {
  802.          *blocked = FALSE;
  803.       }
  804.    }
  805.    else                            // vertical lines
  806.    {
  807.       if (mod->start.y < src->start.y && mod->finish.y >= src->start.y && mod->finish.y < src->finish.y)
  808.       {
  809.          ls.start.y = mod->finish.y;
  810.          ls.finish.y = src->finish.y;
  811.          ls.start.x = ls.finish.x = src->start.x;
  812.          *lines += ls;
  813.       }
  814.       else if (mod->start.y < src->finish.y && mod->start.y > src->start.y && mod->finish.y >= src->finish.y)
  815.       {
  816.          ls.start.y = src->start.y;
  817.          ls.finish.y = mod->start.y;
  818.          ls.start.x = ls.finish.x = src->start.x;
  819.          *lines += ls;
  820.       }
  821.       else if (mod->start.y > src->start.y && mod->finish.y < src->finish.y)
  822.       {
  823.          ls.start.y = mod->finish.y;
  824.          ls.finish.y = src->finish.y;
  825.          ls.start.x = ls.finish.x = src->start.x;
  826.          *lines += ls;
  827.          ls.start.y = src->start.y;
  828.          ls.finish.y = mod->start.y;
  829.          ls.start.x = ls.finish.x = src->start.x;
  830.          *lines += ls;
  831.       }
  832.       else if (mod->start.y >= src->finish.y || mod->finish.y <= src->start.y)
  833.       {
  834.          *blocked = FALSE;
  835.       }
  836.    }
  837. }
  838. void CalcMatrixLines(tranLines* newLines, tranLines* src, LineSegment* mod, BOOL* blocked)
  839. {
  840.    tranLines tmpLines;
  841.    newLines->Destroy();
  842.    //XXXSMJ this is not foolproof but will be good enough for our current needs
  843.    for (int i = 0; i < src->m_nLines; ++i)
  844.    {
  845.       CalcMatrixLines(&tmpLines,&src->m_pLines[i],mod,blocked);
  846.       if (!tmpLines.m_nLines) // this happens when lines don't obstruct each other
  847.          *newLines += src->m_pLines[i];
  848.       else
  849.          *newLines += tmpLines;
  850.    }
  851. }
  852. void CalcMatrixBlockCoords(int left, int top, int right, int bottom, MatrixTransitionData *pData, int block, int* blockLeft, int* blockTop, int* blockRight, int* blockBottom)
  853. {
  854.    double blockX = double(right - left + 1) / double(pData->GetWidth());
  855.    double blockY = double(bottom - top + 1) / double(pData->GetHeight());
  856.     
  857.    *blockLeft = int(left + blockX * (block % pData->GetWidth()));
  858.    *blockTop = int(top + blockY * (block / pData->GetWidth()));
  859.    *blockRight = int(left + blockX * (block % pData->GetWidth() + 1));
  860.    *blockBottom = int(top + blockY * (block / pData->GetWidth() + 1));
  861.  
  862.    if (*blockLeft < left) *blockRight = left;
  863.    if (*blockTop < top) *blockBottom = top;
  864.    if (*blockRight > right) *blockRight = right;
  865.    if (*blockBottom > bottom) *blockBottom = bottom;
  866. }
  867. HXREGION* MatrixTransition(int left, int top, int right, int bottom, int completeness, MatrixTransitionData *pData, tranLines* lines)
  868. {
  869.    HXREGION* retRGN = HXCreateRegion();
  870.    HXREGION* rgn1;
  871.     
  872.    int bLeft,bTop,bRight,bBottom;
  873.    double frameLength = 1000.0 / pData->GetTransitionLength();
  874.    int frame = (int)((float)completeness/(frameLength+0.1));
  875.    MatrixBlockTransitionList* blockTransList = pData->GetTransactionListPtr();
  876.    for (int i = 0; i < frame; ++i)
  877.    {
  878.       MatrixBlockTransition* transList = blockTransList[i].GetListPtr();
  879.       for (int j = 0; j < blockTransList[i].GetSize(); ++j)
  880.       {
  881.          // these will all be completed blocks
  882.          CalcMatrixBlockCoords(left,top,right,bottom,pData,transList[j].block,&bLeft,&bTop,&bRight,&bBottom);
  883.          rgn1 = HXCreateRectRegion(bLeft,bTop,bRight-bLeft,bBottom-bTop);
  884.          HXCombineRgn(retRGN, rgn1, retRGN, HX_RGN_OR);
  885.          HXDestroyRegion(rgn1);
  886.       }
  887.    }
  888.     
  889.    int tmpCompleteness = int((completeness - frameLength * frame) / frameLength * 1000);
  890.    MatrixBlockTransition* transList = blockTransList[frame].GetListPtr();
  891.    for (int j = 0; j < blockTransList[frame].GetSize(); ++j)
  892.    {
  893.       CalcMatrixBlockCoords(left,top,right,bottom,pData,transList[j].block,&bLeft,&bTop,&bRight,&bBottom);
  894.         
  895.       if (transList[j].invert)
  896.       {
  897.          rgn1 = transList[j].transition(bLeft,bTop,bRight,bBottom,1000 - tmpCompleteness,lines);
  898.          rgn1 = InvertRGN(rgn1,bLeft,bTop,bRight,bBottom);
  899.       }
  900.       else
  901.       {
  902.          rgn1 = transList[j].transition(bLeft,bTop,bRight,bBottom,tmpCompleteness,lines);
  903.       }
  904.             
  905.       HXCombineRgn(retRGN, rgn1, retRGN, HX_RGN_OR);
  906.       HXDestroyRegion(rgn1);
  907.    }
  908.    if (lines)
  909.    {
  910.       BOOL blocked,tmpBlock;
  911.       LineSegment lineSeg1, lineSeg2;
  912.       tranLines tmpLines;
  913.       for (int x = 0; x < retRGN->numRects; ++x)
  914.       {
  915.          // top
  916.          if (retRGN->rects[x].y1 > top)
  917.          {
  918.             tranLines   tl;
  919.             blocked = tmpBlock = FALSE;
  920.             lineSeg1.start.x = retRGN->rects[x].x1;
  921.             lineSeg1.start.y = retRGN->rects[x].y1;
  922.             lineSeg1.finish.x = retRGN->rects[x].x2;
  923.             lineSeg1.finish.y = retRGN->rects[x].y1;
  924.             for (int y = 0; y < x; ++y)
  925.             {
  926.                if (retRGN->rects[y].y2 == retRGN->rects[x].y1)
  927.                {
  928.                   lineSeg2.start.x = retRGN->rects[y].x1;
  929.                   lineSeg2.start.y = retRGN->rects[y].y2;
  930.                   lineSeg2.finish.x = retRGN->rects[y].x2;
  931.                   lineSeg2.finish.y = retRGN->rects[y].y2;
  932.                   if (tl.m_nLines)
  933.                   {
  934.                      CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
  935.                      tl = tmpLines;
  936.                   }
  937.                   else
  938.                   {
  939.                      CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
  940.                      tl += tmpLines;
  941.                   }
  942.                   // once we're blocked we don't want to be changed
  943.                   if (tmpBlock)
  944.                      blocked = TRUE;
  945.                }
  946.             }
  947.             if (!blocked && !tl.m_nLines)
  948.             {
  949.                tl += lineSeg1;
  950.             }
  951.             *lines += tl;
  952.          }
  953.          // right
  954.          if (retRGN->rects[x].x2 < right)
  955.          {
  956.             tranLines   tl;
  957.             blocked = tmpBlock = FALSE;
  958.             lineSeg1.start.x = retRGN->rects[x].x2;
  959.             lineSeg1.start.y = retRGN->rects[x].y1;
  960.             lineSeg1.finish.x = retRGN->rects[x].x2;
  961.             lineSeg1.finish.y = retRGN->rects[x].y2;
  962.             for (int y = 0; y < retRGN->numRects; ++y)
  963.             {
  964.                if (retRGN->rects[y].x1 == retRGN->rects[x].x2)
  965.                {
  966.                   lineSeg2.start.x = retRGN->rects[y].x1;
  967.                   lineSeg2.start.y = retRGN->rects[y].y1;
  968.                   lineSeg2.finish.x = retRGN->rects[y].x1;
  969.                   lineSeg2.finish.y = retRGN->rects[y].y2;
  970.                   if (tl.m_nLines)
  971.                   {
  972.                      CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
  973.                      tl = tmpLines;
  974.                   }
  975.                   else
  976.                   {
  977.                      CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
  978.                      tl += tmpLines;
  979.                   }
  980.                   // once we're blocked we don't want to be changed
  981.                   if (tmpBlock)
  982.                      blocked = TRUE;
  983.                }
  984.             }
  985.             if (!blocked && !tl.m_nLines)
  986.             {
  987.                tl += lineSeg1;
  988.             }
  989.             *lines += tl;
  990.          }
  991.          // bottom
  992.          if (retRGN->rects[x].y2 < bottom)
  993.          {
  994.             tranLines   tl;
  995.             blocked = tmpBlock = FALSE;
  996.             lineSeg1.start.x = retRGN->rects[x].x1;
  997.             lineSeg1.start.y = retRGN->rects[x].y2;
  998.             lineSeg1.finish.x = retRGN->rects[x].x2;
  999.             lineSeg1.finish.y = retRGN->rects[x].y2;
  1000.             for (int y = 0; y < retRGN->numRects; ++y)
  1001.             {
  1002.                if (retRGN->rects[y].y1 == retRGN->rects[x].y2)
  1003.                {
  1004.                   lineSeg2.start.x = retRGN->rects[y].x1;
  1005.                   lineSeg2.start.y = retRGN->rects[y].y1;
  1006.                   lineSeg2.finish.x = retRGN->rects[y].x2;
  1007.                   lineSeg2.finish.y = retRGN->rects[y].y1;
  1008.                   if (tl.m_nLines)
  1009.                   {
  1010.                      CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
  1011.                      tl = tmpLines;
  1012.                   }
  1013.                   else
  1014.                   {
  1015.                      CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
  1016.                      tl += tmpLines;
  1017.                   }
  1018.                   // once we're blocked we don't want to be changed
  1019.                   if (tmpBlock)
  1020.                      blocked = TRUE;
  1021.                }
  1022.             }
  1023.             if (!blocked && !tl.m_nLines)
  1024.             {
  1025.                tl += lineSeg1;
  1026.             }
  1027.             *lines += tl;
  1028.          }
  1029.          // left
  1030.          if (retRGN->rects[x].x1 > left)
  1031.          {
  1032.             tranLines   tl;
  1033.             blocked = tmpBlock = FALSE;
  1034.             lineSeg1.start.x = retRGN->rects[x].x1;
  1035.             lineSeg1.start.y = retRGN->rects[x].y1;
  1036.             lineSeg1.finish.x = retRGN->rects[x].x1;
  1037.             lineSeg1.finish.y = retRGN->rects[x].y2;
  1038.             for (int y = 0; y < retRGN->numRects; ++y)
  1039.             {
  1040.                if (retRGN->rects[y].x2 == retRGN->rects[x].x1)
  1041.                {
  1042.                   lineSeg2.start.x = retRGN->rects[y].x2;
  1043.                   lineSeg2.start.y = retRGN->rects[y].y1;
  1044.                   lineSeg2.finish.x = retRGN->rects[y].x2;
  1045.                   lineSeg2.finish.y = retRGN->rects[y].y2;
  1046.                   if (tl.m_nLines)
  1047.                   {
  1048.                      CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
  1049.                      tl = tmpLines;
  1050.                   }
  1051.                   else
  1052.                   {
  1053.                      CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
  1054.                      tl += tmpLines;
  1055.                   }
  1056.                   // once we're blocked we don't want to be changed
  1057.                   if (tmpBlock)
  1058.                      blocked = TRUE;
  1059.                }
  1060.             }
  1061.             if (!blocked && !tl.m_nLines)
  1062.             {
  1063.                tl += lineSeg1;
  1064.             }
  1065.             *lines += tl;
  1066.          }
  1067.       }
  1068.    }
  1069.     
  1070.    return retRGN;
  1071. }
  1072. HXREGION* HorizontalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1073. {
  1074.    static CHXBuffer* z_HorizontalMatrixDataBuffer = NULL;
  1075.         
  1076.    if (!z_HorizontalMatrixDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1077.    {
  1078.       MatrixTransitionData* HorizontalMatrixTransition = new MatrixTransitionData(8,8,64);
  1079.       MatrixBlockTransitionList* blockTransList = HorizontalMatrixTransition->GetTransactionListPtr();
  1080.                 
  1081.       for (int i = 0; i < 64; ++i)
  1082.       {
  1083.          blockTransList[i].CreateList(1);
  1084.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1085.          list->invert = ((i / 8) & 1);
  1086.          if (list->invert)      // determine if row we're in is odd; the top row is row 0
  1087.             list->block = ((i / 8) + 1) * 8 - (i % 8) - 1;  // if we're odd we're moving right to left
  1088.          else
  1089.             list->block = i;  // otherwise left to right
  1090.          list->transition = EdgeWipe;
  1091.       }
  1092.                 
  1093.       z_HorizontalMatrixDataBuffer = new CHXBuffer();
  1094.       z_HorizontalMatrixDataBuffer->AddRef();
  1095.       z_HorizontalMatrixDataBuffer->Set((UCHAR*)&HorizontalMatrixTransition, sizeof(UCHAR*));
  1096.    }
  1097.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1098.    {
  1099.       delete *((MatrixTransitionData**)z_HorizontalMatrixDataBuffer->GetBuffer());
  1100.       if (!z_HorizontalMatrixDataBuffer->Release())
  1101.       {
  1102.          z_HorizontalMatrixDataBuffer = NULL;
  1103.          return HXCreateRegion();
  1104.       }
  1105.    }
  1106.         
  1107.    return MatrixTransition(left,top,right,bottom,completeness,
  1108.                            *((MatrixTransitionData**)z_HorizontalMatrixDataBuffer->GetBuffer()),lines);
  1109. }
  1110. HXREGION* VerticalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1111. {
  1112.    static CHXBuffer* z_VerticalMatrixDataBuffer = NULL;
  1113.         
  1114.    if (!z_VerticalMatrixDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1115.    {
  1116.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(8,8,64);
  1117.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1118.                 
  1119.       for (int i = 0; i < 64; ++i)
  1120.       {
  1121.          blockTransList[i].CreateList(1);
  1122.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1123.                         
  1124.          list->invert = (i / 8) & 1;
  1125.                         
  1126.          if (list->invert)      // determine if column we're in is odd; the left col is col 0
  1127.             list->block = ((7 - i % 8) % 8) * 8 + i / 8;
  1128.          else
  1129.             list->block = (i % 8) * 8 + i / 8;
  1130.                         
  1131.          list->transition = SlideVerticalEdgeWipe;
  1132.       }
  1133.                 
  1134.       z_VerticalMatrixDataBuffer = new CHXBuffer();
  1135.       z_VerticalMatrixDataBuffer->AddRef();
  1136.       z_VerticalMatrixDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1137.    }
  1138.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1139.    {
  1140.       delete *((MatrixTransitionData**)z_VerticalMatrixDataBuffer->GetBuffer());
  1141.       if (!z_VerticalMatrixDataBuffer->Release())
  1142.       {
  1143.          z_VerticalMatrixDataBuffer = NULL;
  1144.          return HXCreateRegion();
  1145.       }
  1146.    }
  1147.         
  1148.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_VerticalMatrixDataBuffer->GetBuffer()),lines);
  1149. }
  1150. void GetTopLeftDiagonalCoords(int left, int top, int right, int bottom, int completeness, HXxPoint p[7], tranLines* lines)
  1151. {
  1152.    int width = right - left;
  1153.    int height = bottom - top;
  1154.    double x = double(width) / 8.0;
  1155.    double y = double(height) / 8.0;
  1156.         
  1157.    int area = 0, lastArea = 0;
  1158.    int i;
  1159.         
  1160.    memset(p,0,sizeof(HXxPoint) * 7);
  1161.         
  1162.    int areaComplete = int(double(width * height * completeness) / 1000.0);
  1163.         
  1164.    for (i = 0; i < 16; ++i)
  1165.    {
  1166.       if (i < 8)
  1167.       {
  1168.          area = int((x * i + x) * (y * i + y) / 2);
  1169.       }
  1170.       else
  1171.       {
  1172.          area = width * height - int((x * (14 - i) + x) * (y * (14 - i) + y) / 2);
  1173.       }
  1174.                 
  1175.       if (areaComplete < area)
  1176.          break;
  1177.                 
  1178.       lastArea = area;
  1179.    }
  1180.    if (i == 16) --i;
  1181.         
  1182.    int tmpCompleteness = 1000 - int(double(area - areaComplete) / double(area - lastArea) * 1000);
  1183.         
  1184.    HXxPoint topPt, bottomPt;
  1185.         
  1186.    if (i < 8)
  1187.    {
  1188.       p[0].x = left;
  1189.       p[0].y = int(top + i * y);
  1190.       p[1].x = int(left + i * x);
  1191.       p[1].y = top;
  1192.       p[2].x = int(left + (i + 1) * x);
  1193.       p[2].y = top;
  1194.       p[3].x = left;
  1195.       p[3].y = int(top + (i + 1) * y);
  1196.    }
  1197.    else
  1198.    {
  1199.       int tmp = i - 8;
  1200.                 
  1201.       p[0].x = int(left + tmp * x);
  1202.       p[0].y = bottom;
  1203.       p[1].x = right;
  1204.       p[1].y = int(top + tmp * y);
  1205.       p[2].x = right;
  1206.       p[2].y = int(top + (tmp + 1) * y);
  1207.       p[3].x = int(left + (tmp + 1) * x);
  1208.       p[3].y = bottom;
  1209.    }
  1210.         
  1211.    if (i & 1)
  1212.       tmpCompleteness = 1000 - tmpCompleteness;
  1213.         
  1214.    GetDiagonalStripCoords(p[0],p[1],p[2],p[3],&topPt,&bottomPt,tmpCompleteness);
  1215.         
  1216.    p[0].x = left;
  1217.    p[0].y = top;
  1218.    p[1].y = top;
  1219.         
  1220.    if (i < 8)
  1221.    {
  1222.       if (i & 1)
  1223.       {
  1224.          p[1].x = int(left + x * i + x);
  1225.          p[2].x = bottomPt.x;
  1226.          p[2].y = bottomPt.y;
  1227.          p[3].x = topPt.x;
  1228.          p[3].y = topPt.y;
  1229.          p[4].y = int(top + y * i);
  1230.       }
  1231.       else
  1232.       {
  1233.          p[1].x = int(left + x * i);
  1234.          p[2].x = topPt.x;
  1235.          p[2].y = topPt.y;
  1236.          p[3].x = bottomPt.x;
  1237.          p[3].y = bottomPt.y;
  1238.          p[4].y = int(top + y * i + y);
  1239.       }
  1240.       p[4].x = left;
  1241.    }
  1242.    else
  1243.    {
  1244.       p[1].x = right;
  1245.       p[2].x = right;
  1246.       p[5].y = bottom;
  1247.       p[6].x = left;
  1248.       p[6].y = bottom;
  1249.                 
  1250.       if (i & 1)
  1251.       {
  1252.          p[2].y = int(top + y * (i - 8) + y);
  1253.          p[3].x = bottomPt.x;
  1254.          p[3].y = bottomPt.y;
  1255.          p[4].x = topPt.x;
  1256.          p[4].y = topPt.y;
  1257.          p[5].x = int(left + x * (i - 8));
  1258.       }
  1259.       else
  1260.       {
  1261.          p[2].y = int(top + y * (i - 8));
  1262.          p[3].x = topPt.x;
  1263.          p[3].y = topPt.y;
  1264.          p[4].x = bottomPt.x;
  1265.          p[4].y = bottomPt.y;
  1266.          p[5].x = int(left + x * (i - 8) + x);
  1267.       }
  1268.    }
  1269.    if (lines)
  1270.    {
  1271.       lines->m_nLines = 3;
  1272.       lines->m_pLines = new LineSegment[3];
  1273.       if(!lines->m_pLines)
  1274.       {
  1275.          lines->m_nLines = 0;
  1276.       }
  1277.       else
  1278.       {
  1279.          int pt = (i < 8) ? 1 : 2;
  1280.          lines->m_pLines[0].start.x = p[pt].x;
  1281.          lines->m_pLines[0].start.y= p[pt].y;
  1282.          lines->m_pLines[0].finish.x = p[pt+1].x;
  1283.          lines->m_pLines[0].finish.y= p[pt+1].y;
  1284.          lines->m_pLines[1].start.x = p[pt+1].x;
  1285.          lines->m_pLines[1].start.y= p[pt+1].y;
  1286.          lines->m_pLines[1].finish.x = p[pt+2].x;
  1287.          lines->m_pLines[1].finish.y= p[pt+2].y;
  1288.          lines->m_pLines[2].start.x = p[pt+2].x;
  1289.          lines->m_pLines[2].start.y= p[pt+2].y;
  1290.          lines->m_pLines[2].finish.x = p[pt+3].x;
  1291.          lines->m_pLines[2].finish.y= p[pt+3].y;
  1292.       }
  1293.    }
  1294. }
  1295. HXREGION* TopLeftDiagonalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1296. {
  1297.    HXxPoint p[7];
  1298.         
  1299.    GetTopLeftDiagonalCoords(left,top,right,bottom,completeness,p,lines);
  1300.    return HXPolygonRegion(p, 7, WindingRule);
  1301. }
  1302. HXREGION* TopRightDiagonalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1303. {
  1304.    HXREGION* retRGN = MirrorVertical(TopLeftDiagonalMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2);
  1305.    if (lines)
  1306.       MirrorVertical(lines,(right - left) / 2);
  1307.    return retRGN;
  1308. }
  1309. HXREGION* BottomRightDiagonalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1310. {
  1311.    HXREGION* retRGN = MirrorHorizontal(MirrorVertical(TopLeftDiagonalMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2),top + (bottom - top + 1) / 2);
  1312.    if (lines)
  1313.    {
  1314.       MirrorVertical(lines,(right - left) / 2);
  1315.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1316.    }
  1317.    return retRGN;
  1318. }
  1319. HXREGION* BottomLeftDiagonalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1320. {
  1321.    HXREGION* retRGN = MirrorHorizontal(TopLeftDiagonalMatrix(left,top,right,bottom,completeness,lines),top + (bottom - top + 1) / 2);
  1322.    if (lines)
  1323.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1324.    return retRGN;
  1325. }
  1326. HXREGION* ClockwiseTopLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1327. {
  1328.    static CHXBuffer* z_cwTopLeftDataBuffer = NULL;
  1329.         
  1330.    if (!z_cwTopLeftDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1331.    {
  1332.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(8,8,64);
  1333.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1334.                 
  1335.       int blockIdx = 0;
  1336.                 
  1337.       for (int i = 8; i > 0; i -= 2)
  1338.       {
  1339.          int j;
  1340.          int horzOffset = ((8 - i) / 2) * 9;
  1341.          int vertOffset = (9 - i) / 2;
  1342.          int vertOffsetRt = i / 2 + 2;
  1343.                         
  1344.          for (j = 0; j < i; ++j, ++blockIdx)
  1345.          {
  1346.             blockTransList[blockIdx].CreateList(1);
  1347.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1348.                                 
  1349.             list->block = j + horzOffset;
  1350.             list->invert = 0;
  1351.             list->transition = EdgeWipe;
  1352.          }
  1353.          for (j = 0; j < i - 2; ++j, ++blockIdx)
  1354.          {
  1355.             blockTransList[blockIdx].CreateList(1);
  1356.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1357.                                 
  1358.             list->block = (j + 2 + vertOffset) * 8 - (vertOffset + 1);
  1359.             list->invert = 0;
  1360.             list->transition = SlideVerticalEdgeWipe;
  1361.          }
  1362.          for (j = 0; j < i; ++j, ++blockIdx)
  1363.          {
  1364.             blockTransList[blockIdx].CreateList(1);
  1365.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1366.                                 
  1367.             list->block = 63 - j - horzOffset;
  1368.             list->invert = 1;
  1369.             list->transition = EdgeWipe;
  1370.          }
  1371.          for (j = 0; j < i - 2; ++j, ++blockIdx)
  1372.          {
  1373.             blockTransList[blockIdx].CreateList(1);
  1374.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1375.                                 
  1376.             list->block = (vertOffsetRt - j) * 8 + (vertOffset);
  1377.             list->invert = 1;
  1378.             list->transition = SlideVerticalEdgeWipe;
  1379.          }
  1380.       }
  1381.                 
  1382.       z_cwTopLeftDataBuffer = new CHXBuffer();
  1383.       z_cwTopLeftDataBuffer->AddRef();
  1384.       z_cwTopLeftDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1385.    }
  1386.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1387.    {
  1388.       delete *((MatrixTransitionData**)z_cwTopLeftDataBuffer->GetBuffer());
  1389.       if (!z_cwTopLeftDataBuffer->Release())
  1390.       {
  1391.          z_cwTopLeftDataBuffer = NULL;
  1392.          return HXCreateRegion();
  1393.       }
  1394.    }
  1395.         
  1396.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_cwTopLeftDataBuffer->GetBuffer()),lines);
  1397. }
  1398. HXREGION* ClockwiseTopRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1399. {
  1400.    HXREGION* retRGN = MirrorVertical(
  1401.       CounterClockwiseTopLeftMatrix(left,top,right,bottom,completeness,lines),
  1402.       left + (right - left+1) / 2
  1403.       );
  1404.    if (lines)
  1405.       MirrorVertical(lines,(left + right) / 2);
  1406.    return retRGN;
  1407. }
  1408. HXREGION* ClockwiseBottomRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1409. {
  1410.    HXREGION* retRGN = MirrorHorizontal(MirrorVertical(ClockwiseTopLeftMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2),(top + bottom) / 2);
  1411.    if (lines)
  1412.    {
  1413.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1414.       MirrorHorizontal(lines,(top + bottom) / 2);
  1415.    }
  1416.    return retRGN;
  1417. }
  1418. HXREGION* ClockwiseBottomLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1419. {
  1420.    HXREGION* retRGN = MirrorHorizontal(CounterClockwiseTopLeftMatrix(left,top,right,bottom,completeness,lines),top + (bottom - top + 1) / 2);
  1421.    if (lines)
  1422.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1423.    return retRGN;
  1424. }
  1425. HXREGION* CounterClockwiseTopLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1426. {
  1427.    static CHXBuffer* z_ccwTopLeftDataBuffer = NULL;
  1428.         
  1429.    if (!z_ccwTopLeftDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1430.    {
  1431.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(8,8,64);
  1432.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1433.                 
  1434.       int blockIdx = 0;
  1435.                 
  1436.       for (int i = 8; i > 0; i -= 2)
  1437.       {
  1438.          int j;
  1439.          int horzOffset = (int)(5.0 - i / 2);
  1440.          int vertOffset = (int)((9.0 - i) / 2);
  1441.          int vertOffsetRt = (int)(i / 2+ 4);
  1442.                         
  1443.          for (j = 0; j < i; ++j, ++blockIdx)
  1444.          {
  1445.             blockTransList[blockIdx].CreateList(1);
  1446.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1447.                                 
  1448.             list->block = (j + vertOffset) * 8 + vertOffset;
  1449.             list->invert = 0;
  1450.             list->transition = SlideVerticalEdgeWipe;
  1451.          }
  1452.          for (j = 0; j < i - 2; ++j, ++blockIdx)
  1453.          {
  1454.             blockTransList[blockIdx].CreateList(1);
  1455.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1456.                                 
  1457.             list->block = j + (i / 2 + 3) * 8 + (10 - i) / 2;
  1458.             list->invert = 0;
  1459.             list->transition = EdgeWipe;
  1460.          }
  1461.          for (j = 0; j < i; ++j, ++blockIdx)
  1462.          {
  1463.             blockTransList[blockIdx].CreateList(1);
  1464.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1465.                                 
  1466.             list->block = (vertOffsetRt - j) * 8 - vertOffset - 1;
  1467.             list->invert = 1;
  1468.             list->transition = SlideVerticalEdgeWipe;
  1469.          }
  1470.          for (j = 0; j < i - 2; ++j, ++blockIdx)
  1471.          {
  1472.             blockTransList[blockIdx].CreateList(1);
  1473.             MatrixBlockTransition* list = blockTransList[blockIdx].GetListPtr();
  1474.                                 
  1475.             list->block = 7 * horzOffset - 1 - j;
  1476.             list->invert = 1;
  1477.             list->transition = EdgeWipe;
  1478.          }
  1479.       }
  1480.                 
  1481.       z_ccwTopLeftDataBuffer = new CHXBuffer();
  1482.       z_ccwTopLeftDataBuffer->AddRef();
  1483.       z_ccwTopLeftDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1484.    }
  1485.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1486.    {
  1487.       delete *((MatrixTransitionData**)z_ccwTopLeftDataBuffer->GetBuffer());
  1488.       if (!z_ccwTopLeftDataBuffer->Release())
  1489.       {
  1490.          z_ccwTopLeftDataBuffer = NULL;
  1491.          return HXCreateRegion();
  1492.       }
  1493.    }
  1494.         
  1495.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_ccwTopLeftDataBuffer->GetBuffer()),lines);
  1496. }
  1497. HXREGION* CounterClockwiseTopRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1498. {
  1499.    HXREGION* retRGN = MirrorVertical(ClockwiseTopLeftMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2);
  1500.    if (lines)
  1501.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1502.    return retRGN;
  1503. }
  1504. HXREGION* CounterClockwiseBottomRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1505. {
  1506.    HXREGION* retRGN = MirrorHorizontal(MirrorVertical(CounterClockwiseTopLeftMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2),top + (bottom - top + 1) / 2);
  1507.    if (lines)
  1508.    {
  1509.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1510.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1511.    }
  1512.    return retRGN;
  1513. }
  1514. HXREGION* CounterClockwiseBottomLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1515. {
  1516.    HXREGION* retRGN = MirrorHorizontal(ClockwiseTopLeftMatrix(left,top,right,bottom,completeness,lines),top + (bottom - top + 1) / 2);
  1517.    if (lines)
  1518.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1519.    return retRGN;
  1520. }
  1521. HXREGION* VerticalStartTopMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1522. {
  1523.    static CHXBuffer* z_verticalTopDataBuffer = NULL;
  1524.         
  1525.    if (!z_verticalTopDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1526.    {
  1527.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(8,1,4);
  1528.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1529.                 
  1530.       for (int i = 0; i < 4; ++i)
  1531.       {
  1532.          blockTransList[i].CreateList(2);
  1533.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1534.                         
  1535.          list[0].invert = list[1].invert = i & 1;
  1536.          list[0].transition = list[1].transition = SlideVerticalEdgeWipe;
  1537.          list[0].block = i;
  1538.          list[1].block = 7 - i;
  1539.       }
  1540.                 
  1541.       z_verticalTopDataBuffer = new CHXBuffer();
  1542.       z_verticalTopDataBuffer->AddRef();
  1543.       z_verticalTopDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1544.    }
  1545.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1546.    {
  1547.       delete *((MatrixTransitionData**)z_verticalTopDataBuffer->GetBuffer());
  1548.       if (!z_verticalTopDataBuffer->Release())
  1549.       {
  1550.          z_verticalTopDataBuffer = NULL;
  1551.          return HXCreateRegion();
  1552.       }
  1553.    }
  1554.         
  1555.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_verticalTopDataBuffer->GetBuffer()),lines);
  1556. }
  1557. HXREGION* VerticalStartBottomMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1558. {
  1559.    HXREGION* retRGN = MirrorHorizontal(VerticalStartTopMatrix(left,top,right,bottom,completeness,lines),top + (bottom - top + 1) / 2);
  1560.    if (lines)
  1561.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1562.    return retRGN;
  1563. }
  1564. HXREGION* VerticalStartTopOppositeMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1565. {
  1566.    static CHXBuffer* z_verticalTopOppDataBuffer = NULL;
  1567.         
  1568.    if (!z_verticalTopOppDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1569.    {
  1570.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(8,1,4);
  1571.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1572.                 
  1573.       for (int i = 0; i < 4; ++i)
  1574.       {
  1575.          blockTransList[i].CreateList(2);
  1576.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1577.                         
  1578.          list[0].invert = i & 1;
  1579.          list[1].invert = !list[0].invert;
  1580.          list[0].transition = list[1].transition = SlideVerticalEdgeWipe;
  1581.          list[0].block = i;
  1582.          list[1].block = 7 - i;
  1583.       }
  1584.                 
  1585.       z_verticalTopOppDataBuffer = new CHXBuffer();
  1586.       z_verticalTopOppDataBuffer->AddRef();
  1587.       z_verticalTopOppDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1588.    }
  1589.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1590.    {
  1591.       delete *((MatrixTransitionData**)z_verticalTopOppDataBuffer->GetBuffer());
  1592.       if (!z_verticalTopOppDataBuffer->Release())
  1593.       {
  1594.          z_verticalTopOppDataBuffer = NULL;
  1595.          return HXCreateRegion();
  1596.       }
  1597.    }
  1598.         
  1599.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_verticalTopOppDataBuffer->GetBuffer()),lines);
  1600. }
  1601. HXREGION* VerticalStartBottomOppositeMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1602. {
  1603.    HXREGION* retRGN = MirrorHorizontal(VerticalStartTopOppositeMatrix(left,top,right,bottom,completeness,lines),top + (bottom - top + 1) / 2);
  1604.    if (lines)
  1605.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1606.    return retRGN;
  1607. }
  1608. HXREGION* HorizontalStartLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1609. {
  1610.    static CHXBuffer* z_verticalTopOppDataBuffer = NULL;
  1611.         
  1612.    if (!z_verticalTopOppDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1613.    {
  1614.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(1,8,4);
  1615.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1616.                 
  1617.       for (int i = 0; i < 4; ++i)
  1618.       {
  1619.          blockTransList[i].CreateList(2);
  1620.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1621.                         
  1622.          list[0].invert = list[1].invert = i & 1;
  1623.          list[0].transition = list[1].transition = EdgeWipe;
  1624.          list[0].block = i;
  1625.          list[1].block = 7 - i;
  1626.       }
  1627.                 
  1628.       z_verticalTopOppDataBuffer = new CHXBuffer();
  1629.       z_verticalTopOppDataBuffer->AddRef();
  1630.       z_verticalTopOppDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1631.    }
  1632.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1633.    {
  1634.       delete *((MatrixTransitionData**)z_verticalTopOppDataBuffer->GetBuffer());
  1635.       if (!z_verticalTopOppDataBuffer->Release())
  1636.       {
  1637.          z_verticalTopOppDataBuffer = NULL;
  1638.          return HXCreateRegion();
  1639.       }
  1640.    }
  1641.         
  1642.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_verticalTopOppDataBuffer->GetBuffer()),lines);
  1643. }
  1644. HXREGION* HorizontalStartRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1645. {
  1646.    HXREGION* retRGN = MirrorVertical(HorizontalStartLeftMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2);
  1647.    if (lines)
  1648.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1649.    return retRGN;
  1650. }
  1651. HXREGION* HorizontalStartLeftOppositeMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1652. {
  1653.    static CHXBuffer* z_verticalTopOppDataBuffer = NULL;
  1654.         
  1655.    if (!z_verticalTopOppDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1656.    {
  1657.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(1,8,4);
  1658.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1659.                 
  1660.       for (int i = 0; i < 4; ++i)
  1661.       {
  1662.          blockTransList[i].CreateList(2);
  1663.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1664.                         
  1665.          list[0].invert = i & 1;
  1666.          list[1].invert = !list[0].invert;
  1667.          list[0].transition = list[1].transition = EdgeWipe;
  1668.          list[0].block = i;
  1669.          list[1].block = 7 - i;
  1670.       }
  1671.                 
  1672.       z_verticalTopOppDataBuffer = new CHXBuffer();
  1673.       z_verticalTopOppDataBuffer->AddRef();
  1674.       z_verticalTopOppDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1675.    }
  1676.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1677.    {
  1678.       delete *((MatrixTransitionData**)z_verticalTopOppDataBuffer->GetBuffer());
  1679.       if (!z_verticalTopOppDataBuffer->Release())
  1680.       {
  1681.          z_verticalTopOppDataBuffer = NULL;
  1682.          return HXCreateRegion();
  1683.       }
  1684.    }
  1685.         
  1686.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_verticalTopOppDataBuffer->GetBuffer()),lines);
  1687. }
  1688. HXREGION* HorizontalStartRightOppositeMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1689. {
  1690.    HXREGION* retRGN = MirrorVertical(HorizontalStartLeftOppositeMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2);
  1691.    if (lines)
  1692.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1693.    return retRGN;
  1694. }
  1695. HXREGION* DoubleSpiralTopMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1696. {
  1697.    tranLines* tmpLines = NULL;
  1698.    if (lines)
  1699.       tmpLines = new tranLines;
  1700.    int ii = (int)(((float)(left + right)) / 2.0 + .5)-1;
  1701.    int jj = ii + 1;
  1702.    
  1703.    
  1704.    HXREGION* retRGN = CounterClockwiseTopLeftMatrix(left, top, ii, bottom, completeness,lines);
  1705.    HXREGION* rgn1 = ClockwiseTopRightMatrix(jj, top, right, bottom, completeness,tmpLines);
  1706.    HXCombineRgn(retRGN, retRGN, rgn1, HX_RGN_XOR);
  1707.    HXDestroyRegion(rgn1);
  1708.    if (lines)
  1709.       *lines += *tmpLines;
  1710.         
  1711.    return retRGN;
  1712. }
  1713. HXREGION* DoubleSpiralBottomMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1714. {
  1715.    HXREGION* retRGN = MirrorHorizontal(DoubleSpiralTopMatrix(left,top,right,bottom,completeness,lines),top + (bottom - top + 1) / 2);
  1716.    if (lines)
  1717.       MirrorHorizontal(lines,top + (bottom - top + 1) / 2);
  1718.    return retRGN;
  1719. }
  1720. HXREGION* DoubleSpiralLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1721. {
  1722.    tranLines* tmpLines = NULL;
  1723.    if (lines)
  1724.       tmpLines = new tranLines;
  1725.    HXREGION* retRGN = ClockwiseTopLeftMatrix(left, top, right, (top + bottom) / 2 + 1, completeness,lines);
  1726.    HXREGION* rgn1 = CounterClockwiseBottomLeftMatrix(left, (top + bottom) / 2, right, bottom, completeness,tmpLines);
  1727.    HXCombineRgn(retRGN, retRGN, rgn1, HX_RGN_OR);
  1728.    HXDestroyRegion(rgn1);
  1729.         
  1730.    if (lines)
  1731.       *lines += *tmpLines;
  1732.         
  1733.    return retRGN;
  1734. }
  1735. HXREGION* DoubleSpiralRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1736. {
  1737.    HXREGION* retRGN = MirrorVertical(DoubleSpiralLeftMatrix(left,top,right,bottom,completeness,lines),left + (right - left + 1) / 2);
  1738.    if (lines)
  1739.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1740.    return retRGN;
  1741. }
  1742. HXREGION* QuadSpiralVerticalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1743. {
  1744.    tranLines* tmpLines = NULL;
  1745.    if (lines)
  1746.       tmpLines = new tranLines;
  1747.    HXREGION* retRGN = DoubleSpiralTopMatrix(left, top, right, (top + bottom) / 2 + 1, completeness,lines);
  1748.    HXREGION* rgn1 = DoubleSpiralBottomMatrix(left, (top + bottom) / 2 , right, bottom, completeness,tmpLines);
  1749.    HXCombineRgn(retRGN, retRGN, rgn1, HX_RGN_OR);
  1750.    HXDestroyRegion(rgn1);
  1751.    if (lines)
  1752.       *lines += *tmpLines;
  1753.         
  1754.    return retRGN;
  1755. }
  1756. HXREGION* QuadSpiralHorizontalMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1757. {
  1758.    tranLines* tmpLines = NULL;
  1759.    if (lines)
  1760.       tmpLines = new tranLines;
  1761.    HXREGION* retRGN = DoubleSpiralLeftMatrix(left, top, (left + right) / 2, bottom, completeness,lines);
  1762.    HXREGION* rgn1 = DoubleSpiralRightMatrix((left + right) / 2 + 1, top, right, bottom, completeness,tmpLines);
  1763.    HXCombineRgn(retRGN, retRGN, rgn1, HX_RGN_XOR);
  1764.    HXDestroyRegion(rgn1);
  1765.    if (lines)
  1766.       *lines += *tmpLines;
  1767.         
  1768.    return retRGN;
  1769. }
  1770. HXREGION* VerticalWaterfallLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1771. {
  1772.    static CHXBuffer* z_waterfallLeftDataBuffer = NULL;
  1773.         
  1774.    if (!z_waterfallLeftDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1775.    {
  1776.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(8,4,11);
  1777.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1778.                 
  1779.       int blockCount;
  1780.       int start = 0;
  1781.                 
  1782.       for (int i = 0; i < 11; ++i)
  1783.       {
  1784.          blockCount = 6 - abs(i - 5);
  1785.          if (blockCount > 4) blockCount = 4;
  1786.                         
  1787.          blockTransList[i].CreateList(blockCount);
  1788.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1789.                         
  1790.          for (int j = 0; j < blockCount; ++j)
  1791.          {
  1792.             list[j].block = start - j * 7;
  1793.             list[j].invert = 0;
  1794.             list[j].transition = SlideVerticalEdgeWipe;
  1795.          }
  1796.          start = (i >= 3) ? start + 1 : start + 8;
  1797.       }
  1798.                 
  1799.       z_waterfallLeftDataBuffer = new CHXBuffer();
  1800.       z_waterfallLeftDataBuffer->AddRef();
  1801.       z_waterfallLeftDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1802.    }
  1803.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1804.    {
  1805.       delete *((MatrixTransitionData**)z_waterfallLeftDataBuffer->GetBuffer());
  1806.       if (!z_waterfallLeftDataBuffer->Release())
  1807.       {
  1808.          z_waterfallLeftDataBuffer = NULL;
  1809.          return HXCreateRegion();
  1810.       }
  1811.    }
  1812.         
  1813.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_waterfallLeftDataBuffer->GetBuffer()),lines);
  1814. }
  1815. HXREGION* VerticalWaterfallRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1816. {
  1817.    HXREGION* retRGN = MirrorVertical(VerticalWaterfallLeftMatrix(left, top, right, bottom, completeness,lines),left + (right - left + 1) / 2);
  1818.    if (lines)
  1819.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1820.    return retRGN;
  1821. }
  1822. HXREGION* HorizontalWaterfallLeftMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1823. {
  1824.    static CHXBuffer* z_waterfallHorzLeftDataBuffer = NULL;
  1825.         
  1826.    if (!z_waterfallHorzLeftDataBuffer || completeness == MATRIX_TRANSITION_INIT)
  1827.    {
  1828.       MatrixTransitionData* VerticalMatrixTransition = new MatrixTransitionData(4,8,11);
  1829.       MatrixBlockTransitionList* blockTransList = VerticalMatrixTransition->GetTransactionListPtr();
  1830.                 
  1831.       int blockCount;
  1832.       int start = 0;
  1833.                 
  1834.       for (int i = 0; i < 11; ++i)
  1835.       {
  1836.          blockCount = 6 - abs(i - 5);
  1837.          if (blockCount > 4) blockCount = 4;
  1838.                         
  1839.          blockTransList[i].CreateList(blockCount);
  1840.          MatrixBlockTransition* list = blockTransList[i].GetListPtr();
  1841.                         
  1842.          for (int j = 0; j < blockCount; ++j)
  1843.          {
  1844.             list[j].block = start + j * 3;
  1845.             list[j].invert = 0;
  1846.             list[j].transition = EdgeWipe;
  1847.          }
  1848.          start = (start >= 3) ? start + 4 : start + 1;
  1849.       }
  1850.                 
  1851.       z_waterfallHorzLeftDataBuffer = new CHXBuffer();
  1852.       z_waterfallHorzLeftDataBuffer->AddRef();
  1853.       z_waterfallHorzLeftDataBuffer->Set((UCHAR*)&VerticalMatrixTransition, sizeof(UCHAR*));
  1854.    }
  1855.    else if (completeness == MATRIX_TRANSITION_DELETE)
  1856.    {
  1857.       delete *((MatrixTransitionData**)z_waterfallHorzLeftDataBuffer->GetBuffer());
  1858.       if (!z_waterfallHorzLeftDataBuffer->Release())
  1859.       {
  1860.          z_waterfallHorzLeftDataBuffer = NULL;
  1861.          return HXCreateRegion();
  1862.       }
  1863.    }
  1864.         
  1865.    return MatrixTransition(left,top,right,bottom,completeness,*((MatrixTransitionData**)z_waterfallHorzLeftDataBuffer->GetBuffer()),lines);
  1866. }
  1867. HXREGION* HorizontalWaterfallRightMatrix(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1868. {
  1869.    HXREGION* retRGN = MirrorVertical(HorizontalWaterfallLeftMatrix(left, top, right, bottom, completeness,lines),left + (right - left + 1) / 2);
  1870.    if (lines)
  1871.       MirrorVertical(lines,left + (right - left + 1) / 2);
  1872.    return retRGN;
  1873. }
  1874. #endif //_TRANSITIONS_ON_
  1875. HXREGION* DefaultTransition(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  1876. {
  1877.    if (lines)
  1878.    {
  1879.       lines->m_nLines = 0;
  1880.       HX_VECTOR_DELETE( lines->m_pLines );
  1881.    }
  1882.    return HXCreateRectRegion(left, top, right - left, bottom - top);
  1883. }
  1884. #ifdef _TRANSITIONS_ON_
  1885. HXREGION* CreateConvexPoly(int nSides, int startingAngle, int left, int top, int right, int bottom, int completeness, int multiplier = 100, int arclength = 360, int oneExtra = 0, tranLines* lines = NULL)
  1886. {
  1887.    HXxPoint* points = (HXxPoint*) malloc(sizeof(HXxPoint)* (nSides+oneExtra));
  1888.    HX_ASSERT( points );
  1889.    
  1890.    int count = 0;
  1891.    int middlex = (left+right)/2;
  1892.    int middley = (top+bottom)/2;
  1893.    double sizex = (double)(right - left) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  1894.    double sizey = (double)(bottom - top) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  1895.    for(;count<(nSides+oneExtra); count++)
  1896.    {
  1897.       double angle      = ((double)startingAngle + ((double)(((double)arclength/(double)nSides)*(double)count)))*PI/180.0;
  1898.       points[count].x = (int) (middlex + sin(angle) * sizex);
  1899.       points[count].y = (int) (middley - cos(angle) * sizey);
  1900.    }
  1901.    if (lines)
  1902.    {
  1903.       lines->m_nLines = nSides;
  1904.       lines->m_pLines = new LineSegment[nSides];
  1905.       lines->m_pLines[0].start.x = points[0].x;
  1906.       lines->m_pLines[0].start.y = points[0].y;
  1907.       for (count = 1; count < nSides; count++)
  1908.       {
  1909.          lines->m_pLines[count].start.x = points[count].x;
  1910.          lines->m_pLines[count].start.y = points[count].y;
  1911.          lines->m_pLines[count - 1].finish.x = points[count].x;
  1912.          lines->m_pLines[count - 1].finish.y = points[count].y;
  1913.       }
  1914.       lines->m_pLines[count - 1].finish.x = points[0].x;
  1915.       lines->m_pLines[count - 1].finish.y = points[0].y;
  1916.    }
  1917.    HXREGION* tempRGN = HXPolygonRegion( points, (nSides+oneExtra), WindingRule);
  1918.    free(points);
  1919.    return tempRGN;
  1920. }
  1921. HXREGION* CreateConcavePoly(int nSides, int startingAngle, int left, int top, int right, int bottom, int completeness, int multiplier = 100, tranLines* lines = NULL)
  1922. {
  1923.    HXxPoint* points = (HXxPoint*) malloc(sizeof(HXxPoint)* nSides*2);
  1924.         
  1925.    int count = 0;
  1926.    int middlex = (left+right)/2;
  1927.    int middley = (top+bottom)/2;
  1928.    double sizex = (double)(right - left) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  1929.    double sizey = (double)(bottom - top) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  1930.         
  1931.    for(;count<nSides*2; count++)
  1932.    {
  1933.       double angle      = (startingAngle + ((double)((360.0/((double)nSides*2))*(double)count)))*PI/180.0;
  1934.       points[count].x = (int) (middlex + sin(angle) * sizex * (double)(count %2 + 1));
  1935.       points[count].y = (int) (middley - cos(angle) * sizey * (double)(count %2 + 1));
  1936.    }
  1937.         
  1938.    if (lines)
  1939.    {
  1940.       lines->m_nLines = nSides * 2;
  1941.       lines->m_pLines = new LineSegment[lines->m_nLines];
  1942.       lines->m_pLines[0].start.x = points[0].x;
  1943.       lines->m_pLines[0].start.y = points[0].y;
  1944.       for (count = 1; count < lines->m_nLines; count++)
  1945.       {
  1946.          lines->m_pLines[count].start.x = points[count].x;
  1947.          lines->m_pLines[count].start.y = points[count].y;
  1948.          lines->m_pLines[count - 1].finish.x = points[count].x;
  1949.          lines->m_pLines[count - 1].finish.y = points[count].y;
  1950.       }
  1951.       lines->m_pLines[count - 1].finish.x = points[0].x;
  1952.       lines->m_pLines[count - 1].finish.y = points[0].y;
  1953.    }
  1954.    HXREGION* tempRGN = HXPolygonRegion( points, nSides*2, WindingRule);
  1955.    free(points);
  1956.    return tempRGN;
  1957. }
  1958. HXREGION* CreateArrowHeadPoly(int startingAngle, int left, int top, int right, int bottom, int completeness, int multiplier = 100, tranLines* lines = NULL)
  1959. {
  1960.    int angles[] = {0, 140, 180, 220};
  1961.    double multiple[] = { 1.0, 1.0, 0.3333, 1.0};
  1962.    int nSides = 4;
  1963.    HXxPoint* points = (HXxPoint*) malloc(sizeof(HXxPoint)* nSides);
  1964.         
  1965.    int count = 0;
  1966.    int middlex = (left+right)/2;
  1967.    int middley = (top+bottom)/2;
  1968.    double sizex = (double)(right - left) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  1969.    double sizey = (double)(bottom - top) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  1970.         
  1971.    for(;count<nSides; count++)
  1972.    {
  1973.       double angle      = ((double)(startingAngle + angles[count]))*PI/180.0;
  1974.       points[count].x = (int) (middlex + sin(angle) * sizex * multiple[count]);
  1975.       points[count].y = (int) (middley - cos(angle) * sizey * multiple[count]);
  1976.    }
  1977.         
  1978.    if (lines)
  1979.    {
  1980.       lines->m_nLines = nSides;
  1981.       lines->m_pLines = new LineSegment[nSides];
  1982.       lines->m_pLines[0].start.x = points[0].x;
  1983.       lines->m_pLines[0].start.y = points[0].y;
  1984.       for (count = 1; count < nSides; count++)
  1985.       {
  1986.          lines->m_pLines[count].start.x = points[count].x;
  1987.          lines->m_pLines[count].start.y = points[count].y;
  1988.          lines->m_pLines[count - 1].finish.x = points[count].x;
  1989.          lines->m_pLines[count - 1].finish.y = points[count].y;
  1990.       }
  1991.       lines->m_pLines[count - 1].finish.x = points[0].x;
  1992.       lines->m_pLines[count - 1].finish.y = points[0].y;
  1993.    }
  1994.    HXREGION* tempRGN = HXPolygonRegion( points, nSides, WindingRule);
  1995.    free(points);
  1996.    return tempRGN;
  1997. }
  1998. HXREGION* CreateSharpTrianglePoly(int startingAngle, int left, int top, int right, int bottom, int completeness, int multiplier = 100, tranLines* lines = NULL)
  1999. {
  2000.    int angles[] = {0, 150, 210};
  2001.    int nSides = 3;
  2002.    HXxPoint* points = (HXxPoint*) malloc(sizeof(HXxPoint)* nSides);
  2003.         
  2004.    int count = 0;
  2005.    int middlex = (left+right)/2;
  2006.    int middley = (top+bottom)/2;
  2007.    double sizex = (double)(right - left) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  2008.    double sizey = (double)(bottom - top) * (double) completeness / 1000.0 * (double)multiplier / 100.0;
  2009.         
  2010.    for(;count<nSides; count++)
  2011.    {
  2012.       double angle      = ((double)(startingAngle + angles[count]))*PI/180.0;
  2013.       points[count].x = (int) (middlex + sin(angle) * sizex); 
  2014.       points[count].y = (int) (middley - cos(angle) * sizey);
  2015.    }
  2016.         
  2017.    if (lines)
  2018.    {
  2019.       lines->m_nLines = nSides;
  2020.       lines->m_pLines = new LineSegment[nSides];
  2021.       lines->m_pLines[0].start.x = points[0].x;
  2022.       lines->m_pLines[0].start.y = points[0].y;
  2023.       for (count = 1; count < nSides; count++)
  2024.       {
  2025.          lines->m_pLines[count].start.x = points[count].x;
  2026.          lines->m_pLines[count].start.y = points[count].y;
  2027.          lines->m_pLines[count - 1].finish.x = points[count].x;
  2028.          lines->m_pLines[count - 1].finish.y = points[count].y;
  2029.       }
  2030.       lines->m_pLines[count - 1].finish.x = points[0].x;
  2031.       lines->m_pLines[count - 1].finish.y = points[0].y;
  2032.    }
  2033.    HXREGION* tempRGN = HXPolygonRegion( points, nSides, WindingRule);
  2034.    free(points);
  2035.    return tempRGN;
  2036. }
  2037. HXREGION* KeyHoleIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2038. {
  2039.    if (completeness >= 1000)
  2040.       return HXCreateRectRegion(left,top,right-left,bottom-top);
  2041.    int midX = left + right / 2;
  2042.    int midY = top + bottom / 2;
  2043.    int radius = int(double(midY - top) / 450.0 * completeness);
  2044.    int hTop = midY - radius;
  2045.    int startY = int(hTop + double(midY - hTop) * 2.0 / 5.0);
  2046.    int i;
  2047.    HXxPoint p[61];
  2048.    double angle = 1.570796; // 90 degrees
  2049.    for (i = 0; i <= 30; ++i, angle += 0.087266) // 5 degress
  2050.    {
  2051.       p[i].x = midX + int(cos(angle) * radius);
  2052.       p[i].y = startY - int(sin(angle) * radius);
  2053.    }
  2054.    p[30].x = midX - radius;
  2055.    p[30].y = startY + radius * 3;
  2056.    p[31].x = midX + radius;
  2057.    p[31].y = p[30].y;
  2058.    for (i = 32; i < 61; ++i)
  2059.    {
  2060.       p[i].x = 2 * midX - p[61 - i].x;
  2061.       p[i].y = p[61 - i].y;
  2062.    }
  2063.    if (lines)
  2064.    {
  2065.       lines->m_pLines = new LineSegment[61];
  2066.       if(!lines->m_pLines)
  2067.       {
  2068.          lines->m_nLines = 0;
  2069.       }
  2070.       else
  2071.       {
  2072.          int j;
  2073.          lines->m_nLines = 61;
  2074.          for (i = 0, j = 1; i < 60; ++i, ++j)
  2075.          {
  2076.             lines->m_pLines[i].start.x = p[i].x;
  2077.             lines->m_pLines[i].start.y = p[i].y;
  2078.             lines->m_pLines[i].finish.x = p[j].x;
  2079.             lines->m_pLines[i].finish.y = p[j].y;
  2080.          }
  2081.          lines->m_pLines[60].start.x = p[60].x;
  2082.          lines->m_pLines[60].start.y = p[60].y;
  2083.          lines->m_pLines[60].finish.x = p[0].x;
  2084.          lines->m_pLines[60].finish.y = p[0].y;
  2085.       }
  2086.    }
  2087.    return HXPolygonRegion(p, 61, WindingRule);
  2088. }
  2089. HXREGION* CatEyeIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2090. {
  2091.    int width = right - left;
  2092.    int height = bottom - top;
  2093.    int halfWidth = width / 2;
  2094.    int halfHeight = height / 2;
  2095.    int radius = int(sqrt((double)(height * height + halfWidth * halfWidth)));
  2096.         
  2097.    double step = double(radius) / 1000.0;
  2098.    int x = int(double(halfHeight) / step);
  2099.    double newStep = double(1000 - x) / 1000.0;
  2100.    completeness = int(double(completeness) * newStep + x);
  2101.         
  2102.    tranLines* tmpLines = NULL;
  2103.    if (lines)
  2104.       tmpLines = new tranLines;
  2105.    HXREGION* retRGN = CreateConvexPoly(51,0,halfWidth - radius,top - radius,halfWidth + radius,top + radius,completeness,50,360,0,tmpLines);
  2106.    HXREGION* reg1 = CreateConvexPoly(51,0,halfWidth - radius,bottom - radius,halfWidth + radius,bottom + radius,completeness,50,360,0,lines);
  2107.     
  2108.    if (lines)
  2109.    {
  2110.       *lines += *tmpLines;
  2111.       delete tmpLines;
  2112.    }
  2113.         
  2114.    HXCombineRgn(retRGN, retRGN, reg1, HX_RGN_AND);
  2115.    HXDestroyRegion(reg1);
  2116.         
  2117.    return retRGN;
  2118. }
  2119. HXREGION* CatEyeSideIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2120. {
  2121.    int width = right - left;
  2122.    int height = bottom - top;
  2123.    int halfWidth = width / 2;
  2124.    int halfHeight = height / 2;
  2125.    int radius = int(sqrt((double)(width * width + halfHeight * halfHeight)));
  2126.         
  2127.    double step = double(radius) / 1000.0;
  2128.    int x = int(double(halfWidth) / step);
  2129.    double newStep = double(1000 - x) / 1000.0;
  2130.    completeness = int(double(completeness) * newStep + x);
  2131.         
  2132.    tranLines* tmpLines = NULL;
  2133.    if (lines)
  2134.       tmpLines = new tranLines;
  2135.    HXREGION* retRGN = CreateConvexPoly(51,0,left - radius,halfHeight - radius,left + radius,halfHeight + radius,completeness,50,360,0,lines);
  2136.    HXREGION* reg1 = CreateConvexPoly(51,0,right - radius,halfHeight - radius,right + radius,halfHeight + radius,completeness,50,360,0,tmpLines);
  2137.         
  2138.    if (lines)
  2139.    {
  2140.       *lines += *tmpLines;
  2141.       delete tmpLines;
  2142.    }
  2143.         
  2144.    HXCombineRgn(retRGN, retRGN, reg1, HX_RGN_AND);
  2145.    HXDestroyRegion(reg1);
  2146.         
  2147.    return retRGN;
  2148. }
  2149. HXREGION* RoundRectCalc(int midX, int midY, int dx, int dy, int radius, tranLines* lines)
  2150. {
  2151.    int i;
  2152.    HXxPoint p[60];
  2153.    double angle = 1.570796; // 90 degrees
  2154.    for (i = 0; i < 15; ++i, angle += 0.10472) // 6 degrees
  2155.    {
  2156.       int nx = int(cos(angle) * radius);
  2157.       int ny = int(sin(angle) * radius);
  2158.       p[i].x = p[29 - i].x = midX - dx / 2 + nx;
  2159.       p[59 - i].x = p[30 + i].x = midX + dx / 2 - nx;
  2160.       p[i].y = p[59 - i].y = midY - dy / 2 - ny;
  2161.       p[29 - i].y = p[30 + i].y = midY + dy / 2 + ny;
  2162.    }
  2163.    if (lines)
  2164.    {
  2165.       lines->m_pLines = new LineSegment[60];
  2166.       if(!lines->m_pLines)
  2167.       {
  2168.          lines->m_nLines = 0;
  2169.       }
  2170.       else
  2171.       {
  2172.          int j;
  2173.          lines->m_nLines = 60;
  2174.          for (i = 0, j = 1; i < 59; ++i, ++j)
  2175.          {
  2176.             lines->m_pLines[i].start.x = p[i].x;
  2177.             lines->m_pLines[i].start.y = p[i].y;
  2178.             lines->m_pLines[i].finish.x = p[j].x;
  2179.             lines->m_pLines[i].finish.y = p[j].y;
  2180.          }
  2181.          lines->m_pLines[59].start.x = p[59].x;
  2182.          lines->m_pLines[59].start.y = p[59].y;
  2183.          lines->m_pLines[59].finish.x = p[0].x;
  2184.          lines->m_pLines[59].finish.y = p[0].y;
  2185.       }
  2186.    }
  2187.         
  2188.    return HXPolygonRegion(p, 60, WindingRule);
  2189. }
  2190. HXREGION* RoundRectHorizontal(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2191. {
  2192.    if (completeness >= 1000)
  2193.       return HXCreateRectRegion(left,top,right-left,bottom-top);
  2194.    int width = right - left;
  2195.    int height = bottom - top;
  2196.    int midX = left + width / 2;
  2197.    int midY = top + height / 2;
  2198.    int steps = height / 2 + height / 16;
  2199.         
  2200.    if (width > height * 2)
  2201.       steps += (width - height) / 2;
  2202.         
  2203.    int dy = int(steps * (double(completeness) / 1000.0));
  2204.    int dx = dy * 2;
  2205.    int radius = dy / 2;
  2206.    return RoundRectCalc(midX, midY, dx, dy, radius, lines);
  2207. }
  2208. HXREGION* RoundRectVeritical(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2209. {
  2210.    if (completeness >= 1000)
  2211.       return HXCreateRectRegion(left,top,right-left,bottom-top);
  2212.    int width = right - left;
  2213.    int height = bottom - top;
  2214.    int midX = left + right / 2;
  2215.    int midY = top + bottom / 2;
  2216.    int steps = width / 2;
  2217.         
  2218.    if (height > width * 2)
  2219.       steps += (height - width) / 2;
  2220.         
  2221.    int dx = int(steps * (double(completeness) / 1000.0));
  2222.    int dy = dx * 2;
  2223.    int radius = dx / 2;
  2224.    return RoundRectCalc(midX, midY, dx, dy, radius, lines);
  2225. }
  2226. HXREGION* ConvexPolyIris(int sides, int angle, int left, int top, int right, int bottom, int completeness, int multiplier = 100, tranLines* lines = NULL)
  2227. {
  2228.    if (completeness >= 1000)
  2229.       return HXCreateRectRegion(left,top,right-left,bottom-top);
  2230.         
  2231.    int width = right - left;
  2232.    int height = bottom - top;
  2233.    int midX = left + width / 2;
  2234.    int midY = top + height / 2;
  2235.         
  2236.    double step = double(max(width, height)) / 2000.0;
  2237.    int square = int(step * completeness);
  2238.         
  2239.    int sLeft = midX - square;
  2240.    int sTop = midY - square;
  2241.    int sRight = midX + square;
  2242.    int sBottom = midY + square;
  2243.         
  2244.    return CreateConvexPoly(sides, angle, sLeft, sTop, sRight, sBottom, completeness, multiplier, 360, 0 ,lines);
  2245. }
  2246. HXREGION* RectangleIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2247. {
  2248.    return CreateConvexPoly(4, 45, left, top, right, bottom, completeness, 75, 360, 0 , lines);
  2249. }
  2250. HXREGION* DiamondIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2251. {
  2252.    return ConvexPolyIris(4,0,left,top,right,bottom,completeness, 100, lines);
  2253. }
  2254. HXREGION* TriangleIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2255. {
  2256.    return ConvexPolyIris(3,0,left,top,right,bottom,completeness, 140, lines);
  2257. }
  2258. HXREGION* TriangleRightIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2259. {
  2260.    return ConvexPolyIris(3,90,left,top,right,bottom,completeness,140, lines);
  2261. }
  2262. HXREGION* TriangleUpsideDownIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2263. {
  2264.    return ConvexPolyIris(3,180,left,top,right,bottom,completeness, 140, lines);
  2265. }
  2266. HXREGION* TriangleLeftIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2267. {
  2268.    return ConvexPolyIris(3,270,left,top,right,bottom,completeness, 140, lines);
  2269. }
  2270. HXREGION* PentagonIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2271. {
  2272.    return ConvexPolyIris(5,0,left,top,right,bottom,completeness, 66, lines);
  2273. }
  2274. HXREGION* PentagonUpsideDownLeftIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2275. {
  2276.    return ConvexPolyIris(5,180,left,top,right,bottom,completeness,66, lines);
  2277. }
  2278. HXREGION* HexagonIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2279. {
  2280.    return ConvexPolyIris(6,60,left,top,right,bottom,completeness,85, lines);
  2281. }
  2282. HXREGION* HexagonSideIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2283. {
  2284.    return ConvexPolyIris(6,30,left,top,right,bottom,completeness,85, lines);
  2285. }
  2286. HXREGION* CircleIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2287. {
  2288.    return ConvexPolyIris(50,0,left,top,right,bottom,completeness,60, lines);
  2289. }
  2290. HXREGION* OvalIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2291. {
  2292.    return CreateConvexPoly(50, 0, left - (right - left)/2, top, right + (right - left)/2, bottom, completeness, 60, 360, 0 , lines);
  2293. }
  2294. HXREGION* OvalSideIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2295. {
  2296.    return CreateConvexPoly(50, 0, left, top - (bottom - top)/2, right, bottom + (bottom - top)/2, completeness, 60, 360, 0 , lines);
  2297. }
  2298. HXREGION* StarIris(int sides, int angle, int left, int top, int right, int bottom, int completeness, int multiplier = 100, tranLines* lines = NULL)
  2299. {
  2300.    if (completeness >= 1000)
  2301.       return HXCreateRectRegion(left,top,right-left,bottom-top);
  2302.         
  2303.    int width = right - left;
  2304.    int height = bottom - top;
  2305.    int midX = left + width / 2;
  2306.    int midY = top + height / 2;
  2307.         
  2308.    int square = int(double(min(width, height) * double(multiplier) / 100.0 * completeness) / 1000.0);
  2309.         
  2310.    int sLeft = midX - square;
  2311.    int sTop = midY - square;
  2312.    int sRight = midX + square;
  2313.    int sBottom = midY + square;
  2314.         
  2315.    HXREGION* retRGN = CreateConcavePoly(sides, angle, sLeft, sTop, sRight, sBottom, completeness, 50, lines);
  2316.    return retRGN;
  2317. }
  2318. HXREGION* FourPointStarIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2319. {
  2320.    return StarIris(4,45,left,top,right,bottom,completeness,120, lines);
  2321. }
  2322. HXREGION* FivePointStarIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2323. {
  2324.    return StarIris(5,36,left,top,right,bottom,completeness,150, lines);
  2325. }
  2326. HXREGION* SixPointStarIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2327. {
  2328.    return StarIris(6,30,left,top,right,bottom,completeness,150, lines);
  2329. }
  2330. HXREGION* ArrowHeadIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2331. {
  2332.    return CreateArrowHeadPoly(0, left, top, right, bottom, completeness, 200, lines);
  2333. }
  2334. HXREGION* ArrowHeadRightIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2335. {
  2336.    return CreateArrowHeadPoly(90, left, top, right, bottom, completeness, 200, lines);
  2337. }
  2338. HXREGION* ArrowHeadUpsideDownIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2339. {
  2340.    return CreateArrowHeadPoly(180, left, top, right, bottom, completeness, 200, lines);
  2341. }
  2342. HXREGION* ArrowHeadLeftIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2343. {
  2344.    return CreateArrowHeadPoly(270, left, top, right, bottom, completeness, 200, lines);
  2345. }
  2346. HXREGION* HeartIris(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2347. {
  2348.    if (completeness >= 1000)
  2349.       return HXCreateRectRegion(left,top,right-left,bottom-top);
  2350.    int midX = (right - left) / 2;
  2351.    int midY = (bottom - top) / 2;
  2352.    int radius = int(double(midY - top) / 750.0 * completeness);
  2353.    int hLeft = midX - radius;
  2354.    int hTop = midY - radius;
  2355.    int startY = int(hTop + double(midY - hTop) * 2.0 / 5.0);
  2356.    int i;
  2357.    HXxPoint p[60];
  2358.    double angle = 0;
  2359.    for (i = 0; i <= 30; ++i, angle += 0.1309) // 7.5 degress
  2360.    {
  2361.       p[i].x = hLeft + int(cos(angle) * radius);
  2362.       p[i].y = startY - int(sin(angle) * radius);
  2363.    }
  2364.    p[30].x = midX;
  2365.    p[30].y = p[29].y + (5 * (midX - p[29].x)) / 4; // slope is 5/4 or 1.25
  2366.    for (i = 31; i < 60; ++i)
  2367.    {
  2368.       p[i].x = 2 * midX - p[60 - i].x;
  2369.       p[i].y = p[60 - i].y;
  2370.    }
  2371.    if (lines)
  2372.    {
  2373.       lines->m_pLines = new LineSegment[60];
  2374.       if(!lines->m_pLines)
  2375.       {
  2376.          lines->m_nLines = 0;
  2377.       }
  2378.       else
  2379.       {
  2380.          int j;
  2381.          lines->m_nLines = 60;
  2382.          for (i = 0, j = 1; i < 59; ++i, ++j)
  2383.          {
  2384.             lines->m_pLines[i].start.x = p[i].x;
  2385.             lines->m_pLines[i].start.y = p[i].y;
  2386.             lines->m_pLines[i].finish.x = p[j].x;
  2387.             lines->m_pLines[i].finish.y = p[j].y;
  2388.          }
  2389.          lines->m_pLines[59].start.x = p[59].x;
  2390.          lines->m_pLines[59].start.y = p[59].y;
  2391.          lines->m_pLines[59].finish.x = p[0].x;
  2392.          lines->m_pLines[59].finish.y = p[0].y;
  2393.       }
  2394.    }
  2395.    return HXPolygonRegion(p, 60, WindingRule);
  2396. }
  2397. HXREGION* EdgeWipe(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2398. {
  2399.    int x = (int)((double)left + (right - left)*((double)completeness)/1000.0);
  2400.    if (lines)
  2401.    {
  2402.       lines->m_nLines = 1;
  2403.       lines->m_pLines = new LineSegment[1];
  2404.       lines->m_pLines->start.x = lines->m_pLines->finish.x = x;
  2405.       lines->m_pLines->start.y = top;
  2406.       lines->m_pLines->finish.y = bottom;
  2407.    }
  2408.    return HXCreateRectRegion(left,
  2409.                               top,
  2410.                               x - left,
  2411.                               bottom - top);
  2412. }
  2413. HXREGION* SlideVerticalEdgeWipe(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2414. {
  2415.    int y = (int) ((double)top + (double)(bottom - top)* ((double)completeness) / 1000.0);
  2416.    if (lines)
  2417.    {
  2418.       lines->m_nLines = 1;
  2419.       lines->m_pLines = new LineSegment[1];
  2420.       lines->m_pLines->start.x = left;
  2421.       lines->m_pLines->finish.x = right;
  2422.       lines->m_pLines->start.y = lines->m_pLines->finish.y = y;
  2423.    }
  2424.    return HXCreateRectRegion( left,
  2425.                                top,
  2426.                                right - left,
  2427.                                y - top
  2428.                                );
  2429. }
  2430. HXREGION* TopLeftEdgeWipe(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2431. {
  2432.    HXxPoint points[4];
  2433.         
  2434.    points[0].x = left;
  2435.    points[0].y = top;
  2436.    points[1].x = left;
  2437.    points[1].y = top + ((bottom - top) * completeness  )/ 1000;
  2438.    points[2].x = left + ((right - left) * completeness )/ 1000;
  2439.    points[2].y = top + ((bottom - top) * completeness  )/ 1000;
  2440.    points[3].x = left + ((right - left) * completeness )/ 1000;
  2441.    points[3].y = top;
  2442.         
  2443.    if (lines)
  2444.    {
  2445.       lines->m_nLines = 2;
  2446.       lines->m_pLines = new LineSegment[2];
  2447.       if (!lines->m_pLines)
  2448.       {
  2449.          lines->m_nLines = 0;
  2450.       }
  2451.       else
  2452.       {
  2453.          lines->m_pLines[0].start.x = points[1].x;
  2454.          lines->m_pLines[0].start.y = points[1].y;
  2455.          lines->m_pLines[0].finish.x = points[2].x;
  2456.          lines->m_pLines[0].finish.y = points[2].y;
  2457.          lines->m_pLines[1].start.x = points[2].x;
  2458.          lines->m_pLines[1].start.y = points[2].y;
  2459.          lines->m_pLines[1].finish.x = points[3].x;
  2460.          lines->m_pLines[1].finish.y = points[3].y;
  2461.       }
  2462.    }
  2463.    return HXPolygonRegion( points, 4, WindingRule);
  2464. }
  2465. HXREGION* TopRightEdgeWipe(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2466. {
  2467.    HXxPoint points[4];
  2468.         
  2469.    points[0].x = right;
  2470.    points[0].y = top;
  2471.    points[1].x = right;
  2472.    points[1].y = top + ((bottom - top) * completeness)/ 1000;
  2473.    points[2].x = right - ((right - left) * completeness)/ 1000;
  2474.    points[2].y = top + ((bottom - top) * completeness)/ 1000;
  2475.    points[3].x = right - ((right - left) * completeness)/ 1000;
  2476.    points[3].y = top;
  2477.         
  2478.    if (lines)
  2479.    {
  2480.       lines->m_nLines = 2;
  2481.       lines->m_pLines = new LineSegment[2];
  2482.       if (!lines->m_pLines)
  2483.       {
  2484.          lines->m_nLines = 0;
  2485.       }
  2486.       else
  2487.       {
  2488.          lines->m_pLines[0].start.x = points[1].x;
  2489.          lines->m_pLines[0].start.y = points[1].y;
  2490.          lines->m_pLines[0].finish.x = points[2].x;
  2491.          lines->m_pLines[0].finish.y = points[2].y;
  2492.          lines->m_pLines[1].start.x = points[2].x;
  2493.          lines->m_pLines[1].start.y = points[2].y;
  2494.          lines->m_pLines[1].finish.x = points[3].x;
  2495.          lines->m_pLines[1].finish.y = points[3].y;
  2496.       }
  2497.    }
  2498.    return HXPolygonRegion( points, 4, WindingRule);
  2499. }
  2500. HXREGION* BottomRightEdgeWipe(int left, int top, int right, int bottom, int completeness, tranLines* lines)
  2501. {
  2502.    HXxPoint points[4];