Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
100% found this document useful (3 votes)
5K views65 pages

Download full Computer Graphics Programming in OpenGL with Java Gordon ebook all chapters

OpenGL

Uploaded by

trbaapoi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
Download as pdf or txt
100% found this document useful (3 votes)
5K views65 pages

Download full Computer Graphics Programming in OpenGL with Java Gordon ebook all chapters

OpenGL

Uploaded by

trbaapoi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
Download as pdf or txt
Download as pdf or txt
You are on page 1/ 65

Experience Seamless Full Ebook Downloads for Every Genre at textbookfull.

com

Computer Graphics Programming in OpenGL with Java


Gordon

https://textbookfull.com/product/computer-graphics-
programming-in-opengl-with-java-gordon/

OR CLICK BUTTON

DOWNLOAD NOW

Explore and download more ebook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Computer Graphics Programming in OpenGL with Java 2nd


Edition V. Scott Gordon

https://textbookfull.com/product/computer-graphics-programming-in-
opengl-with-java-2nd-edition-v-scott-gordon/

textboxfull.com

Computer Graphics Programming in OpenGL Using C++, Third


Edition Gordon Phd

https://textbookfull.com/product/computer-graphics-programming-in-
opengl-using-c-third-edition-gordon-phd/

textboxfull.com

Introduction to Computer Graphics with OpenGL ES First


Edition Junghyun Han

https://textbookfull.com/product/introduction-to-computer-graphics-
with-opengl-es-first-edition-junghyun-han/

textboxfull.com

Computer graphics through openGL Third Edition Guha

https://textbookfull.com/product/computer-graphics-through-opengl-
third-edition-guha/

textboxfull.com
Computer Graphics Through OpenGL: From Theory to
Experiments Sumanta Guha

https://textbookfull.com/product/computer-graphics-through-opengl-
from-theory-to-experiments-sumanta-guha/

textboxfull.com

Learn OpenGL Learn modern OpenGL graphics programming in a


step by step fashion 1st Edition Joey De Vries

https://textbookfull.com/product/learn-opengl-learn-modern-opengl-
graphics-programming-in-a-step-by-step-fashion-1st-edition-joey-de-
vries/
textboxfull.com

Computer Graphics for Java Programmers 3rd Edition Leen


Ammeraal

https://textbookfull.com/product/computer-graphics-for-java-
programmers-3rd-edition-leen-ammeraal/

textboxfull.com

OpenGL Programming Guide The Official Guide to Learning


OpenGL Version 4 5 with SPIR V 9th Edition Kessenich

https://textbookfull.com/product/opengl-programming-guide-the-
official-guide-to-learning-opengl-version-4-5-with-spir-v-9th-edition-
kessenich/
textboxfull.com

Learning Java An Introduction to Real World Programming


with Java Marc Loy

https://textbookfull.com/product/learning-java-an-introduction-to-
real-world-programming-with-java-marc-loy/

textboxfull.com
Computer GraphiCs
proGramminG in openGL
with Java
LICENSE, DISCLAIMER OF LIABILITY, AND LIMITED WARRANTY

By purchasing or using this book (the “Work”), you agree that this license grants
permission to use the contents contained herein, but does not give you the right
of ownership to any of the textual content in the book or ownership to any of the
information or products contained in it. This license does not permit uploading of the
Work onto the Internet or on a network (of any kind) without the written consent of
the Publisher. Duplication or dissemination of any text, code, simulations, images,
etc. contained herein is limited to and subject to licensing terms for the respective
products, and permission must be obtained from the Publisher or the owner of the
content, etc., in order to reproduce or network any portion of the textual material
(in any media) that is contained in the Work.

Mercury Learning and inforMation (“MLI” or “the Publisher”) and anyone


involved in the creation, writing, or production of the companion disc,
accompanying algorithms, code, or computer programs (“the software”), and any
accompanying Web site or software of the Work, cannot and do not warrant the
performance or results that might be obtained by using the contents of the Work.
The authors, developers, and the Publisher have used their best efforts to insure
the accuracy and functionality of the textual material and/or programs contained
in this package; we, however, make no warranty of any kind, express or implied,
regarding the performance of these contents or programs. The Work is sold “as is”
without warranty (except for defective materials used in manufacturing the book
or due to faulty workmanship).

The authors, developers, and the publisher of any accompanying content, and
anyone involved in the composition, production, and manufacturing of this work
will not be liable for damages of any kind arising out of the use of (or the inability to
use) the algorithms, source code, computer programs, or textual material contained
in this publication. This includes, but is not limited to, loss of revenue or profit, or
other incidental, physical, or consequential damages arising out of the use of this
Work.

The sole remedy in the event of a claim of any kind is expressly limited to
replacement of the book, and only at the discretion of the Publisher. The use of
“implied warranty” and certain “exclusions” vary from state to state, and might not
apply to the purchaser of this product.

Companion disc files are available for download from the publisher by writing to
info@merclearning.com.
Computer GraphiCs
proGramminG in openGL
with Java

V. Scott Gordon, Ph.D.


California State University, Sacramento

John Clevenger, Ph.D.


California State University, Sacramento

merCury LearninG and information


Dulles, Virginia
Boston, Massachusetts
New Delhi
Copyright ©2017 by Mercury Learning and InforMation LLC. All rights reserved.

This publication, portions of it, or any accompanying software may not be reproduced in any way,
stored in a retrieval system of any type, or transmitted by any means, media, electronic display or
mechanical display, including, but not limited to, photocopy, recording, Internet postings, or scan-
ning, without prior permission in writing from the publisher.

Publisher: David Pallai

Mercury Learning and InforMation


22841 Quicksilver Drive
Dulles, VA 20166
info@merclearning.com
www.merclearning.com
(800) 232-0223

V. Scott Gordon & John Clevenger


Computer Graphics Programming in OpenGL with Java
ISBN: 978-1-683920-27-4

The publisher recognizes and respects all marks used by companies, manufacturers, and
developers as a means to distinguish their products. All brand names and product names mentioned
in this book are trademarks or service marks of their respective companies. Any omission or misuse
(of any kind) of service marks or trademarks, etc. is not an attempt to infringe on the property
of others.

Library of Congress Control Number: 2016962393

171819321 Printed in the United States of America on acid-free paper

Our titles are available for adoption, license, or bulk purchase by institutions, corporations, etc.
For additional information, please contact the Customer Service Dept. at 800-232-0223 (toll free).
Digital versions of our titles are available at: www.authorcloudware.com and other e-vendors. All
companion files are available by writing to the publisher at info@merclearning.com.

The sole obligation of Mercury Learning and InforMation to the purchaser is to replace the book
and/or disc, based on defective materials or faulty workmanship, but not based on the operation or
functionality of the product.
Contents
Preface xi
Intended Audience xiii
How to Use This Book xiii
Acknowledgments xv
About the Authors xv

Chapter 1 Getting Started 1


1.1 Languages and Libraries 1
1.1.1 Java 2
1.1.2 OpenGL / GLSL 2
1.1.3 JOGL 3
1.1.4 graphicslib3D 3
1.2 Installation and Configuration 3
1.2.1 Installing Java 3
1.2.2 Installing OpenGL / GLSL 4
1.2.3 Installing JOGL 4
1.2.4 Installing graphicslib3D 4

Chapter 2 JOGL and the OpenGL Graphics Pipeline 7


2.1 The OpenGL Pipeline 8
2.1.1 Java/JOGL Application 9
2.1.2 Vertex and Fragment Shaders 12
2.1.3 Tessellation 17
2.1.4 Geometry Shader 18
2.1.5 Rasterization 19
2.1.6 Fragment Shader 20
2.1.7 Pixel Operations 21
2.2 Detecting OpenGL and GLSL Errors 23
2.3 Reading GLSL Source Code from Files 27
2.4 Building Objects from Vertices 29
2.5 Animating a Scene 30

Chapter 3 Mathematical Foundations 35


3.1 3D Coordinate Systems 36
3.2 Points 36
3.3 Matrices 37
3.4 Transformation Matrices 40
3.4.1 Translation 40
3.4.2 Scaling 41
3.4.3 Rotation 42
3.5 Vectors 44
3.5.1 Uses for Dot Product 45
3.5.2 Uses for Cross Product 47
3.6 Local and World Space 48
3.7 Eye Space and the Synthetic Camera 49
3.8 Projection Matrices 52
3.8.1 The Perspective Projection Matrix 52
3.8.2 The Orthographic Projection Matrix 54
3.9 Look-At Matrix 56
3.10 GLSL Functions for Building Matrix Transforms 57

Chapter 4 Managing 3D Graphics Data 63


4.1 Buffers & Vertex Attributes 64
4.2 Uniform Variables 67
4.3 Interpolation of Vertex Attributes 68
4.4 Model-View and Perspective Matrices 69
4.5 Our First 3D Program – a 3D Cube 71
4.6 Rendering Multiple Copies of an Object 80
4.6.1 Instancing 81
4.7 Rendering Multiple Different Models in a Scene 85
4.8 Matrix Stacks 87

vi ■ C o n t e n ts
4.9 Combating “Z-Fighting” Artifacts 94
4.10 Other Options for Primitives 95
4.11 Back-Face Culling 97

Chapter 5 Texture Mapping 103


5.1 Loading Texture Image Files 104
5.2 Texture Coordinates 106
5.3 Creating a Texture Object 108
5.4 Constructing Texture Coordinates 108
5.5 Loading Texture Coordinates into Buffers 110
5.6 Using the Texture in a Shader: Sampler Variables and Texture Units 110
5.7 Texture Mapping: Example Program 111
5.8 Mipmapping 114
5.9 Anisotropic Filtering 120
5.10 Wrapping and Tiling 121
5.11 Perspective Distortion 123
5.12 Loading Texture Image Files Using Java AWT Classes 124

Chapter 6 3D Models 129


6.1 Procedural Models – Building a Sphere 130
6.2 OpenGL Indexing – Building a Torus 137
6.2.1 The Torus 137
6.2.2 Indexing in OpenGL 139
6.3 Loading Externally Produced Models 144

Chapter 7 Lighting 157


7.1 Lighting Models 157
7.2 Lights 159
7.3 Materials 163
7.4 ADS Lighting Computations 165
7.5 Implementing ADS Lighting 168
7.5.1 Gouraud Shading 169
7.5.2 Phong Shading 177
7.6 Combining Lighting and Textures 182

Chapter 8 Shadows 189


8.1 The Importance of Shadows 189
8.2 Projective Shadows 190

C onte nts ■ vii


8.3 Shadow Volumes 191
8.4 Shadow Mapping 192
8.4.1 Shadow Mapping (PASS ONE) – “Draw” Objects
from Light Position 193
8.4.2 Shadow Mapping (Intermediate Step) – Copying the
Z-Buffer to a Texture 194
8.4.3 Shadow Mapping (PASS TWO) – Rendering the
Scene with Shadows 195
8.5 A Shadow Mapping Example 199
8.6 Shadow Mapping Artifacts 205

Chapter 9 Sky and Backgrounds 211


9.1 Skyboxes 211
9.2 Skydomes 214
9.3 Implementing a Skybox 215
9.3.1 Building a Skybox from Scratch 216
9.3.2 Using OpenGL Cube Maps 219
9.4 Environment Mapping 223

Chapter 10 Enhancing Surface Detail 231


10.1 Bump Mapping 232
10.2 Normal Mapping 233
10.3 Height Mapping 242

Chapter 11 Parametric Surfaces 249


11.1 Quadratic Bézier Curves 249
11.2 Cubic Bézier Curves 251
11.3 Quadratic Bézier Surfaces 254
11.4 Cubic Bézier Surfaces 256

Chapter 12 Tessellation 261


12.1 Tessellation in OpenGL 261
12.2 Tessellation for Bézier Surfaces 267
12.3 Tessellation for Terrain / Height Maps 273
12.4 Controlling Level of Detail (LOD) 281

viii ■ C o n t e n ts
Chapter 13 Geometry Shaders 287
13.1 Per-Primitive Processing in OpenGL 287
13.2 Altering Primitives 288
13.3 Deleting Primitives 293
13.4 Adding Primitives 294

Chapter 14 Other Techniques 299


14.1 Fog 299
14.2 Compositing / Blending / Transparency 302
14.3 User-Defined Clipping Planes 308
14.4 3D Textures 310
14.5 Noise 316
14.6 Noise Application – Marble 321
14.7 Noise Application – Wood 323
14.8 Noise Application – Clouds 327
14.9 Noise Application – Special Effects 332

Index 337

