sitetran.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:180k
源码类别:

Symbian

开发平台:

C/C++

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