⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sitetran.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
   {VerticalWaterfallLeftMatrix, 350, "verticalLeft"},
   {VerticalWaterfallRightMatrix, 351, "verticalRight"},
   {HorizontalWaterfallLeftMatrix, 352, "horizontalLeft"},
   {HorizontalWaterfallRightMatrix, 353, "horizontalRight"}
};

//-----------------------------------------------------------------------
tranStruct z_slideTable[] =
{
   {SlideFromLeft, -1, "fromLeft"},
   {SlideFromTop, -1, "fromTop"},
   {SlideFromRight, -1, "fromRight"},
   {SlideFromBottom, -1, "fromBottom"}
};

tranStruct z_fadeTable[] =
{
   {Crossfade,     -1, "crossfade"},
   {FadeToColor,   -1, "fadeToColor"},
   {FadeFromColor, -1, "fadeFromColor"}
};

tranStruct z_defaultTable[] =
{
   {DefaultTransition, -1, "DefaultTransition"}
};


//////////////////////////////////////
#endif  //_TRANSITIONS_ON_



tranType z_TransitionTable[] = 
{
   {z_defaultTable, "noTransition", sizeof(z_defaultTable) / sizeof(z_defaultTable[0])},
        
#ifdef _TRANSITIONS_ON_
        
   {z_barWipeTable, "barWipe", sizeof(z_barWipeTable) / sizeof(z_barWipeTable[0])},
   {z_boxWipeTable, "boxWipe", sizeof(z_boxWipeTable) / sizeof(z_boxWipeTable[0])},
   {z_fourBoxTable, "fourBoxWipe", sizeof(z_fourBoxTable) / sizeof(z_fourBoxTable[0])},
   {z_barnDoorTable, "barnDoorWipe", sizeof(z_barnDoorTable) / sizeof(z_barnDoorTable[0])},
   {z_diagonalTable, "diagonalWipe", sizeof(z_diagonalTable) / sizeof(z_diagonalTable[0])},
   {z_bowTieTable, "bowTieWipe", sizeof(z_bowTieTable) / sizeof(z_bowTieTable[0])},
   {z_miscDiagonalTable, "miscDiagonalWipe", sizeof(z_miscDiagonalTable) / sizeof(z_miscDiagonalTable[0])},
   {z_veeTable, "veeWipe", sizeof(z_veeTable) / sizeof(z_veeTable[0])},
   {z_barnVeeTable, "barnVeeWipe", sizeof(z_barnVeeTable) / sizeof(z_barnVeeTable[0])},
   {z_zigZagTable, "zigZagWipe", sizeof(z_zigZagTable) / sizeof(z_zigZagTable[0])},
   {z_barnZigZagTable, "barnZigZagWipe", sizeof(z_barnZigZagTable) / sizeof(z_barnZigZagTable[0])},
   {z_irisTable, "irisWipe", sizeof(z_irisTable) / sizeof(z_irisTable[0])},
   {z_triangleTable, "triangleWipe", sizeof(z_triangleTable) / sizeof(z_triangleTable[0])},
   {z_arrowHeadTable, "arrowHeadWipe", sizeof(z_arrowHeadTable) / sizeof(z_arrowHeadTable[0])},
   {z_pentagonTable, "pentagonWipe", sizeof(z_pentagonTable) / sizeof(z_pentagonTable[0])},
   {z_hexagonTable, "hexagonWipe", sizeof(z_hexagonTable) / sizeof(z_hexagonTable[0])},
   {z_ellipseTable, "ellipseWipe", sizeof(z_ellipseTable) / sizeof(z_ellipseTable[0])},
   {z_eyeTable, "eyeWipe", sizeof(z_eyeTable) / sizeof(z_eyeTable[0])},
   {z_roundRectTable, "roundRectWipe", sizeof(z_roundRectTable) / sizeof(z_roundRectTable[0])},
   {z_starTable, "starWipe", sizeof(z_starTable) / sizeof(z_starTable[0])},
   {z_miscShapeTable, "miscShapeWipe", sizeof(z_miscShapeTable) / sizeof(z_miscShapeTable[0])},
   {z_clockTable, "clockWipe", sizeof(z_clockTable) / sizeof(z_clockTable[0])},
   {z_pinWheelTable, "pinWheelWipe", sizeof(z_pinWheelTable) / sizeof(z_pinWheelTable[0])},
   {z_singleSweepTable, "singleSweepWipe", sizeof(z_singleSweepTable) / sizeof(z_singleSweepTable[0])},
   {z_fanTable, "fanWipe", sizeof(z_fanTable) / sizeof(z_fanTable[0])},
   {z_doubleFanTable, "doubleFanWipe", sizeof(z_doubleFanTable) / sizeof(z_doubleFanTable[0])},
   {z_doubleSweepTable, "doubleSweepWipe", sizeof(z_doubleSweepTable) / sizeof(z_doubleSweepTable[0])},
   {z_saloonDoorTable, "saloonDoorWipe", sizeof(z_saloonDoorTable) / sizeof(z_saloonDoorTable[0])},
   {z_windshieldTable, "windshieldWipe", sizeof(z_windshieldTable) / sizeof(z_windshieldTable[0])},
   {z_snakeTable, "snakeWipe", sizeof(z_snakeTable) / sizeof(z_snakeTable[0])},
   {z_spiralTable, "spiralWipe", sizeof(z_spiralTable) / sizeof(z_spiralTable[0])},
   {z_parallelSnakesTable, "parallelSnakesWipe", sizeof(z_parallelSnakesTable) / sizeof(z_parallelSnakesTable[0])},
   {z_boxSnakesTable, "boxSnakesWipe", sizeof(z_boxSnakesTable) / sizeof(z_boxSnakesTable[0])},
   {z_waterfallTable, "waterfallWipe", sizeof(z_waterfallTable) / sizeof(z_waterfallTable[0])},
   {z_slideTable, "slideWipe", sizeof(z_slideTable) / sizeof(z_slideTable[0])},
   {z_fadeTable, "fade", sizeof(z_fadeTable) / sizeof(z_fadeTable[0])}
#endif //_TRANSITIONS_ON_
};

INT32 z_nNumberTransitionTypes = sizeof(z_TransitionTable) / sizeof(z_TransitionTable[0]);

#ifdef _TRANSITIONS_ON_


void CalcMatrixLines(tranLines* lines, LineSegment* src, LineSegment* mod, BOOL* blocked)
{
   LineSegment ls;

   *blocked = TRUE;

   lines->Destroy();

   if (src->start.y == src->finish.y) // horizontal lines
   {
      if (mod->start.x <= src->start.x && mod->finish.x >= src->start.x && mod->finish.x < src->finish.x)
      {
         ls.start.x = mod->finish.x;
         ls.finish.x = src->finish.x;
         ls.start.y = ls.finish.y = src->start.y;

         *lines += ls;
      }
      else if (mod->start.x <= src->finish.x && mod->start.x > src->start.x && mod->finish.x >= src->finish.x)
      {
         ls.start.x = src->start.x;
         ls.finish.x = mod->start.x;
         ls.start.y = ls.finish.y = src->start.y;

         *lines += ls;
      }
      else if (mod->start.x > src->start.x && mod->finish.x < src->finish.x)
      {
         ls.start.x = mod->finish.x;
         ls.finish.x = src->finish.x;
         ls.start.y = ls.finish.y = src->start.y;

         *lines += ls;

         ls.start.x = src->start.x;
         ls.finish.x = mod->start.x;
         ls.start.y = ls.finish.y = src->start.y;

         *lines += ls;
      }
      else if (mod->start.x >= src->finish.x || mod->finish.x <= src->start.x)
      {
         *blocked = FALSE;
      }
   }
   else                            // vertical lines
   {
      if (mod->start.y < src->start.y && mod->finish.y >= src->start.y && mod->finish.y < src->finish.y)
      {
         ls.start.y = mod->finish.y;
         ls.finish.y = src->finish.y;
         ls.start.x = ls.finish.x = src->start.x;

         *lines += ls;
      }
      else if (mod->start.y < src->finish.y && mod->start.y > src->start.y && mod->finish.y >= src->finish.y)
      {
         ls.start.y = src->start.y;
         ls.finish.y = mod->start.y;
         ls.start.x = ls.finish.x = src->start.x;

         *lines += ls;
      }
      else if (mod->start.y > src->start.y && mod->finish.y < src->finish.y)
      {
         ls.start.y = mod->finish.y;
         ls.finish.y = src->finish.y;
         ls.start.x = ls.finish.x = src->start.x;

         *lines += ls;

         ls.start.y = src->start.y;
         ls.finish.y = mod->start.y;
         ls.start.x = ls.finish.x = src->start.x;

         *lines += ls;
      }
      else if (mod->start.y >= src->finish.y || mod->finish.y <= src->start.y)
      {
         *blocked = FALSE;
      }
   }
}

