﻿

c# pdf library free : Change pdf metadata software SDK dll windows wpf asp.net web forms ThesisWouterLabeeuw5-part217

CHAPTER 4. VPF AND VMAP LEVEL 0 SYNTAX
43
The tree is built up in cells. The ﬁrst cell represents the whole area of the spatial index. The
ﬁrst cell contains the primitives that cannot be placed in smaller cells like the second and
the third cell, see below. The second and the third cell have the size of the ﬁrst one divided
by two. They are called the “children” of the ﬁrst cell. The mother-child structure can be
viewed in ﬁgure 4.3. These two cells can both also be divided into two cells. This happens
when there is a primitive that uses only a small area. This division is represented in ﬁgure
4.4. Area one is the big area, area two and three are half the size of area one. Areas four and
ﬁve are half the size of area two etc.
Figure 4.3: Spatial index, area division tree
Figure 4.4: spatial index, area division
When combining table 4.2 with ﬁgure 4.4, one can notice that area one contains one primitive.
Area two has ﬁve primitives, area three one etc. Notice that there can be areas without
primitives. When all the primitives are inside a spatial area, there is no need for division
anymore.
4.3.4 Data record
The data record manages the primitives related to the cells and the coordinates of a ﬁctive
rectangle that encloses the primitive. The coordinates are integer values.
4.3.5 Calculating integer coordinates
The coordinates of a spatial index ﬁle aren’t really the coordinates, but integervalues rep-
resenting the coordinates. This means that there has to be a way of converting them. All
Enable VB.NET Users to Read, Write, Edit, Delete and Update PDF Document Metadata
CHAPTER 4. VPF AND VMAP LEVEL 0 SYNTAX
44
coordinates in spatial index ﬁles are the coordinates of a rectangle: X
1
and Y
1
are the mini-
mum coordinates in the X and Y direction, while X
2
and Y
2
are the maximum coordinates in
the X and Y directing. For the calculation of X
1
and Y
1
,one can use equation 4.1 and for the
calculation of X
2
and Y
2
you should use equation 4.2. In here the minimum coordinate of X
will be the minimum coordinate of the whole area of the spatial index ﬁle, same with Y. The
maximum willbe the maximum coordinate of the whole area. This means that the coordinate
of the reactangle surrounding the complete spatial index will be (0,0,255,255) representing
(X
1
,X
2
,Y
1
,Y
2
).
coordinate = int
coordinate −minimum
maximum − minimum
∗255
(4.1)
coordinate =
int
coordinate − minimum
maximum −minimum
∗255

