mgr's weblog

GPN8-Plakat fertig! \o/

June 17, 2009, Typography
Last edited on June 17, 2009

GPN8-Plakat; click for a larger version (114 kB).

Yeah!

Ein Web-PDF des Plakates gibt es auch: GPN8-Space-Invader-Plakat-final.pdf. (Nicht für den Ausdruck auf üblichen CMYK-Druckern geeignet.)

Der Druck ist schwarz auf grünem Neonpapier erfolgt, was ziemlich fett aussieht. (Dank für die Hilfe an Flowhase!) Actionshots folgen! :-)

Die Poster haben nun gedruckt und beschnitten eine Größe von etwa 56,8 cm x 83,3 cm, was einem Seitenverhältnis von 1,467 entspricht. Nicht ganz das gewollte Verhältnis 1,492 bei Kinoplakatgröße von 61 x 91 cm, aber näher daran als an dem etwas uneleganten √2-Verhältnis (~1,414) der DIN-Papierformate.

Flyer, Tassen, T-Shirts und Namensschilder gibt es ebenfalls, beziehungsweise sind in der Herstellung. Auch die GPN8-Webseite hat Dank Einsatz von Neingeist und mir ein entsprechendes Design inklusive grüner Retrokarte erhalten.

Ich hoffe, es gefällt.


Design by Max-Gerd Retzlaff <m.retzlaff@gmx.net>, 2009.

Space Invaders (including artwork) designed by Tomohiro Nishikado, released 1978.

Font "Dirty Headline" (Freeware) by S. John Ross / Cumberland Fontworks, http://www222.pair.com/sjohn/fonts.htm.

Thank you to both of you!

Earth

April 11, 2009, Literature

"Funny, funny word play! … I'd like to tell them, 'Look, madam, why the hell should we be interested in your damned world? We don't want to be hanging on the outside of any planet and waiting to fall off or get blown off. We don't want raw air puffing at us and dirty water falling on us. We don't want your damned germs and your smelly grass and your dull blue sky and your dull white clouds. We can see Earth in our own sky when we want to, and we don't often want to. The Moon is our home and it's what we make it; exactly what we make it. We own it and we build our own ecology, and we don't need you here being sorry for us going our own way. Go back to your own world and let your gravity pull your breasts down to your knees.' That's when I'd say."

Isaac Asimov, The Gods themselves, 1972, pp. 233/234.

Nice and well written book. Physics, science fiction, sex education / facts of life, emancipation of women. Really a book of the seventies!

Thanks, Johann, for the recommendation and for lending it to me!




The English Wikipedia mentions an interesting comment by Isaac Asimov concerning the middle section of the book:

Asimov was also criticized for the general absence of sexuality and of extraterrestrial life in his science fiction. Asimov once explained that his reluctance to write about aliens came from an incident early in his career when Astounding's editor John Campbell rejected one of his early science fiction stories because the alien characters were portrayed as superior to the humans. He decided that, rather than write weak alien characters, he would not write about aliens at all. Nevertheless, in response to these criticisms he wrote The Gods Themselves, which contains aliens, sex, and alien sex. Asimov said that of all his writings, he was most proud of the middle section of The Gods Themselves, the part which deals with those themes.

Isaac Asimov, I, Asimov: A Memoir, 1994, New York: Doubleday, p. 250.

The English Wikipedia, the page on Isaac Asimov, section Criticisms, online, accessed April 11th, 2009.


The little excerpt you've already read would generally be enough for me but on the first page of the book there is such a nice and well selected section of a conversation that's actually taken from the second half of the first part of the book. In short words it depicts the main topic of the book. Here you go:

'Then why worry?'

'Because, sir, upon the strength of the strong nuclear interaction rests the rate at which hydrogen fuses to helium in the core of the Sun. If the interaction strengthens even unnoticeably, the rate of hydrogen fusion in the sun will increase markedly. The Sun maintains the balance between radiation and gravitation with great delicacy and to upset that balance in favour of radiation, as we are now doing—'

'Yes?'

'—will cause an enormous explosion. Under our laws of nature, it is impossible for a star as small as the Sun to become a supernova. Under the altered laws, it may not be. I doubt that we would have warning. The Sun would build up to a vast explosion and in eight minutes after that you and I will be dead and the Earth will quickly vaporize into an expanding puff of vapor.'

pp. 1 & 56.

:-(

April 11, 2009, Miscellaneous

gestauchter Rahmen; click for a larger version  (277 kB).

Allerdings ist es wohl besser, daß der Rahmen den Großteil der kinetische Energie aufgenommen hat, und nicht ich… Erstaunlich nur, daß das Vorderrad noch völlig intakt ist und nicht etwa eine Acht.

photofont.lisp

December 6, 2008, Lisp
Last edited on December 8, 2008

Yesterday I've stumbled upon Photofonts, a font format where every letter is a fully colored bitmap image. It also supports kerning and Unicode encoding. The file format specification is publicly documented: it's an xml file, the characters are Base64-encoded PNG images in a MIME-container. How nice! And certainly the most efficient way to store binary data.

Sadly there is no Gimp plug-in yet, but you can download a plug-in for Adobe Photoshop, Adobe Illustrator, and Corel Painter for free, and the company has announced plug-ins for Adobe InDesign as well as QuarkXPress. Well, the graphic designers will be happy with those… They have also developed Flash-based embedded web font stuff, but for the program to convert photofonts into that format, called Photofont WebReady, they want to see some money.

Enough of that! A quick look into the CLiki — the Common Lisp Wiki informed me about XMLS, CL-MIME, s-base64, and CL-PNG. Everything I need. Thanks go to the authors and maintainers Drew Crampsie, Robert Marlow, Sven Van Caekenberghe, Harald Musum, and Vebjorn Ljosa! The interfaces are all quite usable and after looking into some free photofonts from the aforementioned homepage (mostly from my Lisp image using XMLS:PARSE) and some hacking I now have a photofont:

example of my Tea Light Candle Photofont; please click for the huge
version (277 kB).

Please click on the image to have a look at the HUGE version! I hope you like it! Every single character of this font is a photograph of some arranged tea light candles. But this article is about the photofont format and my program to generate photofonts, and not about my particular Tea Light Canle Font. Perhaps there will be a separate article some time in the future…

Well, here comes the quick and dirty implementation in Common Lisp:

;;; photofont.lisp - A program to generate photofonts
;;; Dec 5, 2008 by Max-Gerd Retzlaff <m.retzlaff@gmx.net>
;;; Version 1
;;;
;;; See http://www.photofont.com/ for more information.
;;; The "Photofont format specification" is here:
;;;                     http://www.photofont.com/photofont/devel/
;;;
;;; Example call:
;;;   (photofont "Teelichter256" "font-spec-256" "Teelichter256.phf" :indent nil)
;;;
;;; The font-spec file is expected to contain lines like this one:
;;; ! Teelichter-256/!_dscf5475.jpg.png
;;; (single character, a single space, filename with relative path, newline character)   
 
(require :xmls)
(require :cl-mime)
(require :s-base64)
(require :png) ;; cl-png
 
(defun png->mime (pathname)
  (with-output-to-string (mime-out)
    (let ((png (with-open-file (in pathname
                                   :element-type '(unsigned-byte 8))
                 (with-output-to-string (out)
                   (s-base64:encode-base64 in out)))))
      (mime:print-mime mime-out
                       (make-instance 'mime:text-mime
                                      :type "image"
                                      :subtype "png"
                                      :charset "US-ASCII"
                                      :content-encoding :base64
                                      :encoding :base64
                                      :content png)
                       t nil))))
;; (png->mime "Teelichter/256/A_dscf5380.jpg.png")
 
(defun png-dimensions (pathname) 
  (let ((png (with-open-file (in pathname
                                 :element-type '(unsigned-byte 8))
               (png:decode in))))
    (values (png:image-width png)
            (png:image-height png))))
 
(defun root (children)
  (xmls:make-node :name "PhF" :attrs '(("version" "1.0"))
                  :children children))
 
#+(or)
(defun header ()
  (xmls:make-node :name "header"
                  (make-node :name "version" :attrs (xmls:make-node :name "type" :attrs "string"))
                  (make-node :name)
                  ))
(defun header (fontname &key (encoding "ISO 8859- 1 Latin 1 (Western)")
                             (ascender 256)
                             (descender 51)
                             (internal-leading 77)
                             (upm 256))
  `("header" NIL ("version" (("type" "string")))
    ("family" (("type" "string")) ,fontname)
    ("full_name" (("type" "string")) ,fontname)
    ("codepage" (("type" "string")) ,(princ-to-string encoding))
    ("ascender" (("type" "int")) ,(princ-to-string ascender))
    ("descender" (("type" "int")) ,(princ-to-string descender))
    ("internal_leading" (("type" "int")) ,(princ-to-string internal-leading))
    ("upm" (("type" "int")) ,upm)))
 
(defun letter->id (letter)
  "More or less a bugfix, as the photofont plug-in for Adobe Photoshop CS3 (Windows),
seems to have a problem with XML encodings like \"§\"... Otherwise I would just
use STRING."
  (let ((code (char-code letter)))
    (if (< 127 code)
        (char-name letter)
        ;; (format nil "~a+0x80" (code-char (- code 128)))
        (string letter))))
 
(defun mapping (letter)
  `("map" (("unc" ,(princ-to-string (char-code letter))) ("id" ,(letter->id letter)))))
 
(defun all-mappings (letters)
  (mapcar #'mapping letters))
 
(defun globals (all-mappings)
  `("globals" NIL
              ("unicode_mapping" (("subtype" "map_unicode") ("type" "array"))
                                 ,@all-mappings)))
;; (globals  (all-mappings (coerce "ABCDß!§$" 'list)))
 
(defun glyph (letter pathname)
  (multiple-value-bind (width height)
      (png-dimensions pathname)
    (let ((width-string (princ-to-string width))
          (height-string (princ-to-string height)))
      `("glyph" (("id" ,(letter->id letter)))
                ("image" (("type" "photo")
                          ("id" "v0"))
                         ("shape" (("embedded" ,(file-namestring pathname)))
                                  ("ppm" (("int" ,height-string)))
                                  ("bbox" (("height" ,height-string) ("width" ,width-string)
                                           ("y" "0") ("x" "0")))
                                  ("base" (("y" ,height-string) ("x" "0")))
                                  ("delta" (("y" "0") ("x" ,(princ-to-string (- width 2)))))))))))
 
(defun all-glyphs (list)
  (xmls:make-node :name "glyphs"
                  :children (mapcar (lambda (glyph-spec)
                                      (apply #'glyph glyph-spec))
                                    list)))
#+(or)
(all-glyphs '((#\A #p"Teelichter/256/A_dscf5380.jpg.png")
                       (#\B #p"Teelichter/256/B_dscf5702.jpg.png")))
 
(defun image (pathname)
  (xmls:make-node :name "image" :attrs `(("id" ,(file-namestring pathname)))
                  :children (list (png->mime pathname))))
;; (image "Teelichter/256/A_dscf5380.jpg.png")
 
(defun all-images (pathnames)
  (xmls:make-node :name "data"
                  :children (list (xmls:make-node :name "photo"
                                             :children (mapcar #'image pathnames)))))
#+(or)
(all-images (list "Teelichter/256/A_dscf5380.jpg.png"
                  "Teelichter/256/B_dscf5702.jpg.png"))
 
(defun parse-fontspec (pathname)
  (let ((glyph-specs))

(with-open-file (file pathname) (do ((line (read-line file nil 'eof) (read-line file nil 'eof))) ((eq line 'eof)) (push (list (elt line 0) (subseq line 2)) glyph-specs))) (nreverse glyph-specs)))     (defun generate-photofont (fontname pathname) (let ((glyph-specs (parse-fontspec pathname))) (multiple-value-bind (width height) (png-dimensions (second (first glyph-specs))) (declare (ignore height)) (root (list (header fontname :ascender (princ-to-string width) :upm (princ-to-string width)) (globals (all-mappings (mapcar #'car glyph-specs))) (all-glyphs glyph-specs) (all-images (mapcar #'second glyph-specs)))))))   (defun photofont (fontname source target &key indent) (with-open-file (out target :direction :output :if-exists :overwrite :if-does-not-exist :create) (princ "<?xml version=\"1.0\" ?> " out) (xmls:write-xml (generate-photofont fontname source) out :indent indent))) ;; (photofont "Teelichter256" "font-spec-256" "Teelichter256.phf" :indent nil) ;; (princ (xmls:toxml * :indent t))


Please send me an email if you have a use for this code or have a nice photofont for me. Thanks in advance!

Using an Image Viewer as a Presentation Program,
Image Correction in Batch Mode (Using The GIMP)

November 27, 2008, Lisp
Last edited on November 28, 2008

As already mentioned in the German article Public Speech: History of Typesetting and Letterpress Printing I have given that speech without any slides. Instead I've made use of a simple image viewer and a LCD projector to present the eighty pictures. In this article I describe the preparations.

Color Correction of Scanned Images

Eighty pictures, and most of them I had to scan by myself from the various books that I have used. That means that the colors had to be altered a tad, at least we need to correct the input level of the colors (e.g. using The GIMP's Adjust Color Levels tool). We want well balanced images, the levels should be distributed all over the whole color range, and it'd be best if the text of the reverse side could not be seen through (remember that often book pages are quite thin).

If your picture is just composed of pen strokes (for example pencil drawings or woodcuts) it's a nice trick to propagate the lower value pixels before using the Levels tool (Filters → Distorts → Value Propagate, More Black), so that afterwards you can apply the Levels tool more harshly. This method is described quite nicely in Liam Quin's How to Clean Up Scanned Engravings and Old Photographs, (second) step 8. Strengthen Those Lines. He aptly writes: "The point of this is that when you make the image brighter the edges of the dark lines get eaten away, so you need to strengthen them first."

Automate the Color Correction

We certainly do not want to do this for some dozen images! Luckily The GIMP has a nice batch mode to automate this process. At the same time it is (in my opinion) a bit easier to write a batch script instead of a filter script that is embedded into The GIMP with a special dialog box (though that is not that hard, either).

How this is done is described in the compact tutorial GIMP Batch Mode. Thank you, anonymous writer, for having written that nice page! Remember to consult The GIMP's helpful Procedure Browser, (GIMP toolbox → Xtns → Procedure Browser) when writing your own scripts. It gives you a list of all commands and describes all their parameters in detail (although, sadly, it describes not everything you need to know…). Here is my script:

(define (batch-vpropagate-levels pattern)
  (let∗ ((filelist (cadr (file-glob pattern 1))))
    (while (not (null? filelist))
           (let∗ ((filename (car filelist))
                  (image (car (gimp-file-load RUN-NONINTERACTIVE
                                              filename filename)))
                  (drawable (car (gimp-image-get-active-layer image))))
 
             (plug-in-vpropagate RUN-NONINTERACTIVE
                                 image drawable
                                 1 ;; more black
                                 1 ;; channel
                                 0.18 ;; rate
                                 15 ;; direction mask
                                 0 ;; lower-limit
                                 255 ;; upper-limit
                                 )
             (gimp-levels drawable
                          0 ;; value channel
                          125 242
                          1.5
                          0 255)
 
             (gimp-file-save RUN-NONINTERACTIVE
                             image drawable filename filename)
             (gimp-image-delete image))
           (set! filelist (cdr filelist)))))
 
(define (batch-levels pattern)
  (let∗ ((filelist (cadr (file-glob pattern 1))))
    (while (not (null? filelist))
           (let∗ ((filename (car filelist))
                  (image (car (gimp-file-load RUN-NONINTERACTIVE
                                              filename filename)))
                  (drawable (car (gimp-image-get-active-layer image))))
 
             (gimp-levels drawable
                          0 ;; value channel
                          75 245
                          1.0
                          0 255)
 
             (gimp-file-save RUN-NONINTERACTIVE
                             image drawable filename filename)
             (gimp-image-delete image))
           (set! filelist (cdr filelist)))))

Save it to a file named adjust-scan.scm in the directory ~/.gimp-2.x/scripts/. The first function is an example script for line drawings; the second one is the function that I've used for all scanned images of said speech.

I wanted a quick'n'dirty solution, so I've just determined reasonable values using one or two images. Of course, we have to scan all images with the same scanning settings! Then I have copied all original images to a new directory—as the functions change the images in place—, and fired up:

gimp -i -b '(batch-levels "∗.png")' -b '(gimp-quit 0)'

Hint

If you want to get small files—e.g. for the Web or to have them included in a PDF document—select the input level range more rigorously in order to remove the noise of the paper texture, convert the image to indexed colors with a color map of twenty to fifty colors (Image → Mode → Indexed…, important: select Generate optimum palette), and save it as a PNG file.

Sorting the Images

Now I've put all images—the scanned and post-processed ones as well as selected images from the Web—in a new directory called Selection. I've generated a list of all image files using the command:

ls -1 > files

Open it and sort the files as you need them during your speech. Prepend whatever you want to lines of files that you do not need after all and insert blank lines as you want. Create a subdirectory Sorted and call this BASH script:

IFS=$'\n';
num=1;
for i in $(<files);do
    # echo $i | grep "__handiwork\."
    handifile=${i:0:${#i}-4}__handiwork${i: -4}
    ls $handifile >/dev/null 2>&1
    if [ $? -eq 0 ] ; then
        i=$handifile
    fi
    newname=$(printf "%03d" $num)__$i; 
    echo $newname; 
    cp -l $i Sorted/$newname ;
    let num=$num+1;
done

It generates numbered hard links in the subdirectory to all files that you have listed in the file files. If you need to manually adjust an image append "__handiwork" to its file name just before the (three letter) extension; it will be selected instead of the original file.

A nice thing about this solution is the fact that it is independent of the particular image viewer program, as long as it can show images in the alphabetical order of their file names. If your notebook has a problem just before your speech, it is more easy to use another person's computer: even Microsoft Windows's built-in picture preview, the Picture and Fax Viewer, is enough.


Please send me an email if you liked this article! You even do not need to mention the colour of your socks and/or include a picture of your ankles, as Liam Quin asks you to do! :-)

Vortrag:
Geschichte des Schriftsatzes und des Buchdruckes

November 23, 2008, Literature
Last edited on November 23, 2008

Ui, so lange Zeit kein neuer Eintrag! Na, es gibt einfach zu viele Dinge. Ich müßte mal etwas über meine Atmel-Forth-Spielereien mit amforth und (color) avrforth berichten, meine (zügigen) Matrizen-Libraries für Common Lisp, Delphi 2007 und Free Pascal veröffentlichen und zig Bücher erwähnen… Achja!

In den letzten Wochen habe ich einen Vortrag vor unterschiedlichem Publikum gehalten: einem kleinen Typographie-Seminar an der Hochschule für Gestaltung (5.11.2008), dem Entropia (16.11.2008) und dem Institut für Betriebs- und Dialogsysteme, Forschungsbereich Angewandte Geometrie und Computergraphik unter der Leitung von Herrn Professor Prautzsch, der so freundlich gewesen ist, gleich eine Einladung an die Mitarbeiter der Fakultät für Informatik vorzuschlagen. Dieser sind — sehr zu meiner Freude — Mitglieder und Leiter verschiedener Institute gefolgt:


Geschichte des Schriftsatzes und des Buchdruckes

Donald Knuth, Digital Typography, Slide 0, Kyoto Prize 1996; click for a larger version (188 kB).

Ausgehend von der Zeit der Frühdrucker in der Mitte des 15. Jahrhunderts wird in der ersten Hälfte des Vortrags die Geschichte des Bleisatzes mit beweglichen Einzellettern bis in die 1970er Jahre beschrieben. Viele einzelne Erfindungen sind notwendig gewesen, um dem modernen Buchdruck den Weg zu bereiten; ihre Geschichte reicht bis ins zweite Jahrhundert zurück, und darf nicht völlig unerwähnt bleiben.

Den Beginn der zweiten Vortragshälfte bildet der Offsetdruck, eine Weiterentwicklung der Lithographie, der schließlich das Ende des Buchdruckes mit Bleilettern einleitet. Mit Erfin- dung der Digitalen Druckplattenbelichtung (computer-to-plate) und des Laserdruckers beginnt es für uns Informatiker interessant zu werden. Donald Knuth, zunächst zutiefst erschrocken über die Druckerzeugnisse der photographischen Offsetmaschinen der 70er Jahre und kurz dar- auf ebenso verzückt von der Detailschärfe der ersten digital angesteuerten Offsetgeräte, konnte nicht davon ablassen, ließ alles andere stehen und liegen, und widmete dem Problem letztlich viele Jahre: die Intention ästhetischer Buchstaben mathematisch zu beschreiben, sowie ein Pro- gramm zu schaffen, das diese Buchstaben in Bitmuster für beliebige Geräte umwandeln kann: METAFONT. Neben diesem sogenannten strich-basierten System sind heutzutage nahezu aus- schließlich Outline-Systeme verbreitet: PostScript, PDF, TrueType, OpenType etc. Diese werden abschließend umrissen.



Bei allen Gelegenheiten habe ich natürlich an das jeweilige Publikum leicht angepaßte Vorträge gehalten. (HfG-Studenten braucht man beispielsweise kaum erzählen, daß Schriften für jede eingesetzte Größe eigens gestaltet sein sollten (man sie also nicht linear skalieren sollte). Andererseits führt man die tollen Eigenschaften polynomialer Kurven in Bezier-Darstellungen dort ein wenig weniger mathematisch aus. Anders verhält es sich vor Professoren der Informatik.) Das Feedback ist bei allen Gelegenheiten äußert positiv gewesen, was mich natürlich sehr freut! Ich habe einen freien Vortrag ohne Folien gehalten; einen Beamer habe ausschließlich verwendet, um die viele Bilder an die Wand zu projizieren. Zwischendurch habe ich auch minutenlang ganz ohne neue Bilder erzählt, dafür teilweise mit Fragen ans Publikum.

Ich traue mich nicht so recht, all die achtzig, fast ausschließlich eingescannten Bilder ins Netz zu stellen. Viele sind zwar etwas älter, doch einige stammen aus jüngeren Büchern. Als kleinen Ersatz habe ich in dem Heftchen der Quellenangaben einen Bildnachweis für jedes einzelne Bild aufgeführt.

Ja, die Quellen sind etwas länglich geworden. Über die Jahre habe ich recht viele Bücher zum Thema gelesen, die ich nun zur Vortragsvorbereitung wieder hervorgekramt habe. Beziehungsweise habe herauskramen lassen, denn viele befinden sich im Magazin der Universitätsbibliothek Karlsruhe. Da man also auf diese nicht so leicht in der Bibliothek stoßen kann, habe ich sie alle aufgelistet und die besonders empfehlenswerten jeweils mit einem kleinen Pfeil markiert.

Es gibt die Quellenangaben als PDF für den Bildschirm sowie zum Ausdrucken als kleines Heftchen (doppelseitig drucken und einmal falten).

Zwei Audiomitschnitte habe ich zwar angefertigt, aber ob ich diese im Internet veröffentlichen möchte… Davon möchte ich zur Zeit doch eher absehen. Tut mir leid.


Abschließend einige Videolinks

Digibarn: Xerox Star 8010 Interfaces (1981), What You See Is What You Get; click for a larger version (511 kB).


Vielen Dank für die rege Teilnahme!

The single most important truth about mankind

June 4, 2008, Literature
Last edited on June 4, 2008

"I'm not sure that if I hadn't met people from Tarnover I would believe you. If I can judge by them, through . . ."

"Be assured they're typical. They've been systematically steered away from understanding of the single most important truth about mankind. It's as though you were to comb the continent for the kindest, most generous, most considerate individuals you could find, and then spend years persuading them that because such attitudes are rare, they must be abnormal and should be cured."

"What most important truth?"

"You tell me. You've known it all your life. You live by its compass."

"Anything to do with my reason for getting interested in you in the first place? I noticed how hard you were trying to conform to a stock pattern. It seemed like a dreadful waste."

"That's it. One charge I made against Freeman which I won't retract: I accused him of dealing not in human beings but in approximations to a preordained model of a human being. I really am glad he decided to give it up. Bad habit!"

"Then I know what you're talking about. It's the uncertainty principle."

"Of course. The opposite of evil. Everything implied by that shopworn term 'free will.' Ever run across the phrase 'the new conformity'?"

"Yes, and it's terrifying. In an age when we have more choice than ever before, more mobility, more information, more opportunity to fulfill ourselves, how is it that people can prefer to be identical? The plug-in life-style makes me puke."

"But the concept has been sold with such persistence, the majority of people feel afraid not to agree that it's the best way of keeping track in a chaotic world. As it were: 'Everybody else says it is—who am I to argue?'"

"I am I."

"Tat tvam asi."

John Brunner, The Shockwave Rider, 1975, pp. 233/234.


Tolles Buch. Am Anfang bin ich nicht gut reingekommen, aber nach vierzig, fünfzig Seiten hat sich das gegeben, und im Gegenteil hat das Buch angefangen, mir sehr zu gefallen.

Older entries...

Select a Theme:

Basilique du Sacré-Coeur de Montmartre (Paris) Parc Floral de Paris Castillo de Santa Barbara (Alicante) About the photos

Entries: