mapinfo.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:21k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "global.h"
  2. #include "mapinfo.h"
  3. //-----------------------------------------------------------------------------
  4. // Name: 
  5. // Desc: 
  6. //-----------------------------------------------------------------------------
  7. CMapInfo::CMapInfo() {
  8. m_bReversed = false;
  9. m_nBlocks = 0;
  10. m_cxBlocks = 0;
  11. m_cyBlocks = 0;
  12. m_szFileName = NULL;
  13. m_ptBase  = NULL;
  14. m_pBlocks  = NULL;
  15. m_pTankInfo  = NULL;
  16. }
  17. //-----------------------------------------------------------------------------
  18. // Name: 
  19. // Desc: 
  20. //-----------------------------------------------------------------------------
  21. CMapInfo::~CMapInfo() {
  22. DestroyMap();
  23. }
  24. //-----------------------------------------------------------------------------
  25. // Name: 
  26. // Desc: 
  27. //-----------------------------------------------------------------------------
  28. void CMapInfo::DestroyMap() {
  29. //DELETE_PTR( m_szFileName ); // Undefined error here
  30. //DELETE_ARRAY( m_ptBase );
  31. //DELETE_ARRAY( m_pBlocks );
  32. //DELETE_ARRAY( m_pTankInfo );
  33. }
  34. //-----------------------------------------------------------------------------
  35. // Name: 
  36. // Desc: 
  37. //-----------------------------------------------------------------------------
  38. bool CMapInfo::LoadMap( const char *filename ) {
  39. if ( !filename )
  40. return false;
  41. DestroyMap();
  42. m_szFileName = new char[strlen(filename)+1];
  43. strcpy( m_szFileName, filename );
  44. HANDLE hfile;
  45. DWORD read, ret;
  46. FILEHEADER header;
  47. // Open exist file
  48. hfile = CreateFile( m_szFileName, GENERIC_READ,
  49. 0, NULL, OPEN_EXISTING,
  50. FILE_ATTRIBUTE_NORMAL, NULL );
  51. if ( hfile == INVALID_HANDLE_VALUE ) 
  52. goto err_quit_loadmap;
  53. // Read file header and test if the file format is legal
  54. read = sizeof(FILEHEADER);
  55. if ( !ReadFile( hfile, (LPVOID)&header, read, &ret, NULL ) ) 
  56. goto err_quit_loadmap;
  57. if ( header.dwFileID != GAME_MAP_FILE_IDENTITY ||
  58. header.dwVersion != GAME_MAP_VER_1_2_0 ) 
  59. goto err_quit_loadmap;
  60. // Read base possitions
  61. m_ptBase = new POINT[2];
  62. read = sizeof(POINT) * 2;
  63. if ( !ReadFile( hfile, (LPVOID)m_ptBase, read, &ret , NULL ) )  
  64. goto err_quit_loadmap;
  65. // Read tanks' original infomation settings
  66. m_pTankInfo = new TANKINFO[20];
  67. if ( !m_pTankInfo )  
  68. goto err_quit_loadmap;
  69. read = sizeof(TANKINFO)*20;
  70. if( !ReadFile( hfile, (LPVOID)m_pTankInfo, read, &ret, NULL ) )  
  71. goto err_quit_loadmap;
  72. // Read block infomations
  73. m_nBlocks = header.nBlocks;
  74. m_cxBlocks = DEFAULT_CX_BLOCKS;
  75. m_cyBlocks = DEFAULT_CY_BLOCKS;
  76. m_pBlocks = new BLOCK[m_nBlocks];
  77. if ( !m_pBlocks ) 
  78. goto err_quit_loadmap;
  79. read = sizeof(BLOCK) * m_nBlocks;
  80. ZeroMemory( m_pBlocks, read );
  81. if( !ReadFile( hfile, (LPVOID)m_pBlocks, read, &ret, NULL ) ) 
  82. goto err_quit_loadmap;
  83. // Close file handle
  84. CloseHandle(hfile);
  85. // Need to be added in further version of map
  86. m_uiTankNum = 20;
  87. return true;
  88. // False return
  89. err_quit_loadmap:
  90. CloseHandle(hfile);
  91. DestroyMap();
  92. m_nBlocks  = 0;
  93. m_cxBlocks = 0;
  94. m_cyBlocks = 0;
  95. return false;
  96. }
  97. //-----------------------------------------------------------------------------
  98. // Name: 
  99. // Desc: 
  100. //-----------------------------------------------------------------------------
  101. void CMapInfo::SetReversed( bool flag ) {
  102. if ( m_bReversed != flag && CenterRotate180() )
  103. m_bReversed = flag;
  104. }
  105. //-----------------------------------------------------------------------------
  106. // Name: 
  107. // Desc: 
  108. //-----------------------------------------------------------------------------
  109. void CMapInfo::ConvertCoord( CObject * pobj ) {
  110. pobj->SetPos( g_FrameLeft - pobj->GetLeft(), g_FrameLeft - pobj->GetTop() );
  111. }
  112. //-----------------------------------------------------------------------------
  113. // Name: 
  114. // Desc: 
  115. //-----------------------------------------------------------------------------
  116. void CMapInfo::Protect( RECT rt, bool flag, POINT *ppts, int &changed ) {
  117. int x, y;
  118. int xend = rt.left/32+1, yend = rt.top/32+1;
  119. int total = 0;
  120. for ( y = yend-2; y <= yend; y++ )  {
  121. if ( y < 0 || y > m_cyBlocks-2)
  122. continue;
  123. for ( x = xend-2; x <= xend; x++ ) {
  124. if ( x < 0 || x > m_cxBlocks-2)
  125. continue;
  126. if ( total < changed ) {
  127. if ( flag )
  128. (m_pBlocks+y*m_cyBlocks+x)->byClass = LAND_IRON;
  129. else
  130. (m_pBlocks+y*m_cyBlocks+x)->byClass = LAND_BRICK;
  131. ppts[total].x = x;
  132. ppts[total].y = y;
  133. total++;
  134. }
  135. }
  136. }
  137. changed = total;
  138. }
  139. //-----------------------------------------------------------------------------
  140. // Name: 
  141. // Desc: 
  142. //-----------------------------------------------------------------------------
  143. bool CMapInfo::CenterRotate180() {
  144. if ( !(HorReverseMap() && VerReverseMap()) )
  145. return false;
  146. // Reverse base position too
  147. if ( m_ptBase ) {
  148. m_ptBase[0].x = (m_cxBlocks-2)*32-m_ptBase[0].x;
  149. m_ptBase[0].y = (m_cyBlocks-2)*32-m_ptBase[0].y;
  150. m_ptBase[1].x = (m_cxBlocks-2)*32-m_ptBase[1].x;
  151. m_ptBase[1].y = (m_cyBlocks-2)*32-m_ptBase[1].y;
  152. }
  153. return true;
  154. }
  155. //-----------------------------------------------------------------------------
  156. // Name: 
  157. // Desc: 
  158. //-----------------------------------------------------------------------------
  159. bool CMapInfo::HorReverseMap() {
  160. if ( !m_pBlocks || m_cxBlocks == 0)
  161. return false;
  162. int i,j,half,opp;
  163. BLOCK block;
  164. half = (m_cxBlocks-1)/2; // Divide to two pars, left and right
  165. for(j=0; j<m_cyBlocks-1; j++) {
  166. for(i=0; i<half; i++) {
  167. // exchange b[j][i] and b[j][19-i]
  168. opp = m_cxBlocks-2-i;
  169. HorReverseBlock(i,j);
  170. HorReverseBlock(opp,j);
  171. block = *(m_pBlocks+j*m_cyBlocks+i);
  172. *(m_pBlocks+j*m_cyBlocks+i) = *(m_pBlocks+j*m_cyBlocks+opp);
  173. *(m_pBlocks+j*m_cyBlocks+opp) = block;
  174. }
  175. }
  176. return true;
  177. }
  178. //-----------------------------------------------------------------------------
  179. // Name: 
  180. // Desc: 
  181. //-----------------------------------------------------------------------------
  182. bool CMapInfo::VerReverseMap() {
  183. if ( !m_pBlocks || m_cyBlocks == 0)
  184. return false;
  185. int i,j,half,opp;
  186. BLOCK block;
  187. half = (m_cyBlocks-1)/2; // Divide to two parts, up and down
  188. for(i=0; i<m_cxBlocks-1; i++) {
  189. for(j=0; j<half; j++) {
  190. // exchange b[j][i] and b[19-j][i]
  191. opp = m_cyBlocks-2-j;
  192. VerReverseBlock( i, j );
  193. VerReverseBlock( i, opp );
  194. block = *( m_pBlocks + j*m_cyBlocks + i);
  195. *( m_pBlocks + j*m_cyBlocks+i ) = *( m_pBlocks + opp*m_cyBlocks+i );
  196. *( m_pBlocks+ opp*m_cyBlocks+i ) = block;
  197. }
  198. }
  199. return true;
  200. }
  201. //-----------------------------------------------------------------------------
  202. // Name: 
  203. // Desc: 
  204. //-----------------------------------------------------------------------------
  205. void CMapInfo::HorReverseBlock( int x, int y ) {
  206. BYTE b1,b2,b3,b4,obs;
  207. obs = (m_pBlocks+y*m_cyBlocks+x)->byObstacle;
  208. if(obs != 0 && obs != 0x0f) {
  209. b1 = obs & 0x01;
  210. b2 = obs & 0x02;
  211. b3 = obs & 0x04;
  212. b4 = obs & 0x08;
  213. (m_pBlocks+y*m_cyBlocks+x)->byObstacle = (b1<<3) +
  214. (b2<<1) + (b3>>1) + (b4>>3);
  215. }
  216. }
  217. //-----------------------------------------------------------------------------
  218. // Name: 
  219. // Desc: 
  220. //-----------------------------------------------------------------------------
  221. void CMapInfo::VerReverseBlock( int x, int y ) {
  222. BYTE b1,b2,b3,b4,obs;
  223. obs = (m_pBlocks+y*m_cyBlocks+x)->byObstacle;
  224. if(obs != 0 && obs != 0x0f) {
  225. b1 = obs & 0x01;
  226. b2 = obs & 0x02;
  227. b3 = obs & 0x04;
  228. b4 = obs & 0x08;
  229. (m_pBlocks+y*m_cyBlocks+x)->byObstacle = (b1<<1) + 
  230. (b2>>1) + (b3<<1) + (b4>>1);
  231. }
  232. }
  233. //-----------------------------------------------------------------------------
  234. // Name: 
  235. // Desc: 
  236. //-----------------------------------------------------------------------------
  237. int CMapInfo::BlockCounter( DWORD land, CObjBlock *pobb ) {
  238. int counter = 0;
  239. BLOCK *pblk;
  240. for ( int i=0; i<m_cyBlocks-1; i++ )
  241. for ( int j=0; j<m_cxBlocks-1; j++ ) {
  242. pblk = m_pBlocks+i*m_cxBlocks+j;
  243. if ( pblk->byClass == land ) {
  244. if ( pobb ) {
  245. pobb[counter].CreateObjBlock( j, i, land );
  246. pobb[counter].SetTotalFrame( 3 );
  247. }
  248. counter++;
  249. }
  250. }
  251. return counter;
  252. }
  253. //-----------------------------------------------------------------------------
  254. // Name: 
  255. // Desc: 
  256. //-----------------------------------------------------------------------------
  257. bool CMapInfo::BlockLocator( int x, int y, RECT *prc, int &level ) {
  258. BLOCK *pblock = m_pBlocks + x + y*m_cxBlocks;
  259. DWORD dwLocType; 
  260. level = LAYER_GROUND;
  261. switch(pblock->byClass)
  262. {
  263. case LAND_BRICK:
  264. dwLocType = LOC_BLOCK_BRICK0;
  265. break;
  266. case LAND_IRON:
  267. dwLocType = LOC_BLOCK_IRON0;
  268. break;
  269. case LAND_RIVER:
  270. dwLocType = LOC_BLOCK_RIVER0;
  271. break;
  272. case LAND_GRASS:
  273. dwLocType = LOC_BLOCK_GRASS0;
  274. level = LAYER_TREE;
  275. break;
  276. case LAND_ICE:
  277. dwLocType = LOC_BLOCK_ICE0;
  278. break;
  279. case LAND_NONE:
  280. default:
  281. dwLocType = LOC_BLOCK_NONE;
  282. }
  283. int *pres = &ResArray[dwLocType][0];
  284. prc->left = pblock->byObstacle * (*(pres+RESSIZE_WIDTH)) + (*(pres+RESPOS_LEFT));
  285. prc->top  = *(pres+RESPOS_TOP);
  286. prc->right  = prc->left + (*(pres+RESSIZE_WIDTH));
  287. prc->bottom = prc->top + (*(pres+RESSIZE_HEIGHT));
  288. return true;
  289. }
  290. //-----------------------------------------------------------------------------
  291. // Name: 
  292. // Desc: 
  293. //-----------------------------------------------------------------------------
  294. bool CMapInfo::ObjectLocator( CObject *pobj, RECT *prc, int &level ) {
  295. DWORD type = pobj->GetType();
  296. if ( type == OBJTYPE_TANK ) {
  297. prc->top  = RES_POST_TANK;
  298. prc->left = RES_POSL_TANK;
  299. prc->left +=  ((CObjTank *)pobj)->m_uiDirection - 1;
  300. prc->left  *= g_FrameSmall;
  301. prc->top   *= g_FrameSmall;
  302. level = LAYER_TANK;
  303. } else if ( type == OBJTYPE_BULLET ) {
  304. prc->top  = 128;
  305. prc->left = pobj->GetFrameCurrent() * g_FrameSmall;
  306. level = LAYER_BULLET;
  307. } else if ( type == OBJTYPE_BASE ) {
  308. prc->top  = RES_POST_BASE;
  309. prc->left = RES_POSL_BASE;
  310. }
  311. prc->right  = prc->left + pobj->GetWidth();
  312. prc->bottom = prc->top + pobj->GetHeight();
  313. return true;
  314. }
  315. //-----------------------------------------------------------------------------
  316. // Name: 
  317. // Desc: 
  318. //-----------------------------------------------------------------------------
  319. bool CMapInfo::ObjBlockLocator( CObjBlock *poblk, RECT *prc, int &level ) {
  320. if ( poblk->GetLand() == LAND_RIVER ) {
  321. BLOCK *pblock = m_pBlocks + poblk->GetBx() + 
  322. poblk->GetBy()*m_cxBlocks;
  323. prc->left = pblock->byObstacle + RES_POSL_LAND;
  324. prc->top = RES_POST_LAND_RIVER + poblk->GetFrameCurrent();
  325. prc->left  *= g_FrameSmall;
  326. prc->top   *= g_FrameSmall;
  327. prc->right  = prc->left + g_FrameSmall;
  328. prc->bottom = prc->top + g_FrameSmall;
  329. level = LAYER_GROUND;
  330. }
  331. return true;
  332. }
  333. //-----------------------------------------------------------------------------
  334. // Name: 
  335. // Desc: 
  336. //-----------------------------------------------------------------------------
  337. bool CMapInfo::ColR2R( RECT &rt_move, RECT rt_stable, POINT step ) {
  338. bool intersect = false;
  339. SetRect( &rt_move, rt_move.left - rt_stable.right, rt_move.top - rt_stable.bottom,
  340. rt_move.right - rt_stable.left, rt_move.bottom - rt_stable.top );
  341. while ( rt_move.left * rt_move.right < 0  && rt_move.top * rt_move.bottom < 0 ) {
  342. intersect = true;
  343. if ( step.x != 0 ) {
  344. rt_move.left -= step.x;
  345. rt_move.right -= step.x;
  346. } else if ( step.y != 0 ) {
  347. rt_move.top -= step.y;
  348. rt_move.bottom -= step.y;
  349. } else
  350. break;
  351. }
  352. rt_move.left += rt_stable.right;
  353. rt_move.top += rt_stable.bottom;
  354. rt_move.right += rt_stable.left;
  355. rt_move.bottom += rt_stable.top;
  356. return intersect;
  357. }
  358. //-----------------------------------------------------------------------------
  359. // Name: 
  360. // Desc: 
  361. //-----------------------------------------------------------------------------
  362. void CMapInfo::ColRToMobile( RECT &rt, POINT step, CMobileObject **ppmos,
  363.  int num, int except, UINT team, bool checkteam,
  364.  int &hit )
  365. {
  366. hit = -1;
  367. for ( int i=0; i<num; i++ ) {
  368. if ( i == except || !ppmos[i] || 
  369. ( ppmos[i]->GetStat() & OBJSTAT_CADAVER ) )
  370. continue;
  371. if ( checkteam && team == ppmos[i]->m_uiTeamType ) 
  372. continue;
  373. if ( ColR2R( rt, ppmos[i]->GetRect(), step ) )
  374. hit = i;
  375. }
  376. }
  377. //-----------------------------------------------------------------------------
  378. // Name: 
  379. // Desc: 
  380. //-----------------------------------------------------------------------------
  381. void CMapInfo::ColRToB( POINT &lt, WidthType wt, POINT step, DWORD block_land, 
  382.   DWORD &over_land, DWORD remove_land, POINT *ptChanged,
  383.   int &changed )
  384. {
  385. BLOCK *pblks[4];
  386. POINT index[4];
  387. int mask[4];
  388. DWORD over_ret, land;
  389. bool bBlocked; 
  390. int total = 0;
  391. int bound;
  392. // Boundary test
  393. if ( wt == WIDTH_32 )
  394. bound = g_FrameWidth-32;
  395. else
  396. bound = g_FrameWidth-16;
  397. if ( lt.x < 0 )
  398. lt.x = 0;
  399. else if ( lt.x > bound )
  400. lt.x = bound;
  401. if ( lt.y < 0 )
  402. lt.y = 0;
  403. else if ( lt.y > bound )
  404. lt.y = bound;
  405. // Block Test
  406. do {
  407. // 4 block indices
  408. index[0].x = lt.x / g_FrameSmall;
  409. index[0].y = lt.y / g_FrameSmall;
  410. index[2].x = index[0].x;
  411. index[1].x = index[0].x + 1;
  412. index[3].x = index[1].x;
  413. index[1].y = index[0].y;
  414. index[2].y = index[0].y + 1;
  415. index[3].y = index[2].y;
  416. // 4 masks
  417. if ( wt == WIDTH_32 )
  418. Get4Mask( lt.x, lt.y, mask );
  419. else
  420. Get4Mask16( lt.x, lt.y, mask );
  421. // Test with these 4 blocks
  422. bBlocked = false;
  423. over_ret = 0;
  424. for ( int i=0; i<4; i++ )
  425. {
  426. pblks[i] = m_pBlocks +  index[i].y * m_cxBlocks + index[i].x;
  427. if ( mask[i] & pblks[i]->byObstacle ) // overlap
  428. {
  429. land = 1 << pblks[i]->byClass;
  430. if ( land & remove_land ) { // remove
  431. if ( total < changed ) {
  432. pblks[i]->byObstacle &= ~mask[i];
  433. ptChanged[total] = index[i];
  434. }
  435. total++;
  436. }
  437. if ( land & block_land ) { // block
  438. bBlocked = true;
  439. }
  440. if ( land & over_land ) // over, set the bit
  441. over_ret |= land;
  442. }
  443. }
  444. // Block or not
  445. if ( bBlocked ) {
  446. if ( step.x != 0 ) {
  447. while ( lt.x % 16 != 0 )
  448. lt.x -= step.x;
  449. }
  450. else if ( step.y != 0 ) {
  451. while ( lt.y % 16 != 0 )
  452. lt.y -= step.y;
  453. }
  454. } else
  455. break;
  456. } while (true);
  457. // Set return values
  458. changed = total;
  459. over_land = over_ret;
  460. }
  461. //-----------------------------------------------------------------------------
  462. // Name: 
  463. // Desc: 
  464. //-----------------------------------------------------------------------------
  465. void CMapInfo::Get4Mask( int left, int top, int *mask) {
  466. int iver = top % g_FrameSmall,
  467. ihor = left % g_FrameSmall;
  468. // Assign mask array, LT-RT-LB-RB
  469. // All case here.
  470. if ( iver > g_FrameBasis) {
  471. if ( ihor > g_FrameBasis ) { // 1:2:2:4
  472. mask[0] = 2;
  473. mask[1] = 6;
  474. mask[2] = 3;
  475. mask[3] = 15;
  476. } else if ( ihor == g_FrameBasis ) { // 1:1:2:2
  477. mask[0] = 2;
  478. mask[1] = 4;
  479. mask[2] = 3;
  480. mask[3] = 12;
  481. } else if ( ihor > 0 ) { // 2:1:4:2
  482. mask[0] = 6;
  483. mask[1] = 4;
  484. mask[2] = 15;
  485. mask[3] = 12;
  486. } else { // 2:0:4:0
  487. mask[0] = 6;
  488. mask[1] = 0;
  489. mask[2] = 15;
  490. mask[3] = 0;
  491. }
  492. } else if ( iver == g_FrameBasis ) {
  493. if ( ihor > g_FrameBasis ) { // 1:2:1:2
  494. mask[0] = 2;
  495. mask[1] = 6;
  496. mask[2] = 1;
  497. mask[3] = 9;
  498. } else if ( ihor == g_FrameBasis ) { // 1:1:1:1
  499. mask[0] = 2;
  500. mask[1] = 4;
  501. mask[2] = 1;
  502. mask[3] = 8;
  503. } else if ( ihor > 0 ) { // 2:1:2:1
  504. mask[0] = 6;
  505. mask[1] = 4;
  506. mask[2] = 9;
  507. mask[3] = 8;
  508. } else { // 2:0:2:0
  509. mask[0] = 6;
  510. mask[1] = 0;
  511. mask[2] = 9;
  512. mask[3] = 0;
  513. }
  514. } else if ( iver > 0 ) {
  515. if ( ihor > g_FrameBasis ) { // 2:4:1:2
  516. mask[0] = 3;
  517. mask[1] = 15;
  518. mask[2] = 1;
  519. mask[3] = 9;
  520. } else if ( ihor == g_FrameBasis ) { // 2:2:1:1
  521. mask[0] = 3;
  522. mask[1] = 12;
  523. mask[2] = 1;
  524. mask[3] = 8;
  525. } else if ( ihor > 0 ) { // 4:2:2:1
  526. mask[0] = 15;
  527. mask[1] = 12;
  528. mask[2] = 9;
  529. mask[3] = 8;
  530. } else { // 4:0:2:0
  531. mask[0] = 15;
  532. mask[1] = 0;
  533. mask[2] = 9;
  534. mask[3] = 0;
  535. }
  536. } else {
  537. if ( ihor > g_FrameBasis ) { // 2:4:0:0
  538. mask[0] = 3;
  539. mask[1] = 15;
  540. mask[2] = 0;
  541. mask[3] = 0;
  542. } else if ( ihor == g_FrameBasis ) { // 2:2:0:0
  543. mask[0] = 3;
  544. mask[1] = 12;
  545. mask[2] = 0;
  546. mask[3] = 0;
  547. } else if ( ihor > 0 ) { // 4:2:0:0
  548. mask[0] = 15;
  549. mask[1] = 12;
  550. mask[2] = 0;
  551. mask[3] = 0;
  552. } else { // 4:0:0:0
  553. mask[0] = 15;
  554. mask[1] = 0;
  555. mask[2] = 0;
  556. mask[3] = 0;
  557. }
  558. }
  559. }
  560. //-----------------------------------------------------------------------------
  561. // Name: 
  562. // Desc: 
  563. //-----------------------------------------------------------------------------
  564. void CMapInfo::Get4Mask16( int left, int top, int *mask) {
  565. int iver = top % g_FrameSmall,
  566. ihor = left % g_FrameSmall;
  567. // Assign mask array, LT-RT-LB-RB
  568. // All case here.
  569. if ( iver > g_FrameBasis) {
  570. if ( ihor > g_FrameBasis ) { // 1:2:2:4
  571. mask[0] = 2;
  572. mask[1] = 4;
  573. mask[2] = 1;
  574. mask[3] = 8;
  575. } else if ( ihor == g_FrameBasis ) { // 1:1:2:2
  576. mask[0] = 2;
  577. mask[1] = 0;
  578. mask[2] = 1;
  579. mask[3] = 0;
  580. } else if ( ihor > 0 ) { // 2:1:4:2
  581. mask[0] = 6;
  582. mask[1] = 0;
  583. mask[2] = 9;
  584. mask[3] = 0;
  585. } else { // 2:0:4:0
  586. mask[0] = 4;
  587. mask[1] = 0;
  588. mask[2] = 8;
  589. mask[3] = 0;
  590. }
  591. } else if ( iver == g_FrameBasis ) {
  592. if ( ihor > g_FrameBasis ) { // 1:2:1:2
  593. mask[0] = 2;
  594. mask[1] = 4;
  595. mask[2] = 0;
  596. mask[3] = 0;
  597. } else if ( ihor == g_FrameBasis ) { // 1:1:1:1
  598. mask[0] = 2;
  599. mask[1] = 0;
  600. mask[2] = 0;
  601. mask[3] = 0;
  602. } else if ( ihor > 0 ) { // 2:1:2:1
  603. mask[0] = 6;
  604. mask[1] = 0;
  605. mask[2] = 0;
  606. mask[3] = 0;
  607. } else { // 2:0:2:0
  608. mask[0] = 4;
  609. mask[1] = 0;
  610. mask[2] = 0;
  611. mask[3] = 0;
  612. }
  613. } else if ( iver > 0 ) {
  614. if ( ihor > g_FrameBasis ) { // 2:4:1:2
  615. mask[0] = 3;
  616. mask[1] = 12;
  617. mask[2] = 0;
  618. mask[3] = 0;
  619. } else if ( ihor == g_FrameBasis ) { // 2:2:1:1
  620. mask[0] = 3;
  621. mask[1] = 0;
  622. mask[2] = 0;
  623. mask[3] = 0;
  624. } else if ( ihor > 0 ) { // 4:2:2:1
  625. mask[0] = 15;
  626. mask[1] = 0;
  627. mask[2] = 0;
  628. mask[3] = 0;
  629. } else { // 4:0:2:0
  630. mask[0] = 12;
  631. mask[1] = 0;
  632. mask[2] = 0;
  633. mask[3] = 0;
  634. }
  635. } else {
  636. if ( ihor > g_FrameBasis ) { // 2:4:0:0
  637. mask[0] = 1;
  638. mask[1] = 8;
  639. mask[2] = 0;
  640. mask[3] = 0;
  641. } else if ( ihor == g_FrameBasis ) { // 2:2:0:0
  642. mask[0] = 1;
  643. mask[1] = 0;
  644. mask[2] = 0;
  645. mask[3] = 0;
  646. } else if ( ihor > 0 ) { // 4:2:0:0
  647. mask[0] = 9;
  648. mask[1] = 0;
  649. mask[2] = 0;
  650. mask[3] = 0;
  651. } else { // 4:0:0:0
  652. mask[0] = 8;
  653. mask[1] = 0;
  654. mask[2] = 0;
  655. mask[3] = 0;
  656. }
  657. }
  658. }
  659. //-----------------------------------------------------------------------------
  660. // Name: 
  661. // Desc: 
  662. //-----------------------------------------------------------------------------
  663. /*
  664. All case here.
  665. if ( iver > g_FrameBasis) {
  666. if ( ihor > g_FrameBasis ) { // 1:2:2:4
  667. mask[0] = 3;
  668. mask[1] = 15;
  669. mask[2] = 1;
  670. mask[3] = 8;
  671. } else if ( ihor == g_FrameBasis ) { // 1:1:2:2
  672. mask[0] = 15;
  673. mask[1] = 12;
  674. mask[2] = 9;
  675. mask[3] = 8;
  676. } else if ( ihor > 0 ) { // 2:1:4:2
  677. mask[0] = 15;
  678. mask[1] = 12;
  679. mask[2] = 9;
  680. mask[3] = 8;
  681. } else { // 2:0:4:0
  682. mask[0] = 15;
  683. mask[1] = 0;
  684. mask[2] = 9;
  685. mask[3] = 0;
  686. }
  687. } else if ( iver == g_FrameBasis ) {
  688. if ( ihor > g_FrameBasis ) { // 1:2:1:2
  689. mask[0] = 3;
  690. mask[1] = 15;
  691. mask[2] = 1;
  692. mask[3] = 8;
  693. } else if ( ihor == g_FrameBasis ) { // 1:1:1:1
  694. mask[0] = 15;
  695. mask[1] = 12;
  696. mask[2] = 9;
  697. mask[3] = 8;
  698. } else if ( ihor > 0 ) { // 2:1:2:1
  699. mask[0] = 15;
  700. mask[1] = 12;
  701. mask[2] = 9;
  702. mask[3] = 8;
  703. } else { // 2:0:2:0
  704. mask[0] = 15;
  705. mask[1] = 0;
  706. mask[2] = 9;
  707. mask[3] = 0;
  708. }
  709. } else if ( iver > 0 ) {
  710. if ( ihor > g_FrameBasis ) { // 2:4:1:2
  711. mask[0] = 3;
  712. mask[1] = 15;
  713. mask[2] = 1;
  714. mask[3] = 8;
  715. } else if ( ihor == g_FrameBasis ) { // 2:2:1:1
  716. mask[0] = 15;
  717. mask[1] = 12;
  718. mask[2] = 9;
  719. mask[3] = 8;
  720. } else if ( ihor > 0 ) { // 4:2:2:1
  721. mask[0] = 15;
  722. mask[1] = 12;
  723. mask[2] = 9;
  724. mask[3] = 8;
  725. } else { // 4:0:2:0
  726. mask[0] = 15;
  727. mask[1] = 0;
  728. mask[2] = 9;
  729. mask[3] = 0;
  730. }
  731. } else {
  732. if ( ihor > g_FrameBasis ) { // 2:4:0:0
  733. mask[0] = 3;
  734. mask[1] = 15;
  735. mask[2] = 1;
  736. mask[3] = 8;
  737. } else if ( ihor == g_FrameBasis ) { // 2:2:0:0
  738. mask[0] = 15;
  739. mask[1] = 12;
  740. mask[2] = 9;
  741. mask[3] = 8;
  742. } else if ( ihor > 0 ) { // 4:2:0:0
  743. mask[0] = 15;
  744. mask[1] = 12;
  745. mask[2] = 9;
  746. mask[3] = 8;
  747. } else { // 4:0:0:0
  748. mask[0] = 15;
  749. mask[1] = 0;
  750. mask[2] = 9;
  751. mask[3] = 0;
  752. }
  753. }
  754.   */