+1
(4.2)
If the equation 4.2 results into 256, the value must be set to 255.
4.4 Thematic index ﬁle
4.4.1 Structure
Athematic index consists of:
Aheader with information about the type of index, the associated table and the column in
that table.
An index directory containing for each distinct indexed element the oﬀset to the index
data.
The index data is the data record containing information about the indexed element.
VB.NET PDF File Compress Library: Compress reduce PDF size in vb.
Document and metadata. outputFilePath = Program.RootPath + "\\" 3_optimized.pdf"; 'create optimizing TargetResolution = 150.0F 'to change image compression
How to C#: Modify Image Metadata (tag)
Merge PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings. in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET
Chapter 5
OpenGL
5.1 Introduction 
OpenGL stands for “Open Graphics Library”. It is a software interface to graphics hardware.
To a programmer OpenGL is a set of commands. These commands allow the speciﬁcation
of geometric objects in two or three dimensions. The geometric objects can be lines, points,
polygons, etc. The programmer also gets a set of commands that control how these objects
are rendered into the framebuﬀer. Mostly OpenGL speciﬁes an immediate-mode interface,
meaning that specifying an object causes it to be drawn. When the programmer uses the
OpenGL API, it will be possible to port the software to another system since the API is
vendor independent.
To the implementer of OpenGL, OpenGL is a set of commands that aﬀect the operation of
graphics hardware.
5.2 Drawing using OpenGL 
5.2.1 Primitives
The aim of OpenGL is drawing primitives. A Primitive in OpenGL starts with the begin-
command and is closed with the end-command. A primitive can be a point, a line, a polygon
etc.
This means that the VPF primitives, described in section 2.3.2, can be drawn using the
OpenGL primitives.
The primitives are deﬁned by a group of vertices. A vertex deﬁnes a point, an endpoint of
an edge, or a corner of a polygon where two edges meet.
Asimple example of the drawing of a line primitive can be found below:
glBegin(GL
LINES);
glVertex2f(−0.5, 0.9);
glVertex2f (0.1 , 0.8) ;
45
VB.NET PDF Library SDK to view, edit, convert, process PDF file
PDF Metadata Edit. Offer professional PDF document metadata editing APIs, using which VB.NET developers can redact, delete, view and save PDF metadata.
C# PDF File Compress Library: Compress reduce PDF size in C#.net
Document and metadata. All object data. Program.RootPath + "\\" 3_optimized.pdf"; // create optimizing TargetResolution = 150F; // to change image compression
CHAPTER 5. OPENGL
46
glEnd() ;
This code draws a line from coordinate (-0.5, 0.9) to (0.1, 0.8), with (x, y) as the layout of
the coordinates.
OpenGL itself cannot render complex objects, only simple primitives. If there is the need for
complex objects, one should use a toolkit (like GLU) or write the implementation itself.
The polygons in the VPF standard are complex objects. They aren’t OpenGL primitives
because they use a winding edge technology.
5.2.2 Text
Since Barco mostly uses “Bitmap Fonts” in OpenGL, the information about text in OpenGL
will be restricted to bitmap fonts.
Abitmap font is the easiest way to display text in OpenGL. The font needs to be declared
in an array. Once the array is declared, a simple function can place the text on it is correct
position using coordinates.
5.2.3 Tesselations
Tessalations are used to create complex rather then primitive polygon stuctures. The winding
edge implementation can be done using GLU tesselations.
Atesselation object needs to be created in order to work with tesselations. When the object
is created, it can be used to draw all the complex polygons.
5.3 GLUT 
The OpenGL Utility Toolkit (GLUT) is a programming interface for writing window system
independent OpenGL programmes.
OpenGL is a speciﬁcation that is isolated from the window system. This means that OpenGL
is window system independent. The operations for the window system need to be done in
the window system itself. This means that you will need knowledge of the window system,
in order to get the OpenGL programme to work. Here is where GLUT comes in. GLUT is a
toolkit that makes it possible to manipulate windows, handle input, etc without the need for
knowledge of the window system.
Since GLUT exists for multiple window systems, it is possible to get the same code to work
on those multiple window systems.
C# PDF Library SDK to view, edit, convert, process PDF file for C#
accordingly. Multiple metadata types of PDF file can be easily added and processed in C#.NET Class. Capable C#.NET: Edit PDF Metadata. PDF SDK
C# TIFF - Edit TIFF Metadata in C#.NET. Allow Users to Read and Edit Metadata Stored in Tiff Image in C#.NET Application. How to Get TIFF XMP Metadata in C#.NET.
Chapter 6
Implementation
6.1 Code to start from
The implementation of the VPF - VMap Level 0 software is based on an existing code from
NIMA. NIMA stands for National Imagery and Mapping Agency.
The NIMA code has implementations for RPF (the Raster Product Format), VPF (the Vec-
tor Product Format), DAFIF (the Digital Aeronautical Flight Information File) and DTED
(Digital Terrain Elevation Data).
The NIMA code is a quite large heap of code. There was a need to have a decent approach.
The ﬁrst thing that was needed to be done was to check whether the code forﬁlled Barco’s
requirements. This means: no recursivity, no dynamic allocations and no coversions in be-
tween. The code had to be written in plain C, not in an object oriented language or a
scripting language. This also gives the developper the possibility to follow the running code
sequentially.
After reviewing the code, the conclusion was that the basic VPF code could/can be adapted
to those needs. There is dynamic allocation and recursivity, so these needed to be removed.
In this stadium, there was no knowledge of the VPF standard.
In order to understand the code, there was the need to understand VPF itself. Step by step,
the military VPF standard had to be understood.
The low level code for the VPF/VMap implementation was mainly provided by the NIMA-
code. This means that the reading in of tables, indexes and primitives was in the code. Only
the functions were sometimes too large for Barco Avionics (like the writing of tables), so they
needed cleanup. Some other functions had recursivity, so it had to be removed.
The top level was implemented during the thesis. The top level code in the NIMA code was
written object oriented. It wasn’t possible to use this code so the top level needed to be
written. For this implementation the structure of VPF had to be known.
The connection between the top level and the low level was made after the low and the top
level. The correct feature classes were found using the top level. The coordinates could be
47
Able to change password on adobe PDF document in C#.NET. To C# Sample Code: Change and Update PDF Document Password in C#.NET. In
C# PDF Annotate Library: Draw, edit PDF annotation, markups in C#.
Able to edit and change PDF annotation properties such as font size or color. Abilities to draw markups on PDF document or stamp on PDF file.
CHAPTER 6. IMPLEMENTATION
48
given and now the correct primites had to be selected. The connection between top and low
level mostly usesa code from a low level.
6.2 Low level
6.2.1 Introduction
The ﬁrst code that needed to be implementedwas a low level code. This code made it possible
to read in the basics of the VPF tables. The VPF tables are the most important part, the
VPF tables contain the data.
characters, shorts, integers, ﬂoats, doubles, dates, keys, coordinates, tri-coordinates, double-
coordinates and tri-double-coordinates. The type and the amount need to be speciﬁed
Now the data types can be read, the second step is to initialise the VPF tables. This hap-
pens with the vpf
open
table. The function returns a structure containing the table header
information, structures for rows and ﬁlepointers to the tables index ﬁle (optional) and the
table data itself. Inside vpf
open
table, parse
data
def is called. parse
data
def actually
ﬁlls in the table header information into the table structure. Both functions can be found in
vpftable.c.
6.2.4 Getting a table element
With the table initialised, the next thing to do is to read in the rows. The functions to read
in the rows are available at vpfread.c. To get a row the function get
row can be used. It
row. It returns a row structure. read
row requires the table structure in order to
next
row, which reads in the next
row.
Once the row can be read, the next thing to implement would be getting the required infor-
mation out of the tables data. This happens with get
table
element. get
table
element needs
the table structure and the row structure in order to work. It also requires the ﬁeldnumber.
The function has two ways for returning data, depending on the type of data: using a pointer
to data in the argument or returning the data as the result of the function.
Method one is get_table_element(id, row, table, &returnvalue, &n);. This method
is used to read in one element, like a character or integer. Since it will only read one element
the value of n will be ‘1’.
CHAPTER 6. IMPLEMENTATION
49
Method two is
characters = (char*)get_table_element(id, row, table, NULL, &count); The func-
tion get
table
element will allocate room for the characters and read them in. The value of
count, in this case, will be the amount of characters that are read in.
get
table
element is very helpful for a lot of functions, especially for reading in primitives.
6.2.5 Dumping a tables content
Afunction VPF
dump
table() was created in order to dump tables in a text ﬁle. The text
ﬁles couldbe read without the needof knowledge about how the tables work. A representation
of a table dump can be viewed below. It’s a snippet of a connected node primitive table.
D:\labeeuww\VPF
database\eurnasia\bnd\l\k\n\a\cnd
Connected Node Primitive Table
Definition :
id (I ,1)
Row Identifier
first
edge (I ,1)
Foreign Key to Edge Table
coordinate (Z,1)
Coordinates of Connected Node
Contents:
id: 1
first
edge : 1
coordinate : (−17.012417,45.000000,−1.#QNAN0)
id: 2
first
edge : 1
coordinate : (−16.938334,45.000000,−1.#QNAN0)
The dumping of a table makes it less diﬃcult to understand certain table structures and the
VPF standard.
The next thing to do, was the implementation of the primitives. As already mentioned before,
primitives are structures of points, lines, areas or text. Functions like read
edge,
arow. The row will be read in order to fetch the correct primitive. vpfprim.c contains these
functions. They use the get
table
element-function to build up the edge, face, point or text
structure. Such a structure contains mainly the id of the primitive and the coordinates.
6.2.7 Indexes
There aren’t only tables at low level. Spatial index ﬁles and thematic index ﬁles need to be
handled. These ﬁles are used to speed up the proces of fetching the correct primitives. They
use a kind of set.
CHAPTER 6. IMPLEMENTATION
50
begin
end
vpf_open_table
i = first prim to draw
draw_prim(i, table)
function
done?
i = next to draw
idraw init
OpenGL
draw_prim
(rowid, table)
coordinates
i = first coord
idraw OpenGL
funcion
done?
exit
i = next coord
Figure 6.1: Drawing a table’s primitives ﬂowchart
6.2.8 Draw a table’s primitives
In order to draw a primitive, there is the need for the coordinates of the primitive. The
functions for drawing primitives can be found inside vpfdraw.c: draw
edge, draw
point,
draw
face and draw
text. These functions call functions from idraw.c which contain the
OpenGL routines.
Figure 6.1 shows how a table is drawn. First OpenGL is initialised with the idraw
init-
function. The table gets opened. For each row of the table the primitive draw function is
called. In the primitive draw function the row is read. Then the coordinates are fetched.
Each coordinate gets drawn.
6.3 Top level
6.3.1 Introduction
The database has a certain structure. This structure has to be in the code. So using a top
down method, all structures of the database are implemented. Start with the database header
table, one goes to the library tables, using the coverage tables and the feature class tables in
order to select the correct primitives.