File: TestGL2PSAddPolyPrimitive.cxx

package info (click to toggle)
paraview 5.4.1+dfsg4-3.1
  • links: PTS, VCS
  • area: main
  • in suites: buster, sid
  • size: 218,616 kB
  • sloc: cpp: 2,331,508; ansic: 322,365; python: 111,051; xml: 79,203; tcl: 47,013; yacc: 4,877; java: 4,438; perl: 3,238; sh: 2,920; lex: 1,908; f90: 748; makefile: 273; pascal: 228; objc: 83; fortran: 31
file content (137 lines) | stat: -rw-r--r-- 4,516 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    TestGL2PSAddPolyPrimitive.cxx

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/

// This test checks that we can use GL2PS without an OpenGL context using
// a buffer size of 0, gl2psAddPolyPrimitive, and gl2psForceRasterPos.

#include "vtk_gl2ps.h"

#include "vtkTestingInteractor.h"

#include <iostream>
#include <string>
#include <vector>

namespace {

static inline void setVertex(GL2PSvertex &vert,
                             float x, float y, float z,
                             float r, float g, float b, float a)
{
  vert.xyz[0] = x;
  vert.xyz[1] = y;
  vert.xyz[2] = z;
  vert.rgba[0] = r;
  vert.rgba[1] = g;
  vert.rgba[2] = b;
  vert.rgba[3] = a;
}

static inline void generatePixelData(std::vector<float> &data,
                                     size_t width, size_t height)
{
  data.resize(width * height * 4);
  for (size_t h = 0; h < height; ++h)
  {
    size_t rowOffset = h * width * 4;
    for (size_t w = 0; w < width; ++w)
    {
      size_t pixel = rowOffset + (w * 4);
      data[pixel    ] = h / static_cast<float>(height);
      data[pixel + 1] = 0.f;
      data[pixel + 2] = w / static_cast<float>(width);
      data[pixel + 3] = 1.f;
    }
  }
}

} // end anon namespace

int TestGL2PSAddPolyPrimitive(int , char * [])
{
  std::string filename = vtkTestingInteractor::TempDirectory +
      std::string("/TestGL2PSAddPolyPrimitive.ps");
  FILE *stream = fopen(filename.c_str(), "wb");
  if (stream == NULL)
  {
    std::cerr << "Error opening output file." << std::endl;
    return EXIT_FAILURE;
  }

  GLint viewport[4] = { 0, 0, 400, 400 };
  GLint result = gl2psBeginPage("AddPolyPrimitive Test", "VTK", viewport,
                                GL2PS_PS, GL2PS_SIMPLE_SORT,
                                GL2PS_NO_OPENGL_CONTEXT | GL2PS_NO_BLENDING,
                                GL_RGBA, 0, NULL, 0, 0, 0, 0, stream, 0);
  if (result != GL2PS_SUCCESS)
  {
    std::cerr << "gl2psBeginPage failed." << std::endl;
    return EXIT_FAILURE;
  }

  // AddPolyPrimitive arguments:
  GL2PSvertex vertices[3]; // Vertices.
  GLint offset = 0; // line offset
  GLushort pattern = 0xffff; // glLineStipple pattern
  GLint factor = 1; // glLineStipple repeat factor
  GLfloat ofactor = 0.f; // glPolygonOffset factor
  GLfloat ounits = 0.f; // glPolygonOffset units
  GLfloat width = 1; // linewidth or pointsize
  // Something to do with gl2psEnable(GL2PS_POLYGON_BOUNDARY), which is not
  // implemented according to the docs.
  char boundary = 0;

  // Point:
  setVertex(vertices[0], 200, 307.5, 0, 0.f, 0.f, 1.f, 1.f);
  gl2psAddPolyPrimitive(GL2PS_POINT, 1, vertices, offset, ofactor, ounits,
                        pattern, factor, /*width=*/15, 0, 0, boundary);

  // Line:
  // Note that the first vertex's color is used for the entire line.
  setVertex(vertices[0], 100, 50, 0, 1.f, 0.f, 0.f, 1.f);
  setVertex(vertices[1], 300, 50, 0, 0.f, 0.f, 1.f, 1.f);
  gl2psAddPolyPrimitive(GL2PS_LINE, 2, vertices, offset, ofactor, ounits,
                        pattern, factor, width, 0, 0, boundary);

  // Triangle:
  setVertex(vertices[0], 100, 100, 0, 1.f, 0.f, 0.f, 1.f);
  setVertex(vertices[1], 300, 100, 0, 0.f, 1.f, 0.f, 1.f);
  setVertex(vertices[2], 200, 300, 0, 0.f, 0.f, 1.f, 1.f);
  gl2psAddPolyPrimitive(GL2PS_TRIANGLE, 3, vertices, offset, ofactor, ounits,
                        pattern, factor, width, 0, 0, boundary);

  // Text:
  setVertex(vertices[0], 200, 325, 0, 0.f, 0.f, 0.f, 1.f);
  gl2psForceRasterPos(vertices);
  gl2psTextOpt("GL2PS with no OpenGL", "Helvetica", 12, GL2PS_TEXT_B, 0.f);

  // DrawPixels:
  std::vector<float> pixelData;
  generatePixelData(pixelData, 100, 100);
  setVertex(vertices[0], 275, 275, 0, 0.f, 0.f, 0.f, 0.f);
  gl2psForceRasterPos(vertices);
  gl2psDrawPixels(100, 100, 0, 0, GL_RGBA, GL_FLOAT, &pixelData[0]);

  result = gl2psEndPage();
  if (result != GL2PS_SUCCESS)
  {
    std::cerr << "gl2psEndPage failed." << std::endl;
    return EXIT_FAILURE;
  }

  fclose(stream);

  return EXIT_SUCCESS;
}