Pan


... [ Seminar "Einführung in Haskell" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ...

Pan


Einleitung

Pan ist eine als Compiler implementiere DSEL, die auf einem C Compiler aufsetzt. Zur Zeit ist noch der MS C++ Compiler erforderlich, allerdings ist die Portation auf an C Compiler möglich.
Es gibt zwei Versionen

Effekte

Der Pan Compiler unterstützt folgende verschiedene
Typen von Effekten:

type Image c
=
PointE → c
type ImageB c
=
TimeE → Image c (1)
type Filter c
=
ImageC → Image c
type FilterB c
=
ImageC → ImageB c (1)
type ImageCombiner
=
ImageC → ImageC → ImageBC

(1) Diese Typen bezeihen sich auf Animationen.

Hierfür gibt es compile Funktionen:

type Compiler a     = String → UI a → IO ()

compileImage
::
ToColor c => Compiler (Image c)
compileImageB
::
ToColor c => Compiler (ImageB c)
compileFilter
::
ToColor c => Compiler (Filter c)
compileFilterB
::
ToColor c => Compiler (FilterB c)
compileCombiner
::
Compiler ImageCombiner

Ziele

Pan kann für verschiedene Ziele compilieren:

  • Component
:
Erzeugt eine (*.pef) Pan Effekt Datei für den Pan Component Viewer, Dateien können geladen und gespeichert werden.
  • Standalone
:
Erzeugt eine ausführbare Datei, vergleichbar mit Component, aber weniger Funktionen
  • DXTransform
:
DirectX Transformation, lässt sich in Webseiten integrieren.
  • PhotoShopFillter
:
Erzeugt ein Photoshop Plugin
  • Control
:
Erzeugt ein Active-X Element


Für jedes Ziel gibt es entsprechende compile Funktionen:

allBackends :: [Backend]
allBackends = [Standalone,Component,DXTransform,PhotoShopFilter]

type CompilerFor a = [Backend] → Compiler a

compileImageFor
::
ToColor c => CompilerFor (Image c)
compileImageBFor
::
ToColor c => CompilerFor (ImageB c)
compileFilterFor
::
ToColor c => CompilerFor (Filter c)
compileFilterBFor 
::
ToColor c => CompilerFor (FilterB c)
compileCombinerFor
::
CompilerFor ImageCombiner

Beispielaufruf

compileFilterFor [PhotoShopFilter] "ripple" rippleUI


UIs

UIs  - User Interfaces
Pan stellt UIs zur Verfügung, mit denen sich Eigenschaften  der Filter variieren lassen.

liftM
::
(Monad m) => (a1 → r) → m a1 → m r
liftM f m1
=
do { x1 <- m1; return (f x1) }
Beispiel für ein UI. Hier lässt sich der Radius von alternierenden Ringen verändern.
altRingsUI
::
UI Region
altRingsUI
=
liftM (flip uscale altRings

(slider "ring size" (0,100) 20)






... [ Seminar "Einführung in Haskell" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ nach oben ] ...