C onte nts ■ ix
Preface
This book is designed primarily as a textbook for a typical computer science undergradu-
ate course in OpenGL 3D graphics programming. However, we have also wanted to create
a text that could be used to teach oneself, without an accompanying course. With both of
those aims in mind, we have tried to explain things as clearly and simply as we can. Every
programming example is stripped-down and simplified as much as possible, but still com-
plete so that the reader may run them all as presented.

One of the things that we hope is unique about this book is that we have strived to make
it accessible to a beginner—that is, someone new to 3D graphics programming. While
there is by no means a lack of information available on the topic—quite the contrary—
many students are initially overwhelmed. This text is our attempt to write the book we
wish we had had when we were starting out, with step-by-step explanations of the basics,
progressing in an organized manner up through advanced topics. We considered titling the
book “shader programming made easy”; however, we don’t think that there really is any
way of making shader programming “easy.” We hope that we have come close.

Another thing that makes this book unique is that it teaches OpenGL programming
in Java, using JOGL—a Java “wrapper” for OpenGL’s native C calls [JO16]. There are
several advantages to learning graphics programming in Java rather than in C:
• It is more convenient for students at schools that conduct most of their curriculum
in Java.
• Java’s I/O, window, and event handling are arguably cleaner than in C.
• Java’s excellent support for object-oriented design patterns can foster good design.
It is worth mentioning that there do exist other Java bindings for OpenGL. One that
is becoming increasingly popular is Lightweight Java Game Library, or LWJGL [LW16].
Like JOGL, LWJGL also offers bindings for OpenAL and OpenCL. This textbook focuses
only on JOGL.

Another point of clarification is that there exist both different versions of OpenGL
(briefly discussed later) and different variants of OpenGL. For example, in addition to
“standard OpenGL” (sometimes called “desktop OpenGL”), there exists a variant called
“OpenGL ES” which is tailored for development of embedded systems (hence the “ES”).
“Embedded systems” include devices such as mobile phones, game consoles, automobiles,
and industrial control systems. OpenGL ES is mostly a subset of standard OpenGL, elimi-
nating a large number of operations that are typically not needed for embedded systems.
OpenGL ES also adds some additional functionality, typically application-specific opera-
tions for particular target environments. The JOGL suite of Java bindings includes inter-
faces for different versions of OpenGL ES, although we do not use them in this book.

Yet another variant of OpenGL is called “WebGL.” Based on OpenGL ES, WebGL is
designed to support the use of OpenGL in web browsers. WebGL allows an application to
use JavaScript1 to invoke OpenGL ES operations, which makes it easy to embed OpenGL
graphics into standard HTML (web) documents. Most modern web browsers support
WebGL, including Apple Safari, Google Chrome, Microsoft Internet Explorer, Mozilla
Firefox, and Opera. Since web programming is outside the scope of this book, we will not
cover any WebGL specifics. Note however that because WebGL is based on OpenGL ES,
which in turn is based on standard OpenGL, much of what is covered in this book can be
transferred directly to learning about these OpenGL variants.

The very topic of 3D graphics lends itself to impressive, even beautiful images.
Indeed, many popular textbooks on the topic are filled with breathtaking scenes, and it
is enticing to leaf through their galleries. While we acknowledge the motivational utility
of such examples, our aim is to teach, not to impress. The images in this book are simply
the outputs of the example programs, and since this is an introductory text, the resulting
scenes are unlikely to impress an expert. However, the techniques presented do constitute
the foundational elements for producing today’s stunning 3D effects.

We also haven’t tried to create an OpenGL or JOGL “reference.” Our coverage of


OpenGL and JOGL represents only a tiny fraction of their capabilities. Rather, our aim is to

1
JavaScript is a scripting language that can be used to embed code in webpages. It has strong
similarities to Java, but also many important differences.

xii ■ Pr e f a c e
use OpenGL and JOGL as vehicles for teaching the fundamentals of modern shader-based
3D graphics programming, and provide the reader with a sufficiently deep understanding
for further study. If along the way this text helps to expand awareness of JOGL and other
JogAmp technologies, that would be nice too.

Intended Audience
This book is targeted at students of computer science. This could mean undergraduates pur-
suing a BS degree, but it could also mean anyone who studies computer science. As such, we
are assuming that the reader has at least a solid background in object-oriented programming,
at the level of someone who is, say, a computer science major at the junior or senior level.

There are also some specific things that we use in this book, but that we don’t cover
because we assume the reader already has sufficient background. In particular:
• Java and its Abstract Window Toolkit (AWT) or Swing library, especially for
GUI-building
• Java configuration details, such as manipulating the CLASSPATH
• event-driven programming
• basic matrix algebra and trigonometry
• awareness of color models, such as RGB, RGBA, etc.

How to Use This Book


This book is designed to be read from front to back. That is, material in later chapters
frequently relies on information learned in earlier chapters. So it probably won’t work to
jump back and forth in the chapters; rather, work your way forwards through the material.

This is also intended mostly as a practical, hands-on guide. While there is plenty of
theoretical material included, the reader should treat this text as a sort of “workbook,” in
which you learn basic concepts by actually programming them yourself. We have provided
code for all of the examples, but to really learn the concepts you will want to play with
those examples—extend them to build your own 3D scenes.

At the end of each chapter are a few problems to solve. Some are very simple, involv-
ing merely making simple modifications to the provided code. The problems that are
marked “(PROJECT),” however, are expected to take some time to solve, and require writ-
ing a significant amount of code, or combining techniques from various examples. There
are also a few marked “(RESEARCH)”—those are problems that encourage independent
study because this textbook doesn’t provide sufficient detail to solve them.

Pre fa c e ■ xiii
OpenGL calls, whether made in C or in Java through JOGL, often involve long lists of
parameters. While writing this book, the authors debated whether or not to, in each case,
describe all of the parameters. We decided that at the very beginning, we would describe
every detail. But as the topics progress, we decided to avoid getting bogged down in every
piece of minutiae in the OpenGL calls (and there are many), for fear of the reader losing
sight of the big picture. For this reason, it is essential when working through the examples
to have ready access to reference material for Java, OpenGL, and JOGL.

For this, there are a number of excellent reference sources that we recommend using
in conjunction with this book. The javadocs for Java and JOGL are absolutely essential,
and can be accessed online or downloaded (we explain in Chapter 1 how to download the
JOGL javadoc). The reader should bookmark them for easy access in a browser, and expect
to access them continuously for looking up items such as parameter and constructor details.
The URLs for the Java and JOGL javadocs are:

https://docs.oracle.com/javase/8/docs/api/
https://jogamp.org/deployment/webstart/javadoc/jogl/javadoc

Many of the entries in the JOGL javadoc are simply pointers to the corresponding
entry in the OpenGL documentation, available here:

https://www.opengl.org/sdk/docs/man/

Our examples utilize a mathematics library called graphicslib3D. This is a Java library
that also has its own set of javadocs included. After installing graphicslib3D (described in
Chapter 1), the reader should locate the accompanying javadoc folder and bookmark its
root file (index.html).

Finally, there are many other books on 3D graphics programming that we recommend
reading in parallel with this book (such as for solving the “research” problems). Here are
five that we often refer to:
• (Sellers et al.) OpenGL SuperBible [SW15]
• (Kessenich et al.) OpenGL Programming Guide [KS16] (the “red book”)
• (Wolff) OpenGL 4 Shading Language Cookbook [WO13]
• (Angel and Shreiner) Interactive Computer Graphics [AS14]
• (Luna) Introduction to 3D Game Programming with DirectX 12 [LU16]

xiv ■ Pr e f a c e
Acknowledgments
Early drafts of this book were used in the CSc-155 (Advanced Computer Graphics
Programming) course at CSU Sacramento, and benefited from many student corrections
and comments (and in some cases, code). The authors would particularly like to thank
Mitchell Brannan, Tiffany Chiapuzio-Wong, Samson Chua, Anthony Doan, Kian Faroughi,
Cody Jackson, John Johnston, Zeeshan Khaliq, Raymond Rivera, Oscar Solorzano, Darren
Takemoto, Jon Tinney, James Womack, and Victor Zepeda for their suggestions. We
apologize if we have missed anyone.

We are extremely grateful for the invaluable advice provided to us by Julien Gouesse,
engine support maintainer at Jogamp. Mr. Gouesse provided technical information on
JOGL textures, cube maps, buffer handling, and proper loading of shader source files that
led to improvements in our text.

Jay Turberville of Studio 522 Productions in Scottsdale (Arizona) built the dolphin
model shown on the cover and used throughout this book. Studio 522 Productions does
incredibly high-quality 3D animation and video production, as well as custom 3D mod-
eling. We were thrilled that Mr. Turberville kindly offered to build such a wonderful new
model just for this book project.

We wish to thank a few other artists and researchers who were gracious enough
to allow us to utilize their models and textures. James Hastings-Trew of Planet Pixel
Emporium provided many of the planetary surface textures. Paul Bourke allowed us to use
his wonderful star field. Dr. Marc Levoy of Stanford University granted us permission to
use the famous “Stanford Dragon” model. Paul Baker’s bump-mapping tutorial formed the
basis of the “torus” model we used in many examples. We also thank Mercury Learning
for allowing us to use some of the textures from [LU16].

Dr. Danny Kopec connected us with Mercury Learning and introduced us to its pub-
lisher, David Pallai. Dr. Kopec’s Artificial Intelligence textbook inspired us to consider
Mercury, and our telephone conversations with him were extremely informative. We were
deeply saddened to hear of Dr. Kopec’s untimely passing, and regret that he didn’t have the
chance to see our book come to fruition.

Finally, we wish to thank David Pallai and Jennifer Blaney of Mercury Learning for
believing in this project and guiding us through the textbook publishing process.

Pre fa c e ■ xv
About the Authors
Dr. V. Scott Gordon has been a professor in the California State University system for
over twenty years, and currently teaches advanced graphics and game engineering courses
at CSU Sacramento. He has authored or coauthored over thirty publications in a variety
of areas including video and strategy game programming, artificial intelligence, neural net-
works, software engineering, and computer science education. Dr. Gordon obtained his PhD
at Colorado State University. He is also a jazz drummer and a competitive table tennis player.

Dr. John Clevenger has over forty years of experience teaching a wide variety of courses
including advanced graphics, game architecture, operating systems, VLSI chip design,
system simulation, and other topics. He is the developer of several software frameworks
and tools for teaching graphics and game architecture, including the graphicslib3D library
used in this textbook. He is the technical director of the ACM International Collegiate
Programming Contest, and oversees the ongoing development of PC^2, the most widely
used programming contest support system in the world. Dr. Clevenger obtained his PhD
at the University of California, Davis. He is also a performing jazz musician, and spends
summer vacations in his mountain cabin.

References
[AS14] E. Angel, and D. Shreiner, Interactive Computer Graphics: A Top-Down
Approach with WebGL, 7th ed. (Pearson, 2014).

[JO16] Jogamp, accessed July 2016, http://jogamp.org/.

[LW16] Lightweight Java Game Library (LWJGL), accessed July 2016, https://www.
lwjgl.org/.

[LU16] F. Luna, Introduction to 3D Game Programming with DirectX 12, 2nd ed.
(Mercury Learning, 2016).

[KS16] J. Kessenich, G. Sellers, and D. Shreiner, OpenGL Programming Guide: The


Official Guide to Learning OpenGL, Version 4.5 with SPIR-V, 9th ed. (Addison-
Wesley, 2016).

[SW15] G. Sellers, R. Wright Jr., and N. Haemel., OpenGL SuperBible: Comprehensive


Tutorial and Reference, 7th ed. (Addison-Wesley, 2015).

[WO13] D. Wolff, OpenGL Shading Language Cookbook, 2nd ed. (Packt Publishing, 2013).

xvi ■ Pr e f a c e
C hapter 1
GettinG started
1.1 Languages and Libraries. . . . . . . . . . . . . . . . . . . . . . . . . . .1
1.2 Installation and Configuration . . . . . . . . . . . . . . . . . . . . . .3

■ ■ ■■■
Graphics programming has a reputation of being among the most challeng-
ing computer science topics to learn. These days, graphics programming is shader
based—that is, some of the program is written in a standard language such as Java
or C++ for running on the CPU, and some is written in a special-purpose shader
language for running directly on the graphics card (GPU). Shader programming has
a steep learning curve, so that even drawing something simple requires a convoluted
set of steps to pass graphics data down a “pipeline.” Modern graphics cards are able
to process this data in parallel, and so the graphics programmer must understand the
parallel architecture of the GPU, even when drawing simple shapes.
The payoff, however, is extraordinary power. The blossoming of stunning virtual
reality in videogames and increasingly realistic effects in Hollywood movies can be
greatly attributed to advances in shader programming. If reading this book is your
entrée into 3D graphics, you are taking on a personal challenge that will reward you
not only with pretty pictures, but with a level of control over your machine that you
never imagined was possible. Welcome to the exciting world of computer graphics!

1.1 LANGUAGES AND LIBRARIES


Running the programs in this book requires the use of the following four lan-
guages and libraries:

• Java
• OpenGL / GLSL
• JOGL
• graphicslib3D
2 ■ C o m p uter G rap h ics P ro g ram min g in O pe nG L w ith J a va

It is likely that the reader will need to do a few preparatory steps to ensure that
each of these are installed and properly accessible on his/her system. In this sec-
tion we briefly describe each of them. Then in the following section we show how
to install and/or configure them for use.

1.1.1 Java
Java was developed at Sun Microsystems in the early 1990s, and the first
stable release of a development kit (JDK) was in 1995. In 2010, Oracle Corp. ac-
quired Sun, and has maintained Java since that time [OR16]. This book assumes
Java version 8, which was released in 2014.

1.1.2 OpenGL / GLSL


Version 1.0 of OpenGL appeared in 1992 as an “open” alternative to vendor-
specific Application Programming Interfaces (APIs) for computer graphics. Its
specification and development was managed and controlled by the OpenGL Archi-
tecture Review Board (ARB), a then newly formed group of industry participants.
In 2006 the ARB transferred control of the OpenGL specification to the Khronos
Group, a nonprofit consortium which manages not only the OpenGL specification
but a wide variety of other open industry standards.
Since its beginning OpenGL has been revised and extended regularly. In 2004,
version 2.0 introduced the OpenGL Shading Language (GLSL), allowing “shader
programs” to be installed and run directly in graphics pipeline stages.
In 2009, version 3.1 removed a large number of features that had been depre-
cated, to enforce the use of shader programming as opposed to earlier approaches
(referred to as “immediate mode”).1 Among the more recent features, version 4.0
(in 2010) added a tessellation stage to the programmable pipeline.
This textbook assumes that the user is using a machine with a graphics card
that supports at least version 4.3 of OpenGL. If you are not sure which version of
OpenGL your GPU supports, there are free applications available on the web that
can be used to find out. One such application is GLView, by a company named
“realtechvr” [GV16].

1
Despite this, many graphics card manufacturers (notably NVIDIA) continue to support
deprecated functionality.
C ha pte r 1 · G e tting Sta rte d ■ 3

1.1.3 JOGL
JOGL first appeared in 2003, published on the website Java.net. Since 2010
it has been an independent open source project, and part of a suite of Java bind-
ings maintained by JogAmp [JO15], an online community of developers. JogAmp
also maintains JOAL and JOCL, bindings for OpenAL and OpenCL, respectively.
As new versions of OpenGL and/or Java are released, new versions of JOGL are
developed to support continued compatibility. JogAmp also maintains a short
online user’s guide that includes valuable guidelines for installing and using JOGL
efficiently and effectively [JU16]. This book assumes at least version 2.3 of JOGL.

1.1.4 graphicslib3D
3D graphics programming makes heavy use of vector and matrix algebra.
For this reason, use of OpenGL is greatly facilitated by accompanying it with
a function library or class package to support common mathematical functions.
For example, the popular OpenGL Superbible [SW15] utilizes a C library called
“vecmath”. In this book, we use a Java library called graphicslib3D.
graphicslib3D provides classes for basic math functions related to graphics con-
cepts, such as vector, matrix, point, vertex, and quaternion. It also contains a few
utility classes for storing frequently used 3D graphics structures, such as a stack
for building hierarchical structures, lighting and material information, and a few
basic shapes such as a sphere and a torus.
graphicslib3D was first developed in 2005 by John Clevenger at California State
University Sacramento, and is maintained by the authors.

1.2 INSTALLATION AND CONFIGURATION


1.2.1 Installing Java
To use Java for the examples in this book, you will need both the JRE (Java
Runtime Environment) and the JDK (Java Development Kit). To install them, use
Oracle’s download site, http://www.oracle.com/technetwork/java, and click the “Java
SE” (Standard Edition) link under “Software Downloads.” From there you can
find instructions for downloading the latest JDK, which includes both the Java
compiler and the JRE. It is assumed that the reader is experienced with program-
ming in Java. At the time of this writing, the current version of Java is version 8.
4 ■ C o m p uter G rap h ics P ro g ram min g in O pe nG L w ith J a va

1.2.2 Installing OpenGL / GLSL


It is not necessary to “install” OpenGL or GLSL, but it is necessary to ensure
that your graphics card supports at least version 4.3 of OpenGL. If you do not
know what version of OpenGL your machine supports, you can use one of the
various free applications (such as GLView [GV16]) to find out.

1.2.3 Installing JOGL


To install JOGL, visit http://jogamp.org. As of this writing, the current version
of JOGL is in the “Builds/Downloads” section—look under “Current” and click on
[zip]. This displays the latest stable JOGL files in a folder named “/deployment/
jogamp-current/archive”. Download the following:

jogamp-all-platforms.7z
jogl-javadoc.7z

Unzip these files into the folder on your machine where you would like to
store the JOGL system. A typical location in Windows could be, for example, in a
folder at the root of the C: drive.
The unzipped “jogamp-all-platforms” file contains a folder named “jar”, which
contains two important files that will be used by your applications:

jogl-all.jar
gluegen-rt.jar

Add the full path name of each of these two files to your CLASSPATH environ-
ment variable.
In the jogl-javadoc folder, double-click the file named index.html. This opens the
JOGL javadocs in a browser, which you should then bookmark.

1.2.4 Installing graphicslib3D


To install graphicslib3D, download the graphicslib3D.zip file from the
textbook support website or the accompanying disc. Unzipping this file
ON THE CD
produces a folder containing the following two items:
C ha pte r 1 · G e tting Sta rte d ■ 5

• A file named graphicslib3D.jar


• A folder named javadoc
Move these files to wherever you would like to store graphicslib3D—a typical
location in Windows could be, for example, in a folder at the root of the C: drive.
Add the full path name of the .jar file to your CLASSPATH environment variable.
Open the index.html file in the javadoc folder, and bookmark it as you did for
the JOGL Javadoc.

References
[GV16] GLView, realtech-vr, accessed July 2016, http://www.realtech-vr.com/
glview/.
[JO16] Jogamp, accessed July 2016, http://jogamp.org/.
[JU16] JOGL Users Guide, accessed July 2016, https://jogamp.org/jogl/doc/
userguide/.
[OR16] Java Software, Oracle Corp., accessed July 2016, https://www.oracle.com/
java/index.html.
[SW15] G. Sellers, R. Wright Jr., and N. Haemel, OpenGL SuperBible:
Comprehensive Tutorial and Reference, 7th ed. (Addison-Wesley, 2015).
C hapter 2
JoGL and the openGL
GraphiCs pipeLine

2.1 The OpenGL Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8


2.2 Detecting OpenGL and GLSL Errors. . . . . . . . . . . . . . . .23
2.3 Reading GLSL Source Code from Files . . . . . . . . . . . . . .27
2.4 Building Objects from Vertices . . . . . . . . . . . . . . . . . . . . .29
2.5 Animating a Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
Supplemental Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

■ ■ ■■■
OpenGL (Open Graphics Library) is a multi-platform 2D and 3D graphics API
that incorporates both hardware and software. Using OpenGL requires a graphics
card (GPU) that supports a sufficiently up-to-date version of OpenGL (as described
in Chapter 1).
On the hardware side, OpenGL provides a multi-stage graphics pipeline that is
partially programmable using a language called GLSL (OpenGL Shading Language).
On the software side, OpenGL’s API is written in C, and thus the calls are directly
compatible with C and C++. However, stable language bindings (or “wrappers”) are
available for more than a dozen other popular languages (Java, Perl, Python, Visual
Basic, Delphi, Haskell, Lisp, Ruby, etc.) with virtually equivalent performance. This
textbook uses the popular Java wrapper JOGL (Java OpenGL). When using JOGL,
the programmer writes a Java program that runs on the CPU (more specifically, on
the Java Virtual Machine, or JVM) and includes JOGL (and thus, OpenGL) calls. We
will refer to a Java program that contains JOGL calls as a Java/JOGL application.
One important task of a Java/JOGL application is to install the programmer’s GLSL
code onto the GPU.
8 ■ C o m p uter G rap h ics P ro g ram min g in O pe nG L w ith J a va

An overview of a JOGL-based
graphics application is shown in Fig-
ure 2.1, with the software components
highlighted in red:
Some of the code we will write
will be in Java, with JOGL calls, and
some will be written in GLSL. Our
Java/JOGL application will work to-
gether with our GLSL modules, and
the hardware, to create our 3D graph-
ics output. Once our application is
Figure 2.1 complete, the end user will interact
Overview of a JOGL-based graphics application. with the Java application.
GLSL is an example of a shader language. Shader languages are intended
to run on a GPU, in the context of a graphics pipeline. There are other shader
languages, such as HLSL, which works with Microsoft’s 3D framework DirectX.
GLSL is the specific shader language that is compatible with OpenGL, and thus
we will write shader code in GLSL, in addition to our Java/JOGL application code.
For the rest of this chapter, we will take a brief “tour” of the OpenGL pipeline.
The reader is not expected to understand every detail thoroughly, but just to get a
feel for how the stages work together.

2.1 THE OPENGL PIPELINE


Modern 3D graphics programming utilizes a pipeline, in which the process
of converting a 3D scene to a 2D image is broken down into a series of steps.
OpenGL and DirectX both utilize similar pipelines.
A simplified overview of the OpenGL graphics pipeline is shown in Figure 2.2
(not every stage is shown, just the major ones we will study). The Java/JOGL ap-
plication sends graphics data into the vertex shader—processing proceeds through
the pipeline, and pixels emerge for display on the monitor.
The stages shaded in blue (vertex, tessellation, geometry, and fragment) are
programmable in GLSL. It is one of the responsibilities of the Java/JOGL applica-
tion to load GLSL programs into these shader stages, as follows:

1. It uses Java to obtain the GLSL code, either from text files or hardcoded
as strings.
Ch ap ter 2 · J O G L and the O pe nG L G ra phic s Pipe line ■ 9

2. It then creates OpenGL shader ob-


jects, and loads the GLSL shader
code into them.
3. Finally, it uses OpenGL commands
to compile and link objects and in-
stall them on the GPU.
In practice, it is usually necessary to pro-
vide GLSL code for at least the vertex and
fragment stages, whereas the tessellation
and geometry stages are optional. Let’s walk
through the entire process and see what takes
place at each step. Figure 2.2
Overview of the OpenGL pipeline.

2.1.1 Java/JOGL Application


The bulk of our graphics application is written in Java. Depending on the pur-
pose of the program, it may interact with the end user using standard Java libraries
such as AWT or Swing. For tasks related to 3D rendering, it uses the JOGL library.
Other windowing libraries exist that interface with JOGL, such as SWT and NEWT,
that have some performance advantages; in this book, however, we use AWT and
Swing because of the likelihood the reader already has familiarity with them.
JOGL includes a class called GLCanvas that is compatible with the standard Java
JFrame, and on which we can draw 3D scenes. As already mentioned, JOGL also
gives us commands for installing GLSL programs onto the programmable shader
stages and compiling them. Finally, JOGL uses buffers for sending 3D models and
other related graphics data down the pipeline.
Before we try writing shaders, let’s write a simple Java/JOGL application
that instantiates a GLCanvas and sets its background color. Doing that won’t
require any shaders at all! The code is shown in Program 2.1 (translated to
Java from the C++ version in [SW15]). It extends JFrame, and instantiates a
GLCanvas, adding it to the JFrame. It also implements GLEventListener, required
to utilize OpenGL—this necessitates implementing some methods, specifi-
cally display(), init(), reshape(), and dispose(). The display() method is where we
place code that draws to the GLCanvas. In this example, we load a FloatBuffer
with values (1,0,0,1), corresponding to the RGB values of the color red (plus a
“1” for the opacity component), and use the OpenGL call glClearBuffer() to fill
the display buffer with that color.
10 ■ C o m p uter G rap h ics P ro g ram min g i n O pe nG L w ith J a va

Program 2.1 First Java/JOGL Application