void CalcMatrixLines(tranLines* newLines, tranLines* src, LineSegment* mod, BOOL* blocked)
{
   tranLines tmpLines;

   newLines->Destroy();

   //XXXSMJ this is not foolproof but will be good enough for our current needs
   for (int i = 0; i < src->m_nLines; ++i)
   {
      CalcMatrixLines(&tmpLines,&src->m_pLines[i],mod,blocked);

      if (!tmpLines.m_nLines) // this happens when lines don't obstruct each other
         *newLines += src->m_pLines[i];
      else
         *newLines += tmpLines;
   }
}

void CalcMatrixBlockCoords(int left, int top, int right, int bottom, MatrixTransitionData *pData, int block, int* blockLeft, int* blockTop, int* blockRight, int* blockBottom)
{
   double blockX = double(right - left + 1) / double(pData->GetWidth());
   double blockY = double(bottom - top + 1) / double(pData->GetHeight());
    
   *blockLeft = int(left + blockX * (block % pData->GetWidth()));
   *blockTop = int(top + blockY * (block / pData->GetWidth()));
   *blockRight = int(left + blockX * (block % pData->GetWidth() + 1));
   *blockBottom = int(top + blockY * (block / pData->GetWidth() + 1));
 
   if (*blockLeft < left) *blockRight = left;
   if (*blockTop < top) *blockBottom = top;
   if (*blockRight > right) *blockRight = right;
   if (*blockBottom > bottom) *blockBottom = bottom;
}

