1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestContextItemStacking.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 
16 #include "vtkBlockItem.h"
17 #include "vtkContextScene.h"
18 #include "vtkContextTransform.h"
19 #include "vtkContextView.h"
20 #include "vtkNew.h"
21 #include "vtkRenderWindow.h"
22 #include "vtkRenderWindowInteractor.h"
23 #include "vtkRenderer.h"
24 #include "vtkSmartPointer.h"
25 
26 //------------------------------------------------------------------------------
TestContextItemStacking(int,char * [])27 int TestContextItemStacking(int, char*[])
28 {
29   // Set up a 2D context view, context test object and add it to the scene
30   vtkNew<vtkContextView> view;
31   view->GetRenderer()->SetBackground(0.32, 0.40, 0.47);
32   view->GetRenderWindow()->SetSize(400, 400);
33 
34   vtkNew<vtkBlockItem> rootItem;
35   rootItem->SetDimensions(0, 350, 50, 50);
36 
37   int i = 0;
38   int s = 120;
39   int step = s / 3;
40   vtkNew<vtkBlockItem> test1;
41   test1->SetDimensions(i, i, s, s);
42   test1->SetLabel("1");
43   i += step;
44   vtkNew<vtkBlockItem> test2;
45   test2->SetDimensions(i, i, s, s);
46   test2->SetLabel("2");
47   i += step;
48   vtkNew<vtkBlockItem> test3;
49   test3->SetDimensions(i, i, s, s);
50   test3->SetLabel("3");
51   i += step;
52   vtkNew<vtkBlockItem> test4;
53   test4->SetDimensions(i, i, s, s);
54   test4->SetLabel("4");
55   i += step;
56   vtkNew<vtkBlockItem> test41;
57   test41->SetDimensions(i, i, s, s);
58   test41->SetLabel("4.1");
59   i += step;
60   vtkNew<vtkBlockItem> test411;
61   test411->SetDimensions(i, i, s, s);
62   test411->SetLabel("4.1.1");
63   i += step;
64   vtkNew<vtkBlockItem> test42;
65   test42->SetDimensions(i, i, s, s);
66   test42->SetLabel("4.2");
67   i += step;
68   vtkNew<vtkBlockItem> test5;
69   test5->SetDimensions(i, i, s, s);
70   test5->SetLabel("5");
71 
72   // Build up our multi-level scene
73   vtkIdType index1 = rootItem->AddItem(test1);
74   vtkIdType index2 = rootItem->AddItem(test2);
75   vtkIdType index3 = rootItem->AddItem(test3);
76   vtkIdType index4 = rootItem->AddItem(test4);
77   vtkIdType index41 = test4->AddItem(test41);
78   vtkIdType index411 = test41->AddItem(test411);
79   vtkIdType index42 = test4->AddItem(test42);
80   vtkIdType index5 = rootItem->AddItem(test5);
81   view->GetScene()->AddItem(rootItem);
82 
83   // Check indexes
84   if (index1 != 0 || index2 != 1 || index3 != 2 || index4 != 3 || index41 != 0 || index411 != 0 ||
85     index42 != 1 || index5 != 4)
86   {
87     std::cerr << "AddItem, bad indexes: " << index1 << ", " << index2 << ", " << index3 << ", "
88               << index4 << ", " << index41 << ", " << index411 << ", " << index42 << ", " << index5
89               << std::endl;
90     return EXIT_FAILURE;
91   }
92   // Restack item 3 under all items
93   int res = rootItem->Lower(rootItem->GetItemIndex(test3));
94   index1 = rootItem->GetItemIndex(test1);
95   index2 = rootItem->GetItemIndex(test2);
96   index3 = rootItem->GetItemIndex(test3);
97   index4 = rootItem->GetItemIndex(test4);
98   if (res != 0 || index1 != 1 || index2 != 2 || index3 != 0 || index4 != 3)
99   {
100     std::cerr << "Lower, bad indexes: " << res << "->" << index1 << ", " << index2 << ", " << index3
101               << ", " << index4 << ", " << index41 << ", " << index411 << ", " << index42 << ", "
102               << index5 << std::endl;
103     return EXIT_FAILURE;
104   }
105   // Restack item 1 above 4
106   res = rootItem->StackAbove(index1, index4);
107   index1 = rootItem->GetItemIndex(test1);
108   index2 = rootItem->GetItemIndex(test2);
109   index3 = rootItem->GetItemIndex(test3);
110   index4 = rootItem->GetItemIndex(test4);
111   index41 = test4->GetItemIndex(test41);
112   index42 = test4->GetItemIndex(test42);
113   index5 = rootItem->GetItemIndex(test5);
114   if (res != 3 || index1 != 3 || index2 != 1 || index3 != 0 || index4 != 2 || index41 != 0 ||
115     index411 != 0 || index42 != 1 || index5 != 4)
116   {
117     std::cerr << "StackAbove, bad indexes: " << res << "->" << index1 << ", " << index2 << ", "
118               << index3 << ", " << index4 << ", " << index41 << ", " << index411 << ", " << index42
119               << ", " << index5 << std::endl;
120     return EXIT_FAILURE;
121   }
122   // Restack item 41 above 42
123   res = test4->Raise(index41);
124   index1 = rootItem->GetItemIndex(test1);
125   index2 = rootItem->GetItemIndex(test2);
126   index3 = rootItem->GetItemIndex(test3);
127   index4 = rootItem->GetItemIndex(test4);
128   index41 = test4->GetItemIndex(test41);
129   index42 = test4->GetItemIndex(test42);
130   index5 = rootItem->GetItemIndex(test5);
131   if (res != 1 || index1 != 3 || index2 != 1 || index3 != 0 || index4 != 2 || index41 != 1 ||
132     index411 != 0 || index42 != 0 || index5 != 4)
133   {
134     std::cerr << "Raise, bad indexes: " << res << "->" << index1 << ", " << index2 << ", " << index3
135               << ", " << index4 << ", " << index41 << ", " << index411 << ", " << index42 << ", "
136               << index5 << std::endl;
137     return EXIT_FAILURE;
138   }
139   // Restack item 1 above 4
140   res = rootItem->StackUnder(index2, index3);
141   index1 = rootItem->GetItemIndex(test1);
142   index2 = rootItem->GetItemIndex(test2);
143   index3 = rootItem->GetItemIndex(test3);
144   index4 = rootItem->GetItemIndex(test4);
145   index41 = test4->GetItemIndex(test41);
146   index42 = test4->GetItemIndex(test42);
147   index5 = rootItem->GetItemIndex(test5);
148   if (res != 0 || index1 != 3 || index2 != 0 || index3 != 1 || index4 != 2 || index41 != 1 ||
149     index411 != 0 || index42 != 0 || index5 != 4)
150   {
151     std::cerr << "StackUnder, bad indexes: " << res << "->" << index1 << ", " << index2 << ", "
152               << index3 << ", " << index4 << ", " << index41 << ", " << index411 << ", " << index42
153               << ", " << index5 << std::endl;
154     return EXIT_FAILURE;
155   }
156 
157   // Turn off the color buffer
158   view->GetScene()->SetUseBufferId(false);
159 
160   // Finally render the scene and compare the image to a reference image
161   view->GetRenderWindow()->SetMultiSamples(0);
162   view->GetInteractor()->Initialize();
163   view->GetInteractor()->Start();
164   return EXIT_SUCCESS;
165 }
166