import java.nio.*;
import javax.swing.*;
import static com.jogamp.opengl.GL4.*;
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.common.nio.Buffers;
public class Code extends JFrame implements GLEventListener
{ private GLCanvas myCanvas;
public Code()
{ setTitle(″Chapter2 - program1″);
setSize(600, 400);
setLocation(200, 200);
myCanvas = new GLCanvas();
myCanvas.addGLEventListener(this);
this.add(myCanvas);
setVisible(true);
}
public void display(GLAutoDrawable drawable)
{ GL4 gl = (GL4) GLContext.getCurrentGL();
float bkg[] = { 1.0f, 0.0f, 0.0f, 1.0f };
FloatBuffer bkgBuffer = Buffers.newDirectFloatBuffer(bkg);
gl.glClearBufferfv(GL_COLOR, 0, bkgBuffer);
}
public static void main(String[ ] args)
{ new Code();
}
public void init(GLAutoDrawable drawable) { }
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { }
public void dispose(GLAutoDrawable drawable) { }
}

When running a Java/JOGL application


(such as the above Program 2.1) on a Micro-
soft Windows machine, it is advisable to add
the command-line option to disable the use of
Direct3D acceleration, such as:

java -Dsun.java2d.d3d=false Code

Figure 2.3
The mechanism by which these functions
Output of Program 2-1. are deployed is as follows: When a GLCanvas
Ch ap ter 2 · J O G L and the O pe nG L G ra phic s Pipe line ■ 11

is made “visible” (by our calling “setVisible(true)” on the JFrame that contains it), it
initializes OpenGL, which in turn creates a “GL4” object that our application can use
for making OpenGL function calls. OpenGL then does a “callback,” calling init(),
and passes it a “drawable” object (in this case the drawable object is the GLCanvas,
although that isn’t obvious from the code). In this particular example, init() doesn’t
do anything—in most applications it is where we would read in GLSL code, load 3D
models, and so on. OpenGL next calls display(), also sending it the drawable object.
It is typical to immediately obtain the GL4 object and put it in a variable called “gl”.
(Actually, GL4 is an interface—in practice we don’t need to know the actual GL ob-
ject class).
Later we will see that if we want our scene to be animated, our Java/JOGL ap-
plication will need to tell OpenGL to make additional calls to display().
Now is an appropriate time to take a closer look at JOGL calls in Program 2.1.
Consider this one:

gl.glClearBufferfv(GL_COLOR, 0, bkgBuffer);

Since JOGL is a Java binding for OpenGL, that means that calls to JOGL in
turn generate calls to OpenGL’s library of C functions. In this case, the C function
being called, as described in the OpenGL reference documentation (available on
the web at https://www.opengl.org/sdk/docs) is:

glClearBufferfv(GLenum buffer, Glint drawbuffer, const GLfloat * value);

The first thing to notice is that the name of the JOGL function is the same as
that of the original OpenGL C function, except it is preceded by “gl.”, which is the
name of the GL4 object. The period “.” after the “gl” is significant because “gl” is
the object on which we are invoking the OpenGL function.
To reiterate, GL4 is a Java interface to the OpenGL functions. We can obtain
it in one of two ways: (a) by calling drawable.getGL(), utilizing the “GLAutoDraw-
able” object provided automatically when the various GLEventListener functions
are invoked (called back) by OpenGL, or (b) by calling GLContext.getCurrentGL()
as done in Program 2.1. Obtaining the current GL4 object is important because,
in general, any OpenGL function described in the OpenGL documentation can
be called from JOGL by preceding it with the name of the appropriate GL4 object
(such as “gl.”, here).
The next detail to notice is that the first parameter makes reference to a “GLenum”.
OpenGL has many predefined constants (enums); this one references the color buffer
GL_COLOR that contains the pixels as they are rendered. In actuality, there is more
12 ■ C o m p uter G rap h ics P ro g ram min g i n O pe nG L w ith J a va

than one color buffer, and the second parameter is used to specify which one we are
using (in this case, the 0th or first one).
Next, notice that the third parameter is defined in OpenGL as a C pointer.
While JOGL makes every effort to match the original OpenGL C calls, Java does
not have pointers. Any parameter in OpenGL that is a pointer is changed in JOGL.
In this case, the JOGL version utilizes a FloatBuffer instead. Whenever there is a
discrepancy between a JOGL call and the original C call, consult the JOGL Java-
doc for details on the revised parameter(s).1
Immediately before the call to glClearBufferfv() is a call to newDirectFloatBuffer().
We will learn about this function later in Chapter 4 when we discuss buffers and
the JOGL buffer tools.
Finally, besides display() and init(), we also must implement reshape() and
dispose(). The reshape() function is called when a GLCanvas is resized, and dispose()
is called when the application exits. In Program 2.1 we left them both empty.

2.1.2 Vertex and Fragment Shaders


Our first JOGL program didn’t actually draw anything—it simply filled the
color buffer with a single color. To actually draw something, we need to include a
vertex shader and a fragment shader.
You may be surprised to learn that OpenGL is capable of drawing only a few
kinds of very simple things, such as points, lines, or triangles. These simple things
are called primitives, and for this reason, most 3D models are made up of lots and
lots of primitives, usually triangles.
Primitives are made up of vertices—for example, a triangle consists of three
vertices. The vertices can come from a variety of sources—they can be read from
files and then loaded into buffers by the Java/JOGL application, or they can be
hardcoded in the Java code or even in the GLSL code.

1
In this example, we have described each parameter in the call. However, as the book proceeds,
we will sometimes not bother describing a parameter when we believe that doing so would
complicate matters unnecessarily. The reader should get used to using the JOGL/OpenGL
documentation to fill in such details as necessary.
Other documents randomly have
different content
miekkailua kuin sinä päivänä näin linnan pihalla.»

»Myöskin minä olen nähnyt ihmetyttävää miekankäyttöä», virkkoi


Bertrade de Montfort, »nimittäin tänään. Hei vain!» huudahti hän,
nauraen veitikkamaisesti. »Totisesti olenkin taitanut vangita hurjan
Norman de Tornin, sillä juuri tämä ritari, joka nimittää itseään Roger
de Condéksi, miekkailee paremmin kuin koskaan olen nähnyt
kenenkään miekkailevan, ja hän ratsasti kypärinsilmikko suljettuna,
kunnes nuhtelin häntä siitä.»

Norman de Torn oli ensimmäisenä senjälkeen alkaneessa


naurussa, ja koko seurueesta hän nautti pilasta eniten.

»Tästä paholaisesta puhuttaessa», pitkitti parooni, »mille puolelle


arvelette hänen taipuvan, jos kuningas lopulta pakottaa
läänitysaateliston sotaan? Kun hänellä on tuhat riiviötä
komennuksessaan, saattaa Englannin kohtalo hyvinkin olla hänen
verisen kätensä kämmenellä.»

»Hän ei pidä kuninkaasta eikä ylimyksistä», puhkesi Mary de


Stutevill puhumaan, »ja minä olen pikemminkin taipuvainen
luulemaan, ettei hän auta kumpaakaan puolta, vaan mieluummin
ryöstää sekä kapinallisten että kuninkaan puoluelaisten linnoja niiden
isäntien ollessa sodassa».

»Hänestä lienee mieluisempaa tulla isännän ollessa kotona


lausumassa hänet tervetulleeksi», virkkoi de Stutevill surkuttelevasti.
»Mutta sittenkin olen aina levoton vaimoni ja tyttärieni turvallisuuden
vuoksi, kun vain olen jonkin aikaa poissa Derbystä. Oi, jospa laupias
Jumala pian vapauttaisi Englannin Tornin paholaisesta!»
»Minusta ei sinun tarvitse olla vähääkään huolissasi siihen
nähden», huomautti Mary, »sillä Tornin Norman ei tehnyt
minkäänlaista väkivaltaa ainoallekaan naiselle Stutevillin muurien
sisällä, ja kun eräs hänen miehistään tarttui minuun kovakouraisesti,
iski itse mahtava henkipatto miestä rautakintaisella kädellään niin
lujasti, että raakalaisen kypäri halkesi, samalla lausuen: 'Etkö tiedä,
vintiö, ettei Norman of Torn sodi naisia vastaan?'»

Pian keskustelu kääntyi muihin aiheisiin, eikä Norman of Torn enää


kuullut mitään itsestään sinä iltana.

Hänen oleskelunsa Stutevillin linnassa venyi kolmipäiväiseksi, ja


kun hän sitten kolmantena päivänä istui Bertrade de Montfortin
seurassa vanhan linnan eteläisen tornin ikkunakomerossa, puhui hän
taaskin siitä, että hänen täytyi lähteä, ja taaskin neito kehoitti häntä
jäämään.

»Saadakseni olla teidän seurassanne, Bertrade de Montfort»,


vastasi hän rohkeasti, »olisin valmis kieltäytymään mistä muusta
nautinnosta tahansa, kestämään millaisia puutteita hyvänsä ja
uhmailemaan kaikkia mahdollisia vaaroja, mutta on muita, jotka
odottavat minulta ohjeita, ja velvollisuuteni vaatii minua lähtemään
luotanne. Te näette minut uudelleen, ja se tapahtuu isänne, Simon
de Monfortin, linnassa Leicesterissä — nimittäin», lisäsi hän, »jos
pidätte minua tervetulleena sinne».

»Olette aina tervetullut luokseni, missä tahansa lienenkin, Roger


de
Condé», vakuutti tyttö.

»Muistakaa se lupaus!» kehoitti nuorukainen nauraen. »Joskus


kenties mielellänne olisitte sitä tunnustamatta.»
»En milloinkaan», intti tyttö, ja hänen silmissään tuikkiva väike
hänen niin sanoessaan olisi merkinnyt paljon sellaiselle miehelle,
joka olisi ollut paremmin perehtynyt naisten tapoihin kuin Norman of
Torn oli.

»Toivottavasti ette», virkkoi Norman vakavasti. »Kun olen vain


kehnosti harjaantunut esiintymään kohteliaasti, en osaa lausua, mitä
haluaisin teille puhua, jotta tietäisitte, kuinka paljon ystävyytenne
merkitsee minulle. Hyvästi, Bertrade de Montfort.» Ja hän notkisti
toisen polvensa viedessään tytön sormet huulilleen.

Kun hän muutamia minuutteja myöhemmin ratsasti nostosillan


ylitse ja sitten edelleen maantietä pitkin takaisin Torniin päin, kääntyi
hän luomaan vielä viimeisen katseen linnaan, ja eteläisen tornin
ikkunakomerossa seisoi nuori nainen, joka kohotti kättänsä, heilutti
sitä ja sitten ikäänkuin äkillisen mielijohteen kannustamana heitti
lentosuukon poistuvan ritarin jälkeen, heti sen jälkeen kadoten
aukosta.

Kun Norman of Torn ratsasti takaisin Derbyn kunnailla sijaitsevaan


kolkkoon linnaansa, oli hänellä matkalla paljon ajateltavaa. Sitä
ennen hän ei ollut koskaan tajunnut, mitä toisenlainen elämä
saattaisi tarjota, ja hän tunsi äkkiä vihlovaa katkeruutta isäksi
nimittämäänsä kovaa vanhusta kohtaan, koska tämän opetukset
hänen varhaisimmasta lapsuudestaan saakka olivat opastaneet hänet
sille tielle, joka oli täydelleen erottanut hänet muiden ihmisten
seurasta lukuunottamatta sitä henkipattojen, roistojen ja seikkailijani
hurjaa laumaa, joka ratsasti Tornin nuoren päällikön kauhistuttavan
lipun jäljessä.

Vain epäselvästi ja himmeästi hän tunsi, että juuri hänen


elämäänsä nyt sekaantunut tyttö se oli saanut hänet ensi kerran
häpeämään entisiä tekojaan. Hän ei tiennyt, mitä rakkaus oli, eikä
senvuoksi aavistanut rakastavansa Bertrade de Montfortia.

Ja toinen seikka, joka nyt askarrutti hänen ajatuksiaan, oli hänen


ja
Englannin kruununprinssin omituinen yhdennäköisyys. Se ynnä isä
Clauden
sanat antoivat hänelle paljon päänvaivaa. Mitä se saattoi merkitä?
Oliko kauhea rikos sattumalta olla kuninkaanpojan näköinen?

Mutta vasta nyt, kun hän tunsi saaneensa selville syyn, minkä
tähden hän aina ratsasti kypärinsilmikko suljettuna, halusi hän itse
kiihkeästi piilottaa kasvonsa muiden ihmisten näkyvistä — ei pelosta,
sillä pelkoa hän ei tuntenut, vaan jonkin sisäisen mielijohteen
pakotuksesta, jota hän ei koettanutkaan käsittää.
KAHDEKSAS LUKU

Kun Norman of Torn lähti ratsastamaan de Stutevillin linnasta


laskeutui isä Claude sileäkarvaisen aasinsa selästä Tornin ulkopihalla.
Kammottavasta ulkonäöstään ja pahasta maineestaan huolimatta
tämä uhkaava varustus aina tarjosi lämpimän vastaanoton tälle
hyväntahtoiselle, rattoisalle papille; eikä sen syynä ollut ainoastaan
syvä ystävyys, jota Tornin isäntä tunsi kelpo isää kohtaan, vaan
myöskin pyhän miehen oma miellyttävä ja herttainen luonne, joka
lämmitti yhtä hyvin pyhimystä kuin synnintekijääkin.

Epäilemättä juuri siitä, että hän hellittämättä koetti kehittää


hyvään suuntaan nuorta Normania siihen aikaan, jolloin pojan
luonne oli herkin voimakkaille vaikutuksille, johtui se, että tämän
mahtavan henkipaton toimintaperiaatteet olivat monessa suhteessa
puhtaat ja ylevät. Mutta juuri tämä sama vaikutus hankki isä
Claudelle myöskin hänen ainoan vihamiehensä Tornissa, pienen,
tuiman, harmaapäisen vanhuksen, sillä tämän ainoana
elämänpyrkimyksenä näytti olleen tukahduttaa kaikki jalommat
ritarillisuuden ja miehekkyyden vaistot pojassa, jonka
kasvattamiseen hän oli omistanut elämänsä viimeiset yhdeksäntoista
vuotta.
Isä Clauden kavutessa aasinsa selästä — lihavat ihmiset eivät
keikahda pois satulasta — juoksi puolikymmentä nuorta
aseenkantajaa auttamaan häntä ja taluttamaan eläintä talliin.

Kelpo pappi puhutteli kutakin kerkeätä auttajaansa nimeltä,


kysyen jotakin yhdeltä, laskien hilpeätä pilaa toiselle kevyesti ja
tuttavallisesti, mikä oli molemminpuolisen kiintymyksen ja vanhan
tuttavuuden merkki.

Hänen astellessaan sisälle isosta portista sinkauttelivat sotilaat


hänelle nauraen, mutta kunnioittavasti tervehdyksiä, ja laajalla,
tasaisen nurmikon, upeiden kasvipenkkien, suihkukaivojen,
kuvapatsaiden ja pienien pensaiden kaunistamalla pihalla hän
kohtasi punatukkaisen Shandy-jättiläisen, joka nyt oli Norman of
Tornin korkein alapäällikkö.

»Hyvää huomenta, pyhä Claude!» huusi vankka tappelija. »Oletko


tullut pelastamaan sieluamme vaiko kiroamaan meitä? Minkä
pyhänhäväistyksen olemme nyt tehneet vai olemmeko ansainneet
pyhän kirkon siunauksen? Tuletko nuhtelemaan vaiko kiittämään?»

»En kumpaakaan, sinä uudestisyntymätön vintiö», vastasi pappi


nauraen, »vaikka minusta tuntuu, että ansaitset moitteita, koska
viime viikolla kohtelit mahtavaa Norwichin piispaa niin loukkaavan
epäkohteliaasti».

»So, so, isä», puolustihe Punapää-Shandy. »Mehän vain autoimme


häntä tiukemmin noudattamaan Hänen ohjeitaan ja käskyjään, jonka
palvelija ja opetuslapsi hän väittää olevansa. Eikö Hänen kirkkonsa
arkkipiispan olisi parempi liikkua halpana ja nöyränä Hänen kansansa
keskuudessa kuin nähdä aina ympärillään kiusauksia, hienoja
vaatteita, jalokiviä ja paljon kultaa puhumattakaan kahdesta
viininassakoilla raskaasti kuormitetusta juhdasta?»

»Uskallanpa väittää, että hänen kiusauksistaan oli vähentynyt


ainakin niin monta viininassakkaa kuin kaksi kuormajuhtaa jaksaa
kantaa, kun sinä, punapäinen rosvo, päästit hänet käsistäsi»,
huudahti isä Claude.

»Kyllä, isä», myönsi roteva veitikka nauraen. »Pyhän kirkon vuoksi


otin kun otinkin sen kiusauksen kokonaan takavarikkoon, ja jos sinun
täytyy saada todistuksia voidaksesi antaa minulle synninpäästön, niin
tule mukaani; saat näytteen siitä erinomaisesta arvostelukyvystä,
jota Norwichin piispa osoittaa valitessaan kiusauksiaan.»

»Minulle on kerrottu teidän anastaneen tältä suurmieheltä kaikki


hienoudet, Punapää-Shandy», jatkoi isä Claude, pannen kätensä
henkipaton kainaloon ja lähtien astelemaan linnaa kohti.

»Norman of Torn myönsi hänelle ainoastaan yhden


vaatekappaleen, ja koska aurinko paahtoi kuumasti, valitsi hän siksi
ainoaksi pukukappaleeksi piispalle kypärin suojellakseen hänen
paljaaksi ajeltua päälakeaan vanhan auringon säteiltä. Ja kun hän
sitten pelkäsi joidenkuiden maantieraakalaisten mahdollisesti
ryöstävän sen piispalta, käski hän Silmäpuoli-Kantyn niitata sen kiinni
kaulasuojuksen kahden puolen, jotta sitä eivät voisi muut kuin seppä
irroittaa; ja siten hän lähetti Norwichin mahtavan piispan sidottuna
aasin selkään kasvot häntään päin mennä ratisuttamaan pitkin
pölyistä maantietä pää ainakin suojattuna sattumalta mahdollisesti
hänet kohtaavien uteliaiden katseilta. Neljäkymmentä raipaniskua
hän annatti piispan seurueen kullekin jäsenelle, koska he olivat olleet
liikkeellä huonossa seurassa. Mutta tulehan, täältä saat viiniä
kertomukseni todenperäisyyden takeeksi.»
Heidän istuessaan maistelemassa piispan oivallista kanariviiniä
astui sisälle Tornin pieni vanhus. Hän puhutteli isä Claudea
happamesti, tiedustaen, tiesikö hän, missä päin Norman of Torn oli.

»Emme ole nähneet hänestä merkkiäkään, sittenkun hän kolme


päivää sitten lähti ratsastamaan teidän asunnollenne päin», lopetti
hän.

»Niinpä kyllä», virkkoi pappi, »näin hänet sinä päivänä. Hänellä oli
seikkailu useiden Peter of Colfaxin linnan ritarien kanssa, ja hän
pelasti heidän käsistään erään neidon, jonka ratsun koristeiden
nojalla epäilin kuuluvan Montfortin sukuun. Yhdessä he lähtivät
ratsastamaan pohjoista kohti, mutta poikani ei maininnut, mihin hän
aikoi ja missä tarkoituksessa. Hänen ainoa huomautuksensa, kun
hän puki ylleen sota-asunsa, oli se, että nyt saisin nähdä haukan
hoivaamassa kyyhkystä. Eikö hän ole palannut?»

»Ei», vastasi vanhus, »ja epäilemättä hänen seikkailunsa on


luonteeltaan sopusoinnussa sinun poikamaisten ja naisellisten
opetustesi kanssa. Jos hän olisi noudattanut minun kasvatustani
ilman sinun kirottua papillista sekaantumistasi, olisi hän valmistanut
Tornissa rautasalpaisen pesän kirotun englantilaisen ylimystösi useille
kyyhkysille. Jollet sinä jätä häntä rauhaan, pyrkii hän pian kuninkaan
palvelukseen.»

»Ja siellä hän kenties olisi paremmin kotonaan kuin täällä», virkkoi
pappi tyynesti.

»Miksi niin?» ärähti pieni vanhus, silmäillen isä Claudea tiukasti.

»No», vastasi pappi nauraen, »siksi, että sellainen mies, jonka


valta ja eleet ovat vieläkin kuninkaallisemmat kuin kuninkaan, olisi
todellakin kuninkaallisen palatsin kaunistus». Mutta häneltä ei ollut
jäänyt huomaamatta hänen sanojensa aiheuttama hämminki, eikä
hänen kerkeä vastauksensa täydelleen pettänyt vanhusta.

Samassa astui sisälle aseenkantaja ilmoittamaan, että Shandya


tarvittiin portilla, ja luotuaan murheellisen ja pahoittelevan katseen
tyhjentämättömään pulloon tämä arvonmies poistui huoneesta.

Muutamia minuutteja molemmat miehet istuivat miettiväisinä ja


äänettöminä. Äkkiä Tornin vanhus lopetti hiljaisuuden.

»Pappi», alkoi hän, »sinun pojalleni antamasi ohjaus ei miellytä


minua, kuten tiedät. Hänen on ollut tarpeetonta tuhlata niin paljon
kallista aikaa, riistäen sen miekankäytöltä, oppiakseen hyödytöntä
lukuja kirjoitustaitoa. Mitä hyötyä on latinankielen taidosta sellaiselle
miehelle, jonka tuomio väikkyy selvänä hänen edessään. Siihen
saattaa kulua vuosia, ja se saattaa myöskin tapahtua kuukausien
kuluttua, mutta niin totta kuin piru on helvetissä, Norman of Torn
roikkuu kuninkaan hirsipuussa. Ja sinä tiedät sen, ja hän myöskin
yhtä hyvin kuin minäkin. Kaikki se, mitä sinä olet hänelle opettanut,
käy yli hänen asemansa, ja niiden virittämät toiveet ja
kunnianhimoiset pyrkimykset tekevät lopun vain hänestä
karvaammaksi. Viime aikoina olen huomannut hänen olevan entistä
haluttomamman lähtemään saalistusretkille, mutta hän on mennyt
liian pitkälle kääntyäkseen enää koskaan takaisin; eikä hänellä ole
paikkaa, mihin mennä. Mikä muu hän on milloinkaan ollut kuin hylkiö
ja henkipatto? Mitä sen suurempia toiveita olisi hänen rinnassaan
voinut lietsoa kuin se on, että hänen verivihollisensa häntä vihaisivat
ja pelkäisivät?»

»En tiedä, vanhus», vastasi pappi, »minkä tähden olet omistanut


elämäsi hänen elämänsä tuhoamiseen, enkä arvailultani uskalla
lausua ääneen; mutta ymmärtäkäämme toisiamme kerta kaikkiaan.
Niin paljon kuin teetkin ja olet tehnyt saastuttaaksesi ja turmellaksesi
hänen luontonsa ylevyyttä, olen minä tehnyt ja edelleenkin teen
kaiken voitavani sen torjumiseksi. Kuten sinä olet ollut hänen paha
enkelinsä, niin koetan minä olla hänen hyvä enkelinsä, ja kun
Norman of Torn loppujen lopuksi roikkuu kuninkaan hirsipuussa,
kuten liiankin pahasti pelkään hänelle käyvän, on enemmän syytä
murehtia hänen perikatoaan kuin kirota häntä.

»Hänen ystävänsä ovat alhaison riveistä, mutta niin olivat myöskin


rakkaan Herramme Jeesuksen ystävät ja seuralaiset, joten se on
enemmän hänen kunniakseen kuin se olisi ollut, jos hän olisi
ryöstänyt jo ennestäänkin kovaosaisilta.

»Naisille hän ei ole koskaan tehnyt väkivaltaa; siitäkin puhutaan


hänen kunniakseen, kun hän on poissa, ja se, että hän on ollut julma
miehille, unohdetaan sen suuremman kunnian tähden, että hän on
ollut sääliväinen heikkoja kohtaan.

»Mikä tarkoituksesi lienee, johtuuko se koston himosta vaiko


julman ja turmeltuneen mielen luonnollisesta taipumuksesta, sitä en
tiedä; mutta jos Tornin henkipaton tähden ketään kirotaan, kohtaa
kirous sinua — olin vähällä sanoa, luonnotonta isää; mutta en usko,
että pisaraakaan pilautunutta vertasi virtaa pojaksesi nimittämäsi
nuorukaisen suonissa.»

Tornin tuikea vanhus oli istunut liikkumattomana koko tämän


syytöspuheen ajan; hänen kasvonsa olivat hieman kalvenneet ja
pingoittuneet, saaden pahansuovan vihan ja raivon ilmeen, multa
hän oli sallinut isä Clauden keskeytymättä jatkaa loppuun asti.
»Olet täydelleen selvittänyt minulle, millainen olet ja millaiset ovat
mielipiteesi», virkkoi hän katkerasti, »mutta olen hyvilläni siitä, että
tunnen kantasi. Tähän saakka on välillämme vallinnut rauha, vaikka
ei rakkaus; nyt tietäkäämme molemmat, että välillämme on sota ja
vaino. Elämäntyöni on ollut selvänä edessäni. Muita henkilöitä, kuten
sinäkin, on ollut tielläni; nyt kuitenkin olen minä tässä, mutta missä
ovat he? Ymmärrätkö minua, pappi?» Ja vanhus kumartui kauas
pöydän ylitse, niin että hänen mielettömän sapekkaasti kiiluvat
silmänsä hehkuivat vain muutamien sentimetrien päässä papin
silmistä.

Isä Claude kohtasi hänen katseensa tyynen rauhallisesti.

»Kyllä ymmärrän», sanoi hän, nousi ja poistui linnasta.

Kohta sen jälkeen, kun hän oli saapunut asunnolleen, kajahti kova
koputus oveen, joka heti aukaistiin odottamatta muodollista lupaa.
Isä Claude katsahti sinnepäin, näki Norman of Tornin kookkaan
hahmon, ja hänen kasvoilleen levisi iloisen tyytyväinen
tervehdyshymy.

»Terveeksi, poikani», toivotti pappi.

»Samoin sinulle, isä», vastasi henkipatto. »Mitähän kuuluu


Torniin?
Olen ollut poissa useita päiviä. Onko kaikki linnassa hyvin?»

»Linnassa on kaikki hyvin», vakuutti isä Claude, »jos tarkoitat sillä


sitä, ettei ketään ole vangittu eikä hirtetty murhista. Oi, poikani,
minkä tähden et tahdo luopua tästä rikollisesta elämästäsi? Tapani ei
ole milloinkaan ollut torua eikä nuhdella sinua, mutta aina on
sydäntäni kirvellyt jokainen Norman of Tornin syyksi laskettu uusi
rikos.»

»No, no, isä», torjui henkipatto. »Mitä olen tehnyt sellaista, mihin
ylimykset, kuningas ja pyhä kirkko eivät ole näyttäneet minulle
hyvää esimerkkiä. Murhia, varkauksia, ryöstöjä! Kuluuko Englannissa
ainoatakaan päivää, jona ei tehtäisi näistä jotakuta tai kaikkia
joidenkuiden näiden nimessä?

»Onko väärin, jos Norman of Torn ryöstää sudelta, mutta oikein,


että susi repii lampaita? Minusta ei. Minä otan ainoastaan niiltä, joilla
on enemmän kuin he tarvitsevat, luonnollisilta vihollisiltani, kun he
taas ryöstävät niiltä, joilla ei ole mitään.

»Kuitenkaan» — hänen sävynsä muuttui äkkiä — »en siitä pidä,


isä. Sen sinä tiedät. Toivoisin voivani siitä luopua, mutta se on
mahdotonta.

»Jos kertoisin sinulle, minkä tähden sitä toivoisin, hämmästyisit


varmasti, enkä sitä itsekään ymmärrä; mutta toden totta johtuu
harras toivoni päästä eroon tällaisesta elämästä siitä, että kaipaan
juuri niiden vihollisten seuraa, joita minut on opetettu vihaamaan.
Mutta se on liian myöhäistä, isä. Minun elämälläni voi olla yksi ainoa
loppupää, ja se on hamppuisen nuoran alapää.»

»Ei, poikani; on toinenkin tapa, kunniallinen tapa», väitti kelpo isä


vastaan. »Jossakussa vieraassa maassa on runsaasti mahdollisuuksia
tarjona sellaiselle miehelle kuin sinulle. Ranska tarjoaa suurenmoisen
tulevaisuuden sellaiselle soturille kuin Norman of Torn on. Ludvigin
hovissa saisit paikan maan ylimpien miesten seassa. Olet rikas,
urhea ja komea — niin, älä nosta kättäsi — sinulla on kaikki ne
ominaisuudet ja enemmänkin, sillä olet paljon oppineempi kuin
suurin osa ylimyksistä, sinulla on hyvä sydän ja todella ritarillinen
luonne. Kun sinulla on niin ihastuttavat lahjat, ei mikään voisi sulkea
sinulta tietä vallan ja kunnian korkeimmille huipuille, kun taas sinulla
täällä ei ole mitään muuta tulevaisuutta kuin hirsipuu. Voitko
epäröidä, Norman of Torn?»

Nuori mies seisoi hetkisen ääneti ja pyyhkäisi sitten kädellään


silmiään ikäänkuin haihduttaakseen jonkun näyn.

»Eräästä syystä, isä, täytyy minun viipyä Englannissa vielä ainakin


joku aika, vaikka sinun esiin loitsunasi kuva on tosiaankin ihmeen
houkutteleva.»

Ja se syy oli Bertrade de Mortfort.


YHDEKSÄS LUKU

Bertrade de Montfortin vierailu ystävättärensä Mary de Stutevillin


luona alkoi lähestyä loppuaan. Kolme viikkoa oli vierinyt siitä, kun
Roger de Condé oli ratsastanut ulos Stutevillin portista, ja useita
kertoja oli komean nuoren miehen nimi ollut hänen kauniin
emäntänsä ja tämän vielä kauniimman ystävättären huulilla.

Tänään tytöt kävelivät verkkaisesti laajan pihan puutarhassa käsi


toistensa vyötäisillä, kuiskien viimeisiä luottamustietoja toistensa
korviin, sillä seuraavana päivänä oli Bertrade päättänyt palata
Leicesteriin.

»Minusta olet todellakin kovin ajattelematon, hyvä Bertrade»,


moitti Mary. »Jos isäni olisi täällä, ei hän varmastikaan sallisi sinun
lähteä saattueenasi ainoastaan se pieni joukko miehiä, jotka voimme
antaa mukaasi.»

»Älä pelkää, Mary!» lohdutti Bertrade. »Viisi isäsi soturia on kyllin


varma turvajoukko niin lyhyelle matkalle. Iltaan mennessä olen
perillä. Ja koska se ainoa henkilö, jota näillä tienoin pelkään, sai
äskettäin niin terveellisen kurituksen Roger de Condélta, en usko
hänen rohkenevan uudelleen häiritä minua.»
»Entä Tornin paholainen, Bertrade?» intti Mary. »Vasta eilen
illallahan saapui nilkuttaen luoksemme eräs loordi de Greyn sotilas,
kertoen kauheasta verilöylystä, jonka se katala pahus oli toimeen
pannut hänen isäntänsä väen keskuudessa. Hän on liikkeellä,
Bertrade, enkä osaa ajatella mitään hirveämpää kuin hänen käsiinsä
joutuminen on.»

»Mutta, Mary, ihan äskettäinhän juuri sinä itse vakuutit Norman of


Tornin olleen perin kohteliaan sinulle ryöstäessään tätä isäsi linnaa.
Miten olet niin nopeasti muuttanut mieltäsi?»

»Niin, Bertrade, hän esiintyi tosiaankin kunnioittavasti silloin,


mutta kuka tietää, millaisia hirveitä oikkuja hänen päähänsä saattaa
pälkähtää, ja varmasti vakuutetaan, että hän on verrattoman julma.
Äläkä unohda olevasi Leicesterin tytär ja Henrikin sisarentytär, joita
molempia Tornin henkipatto avoimesti vannoo vihaavansa ja
vainoavansa. Oi, Bertrade, odota ainoastaan päivä tai pari!
Varmastikin isäni siksi palaa, ja saat saattajiksesi viisikymmentä
soturia viiden asemesta.»

»Mitä mahtaisi viisikymmentä soturia Norman of Tornia vastaan,


Mary? Järkeilyllesi on käynyt samoin kuin pelollesi, molemmat ovat
harhaantuneet kauas maalista.

»Jos tämä hurja vintiö osuisi tielleni, olisi parempi, että uhrattaisiin
viisi kuin viisikymmentä miestä, sillä kumpikin lukumäärä olisi ihan
mitätön tuota hirttämättömien murhamiesten kammottavaa laumaa
vastaan. Niin, Mary; minä lähden huomenna, ja teidän kelpo
soturinne palaavat seuraavana päivänä, tuoden minulta mitä parhaat
terveiset.»
»Jos sinä tahdot, niin tahdot», kivahti Mary nenäkkäästi. »Ihan
kouraan jo tuntuu, että olet de Montfort-sukua, jonka peritty
urhoollisuus jää jälkeen ainoastaan sen peritystä itsepäisyydestä.»

Bertrade de Montfort nauroi ja suuteli ystävätärtään poskelle.

»Kentiespä kohtaan maantiellä taaskin uljaan Roger de Condén ja


saan hänet suojelijakseni. Silloin lähetän kun lähetänkin takaisin viisi
soturianne, sillä totisesti vastaa hänen säilänsä enemmän kuin
kymmenen miestä kaikista niistä, joiden olen ennen nähnyt
taistelevan.»

»Jos kohtaisit», tokaisi Mary vieläkin nyreissään ystävättärensä


päätöksestä lähteä seuraavana päivänä, »miehuullisen sir Rogerin
ihan aseettomana, taitaisit sittenkin lähettää takaisin isäni soturit».

Bertrade punehtui ja puri sitten huultansa tuntiessaan lämpimän


veren leviävän poskiinsa.

»Olet hupakko, Mary», virkkoi hän.

Mary purskahti hilpeään, kiusoittelevaan nauruun, suunnattomasti


nauttien kielevän punan osoittaman myöntymyksen aiheuttamasta
hämmingistä.

»Ahaa! Tähän saakka vain arvasin, missä sydämesi ja ajatuksesi


ovat, Bertrade; mutta nyt näen aavistaneeni ihan liiankin oikein. Hän
on tosiaankin komean näköinen, mutta mitä sinä tiedät hänestä?»

»Ole vaiti, Mary!» komensi Bertrade. »Et tiedä, mitä puhut. En


pyyhkisi häneen edes jalkojani, en välitä hänestä rahtuakaan, ja —
onhan kuhmut kolme viikkoa siitä, kun hän lähti Stutevillistä, eikä
hän ole lähettänyt minkäänlaista tietoa.»
»Vai niin!» huudahti pieni kiusanhenki. »Vai sieltäkö tuuli
puhaltaakin? Mylady ei pyyhkisi häneen jalkojaankaan, mutta on
pahasti närkästynyt, kun hän ei ole lähettänyt mitään sanomia. Mon
Dieu, onpa sinulla kummalliset käsitykset, Bertrade!»

»En puhele enää kanssasi, Mary!» Liuskasi Bertrade, polkien


jalkaansa, keikautti sievää päätänsä ja kääntyi jyrkästi linnaan päin.

*****

Pienessä huoneessa Golfaxin linnassa istui kaksi miestä vastakkain


pikku pöydän ääressä. Toinen, Peter of Colfax, oli lyhyt ja hyvin
pyylevä. Hänen punaiset, pöhöttyneet kasvonsa, tihruiset silmänsä ja
perunamainen nenänsä kertoivat hänen elintavoistaan, samalla kun
hänen paksut huulensa, joista alempi riippui isona ja velttona
taaksepäin painuneen leuan ylitse, viittasivat niihin alhaisiin
intohimoihin, joille hänen elämänsä oli omistettu. Hänen
kumppaninsa oli pieni, tuima, harmaa mies, mutta hänen rauta-
asunsa ja suljettu kypärinsä eivät antaneet isännälle vihjaustakaan
siitä, kuka hänen vieraansa saattoi olla. Parhaillaan puhui pieni,
rauta-asuinen mies.

»Eikö riitä se, että tarjoudun auttamaan teitä, sir Peter», kysyi
hän, »koska teidän täytyy saada tietää, minkä tähden sen teen?
Uskokaa, että vihani Leicesteriä kohtaan on minua kannustava
intohimo. Yrityksesi ryöstää tyttö meni myttyyn; jos annat mukaani
kymmenen sotilasta, tuon hänet sinulle.»

»Mistä tiedät hänen huomenna lähtevän ratsastamaan isänsä


linnaan?» tiedusti Peter of Colfax.
»Sekään ei kuulu sinuun, ystäväiseni, mutta minä tiedän sen; ja
jos haluat saada hänet, niin päätä nopeasti, sillä meidän pitäisi
lähteä liikkeelle tänä iltana ehtiäksemme hyvissä ajoin huomenna
sijoittua asemiimme maantien oheen.»

Vieläkin Peter of Colfax empi; hän pelkäsi tämän mahdollisesti


olevan Leicesterin juonen, jolla hänet mielittiin houkutella satimeen.
Hän ei tuntenut vierastaan — miekkonen saattoi haluta tyttöä
itselleen ja käyttää tätä keinoa hankkiakseen tarpeellisen avun
hänen anastustaan varten.

»No?» äänsi pieni, rauta-asuinen mies ärtyneesti. »En voi odottaa


täällä iäti. Tee päätöksesi! Minulle se ei merkitse muuta kuin koston
tyydyttämistä, ja jollet sinä suostu, pestään tarvittavat roistot, etkä
sinäkään sitten enää näe Bertrade de Montfortia.»

Tämä viimeinen uhkaus tehosi parooniin.

»Asia on sovittu», sanoi hän. »Miehet lähtevät mukaasi puolen


tunnin kuluttua. Odota alhaalla linnan pihalla!»

Pienen miehen poistuttua huoneesta Peter of Colfax kutsui


aseenkantajansa, jonka hän käski heti lähettää luoksensa erään
uskollisista kätyreistään.

»Guy», alkoi Peter of Colfax miehen saavuttua, »te sotkitte aika


tavalla erään puuhan joitakuita viikkoja sitten. Arvaatteko, mistä
puhun?»

»Kyllä, mylord.»

»Sattui niin, että huomenna saatte tilaisuuden korjata


hairahduksenne. Ottakaa mukaanne kymmenen miestä ja
ratsastakaa sinne, mihin alhaalla pihalla odottava mies teidät
opastaa, älkääkä palatko ilman sitä, minkä viime kerralla menetitte
kouralliselle miehiä! Ymmärrättekö?»

»Kyllä, mylord.»

»Ja, Guy, puolittain epäilen tätä miekkosta, joka on tarjoutunut


meitä avustamaan. Huomattuanne ensimmäisen merkin
kavalluksesta, karatkaa kaikki yhdessä hänen kimppuunsa ja
surmatkaa hänet! Ilmoittakaa muille määräykseni!»

»Kyllä, mylord. Milloin lähdemme?»

»Heti. Saatte mennä.»

*****

Se aamu, jona Bertrade de Montfort oli päättänyt lähteä takaisin


isänsä linnaan, sarasti harmaana ja uhkaavana. Turhaan koetti Mary
de Stutevill taivuttaa ystävätärtään luopumaan lähtöajatuksesta, kun
päivä oli niin synkeä eikä ollut riittävästi saattoväkeä; Bertrade de
Montfort pysyi lujana.

»Nyt jo olen ollut kolme päivää yli ajastani, enkä edes minä, tytär,
saa noin vain olla tottelematta Simon de Montfortia. Näinkin on
minulla kylliksi vastattavaa. Älä vaadi minua enää lisäämään
päivääkään anteeksi pyydettäväkseni! Ja sitäpaitsi saattavat äitini ja
isäni olla hyvin levottomia jatkuvan poissaoloni tähden. Ei, Mary;
minun täytyy lähteä tänään.» Ja sen hän teki saattajinaan viisi
miestä, jotka linnan puolustusväestä voitiin luovuttaa.

Tuskin puoli tuntia myöhemmin alkoi vihmoa kylmää sadetta, joten


he olivat todella surullinen seurue tarpeessaan lokaisella tiellä
vaippoihin ja päällystakkeihin kietoutuneina. Heidän jatkaessaan
matkaa sade ja tuuli äityivät, kunnes sade pieksi heidän kasvojaan
niin sokaisevina kuuroina, että heidän täytyi pitää silmänsä ummessa
ja luottaa ratsujensa vaistoon.

Vähemmän kuin puolet matkasta oli taivallettu. He ratsastivat


parhaillaan pienessä notkossa sakean metsän peittämää matalaa
harjannetta kohti, jonka synkkiin varjoihin tie kiemurteli. Kastuneiden
lehvien lomitse välkähti rauta-asu, mutta ratsastajien
sateensokaisemat silmät eivät sitä huomanneet. He samosivat
edelleen kärsivällisten hevostensa hitaasti ponnistellessa eteenpäin
upottavalla tiellä ja viuhuvassa myrskyssä.

Nyt he olivat harjanteen rinteen puolivälissä. Synkän metsän


tummissa pimennoissa syntyi liikettä, ja ilman varoituksen huutoa
syöksyi sitten esille joukko teräspukuisia ratsastajia, keihäät tanassa.
Laskettaen täyttä laukkaa Bertraden seurueen kimppuun he kaasivat
tytön saattomiehistä kolme, ennenkuin ehdittiin sivaltaa ainoatakaan
iskua hänen puolustuksekseen. Hänen molemmat jäljelläolevat
seuralaisensa kääntyivät torjumaan toista hyökkäystä, ja uljaasti he
kunnostautuivatkin, sillä kaikki heitä ahdistavat yksitoista miestä
saivat yrittää, ennenkuin nämä kaksi saatiin nujerretuiksi ja
surmatuiksi.

Temmellyksessä ei kukaan ollut huomannut tyttöä, mutta pian


eräs hätyyttämistä, pieni, tuikea, harmaa mies havaitsi hänen
kannustaneen ratsuaan ja kiitäneen pakoon. Huudettuaan
kumppaneilleen hän lähti ripeätä vauhtia ajamaan takaa.

Livettävästä tiestä ja sokaisevasta sateesta huolimatta Bertrade de


Montfort hoputti hevosensa hurjaan juoksuun, sillä hän oli tuntenut
useiden hyökkääjien kilvissä Peter of Colfaxin vaakunan.
Uljaasti kaunis arabialainen hevonen totteli hänen hoputustaan.
Jos hänen ahdistajainsa isot ratsut, Normandiassa ja Flanderissa
kasvatetut, olisivat olleet kiinni pilttuissaan, olisi niillä ollut yhtä hyvät
mahdollisuudet saavuttaa kiitävä, valkea ratsu, joka ihan halkoi
harmaata sadetta, kuten salama puhkoo pilviä.

Ilman pienen, tuikean, harmaan miehen pirullisen ovelaa


kaukonäköisyyttä Bertrade de Montfort olisi päässyt pakoon sinä
päivänä. Mutta nyt oli hänen nopea heponsa kiidättänyt häntä
ainoastaan parisataa metriä, kun se keskellä pimeätä metsää juoksi
suoraan maantien poikki kahden puun väliin pingotettuun nuoraan.

Kun hevonen hirvittävästi tärähtäen kaatui takerruttuaan vankkaan


nuoraan, sinkoutui Bertrade de Montfort kauas eteenpäin ja jäi
virumaan maantien lokaan pienenä, hervottomana, ryvettyneenä
hahmona.

Sieltä hänet löydettiin. Pieni, tuikea, harmaa mies ei edes


laskeutunut ratsailta; niin vähän hän välitti tytön kohtalosta oliko hän
kuollut vai joutuiko hän Peter of Colfaxin käsiin, se oli ihan
samantekevää hänestä. Kummassakin tapauksessa olisi hän
saavuttanut tarkoituksensa, eikä Betrade de Montfort enää
houkuttelisi Norman of Tornia pois siltä tieltä, jonka vanhus oli häntä
varten viitoittanut.

Että sellainen mahdollisuus oli uhkaamassa, sen hän oli saanut


tietää muutamalta Spizo-nimiseltä espanjalaiselta, joka oli ainoa
Norman of Tornin palveluksessa oleva petturi ja jonka pieni, tuikea,
harmaapäinen vanhus oli useita kuukausia sitten ostanut katalaksi
kätyrikseen vakoilemaan suuren henkipaton liikkeitä.
Peter of Colfaxin miehet nostivat Bertrade de Montfortin elottoman
ruumiin tieltä ja sijoittivat sen satulaan erään heikäläisen eteen.

»Lähdetään!» komensi Guyksi nimitetty mies. »Jos hänessä on


vielä henkeä, täytyy meidän rientää sir Peterin luokse, ennenkuin se
sammuu.»

»Minä eroan teistä nyt», ilmoitti pieni vanhus. »Olen suorittanut


osani puuhassa.»

Ja niinpä hän istui, katsellen heidän jälkeensä, kunnes he katosivat


metsään Colfaxin linnan suunnalle.

Sitten hän ratsasti Lakaisin taistelunäyttämölle, jossa sir John de


Stutevillin viisi sotilasta viruivat. Kolme heistä oli jo kuollut, muut
kaksi makasivat tien ohessa vaikeasti, mutta eivät kuolettavasti
haavoitettuina ja valittivat.

Tultuaan heidän kohdalleen pieni, tuima, harmaa mies laskeutui


satulasta ja tappoi pitkällä miekallaan äänettömästi molemmat
haavoittuneet. Sitten hän vetäisi tikarinsa ja piirsi jokaisen viiden
vainajan otsaan merkin, nousi ratsaille ja lähti nopeasti ratsastamaan
Tornia kohti.

»Ja jollei yksi seikka riitä», jupisi hän, »niin se kaatuneiden


otsassa oleva merkki kyllä tehoaa estämään kaiken vastaisen
yhteyden Tornin ja Leicesterin sukujen kesken».

Henry de Montfort, Simonin poika, ratsasti vinhasti ja vimmaisesta


isänsä kahdentoista palvelijan etunenässä Stutevilliin vievällä tiellä.

Bertrade de Montfort oli viipynyt niin kauan yli määräajan, että


kreivi ja kreivitär Eleanor, hänen puolisonsa, olivat vakavasti
levottomina lähettäneet vanhimman poikansa John de Stutevillin
linnaan noutamaan häntä kotiin.

Tuulen ja sateen tullessa selkäpuolelta pieni seurue ratsasti


nopeasti mutaisella tiellä, ja myöhään iltapäivällä he tapasivat
valkean ratsun, joka seistä kyyrötti tuuhean tammen juurella kaareva
selkä viuhuvaan myrskyyn päin.

»Jumaliste», huudahti de Montfort, »se on sisareni ratsu. Nyt on


varmasti jotakin hullusti.» Mutta vaikka he ripeästi tarkastivat
ympäristöä ja luikkailivat äänekkäästi, eivät he saaneet sen enempää
selvyyttä tytön olinpaikasta, minkä vuoksi he lähtivät kiiruhtamaan
edelleen Stutevillia kohti.

Noin kolmen kilometrin päässä siitä paikasta, jossa valkea ratsu oli
kohdattu, he näkivät niiden viiden palvelijan ruumiit, jotka olivat
olleet saattamassa Bertradea Stutevillista.

Hypähdettyään maahan Henry de Montfort tarkasti kaatuneita.


Kilvissä ja kypäröissä olevat vaakunat vahvistivat sitä hänessä heti
herännyttä pelkoa, että nämä olivat Bertraden turvaksi Stutevillista
lähetettyjä miehiä.

Kun hän kumartui vainajain puoleen nähdäkseen, tunsiko hän


heistä ketään, heloitti miesten otsasta häntä vastaan tikarinkärjellä
piirretty pelätty merkki NT.

»Jumalan kirous kohdatkoon häntä!» kiljaisi de Montfort. »Se on


Tornin paholaisen työtä, hyvät herrat», lausui hän seuralaisilleen.
»Tulkaa! Emme tarvitse enempää opastusta päämääräämme.» Ja
noustuaan jälleen satulaan pieni seurue kannusti ratsujaan takaisin
Tornia kohti.
*****

Tullessaan jälleen tajuihinsa Bertrade de Montfort makasi


vuoteessa oudossa huoneessa, ja hänen puoleensa oli kumartunut
vanha nainen, inhoittava, hampaaton akka, jonka hymy oli ihan kuin
torahampaattoman pedon virnistys.

»Kas vain!» kaakotti hän. »Morsian herää. Vakuutinkin mylordille,


että de Montfortia tappamaan tarvitaan enemmän kuin kellahdus
mutaan. Kas niin, kas niin! Nouse nyt ja pukeudu, sillä komea
sulhasesi jaksaa töintuskin hillitä kiihkeätä haluaan sulkea sinut
syliinsä. Alhaalla juhlasalissa hän kävelee edestakaisin kauniit
kasvonsa punaisina.»

»Kuka olette?» huudahti Bertrade de Montfort pää yhäti sekavana


putoamisen vaikutuksesta. »Missä olen?» Sitten: »Oi, mon Dieu!»
kun hän muisti iltapäiväiset tapahtumat ja Colfaxin vaakunan
kimppuunsa hyökänneen seurueen kiivissä. Heti hän oivalsi, kuinka
kauheassa pinteessä hän oli, kuinka äärimmäisen toivottomassa.

Vaikka Peter of Colfax olikin eläimellinen raakimus, oli hän


kumminkin läheinen kuninkaan suosikki; ja se seikka, että Bertrade
oli kuninkaan sisarentytär, olisi tuskin hänen asialleen eduksi, sillä
sille oli enemmän kuin riittävänä vastapainona se, että hän oli Simon
de Montfortin, Henrikin pelkäämään ja vihaaman miehen, tytär.

Hän kuuli käytävästä raskaita, läheneviä askelia, ja pian huusi


miehenääni oven takaa:

»Oletko siellä, Coll? Onko tyttö vironnut pyörtymyksestään?»


»Kyllä, sir Peter», vastasi vanha nainen. »Olin juuri kehoittamassa
häntä nousemaan ja pukeutumaan, ilmoittaen teidän odottavan
alakerrassa.»

»Joudu siis, mylady Bertrade!» käski mies. »Sinulle ei tehdä


mitään pahaa, jos osoittaudut järkeväksi, kuten uskon sinun
tekevän. Vartoan sinua juhlasalissa tai, jos niin haluat, tulen sinne
luoksesi.»

Tyttö kalpeni pikemmin inhosta ja halveksumisesta kuin pelosta,


mutta hänen vastauksensa sävy oli tyyni ja rauhallinen.

»Tulen kohtaamaan sinua alakertaan, sir Peter, ihan kohta.» Ja


hän nousi ja ehätti pukeutumaan samalla kun paroonin loittonevat
askeleet häipyivät portaille, jotka veivät hänen vankilakseen valitusta
tornihuoneesta.

Vanha nainen koetti saada hänet keskustelemaan kanssansa,


mutta tyttö ei halunnut puhella. Hänen kaikki ajatuksensa olivat
keskitetyt kaikkien mahdollisten pelastuskeinojen punnitsemiseen.

Puolen tunnin kuluttua hän astui Peter of Colfaxin linnan


juhlasaliin. Huone oli tyhjä. Siinä ei ollut tehty paljoakaan muutoksia
Ethelwolfin päivien jälkeen. Hänen silmäillessään ympäri salia, etsien
vanginvartijaansa, hänen katseensa viipyi kapeissa, lasittomissa
ikkunoissa, joiden takana oli vapaus. Saisiko hän enää milloinkaan
hengittää Jumalan puhdasta ilmaa näiden tukehduttavien muurien
ulkopuolella? Näiden likaisten, inhoittavien muurien! Ne olivat mustat
samoin kuin nokiset laipiopalkit ja laudoitus paitsi siellä täällä olevia,
hieman vähemmän tahraantuneita läikkiä, joiden kohdalla oli tehty
korjauksia. Kun hänen katseensa osui sodassa ja metsästyksessä
saatuihin voitonmerkkeihin, kaareutuivat hänen huulensa
ylenkatseellisesti, sillä hän tiesi Colfaxin nykyisen isännän saaneen
ne perintönä eikä oman mieskohtaisen kuntonsa avulla.

Huonetta valaisi yksi ainoa lamppu, joka ynnä toisessa avarassa


takassa palavan pienen halkoroihun lepattava valo tuntuivat
pikemminkin korostavan salin himmeitä varjoja.

Bertrade meni lattian poikki ja nojasi tukevaan tammipöytään,


jonka ikä ja ahkera käyttö olivat mustuttaneet laipiopalkkien
väriseksi ja johon oli jäänyt jälkiä suunnattomista juomasarvista ja
raskaista miekoista, kun hurjat ja iloiset räyhääjät olivat innostuneet
osoittamaan suosiotaan jollekulle vaeltavalle laulajalle tai vastanneet
mahtavien, uskollisuudenvalaa vaativien päällikköjensä vakavampiin
kehoituksiin.

Hänen harhaileva katseensa pani merkille kymmenkunta penkkiä


ja muutamia karkeatekoisia, raskaita tuoleja, jotka täydensivät
tämän epäsiistin huoneen epäsiistin kaluston, ja häntä puistatti.
Hänen pieni jalkansa naputti ärtyisesti siivotonta lattiaa, jossa oli
sekaisin kaikenlaisia pehkuja sekä koirien hyljeksimiä tai niiltä
huomaamatta jääneitä luita ja ruuantähteitä.

Mutta kaikkeen tähän ympäristöön kiinnitti Bertrade de Montfort


huomiota vain ohimennen; hän tähyili etsimäänsä miestä, jotta
kohtaus olisi pian ohitse ja hän saisi tietää, mikä kohtalo häntä
tulevaisuudessa odottaisi.

Hänen vilkas katseensa oli osoittanut hänelle, että huone oli ihan
tyhjä ja että sen alapäässä olevan pääoven lisäksi, josta hän oli
tullut, sieltä vei ainoastaan yksi toinen ovi. Se oli sivuseinällä, ja kun
se oli raollaan, näki hän sen vievän pieneen huoneeseen, nähtävästi
makuukammioon.
Hänen seisoessaan kasvot pääoveen päin avautui seinälaudoitus
meluttomasti hänen takanaan, aivan sen paikan kohdalla, jossa
valtaistuimet olivat olleet menneinä aikoina. Aukon tummasta suusta
astui esiin Peter of Colfax. Hän sulki laudoituksen hiljaa jälkeensä ja
eteni tyttöä kohti äänettömin askelin. Korokkeen reunalle
saavuttuaan hän seisahtui, kalisuttaen miekkaansa herättääkseen
Bertraden huomiota.

Jos hänen tarkoituksensa oli herpaista tytön rohkeutta äkillisellä ja


salaperäisellä ilmestymisellään, raukesi hänen aikeensa ihan tyhjiin,
sillä toinen ei edes kääntänyt päätänsä lausuessaan:

»Mitä on sinulla, sir Peter, sanottavaa tämän naapurisi tytärtä ja


hallitsijasi sisarentytärtä kohdanneen halpamaisen petollisen
menettelysi selitykseksi?»

»Kun julma isä tekee tyhjäksi rakastuneiden sydämien


suunnitelmat», vastasi paksumahainen, vanha törkimys pehmeän
mairittelevasti, »täytyy rakkauden sittenkin etsiä tiensä; ja niinpä on
uljas rakastajasi rohjennut uhmailla mahtavan isäsi ja majesteettisen
enosi vihaa ja laskee sydämensä jalkojesi juureen, oi kaunis
Bertrade, varsin hyvin tietäen sinun sydämesi sitä ikävöineen siitä
alkaen, kun ensi kerran tunnustimme rakkautemme sinun
kovasydämiselle isällesi. Katso! Minä lankean polvilleni eteesi,
kyyhkyläiseni.» Ja niveltensä natistessa lihava parooni lysähti
paksuille polvilleen.

Bertrade kääntyi, ja kun hän näki miehen, laukesivat hänen kopeat


piirteensä ivalliseen hymyyn.

»Sinä olet hupakko, sir Peter», virkkoi hän, »ja lisäksi


pahimmanlaatuinen hupakko — vanha hupakko. Sinun on
hyödytöntä pitkittää kosintaasi, sillä minä en sinua huoli. Päästä
minut täältä, jos olet herrasmies! Silloin ei huuliltani ikinä lähde
sanaakaan siitä, mitä on tapahtunut. Mutta päästä minut! Mitään
muuta en pyydä, ja sinun on hyödytöntä pidättää minua, sillä en voi
antaa sinulle sitä, mitä haluaisit. Minä en rakasta sinua enkä ikinä voi
sinua rakastaa.»

Hänen ensimmäiset sanansa olivat saaneet nöyryytyksen punan


täplittämään paroonin ennestäänkin punertavat kasvot purppuran
tapaisiksi, ja kun mies nyt yritti nousta pystyyn, valtasi hänet yhä
pahempi hämminki sen tähden, että hänen suunnattoman vatsansa
pakotuksesta täytyi käydä kontilleen, ennenkuin hän jaksoi nousta,
joten hän kömpi pystyyn hyvin samalla tavoin kuin lehmä, kohottaen
takapuolensa perin naurettavasti korkealle ilmaan. Seisoalleen
päästyään hän näki tytön kääntävän kasvonsa toisaalle salatakseen
nauruaan.

»Palaa huoneeseesi!» jyräytti hän. »Annan sinulle huomiseen


saakka aikaa päättääksesi, tahdotko hyväksyä Peter of Colfaxin
puolisoksesi vai joudutko hänen talossaan toiseen asemaan, joka
iäksi erottaa sinut vertaistesi seurasta.»

Tyttö kääntyi häneen päin naurun yhäti väreillessä huulillaan.

»Minusta ei tule narrin, kömpelön, vanhan ilveilijän, rappeutuneen


mässääjän ja irstailijan, miehen irvikuvan vaimoa. Ja mitä tulee
toiseen ajattelemattomaan uhkaukseesi, ei sinulla ole sisua muuttaa
toiveitasi teoiksi, sinä pelkurimainen raukka, sillä tiedät hyvin, että
Simon de Montfort sivaltaisi omin käsin saastaisen sydämen
rinnastasi, jos hän vain epäilisikään sinun rohjenneen puhua sellaista
minulle, hänen tyttärelleen.» Ja Bertrade de Montfort poistui tämän
vanhan saksilaisen Colfaxin linnan salista ja nousi tornikamariinsa.
Vanha nainen oli vahtimassa häntä yöllä ja myöhään seuraavaan
iltapäivään saakka, jolloin Peter of Colfax uudelleen kutsui vankinsa
puheilleen. Niin pahasti oli vanha noita peloitellut tyttöä, että tämä
uskoi ihan varmasti paroonin varsin hyvin pystyvän täyttämään
hirveän uhkauksensa, ja sentähden hän oli taaskin koettanut keksiä
jotakin pelastus- tai viivytyskeinoa.

Se huone, jossa häntä säilytettiin, oli linnan läntisessä tornissa,


hyvinkin kolmekymmentä metriä ainoasta ikkuna-aukosta näkyvän
vallihaudan yläpuolella. Niin ollen oli pakeneminen sille suunnalle
mahdoton. Ainoa ovi oli varustettu valtavilla tammisalvoilla, ja se itse
oli koottu paksuista, samaa puuta olevista lankuista sekä vahvistettu
rautaisilla poikkikiskoilla.

Jos hän vain saisi vanhan naisen pois huoneesta, aprikoi Bertrade,
voisi hän huonekaluilla teljetä oven sisältäpäin ja siten ainakin
viivyttää uhkaavaa kohtaloaan siinä toivossa, että apua joltakin
taholta tulisi. Mutta hänen ovelimmatkin juonensa osoittautuivat
tehottomiksi pystymättä edes hetkeksikään vapauttamaan häntä
harpyijamaisesta vanginvartijastaan; ja kun lopullinen kutsu oli tullut,
oli hän suunniltaan, koska hänellä ei ollut mitään keinoa tehdäkseen
tyhjiksi ryöstäjänsä aikeet.

Hänen tikarinsa oli häneltä viety, mutta vanhan naisen uumenilla


riippui sellainen ase, ja sen Bertrade päätti anastaa.

Teeskennellen, että hänen vyönsä solki juonitteli, hän kutsui


vanhaa naista avukseen, ja kun akka taivutti päänsä likelle tytön
vyötäisiä nähdäkseen, mikä vika soljessa oli, ojensi Bertrade
vikkelästi kätensä hänen kupeelleen ja sieppasi tikarin tupesta.
Ketterästi hän sitten ponnahti loitommaksi vanhuksesta, joka kirkaisi
suuttumuksesta ja levottomuudesta, syöksyen häntä kohti.
»Takaisin!» kiljaisi tyttö. »Pysy etäällä, vanha noita, tai saat
tuntea, kuinka pitkä oman tikarisi terä on!»

Nainen epäröi ja alkoi sitten kiroilla ja sättiä perin hirvittävästi,


samalla huutaen apua.

Bertrade peräytyi ovelle, komentaen vanhaa naista kuoleman


uhalla pysymään paikallaan, ja laski vikkelästi vankat teljet
paikalleen. Tuskin oli viimeinen salpa ehtinyt kolahtaa kohdalleen,
kun Peter of Colfax muassaan kymmenkunta palvelijaa ja sotilasta jo
kolkutti kovasti oveen.

»Mikä siellä sisällä on vikana, Coll?» huusi parooni.

»Tyttö-letukka sieppasi tikarini ja aikoo murhata minut», kirkui


akka.

»Ja sen varmasti teenkin, Peter of Colfax», vakuutti Bertrade,


»jollet heti lähetä noutamaan ystäviäni saattamaan minua pois
linnastasi, sillä en astu askeltakaan tästä huoneesta, ennenkuin
tiedän, että sen ulkopuolella on omaa väkeäni».

Peter of Colfax rukoili ja uhkaili, komensi ja houkutteli, mutta


kaikki turhaan. Niin kului iltapäivä, ja kun pimeys kattoi linnan,
lakkasi parooni yrittämästä, aikoen nälällä pakottaa vankinsa
tulemaan huoneesta.

Pienessä huoneessa Bertrade de Montfort istui penkillä, pitäen


silmällä vankiaan uskaltamatta kääntää katsettaan pois hänestä
sekunniksikaan. Koko sen pitkän yön hän istui siten, ja aamun
sarastaessa hän oli samassa asennossa, väsyneet silmät yhäti
tähdättyinä noita-akkaan.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like