HXREGION* MatrixTransition(int left, int top, int right, int bottom, int completeness, MatrixTransitionData *pData, tranLines* lines)
{
   HXREGION* retRGN = HXCreateRegion();
   HXREGION* rgn1;
    
   int bLeft,bTop,bRight,bBottom;
   double frameLength = 1000.0 / pData->GetTransitionLength();
   int frame = (int)((float)completeness/(frameLength+0.1));
   MatrixBlockTransitionList* blockTransList = pData->GetTransactionListPtr();
   for (int i = 0; i < frame; ++i)
   {
      MatrixBlockTransition* transList = blockTransList[i].GetListPtr();
      for (int j = 0; j < blockTransList[i].GetSize(); ++j)
      {
         // these will all be completed blocks
         CalcMatrixBlockCoords(left,top,right,bottom,pData,transList[j].block,&bLeft,&bTop,&bRight,&bBottom);
         rgn1 = HXCreateRectRegion(bLeft,bTop,bRight-bLeft,bBottom-bTop);
         HXCombineRgn(retRGN, rgn1, retRGN, HX_RGN_OR);
         HXDestroyRegion(rgn1);
      }
   }
    
   int tmpCompleteness = int((completeness - frameLength * frame) / frameLength * 1000);
   MatrixBlockTransition* transList = blockTransList[frame].GetListPtr();
   for (int j = 0; j < blockTransList[frame].GetSize(); ++j)
   {
      CalcMatrixBlockCoords(left,top,right,bottom,pData,transList[j].block,&bLeft,&bTop,&bRight,&bBottom);
        
      if (transList[j].invert)
      {
         rgn1 = transList[j].transition(bLeft,bTop,bRight,bBottom,1000 - tmpCompleteness,lines);
         rgn1 = InvertRGN(rgn1,bLeft,bTop,bRight,bBottom);
      }
      else
      {
         rgn1 = transList[j].transition(bLeft,bTop,bRight,bBottom,tmpCompleteness,lines);
      }
            
      HXCombineRgn(retRGN, rgn1, retRGN, HX_RGN_OR);
      HXDestroyRegion(rgn1);
   }

   if (lines)
   {
      BOOL blocked,tmpBlock;
      LineSegment lineSeg1, lineSeg2;
      tranLines tmpLines;

      for (int x = 0; x < retRGN->numRects; ++x)
      {
         // top
         if (retRGN->rects[x].y1 > top)
         {
            tranLines   tl;
            blocked = tmpBlock = FALSE;

            lineSeg1.start.x = retRGN->rects[x].x1;
            lineSeg1.start.y = retRGN->rects[x].y1;
            lineSeg1.finish.x = retRGN->rects[x].x2;
            lineSeg1.finish.y = retRGN->rects[x].y1;

            for (int y = 0; y < x; ++y)
            {
               if (retRGN->rects[y].y2 == retRGN->rects[x].y1)
               {
                  lineSeg2.start.x = retRGN->rects[y].x1;
                  lineSeg2.start.y = retRGN->rects[y].y2;
                  lineSeg2.finish.x = retRGN->rects[y].x2;
                  lineSeg2.finish.y = retRGN->rects[y].y2;

                  if (tl.m_nLines)
                  {
                     CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
                     tl = tmpLines;
                  }
                  else
                  {
                     CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
                     tl += tmpLines;
                  }

                  // once we're blocked we don't want to be changed
                  if (tmpBlock)
                     blocked = TRUE;
               }
            }
            if (!blocked && !tl.m_nLines)
            {
               tl += lineSeg1;
            }
            *lines += tl;
         }
         // right
         if (retRGN->rects[x].x2 < right)
         {
            tranLines   tl;
            blocked = tmpBlock = FALSE;

            lineSeg1.start.x = retRGN->rects[x].x2;
            lineSeg1.start.y = retRGN->rects[x].y1;
            lineSeg1.finish.x = retRGN->rects[x].x2;
            lineSeg1.finish.y = retRGN->rects[x].y2;

            for (int y = 0; y < retRGN->numRects; ++y)
            {
               if (retRGN->rects[y].x1 == retRGN->rects[x].x2)
               {
                  lineSeg2.start.x = retRGN->rects[y].x1;
                  lineSeg2.start.y = retRGN->rects[y].y1;
                  lineSeg2.finish.x = retRGN->rects[y].x1;
                  lineSeg2.finish.y = retRGN->rects[y].y2;

                  if (tl.m_nLines)
                  {
                     CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
                     tl = tmpLines;
                  }
                  else
                  {
                     CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
                     tl += tmpLines;
                  }

                  // once we're blocked we don't want to be changed
                  if (tmpBlock)
                     blocked = TRUE;
               }
            }
            if (!blocked && !tl.m_nLines)
            {
               tl += lineSeg1;
            }
            *lines += tl;
         }
         // bottom
         if (retRGN->rects[x].y2 < bottom)
         {
            tranLines   tl;
            blocked = tmpBlock = FALSE;

            lineSeg1.start.x = retRGN->rects[x].x1;
            lineSeg1.start.y = retRGN->rects[x].y2;
            lineSeg1.finish.x = retRGN->rects[x].x2;
            lineSeg1.finish.y = retRGN->rects[x].y2;

            for (int y = 0; y < retRGN->numRects; ++y)
            {
               if (retRGN->rects[y].y1 == retRGN->rects[x].y2)
               {
                  lineSeg2.start.x = retRGN->rects[y].x1;
                  lineSeg2.start.y = retRGN->rects[y].y1;
                  lineSeg2.finish.x = retRGN->rects[y].x2;
                  lineSeg2.finish.y = retRGN->rects[y].y1;

                  if (tl.m_nLines)
                  {
                     CalcMatrixLines(&tmpLines, &tl, &lineSeg2, &tmpBlock);
                     tl = tmpLines;
                  }
                  else
                  {
                     CalcMatrixLines(&tmpLines, &lineSeg1, &lineSeg2, &tmpBlock);
                     tl += tmpLines;
                  }

                  // once we're blocked we don't want to be changed
                  if (tmpBlock)
                     blocked = TRUE;
               }
            }
            if (!blocked && !tl.m_nLines)
            {
               tl += lineSeg1;
            }
            *lines += tl;
         }
         // left
         if (retRGN->rects[x].x1 > left)
         {
            tranLines   tl;
            blocked = tmpBlock = FALSE;

            lineSeg1.start.x = retRGN->rects[x].x1;
            lineSeg1.start.y = retRGN->rects[x].y1;
            lineSeg1.finish.x = retRGN->rects[x].x1;
            lineSeg1.finish.y = retRGN->rects[x].y2;

            for (int y = 0; y < retRGN->numRects; ++y)
            {
               if (retRGN->rects[y].x2 == retRGN->rects[x].x1)
               {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -