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 "vtkRenderer.h"
17 #include "vtkRenderWindow.h"
18 #include "vtkRenderWindowInteractor.h"
19 #include "vtkSmartPointer.h"
20 #include "vtkBlockItem.h"
21 #include "vtkContextTransform.h"
22 #include "vtkContextView.h"
23 #include "vtkContextScene.h"
24 #include "vtkNew.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 ||
85       index41 != 0 || index411 != 0 || index42 != 1 || index5 != 4)
86   {
87     std::cerr << "AddItem, bad indexes: "
88               << index1 << ", " << index2 << ", " << index3 << ", "
89               << index4 << ", " << index41 << ", " << index411 << ", "
90               << index42 << ", " << index5 << std::endl;
91     return EXIT_FAILURE;
92   }
93   // Restack item 3 under all items
94   int res = rootItem->Lower(rootItem->GetItemIndex(test3));
95   index1 = rootItem->GetItemIndex(test1);
96   index2 = rootItem->GetItemIndex(test2);
97   index3 = rootItem->GetItemIndex(test3);
98   index4 = rootItem->GetItemIndex(test4);
99   if (res != 0 || index1 != 1 || index2 != 2 || index3 != 0 || index4 != 3)
100   {
101     std::cerr << "Lower, bad indexes: " << res << "->"
102               << index1 << ", " << index2 << ", " << index3 << ", "
103               << index4 << ", " << index41 << ", " << index411 << ", "
104               << index42 << ", " << index5 << std::endl;
105     return EXIT_FAILURE;
106   }
107   // Restack item 1 above 4
108   res = rootItem->StackAbove(index1, index4);
109   index1 = rootItem->GetItemIndex(test1);
110   index2 = rootItem->GetItemIndex(test2);
111   index3 = rootItem->GetItemIndex(test3);
112   index4 = rootItem->GetItemIndex(test4);
113   index41 = test4->GetItemIndex(test41);
114   index42 = test4->GetItemIndex(test42);
115   index5 = rootItem->GetItemIndex(test5);
116   if (res != 3 || index1 != 3 || index2 != 1 || index3 != 0 || index4 != 2 ||
117       index41 != 0 || index411 != 0 || index42 != 1 || index5 != 4)
118   {
119     std::cerr << "StackAbove, bad indexes: " << res << "->"
120               << index1 << ", " << index2 << ", " << index3 << ", "
121               << index4 << ", " << index41 << ", " << index411 << ", "
122               << index42 << ", " << index5 << std::endl;
123     return EXIT_FAILURE;
124   }
125   // Restack item 41 above 42
126   res = test4->Raise(index41);
127   index1 = rootItem->GetItemIndex(test1);
128   index2 = rootItem->GetItemIndex(test2);
129   index3 = rootItem->GetItemIndex(test3);
130   index4 = rootItem->GetItemIndex(test4);
131   index41 = test4->GetItemIndex(test41);
132   index42 = test4->GetItemIndex(test42);
133   index5 = rootItem->GetItemIndex(test5);
134   if (res != 1 || index1 != 3 || index2 != 1 || index3 != 0 || index4 != 2 ||
135       index41 != 1 || index411 != 0 || index42 != 0 || index5 != 4)
136   {
137     std::cerr << "Raise, bad indexes: "  << res << "->"
138               << index1 << ", " << index2 << ", " << index3 << ", "
139               << index4 << ", " << index41 << ", " << index411 << ", "
140               << index42 << ", " << index5 << std::endl;
141     return EXIT_FAILURE;
142   }
143   // Restack item 1 above 4
144   res = rootItem->StackUnder(index2, index3);
145   index1 = rootItem->GetItemIndex(test1);
146   index2 = rootItem->GetItemIndex(test2);
147   index3 = rootItem->GetItemIndex(test3);
148   index4 = rootItem->GetItemIndex(test4);
149   index41 = test4->GetItemIndex(test41);
150   index42 = test4->GetItemIndex(test42);
151   index5 = rootItem->GetItemIndex(test5);
152   if (res != 0 || index1 != 3 || index2 != 0 || index3 != 1 || index4 != 2 ||
153       index41 != 1 || index411 != 0 || index42 != 0 || index5 != 4)
154   {
155     std::cerr << "StackUnder, bad indexes: "  << res << "->"
156               << index1 << ", " << index2 << ", " << index3 << ", "
157               << index4 << ", " << index41 << ", " << index411 << ", "
158               << index42 << ", " << index5 << std::endl;
159     return EXIT_FAILURE;
160   }
161 
162   // Turn off the color buffer
163   view->GetScene()->SetUseBufferId(false);
164 
165   //Finally render the scene and compare the image to a reference image
166   view->GetRenderWindow()->SetMultiSamples(0);
167   view->GetInteractor()->Initialize();
168   view->GetInteractor()->Start();
169   return EXIT_SUCCESS;
170 }
171