add cmft studio + hdr maps

main
Dominik Madarász 2024-03-20 21:25:47 +01:00
parent 7efc59079a
commit 082f78d25f
327 changed files with 8225 additions and 19 deletions

View File

@ -1259,15 +1259,16 @@ typedef struct skybox_t {
handle program; handle program;
mesh_t geometry; mesh_t geometry;
cubemap_t cubemap; cubemap_t cubemap;
cubemap_t refl_cubemap;
cubemap_t env_cubemap; cubemap_t env_cubemap;
int flags; int flags;
int framebuffers[6]; int framebuffers[6];
int textures[6]; int textures[6];
float *pixels; float *pixels;
texture_t refl, env; texture_t sky, refl, env;
} skybox_t; } skybox_t;
skybox_t skybox(const char *panorama_or_cubemap_folder, int flags); skybox_t skybox(const char *panorama_or_cubemap_folder, int flags);
skybox_t skybox_pbr(const char *refl_map, const char *env_map); skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map);
int skybox_render(skybox_t *sky, mat44 proj, mat44 view); int skybox_render(skybox_t *sky, mat44 proj, mat44 view);
void skybox_destroy(skybox_t *sky); void skybox_destroy(skybox_t *sky);
void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity); void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity);

View File

@ -7,6 +7,9 @@
const char *skyboxes[][2] = { // reflection, env, metadata const char *skyboxes[][2] = { // reflection, env, metadata
{"hdr/graffiti_shelter_4k.hdr","hdr/graffiti_shelter_Env.hdr"},
{"hdr/music_hall_01_4k.hdr","hdr/music_hall_01_Env.hdr"},
{"hdr/the_sky_is_on_fire_2k.hdr","hdr/the_sky_is_on_fire_Env.hdr"},
{"hdr/Tokyo_BigSight_1k.hdr","hdr/Tokyo_BigSight_Env.hdr"}, {"hdr/Tokyo_BigSight_1k.hdr","hdr/Tokyo_BigSight_Env.hdr"},
{"hdr/GCanyon_C_YumaPoint_1k.hdr","hdr/GCanyon_C_YumaPoint_Env.hdr"}, {"hdr/GCanyon_C_YumaPoint_1k.hdr","hdr/GCanyon_C_YumaPoint_Env.hdr"},
{"hdr/Factory_Catwalk_1k.hdr","hdr/Factory_Catwalk_Env.hdr"}, {"hdr/Factory_Catwalk_1k.hdr","hdr/Factory_Catwalk_Env.hdr"},
@ -73,7 +76,7 @@ int main() {
light_type(l, LIGHT_POINT); light_type(l, LIGHT_POINT);
// load skybox // load skybox
scene_get_active()->skybox = skybox_pbr("hdr/Tokyo_BigSight_1k.hdr","hdr/Tokyo_BigSight_Env.hdr"); scene_get_active()->skybox = skybox_pbr(skyboxes[0][0], skyboxes[0][0], skyboxes[0][1]);
while(window_swap() && !input(KEY_ESC)) { while(window_swap() && !input(KEY_ESC)) {
@ -111,7 +114,7 @@ int main() {
// bool selected = !strcmp(g_skybox.reflection->filename, file_name(filename)); // bool selected = !strcmp(g_skybox.reflection->filename, file_name(filename));
bool selected = false; bool selected = false;
if( ui_bool( filename, &selected ) ) { if( ui_bool( filename, &selected ) ) {
scene_get_active()->skybox = skybox_pbr(skyboxes[i][0], skyboxes[i][1]); scene_get_active()->skybox = skybox_pbr(skyboxes[i][0], skyboxes[i][0], skyboxes[i][1]);
} }
} }
ui_panel_end(); ui_panel_end();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -17458,6 +17458,7 @@ typedef struct skybox_t {
handle program; handle program;
mesh_t geometry; mesh_t geometry;
cubemap_t cubemap; cubemap_t cubemap;
cubemap_t refl_cubemap;
cubemap_t env_cubemap; cubemap_t env_cubemap;
int flags; int flags;
@ -17467,11 +17468,11 @@ typedef struct skybox_t {
float *pixels; float *pixels;
// pbr // pbr
texture_t refl, env; texture_t sky, refl, env;
} skybox_t; } skybox_t;
API skybox_t skybox(const char *panorama_or_cubemap_folder, int flags); API skybox_t skybox(const char *panorama_or_cubemap_folder, int flags);
API skybox_t skybox_pbr(const char *refl_map, const char *env_map); API skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map);
API int skybox_render(skybox_t *sky, mat44 proj, mat44 view); API int skybox_render(skybox_t *sky, mat44 proj, mat44 view);
API void skybox_destroy(skybox_t *sky); API void skybox_destroy(skybox_t *sky);
API void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity); API void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity);
@ -371705,7 +371706,7 @@ texture_t load_env_tex( const char *pathfile, unsigned flags ) {
return t; return t;
} }
skybox_t skybox_pbr(const char *refl_map, const char *env_map) { skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map) {
skybox_t sky = {0}; skybox_t sky = {0};
// sky mesh // sky mesh
@ -371720,12 +371721,33 @@ skybox_t skybox_pbr(const char *refl_map, const char *env_map) {
"att_position", "fragcolor", NULL); "att_position", "fragcolor", NULL);
// sky cubemap & SH // sky cubemap & SH
if( sky_map ) {
int is_panorama = vfs_size( sky_map );
if( is_panorama ) { // is file
stbi_hdr_to_ldr_gamma(1.2f);
image_t panorama = image( sky_map, IMAGE_RGBA );
sky.cubemap = cubemap( panorama, 0 ); // RGBA required
image_destroy(&panorama);
} else { // is folder
image_t images[6] = {0};
images[0] = image( va("%s/posx", sky_map), IMAGE_RGB ); // cubepx
images[1] = image( va("%s/negx", sky_map), IMAGE_RGB ); // cubenx
images[2] = image( va("%s/posy", sky_map), IMAGE_RGB ); // cubepy
images[3] = image( va("%s/negy", sky_map), IMAGE_RGB ); // cubeny
images[4] = image( va("%s/posz", sky_map), IMAGE_RGB ); // cubepz
images[5] = image( va("%s/negz", sky_map), IMAGE_RGB ); // cubenz
sky.cubemap = cubemap6( images, 0 );
for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]);
}
sky.refl = load_env_tex(refl_map, TEXTURE_SRGB);
}
if( refl_map ) { if( refl_map ) {
int is_panorama = vfs_size( refl_map ); int is_panorama = vfs_size( refl_map );
if( is_panorama ) { // is file if( is_panorama ) { // is file
stbi_hdr_to_ldr_gamma(1.2f); stbi_hdr_to_ldr_gamma(1.2f);
image_t panorama = image( refl_map, IMAGE_RGBA ); image_t panorama = image( refl_map, IMAGE_RGBA );
sky.cubemap = cubemap( panorama, 0 ); // RGBA required sky.refl_cubemap = cubemap( panorama, 0 ); // RGBA required
image_destroy(&panorama); image_destroy(&panorama);
} else { // is folder } else { // is folder
image_t images[6] = {0}; image_t images[6] = {0};
@ -371735,7 +371757,7 @@ skybox_t skybox_pbr(const char *refl_map, const char *env_map) {
images[3] = image( va("%s/negy", refl_map), IMAGE_RGB ); // cubeny images[3] = image( va("%s/negy", refl_map), IMAGE_RGB ); // cubeny
images[4] = image( va("%s/posz", refl_map), IMAGE_RGB ); // cubepz images[4] = image( va("%s/posz", refl_map), IMAGE_RGB ); // cubepz
images[5] = image( va("%s/negz", refl_map), IMAGE_RGB ); // cubenz images[5] = image( va("%s/negz", refl_map), IMAGE_RGB ); // cubenz
sky.cubemap = cubemap6( images, 0 ); sky.refl_cubemap = cubemap6( images, 0 );
for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]); for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]);
} }

View File

@ -1677,7 +1677,7 @@ texture_t load_env_tex( const char *pathfile, unsigned flags ) {
return t; return t;
} }
skybox_t skybox_pbr(const char *refl_map, const char *env_map) { skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map) {
skybox_t sky = {0}; skybox_t sky = {0};
// sky mesh // sky mesh
@ -1692,12 +1692,33 @@ skybox_t skybox_pbr(const char *refl_map, const char *env_map) {
"att_position", "fragcolor", NULL); "att_position", "fragcolor", NULL);
// sky cubemap & SH // sky cubemap & SH
if( sky_map ) {
int is_panorama = vfs_size( sky_map );
if( is_panorama ) { // is file
stbi_hdr_to_ldr_gamma(1.2f);
image_t panorama = image( sky_map, IMAGE_RGBA );
sky.cubemap = cubemap( panorama, 0 ); // RGBA required
image_destroy(&panorama);
} else { // is folder
image_t images[6] = {0};
images[0] = image( va("%s/posx", sky_map), IMAGE_RGB ); // cubepx
images[1] = image( va("%s/negx", sky_map), IMAGE_RGB ); // cubenx
images[2] = image( va("%s/posy", sky_map), IMAGE_RGB ); // cubepy
images[3] = image( va("%s/negy", sky_map), IMAGE_RGB ); // cubeny
images[4] = image( va("%s/posz", sky_map), IMAGE_RGB ); // cubepz
images[5] = image( va("%s/negz", sky_map), IMAGE_RGB ); // cubenz
sky.cubemap = cubemap6( images, 0 );
for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]);
}
sky.refl = load_env_tex(refl_map, TEXTURE_SRGB);
}
if( refl_map ) { if( refl_map ) {
int is_panorama = vfs_size( refl_map ); int is_panorama = vfs_size( refl_map );
if( is_panorama ) { // is file if( is_panorama ) { // is file
stbi_hdr_to_ldr_gamma(1.2f); stbi_hdr_to_ldr_gamma(1.2f);
image_t panorama = image( refl_map, IMAGE_RGBA ); image_t panorama = image( refl_map, IMAGE_RGBA );
sky.cubemap = cubemap( panorama, 0 ); // RGBA required sky.refl_cubemap = cubemap( panorama, 0 ); // RGBA required
image_destroy(&panorama); image_destroy(&panorama);
} else { // is folder } else { // is folder
image_t images[6] = {0}; image_t images[6] = {0};
@ -1707,7 +1728,7 @@ skybox_t skybox_pbr(const char *refl_map, const char *env_map) {
images[3] = image( va("%s/negy", refl_map), IMAGE_RGB ); // cubeny images[3] = image( va("%s/negy", refl_map), IMAGE_RGB ); // cubeny
images[4] = image( va("%s/posz", refl_map), IMAGE_RGB ); // cubepz images[4] = image( va("%s/posz", refl_map), IMAGE_RGB ); // cubepz
images[5] = image( va("%s/negz", refl_map), IMAGE_RGB ); // cubenz images[5] = image( va("%s/negz", refl_map), IMAGE_RGB ); // cubenz
sky.cubemap = cubemap6( images, 0 ); sky.refl_cubemap = cubemap6( images, 0 );
for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]); for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]);
} }

View File

@ -436,6 +436,7 @@ typedef struct skybox_t {
handle program; handle program;
mesh_t geometry; mesh_t geometry;
cubemap_t cubemap; cubemap_t cubemap;
cubemap_t refl_cubemap;
cubemap_t env_cubemap; cubemap_t env_cubemap;
int flags; int flags;
@ -445,11 +446,11 @@ typedef struct skybox_t {
float *pixels; float *pixels;
// pbr // pbr
texture_t refl, env; texture_t sky, refl, env;
} skybox_t; } skybox_t;
API skybox_t skybox(const char *panorama_or_cubemap_folder, int flags); API skybox_t skybox(const char *panorama_or_cubemap_folder, int flags);
API skybox_t skybox_pbr(const char *refl_map, const char *env_map); API skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map);
API int skybox_render(skybox_t *sky, mat44 proj, mat44 view); API int skybox_render(skybox_t *sky, mat44 proj, mat44 view);
API void skybox_destroy(skybox_t *sky); API void skybox_destroy(skybox_t *sky);
API void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity); API void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity);

View File

@ -18851,7 +18851,7 @@ texture_t load_env_tex( const char *pathfile, unsigned flags ) {
return t; return t;
} }
skybox_t skybox_pbr(const char *refl_map, const char *env_map) { skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map) {
skybox_t sky = {0}; skybox_t sky = {0};
// sky mesh // sky mesh
@ -18866,12 +18866,33 @@ skybox_t skybox_pbr(const char *refl_map, const char *env_map) {
"att_position", "fragcolor", NULL); "att_position", "fragcolor", NULL);
// sky cubemap & SH // sky cubemap & SH
if( sky_map ) {
int is_panorama = vfs_size( sky_map );
if( is_panorama ) { // is file
stbi_hdr_to_ldr_gamma(1.2f);
image_t panorama = image( sky_map, IMAGE_RGBA );
sky.cubemap = cubemap( panorama, 0 ); // RGBA required
image_destroy(&panorama);
} else { // is folder
image_t images[6] = {0};
images[0] = image( va("%s/posx", sky_map), IMAGE_RGB ); // cubepx
images[1] = image( va("%s/negx", sky_map), IMAGE_RGB ); // cubenx
images[2] = image( va("%s/posy", sky_map), IMAGE_RGB ); // cubepy
images[3] = image( va("%s/negy", sky_map), IMAGE_RGB ); // cubeny
images[4] = image( va("%s/posz", sky_map), IMAGE_RGB ); // cubepz
images[5] = image( va("%s/negz", sky_map), IMAGE_RGB ); // cubenz
sky.cubemap = cubemap6( images, 0 );
for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]);
}
sky.refl = load_env_tex(refl_map, TEXTURE_SRGB);
}
if( refl_map ) { if( refl_map ) {
int is_panorama = vfs_size( refl_map ); int is_panorama = vfs_size( refl_map );
if( is_panorama ) { // is file if( is_panorama ) { // is file
stbi_hdr_to_ldr_gamma(1.2f); stbi_hdr_to_ldr_gamma(1.2f);
image_t panorama = image( refl_map, IMAGE_RGBA ); image_t panorama = image( refl_map, IMAGE_RGBA );
sky.cubemap = cubemap( panorama, 0 ); // RGBA required sky.refl_cubemap = cubemap( panorama, 0 ); // RGBA required
image_destroy(&panorama); image_destroy(&panorama);
} else { // is folder } else { // is folder
image_t images[6] = {0}; image_t images[6] = {0};
@ -18881,7 +18902,7 @@ skybox_t skybox_pbr(const char *refl_map, const char *env_map) {
images[3] = image( va("%s/negy", refl_map), IMAGE_RGB ); // cubeny images[3] = image( va("%s/negy", refl_map), IMAGE_RGB ); // cubeny
images[4] = image( va("%s/posz", refl_map), IMAGE_RGB ); // cubepz images[4] = image( va("%s/posz", refl_map), IMAGE_RGB ); // cubepz
images[5] = image( va("%s/negz", refl_map), IMAGE_RGB ); // cubenz images[5] = image( va("%s/negz", refl_map), IMAGE_RGB ); // cubenz
sky.cubemap = cubemap6( images, 0 ); sky.refl_cubemap = cubemap6( images, 0 );
for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]); for( int i = 0; i < countof(images); ++i ) image_destroy(&images[i]);
} }

View File

@ -3525,6 +3525,7 @@ typedef struct skybox_t {
handle program; handle program;
mesh_t geometry; mesh_t geometry;
cubemap_t cubemap; cubemap_t cubemap;
cubemap_t refl_cubemap;
cubemap_t env_cubemap; cubemap_t env_cubemap;
int flags; int flags;
@ -3534,11 +3535,11 @@ typedef struct skybox_t {
float *pixels; float *pixels;
// pbr // pbr
texture_t refl, env; texture_t sky, refl, env;
} skybox_t; } skybox_t;
API skybox_t skybox(const char *panorama_or_cubemap_folder, int flags); API skybox_t skybox(const char *panorama_or_cubemap_folder, int flags);
API skybox_t skybox_pbr(const char *refl_map, const char *env_map); API skybox_t skybox_pbr(const char *sky_map, const char *refl_map, const char *env_map);
API int skybox_render(skybox_t *sky, mat44 proj, mat44 view); API int skybox_render(skybox_t *sky, mat44 proj, mat44 view);
API void skybox_destroy(skybox_t *sky); API void skybox_destroy(skybox_t *sky);
API void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity); API void skybox_mie_calc_sh(skybox_t *sky, float sky_intensity);

Binary file not shown.

View File

@ -0,0 +1,42 @@
If I forgot to add someone to this list please let me know.
Main developers, improvements, bug fixing:
Davide Anastasia (Lead Project Mantainer & Mac OS X support)
<davideanastasia@users.sourceforge.net>
Daniel Kaneider (Windows Setup and Optimisation, Head of i18n Support)
<danielkaneider@users.sourceforge.net>
Franco Comida (Developer, Linux support, Maintainer Fedora Package)
<fcomida@users.sourceforge.net>
Bruce Guenter
Contributors, in last name alphabetical order:
Frank Boehme (various suggestions)
Maciej Dworak
Jean-Christophe Frisch
Ignacy Gawedzki (tiff ldr bugfixes and suggestion)
Arne Hagenah (various suggestions)
Antoine Latter
Erik Ouchterlony
Bertrand Petit (FreeBSD patch)
Nicholas Phillips (MTB alignment code)
Sloan Poe (found and fixed bug regarding legacy actions signal)
Alexandre Prokoudine (gui improvements, desktop integration)
Markus Schmaus (found and fixed bug in Debevec and Robertson02)
Douglas E. Warner (FC6 packager and bug reports)
Ingo Weyrich (speedups, reduction of memory usage, Windows msys2 build instructions)
Translators:
http://qtpfsgui.sourceforge.net/?page_id=23
Original author:
Giuseppe Rota <grota@sourceforge.net>

View File

@ -0,0 +1,455 @@
Changes 2.6.0
NEW: New tonemapping operator kimkautz08
NEW: New tonemapping operator lischinski06
NEW: New tonemapping operator vanhateren06
NEW: New tonemapping operator ferwerda96
NEW: Preview of created HDR in HDR Wizard
NEW: Post processing gamma and saturation
* great speedup and better memory usage for all tonemapping operators
* speedup for hdr creation
* usual bug fixing
Changes 2.5.1
NEW: Selectable threshold for adjusting levels
NEW: Optional Lanczos interpolation
NEW: Antialiased display of images
NEW: Navigation of images in fullscreen
NEW: Online documentation
* many fixes in HDR creation for all profiles
* minor cosmetic fixes to the UI
Changes 2.5.0
NEW: New tonemapping operator ferradans11
NEW: New tonemapping operator mai11
NEW: Better HiDPI support
NEW: Better CLI interface, also for Windows
NEW: "Fast Export", which renders current image in full size
NEW: Export to HTML (Create a webpage with embedded HDR viewer)
NEW: Optional automatic adjustment of LDRs levels
NEW: List version of supported cameras for RAW files (and some libraw info)
NEW: New UI "Dark Theme"
NEW: Switch UI Full Screen (F11), show LDRs and HDRs Full Screen (F10)
NEW: Portuguese (Brazil) translation
* more robust hugin align
* Fix various crashes
* greater EV values range in HdrWizard
* better printing support and print preview in HelpBrowser
* restore load/save curves in HdrWizard
Changes 2.4.0
NEW: Automatic anti-ghosting and improved manual anti-ghosting
NEW: FITS Importer to merge and tonemap astronomic images
NEW: Automatic white-balance for both HDRs and LDRs
NEW: switch to Transifex translation platform for current and future translations
NEW: Windows: integration into the operating system (jumplist, progress bar)
* HDR Creation with small UX improvements
* changed EXIF detection for the HDR creation
* switch to Qt5
* refactored code base for a future libHDR library
* improved Debevec radiance map construction
Changes 2.3.1
* Automatically Update Checker
* Update libraries (in particular, LibRAW)
* Support for TIFF 32 bit floating point (compatible with Adobe Lightroom 4)
* Improved EXR, TIFF, JPEG and PNG I/O
* Improved color conversion routines
* NEW: Hugin's alignment: Autocrop feature (thanks to David Polák)
* NEW: Support additional demosaicing algorithms, AMaZE as default
* NEW: Save HDR creation profiles
* NEW: Copy EXIF tags to tonemapped images automatically
* NEW: Portable mode
* NEW: Testing realtime previews (beta functionality)
* Anti-ghosting working again
* Speed improvements to various TMO algorithms
* Speed improvements to merge algorithms
* New Danish translation
Changes 2.3.0
* New Fattal02 solver based on FFT (thanks to Tino Kluge)
* Port of color management system to LCMS2
* Improved fit between saved files and preview
* UI improvements (tonemapping warning dialog)
* Update translations
* Bug fixes
Changes 2.3.0-beta1
* NEW: colour management system
The new colour management system allows to load colour profile for screen and printer so
that users can double-check the final quality of their HDR images before being saved to
JPEG or PNG.
* Windows: new task bar progress report
* Improved load/save of calculated profile for the merge operator
* Improved JPG, PNG and TIFF reader and writer
Changes 2.2.1
* NEW: splitted executable luminance-hdr-cli for commandline mode
* NEW: Windows Installer optionally registers file associations
* Aborting Batch HDR creation and batch tonemapping is now possible
* Speed improvements in Reinhard05
* Language change without restarting application
* Corrected detection of exif rotation
* Windows: TIFF support now works correctly (at all)
* Windows: fixed some align_image_stack and temp dir problems
* Development: new module system
* Development: fixed help install and i18n path under Linux
Changes 2.2.0
* NEW: BatchHDR tool
* NEW: LDRs can be saved as 16 bit Tiffs
* NEW: Samsung(s) RAW file support
* NEW: Speed improvement due to OpenMP
* More speed improvements: tone-mapping (Mantiuk 06/08, Fattal, Reinhard)
* NEW: image viewers with improved crop/selection tool
* Improvement and optimised level and gamma control (new histogram)
* Improved UI: Tonemapping Panel, Preference Dialog and Mainwindow
* Revert HDR merge algorithms to Qtpfsgui 1.8.12
* Supporting better portrait HDRs
* Windows: fix for file name and temp directory problems
* Better support for filesystem character encoding
* Library updates: Qt, LibRaw 0.14.5, exiv2
* Updated translations (Italian, German, Romanian)
* Development: changing build system from qmake to cmake
* Development: update Windows building scripts
* Development: migration from SVN to Git
* Development: support for FreeBSD9
TODO: redesign UI of Preview Panel and HdrWizard (possibly using QWizard)
TODO: improve preset store/load (maybe use XML files?)
Changes 2.1.0
* Merge MainWindow and TonemappingWindow
* MainWindow works using the SDI concept, instead then MDI (multiple MainWindow can be
open at the same time and work in parallel)
* Tabbed images (HDR or LDR) inside the MainWindow
* New preview widget (PreviewPanel)
* Improved HDR creation Wizard (images can be removed and added)
* Improved Batch Tonemapping: the final size of the tonemapping is read from file,
allowing custom output size
* New I/O engine (runs in a separated thread and shows the status during the operation)
* Improved RAW conversion
* Improved Help
Changes 2.0.2
* New BatchTM Processing engine
* Sorted leaks in freeing memory from pfs::Channel
Changes 2.0.2-pre1
* Smaller memory footprint during the TM process
* [Windows only] improved responsiveness of the UI during the Mantiuk TMO
* [Windows only] update of the library in the package with the latest release (not yet
completed)
* LibRAW is now in charge to convert RAW files, removing the dependency from dcraw as an
external tool (Thanks to Franco Comida)
* [Mac only] Luminance HDR 2.0.2 works on Mac OS X 10.5.X (64 bits version for Snow
Leopard also planned, but not yet released)
* [Mac only] Better UI in Mac OS X (looks cleaner and closer to the Mac style)
* Huge memory leak during the HDR creation process has been sorted out. The overall
procedure is now much faster and uses less memory (much less memory)
* Huge clean of compilation errors and wrong memory allocation/release (Thanks to
Elizabeth Oldham)
* [Linux only] Multithread support is active again and improved
* [FreeBSD] Cleaner compilation (Thanks to Joao Rocha Braga Filho, Maintainer of
Luminance HDR for FreeBSD)
TODO: Redesign of the UI
Changes 2.0.1
* Proper colorspace conversion in Mantiuk06
* OpenMP support disabled
Changes 2.0.0
* Project renamed from 'Qtpfsgui' to 'LuminanceHDR'
* Cropping of HDR images
* Tonemapping selections
* Threads manager
* Added mantiuk08
* New help browser and new help content
TODO: Check Flickr (and other external links) (actually mapped to 'luminance')
TODO: Repaint Icons in TMO dialog
Changes 1.9.3
* Performance improvements on MultiCore Machines
* Integrated pfstmo 1.3.x changes, including better Mantiuk performance
* Integration of Exiv 0.18 (tiff write capabilities in the "Copy EXIF Data" panel)
* Added Hungarian language (thanks to Peter Gaal)
* Added Indonesian language (thanks to Teddy Widhi Laksono)
* Drag and Drop support for HDR creation/opening
* UI improvements: new icons, cleanup of tonemapping panel
* added detail factor option to the mantiuk06 tmo, thanks to Dejan Beric
* Now using native file saving dialogs on Windows and Mac
* 'Save all' feature in tonemapping dialog.
* Many bugfixes, including the old filename problem
* Integrated pfstmo 1.3.x changes:
mantiuk06: Ed Brambley's bug-fix and convergence patch
mantiuk06: Ed Brambley's OpenMP patch
all: Fixes and optimization - see pfstmo ChangeLog for more information
* Renamed reinhard04 to reinhard05 (src directory and references)
* Improved linux packaging system: docs and html target directories can be specified
separately.
Changes 1.9.2:
* Fixed other bugs with non-ascii characters in paths/filenames.
* Integrated pfstmo 1.2 changes:
fixed some serious bugs in the solver and subsampling procedure the artifacts found in
some odd-sized images should be gone (this was actually the mantiuk change in qtpfsgui
1.9.0, thanks to Rafal).
Faster up-/down-sampling functions make the algorithm 25% faster. Thanks to Ed Brambley.
Performance improvements from Ed Brambley: lower memory consumption, faster solver,
Better convergence, additional scale parameter for the contrast equalization method.
(change in mantiuk parameters => new tmo file version + small changes in Fattal by Ed Brambley)
* Added support for align_image_stack commandline parameters and user language selection.
* Global: added 2 new fields in the singleton qtpfsgui class: QStringList for
align_image_stack options and a 2-chars ISO 639 language code for Qtpfsgui's user
interface.
* Improved comments with references for the algorithm that reads exif data to obtain
average global luminance (and EV).
Changes 1.9.1:
* Global: Now there's only one QSettings object and a saveLdr function (also cleaned
QtpfsguiOptions interface: singleton)
* Users can now save the preview of a HDR.
* Added panoramic functionality (GUI dialog and pfs-backend)
* Added sr2 to the list of legal raw extensions
* Fixed bug in exif code leading to crash when having utf8 characters in the path and/or
filename. This bug used to occur in all exif related code: getting EV values in the new
hdr wizard, writing exif comments in jpeg images (batch, cli, and interactive tm), and
copying exif values between files.
* Fixed bug that left a temporary tiff file from raw conversion when pressing ESC in the
new hdr wizard.
* bug 1888249 (sf tracker): fixed typos in manual
* fixed bugs in the cli interface
Changes 1.9.0:
* added manual anti-ghosting feature (for LDRs only).
* fixed mantiuk glitch.
* the online and offline documentation has been updated.
* removed integrated dcraw implementation (now calling external executable).
* fixed durand02 bug (range=0).
* added commandline interface.
* clicking on the tone mapper progress bar will terminate the tone mapping process.
* reinhard04 renamed to reinhard05.
* added hdrInputLoader, a class that loads a ldr/mdr file (input for hdr) in a threaded way
* removed "_impl" from batch gui and exif copy classes filenames.
* renamed aligndialog to editing_tools.
* moved common low-level hdr creation files (and mtb implementation) in the HdrCreation dir.
* moved config.h, gang.{h,cpp} panIconWidget.{h,cpp} smart_scroll_area.{h,cpp} to dir "Common".
* renamed alignmentdialog_impl.{h,cpp} to editingTools
* moved previewWidget.{h,cpp} to HdrWizard.
* renamed options_impl.{h,cpp} -> preferencesDialog.{h,cpp}.
* integrated pfstools 1.6.3 changes.
* fix for gcc 4.3
* added Indonesian translation
02-08-2007 v1.8.12
* 2 New Auto Alignment Engines: hugin's align_image_stack and Greg Ward's Median Threshold
Bitmap, see http://qtpfsgui.wiki.sourceforge.net/align_image_stack
* New manual alignment dialog (for small position refinements after the automatic alignment
step, for example).
* Now checking that images have all the same size while creating the hdr.
* Removed last page in the hdr creation wizard.
* Showing hdr list in windows menu item.
* Added an "About Qtpfsgui" info dialog in the main window.
* (linux) Installing doc (README AUTHORS COPYING ...) files as well in the make install step.
* Now is possible to load jpeg and tiff in the same set.
* Added czech translation
* Changed order of tone mapping tabs.
* Fixed tone mapping settings file parsing bug (fattal).
* Fixed "shortcuts assert" crash.
* Improved batch dialog behavior (disable widget during tone mapping).
* Fixed some small graphical glitches (removed dot from tooltips).
* Added "what's this" descriptions & actions.
* fixed potential buffer overflow security bug.
* Modified icon apply.
31-07-2007 v1.8.11
* added custom size result
* added new operator: mantiuk06
* fattal: added checkbox to enable "old" (pre 1.8.4) behaviour
* fattal: added noise reduction patch (pfstmo 1.1)
* reinhard04: renamed to reinhard05 (following pfstmo's rename)
* reinhard04: synched with pfstmo 1.1 (chromatic & light adaptation)
* exif copy tool: added log, cleaned the code (more robust).
* saving hdr before tone mapping is not required anymore
* gamma and levels: fixed bug: changing the numerical value is the same as dragging the triangles.
* qtpfsgui version added to exif data.
* added pfstmo's gcc switches.
* small bugs & typos.
14-07-2007 v1.8.10
* OpenEXR file format available in win32 as well
* Initial implementation of batch functionality
* Added arch-dependend source files for FreeBSD
* Fixed segfault for Qt 4.2.1
* Loading HDRs is a threaded operation now
* Added build option to enable/disable debug statements (see README).
* Usability patch when user has to specify the EV manually
* Added turkish translation
* Restructured source tree
* Added run-time check for correct dll placement.
* Included pfstools patch for XYZ<->sRGB color space transformation
* Using Qt4 endiannes detection
09-06-2007 v1.8.9
* fixed serious bug related to the creation of an hdr image.
* fixed incompatibilities between Qt 4.1.x and Qt 4.2.x that prevented a successful compilation.
* The following languages are being shipped in the release: English, Italian, German,
Spanish, French and Polish.
* fixed fullsize bug in tonemapping panel
* fixed some textual inconsistencies.
* Added displaying options for the main toolbar.
* fixed in the README the instructions related to internationalization.
* Fixed another segfault (non-const constructor for QImage) at the end of the hdr creation
wizard.
15-05-2007 v1.8.8
* Fixed bug causing crash in windows.
* Qtpfsgui now can be translated in your language (supports internationalisation).
* Added "All supported files ..." file-filter where appropriate.
* Fixed "button does nothing" bug.
* Added shortcuts for menu items, fixed some visual text messages.
* Improved build system, better support for distro packagers (see README file).
* The hdr creation wizard now shows for how many remaining files we have to specify, in
manual mode, the EV value.
06-05-2007 v1.8.7
* fixed test for the correctness of the cache path (important for windows version).
* closed pending file descriptors.
* qtpfsgui warns the user when she attempts to close modified/unsaved HDRs in the
workspace and also when she closes the main window.
* fixed underscore and ~ for LDRs description.
* when attempting to load a non-existent recent files history entry qtpfsgui now removes
graphically that entry.
05-05-2007 v1.8.6
* fixed "QPaintEngine::setSystemClip" bug.
* solved a compile-time error with some version of Qt4.
* updated FAQ (in the html documentation).
28-04-2007 v1.8.5 Giuseppe Rota <grota@users.sourceforge.net>
* added progressbars in tonemapping status bar
* added some status_tips in tone mapping dialog
* added all available formats in load hdr dialog
* fixed filename path bug
* press and hold middle mouse button to scroll hdr and ldr images.
26-04-2007 v1.8.4 Giuseppe Rota <grota@users.sourceforge.net>
* The Tone mapping window has been restyled, so that now we can have multiple results at
the same time.
* Threaded execution keeps user interface responsive, and on a multi-processor machine
(SMP) each thread gets allocated on a different CPU.
* Qtpfsgui now caches intermediate results (using temporary files) for faster execution.
* Faster (post)gamma correction on LDR images.
* It is now possible to use Utf8 file names.
* Corrected bug in fattal tone mapping operator.
v1.8.3 Giuseppe Rota <grota@users.sourceforge.net>
* Added the possibility to load image files without exif data: the user will specify
manually the difference in exposure values (EV or stops).
* Added online documentation: manual,FAQ,hints.
* The tonemapping dialog remembers the last used filename.
* Fixed PowerPC compile-time alignment bug.
* Fixed aperture=0 bug.
18-03-2007 v1.8.2 Giuseppe Rota <grota@users.sourceforge.net>
* Qtpfsgui now supports tiff file formats in:
"File->Load HDR..." (8,16,32 bit and logluv tiff formats)
"File->Save HDR..." (32 bit and logluv tiff formats)
"File->New HDR..." (8 and 16 bit tiff formats)
* memory allocation via mmap (linux,mac) and virtualalloc (win32)
* added a missing newline in exif comments.
* fixed alignment bugs on PowerPC architectures ("blue image").
04-03-2007 v1.8.1 Giuseppe Rota <grota@users.sourceforge.net>
* new dialogs: resize and transplant
* new actions in mainwindow: transplant and resize
* now using doublespinboxes rather than QLineEdits in tonemapping dialog
* now using "apply" button
* initial dependency detection system when compiling in linux
* critical changes in gang.{h,cpp}, to use QDoubleSpinboxes
* hdrwizard: error message beautified
* hdrwizard & mainwindow: gathered all raw formats in 1 filter
* swapped increase/decrease exposure
* writing tonemapping parameters in output ldr
* updated icip06 exponent: 24->12 (it still seems to not work) :(
13-02-2007 Giuseppe Rota <grota@users.sourceforge.net>
* added initial raw image format input support in "Open Hdr..."
and in the "New Hdr..." wizard.
the raw import functionality is obtained via dcraw's code.
* added settings panel.
* added KDE/GNOME desktop integration
05-02-2007 Giuseppe Rota <grota@users.sourceforge.net>
* Fixed exif calculations when APEX values are used. This fixes another red-image hdr bug.
* Fixed a Segmentation Fault (const/noconst uchar*) bug that happens when compiling in
Linux (Suse 10.2) against recent versions of Qt4.
* Fixed some small memory leaks.
29-01-2006 Giuseppe Rota <grota@users.sourceforge.net>
* The only LDR image format supported is now JPEG, the one that has EXIF tags.
* better EXIF tag check: if exif data not found user is warned and operation is aborted
* code that displays negative hdr pixels in black has been commented out.
* libpfs: added renameRGBChannelsToXYZ() renameXYZChannelsToRGB() convertRGBChannelsToXYZ()
convertXYZChannelsToRGB()
* restored PFS stream compatibility (PFS stream has XYZ color chans, not RGB!).
* fixed color bug for reinhard04 tmo.
18-01-2006 Giuseppe Rota <grota@users.sourceforge.net>
* drastic changes in code layout/design aimed to reduce memory usage.
* "Fit to window" option now keeps image ratio.
* Faster computation of Durand va fftw3. Users need to download the new Win Dep Pckg
25-12-2006 Giuseppe Rota <grota@users.sourceforge.net>
Christmas changes:
* Initial anti-ghosting (BETA) feature.
* restored the "what you see is what you save" behaviour in TMO dialog. (fix saveLDR bug)
* removed buttons in the TMO section: modifying the settings implies istantaneous computation.
* fixed shortcuts action functionality.
* fixed save ldr dialog (if no extension specified it uses the one belonging to the current ``filter'')
* zoom in/out/original and fit to window enabled
* the application now remembers the last used directory for
open/save hdr
load/save settings
load input exposures
22-12-2006 Giuseppe Rota <grota@users.sourceforge.net>
v1.4
* tonemapping dialog: added save... load... line_edit pushbutton widgets.
* loading input ldr exposures starts from last used directory.
* loading input TMO settings file starts from last used directory.
* fixed stupid inefficiency while showing hdr.
* fixed memory leaks while closing hdr window.
* implemented loadsettings, savesettings, fromGui2Txt, fromTxt2Gui
20-12-2006 Giuseppe Rota <grota@users.sourceforge.net>
* Changed behaviour in the TMO dialog:
Combobox moved to the top of the preview image.
Clicking save you'll get the full (100%) input hdr tonemapped with current settings.
* Cleared some pfs buffers when the TMO dialog gets closed.
* Added a "Done!" label that shows up when the input ldr exposures have finished loading.
20-12-2006 Giuseppe Rota <grota@users.sourceforge.net>
* changed some #includes
* added comment showing original pfshdrcreate hack: it was NOT in svn, now it's there
only for future reference, in case it's needed.
* restructuring of svn repository in branches/qt4: moved hdrcreate* files into their own
directory
18-12-2006 Giuseppe Rota <grota@users.sourceforge.net>
v1.3
* fixed bug: some cameras (NIKON D50) don't write ISO values in the JPEGS. That led to a
wrong (completely red) hdr result. Now if qtpfsgui doesn't find a ISO value, it uses
internally a default value of ISO=100 for all input exposures.
15-12-2006 Giuseppe Rota <grota@users.sourceforge.net>
* created branch of qtpfsgui, using Qt4. (in svn the code is in branches/qtpfsgui-qt4)
* the code integrates libpfs/pfstmo/pfshdrcreate, now it's stand-alone.
* the code requires libexiv2-devel
* Compilable both in linux and in windows with mingw.
* supported hdr formats in windows are only: HDR(rgbe) and PFS.
Linux also supports OpenEXR. Still problems compiling OpenEXR in windows with MinGW,
seems like no one has ever done it... :(
Also, OpenEXR is compilable with Cygwin, but Qt (qmake and everything) doesn't work with
cygwin.

View File

@ -0,0 +1,341 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -0,0 +1,69 @@
# Luminance HDR
===============
Copyright (C) 2010-2019
- Davide Anastasia <davideanastasia@users.sourceforge.net>
- Franco Comida <fcomida@users.sourceforge.net>
- Daniel Kaneider <danielkaneider@users.sourceforge.net>
and many contributors and translators
Copyright (C) 2006-2010 - Giuseppe Rota <grota@users.sourceforge.net>
- Webpage: http://qtpfsgui.sourceforge.net
- Sourceforge: http://sourceforge.net/projects/qtpfsgui
- Github: https://github.com/LuminanceHDR/LuminanceHDR
What it is
----------
Luminance HDR is a graphical user interface (based on the Qt5 toolkit) that provides a complete workflow for HDR imaging.
Supported HDR formats:
* OpenEXR (extension: exr)
* Radiance RGBE (extension: hdr)
* Tiff formats: 16bit, 32bit (float) and LogLuv (extension: tiff)
* Raw image formats (extension: various)
* PFS native format (extension: pfs)
Supported LDR formats:
* JPEG, PNG, PPM, PBM, TIFF, FITS
Supported features:
* Create an HDR file from a set of images (JPEG, TIFF 8bit and 16bit, RAW)
of the same scene taken at different exposure setting
* Save and load HDR files
* Rotate and resize HDR files
* Tonemap HDR images
* Projective Transformations
* Copy EXIF data between sets of images
* Supports internationalization
Raw image formats are supported - and treated as HDR - thanks to [LibRAW](http://www.libraw.org/).
Make sure you read the "Dependencies" Section in the INSTALL file. If you intend to make a package for a GNU/Linux distribution, please refer to the same file for more information.
The code is in part based on the existing open source packages:
- "pfstools", "pfstmo" and "pfscalibration" by Grzegorz Krawczyk and Rafal Mantiuk
- "qpfstmo", by Nicholas Phillips.
Without their contribution all of this would have not been possible.
Dependencies
------------
Please, refer to the INSTALL file
Compiling the sources
---------------------
Please, refer to the INSTALL file
Contact and Links
-----------------
All comments and suggestions concerning this package or implementation of particular algorithm are welcome.
For bugs, or feature request, please refer to the BUGS file
See also:
* [PFStools](http://www.mpii.mpg.de/resources/pfstools/)
* [PFStmo (a tone mapping library)](http://www.mpii.mpg.de/resources/tmo/)
* [PFScalibration](http://www.mpii.mpg.de/resources/hdr/calibration/pfs.html)

View File

@ -0,0 +1,25 @@
1.000000, 0.000000
1.000000, 0.029169
1.000000, 0.063614
1.000000, 0.100425
1.000000, 0.139501
1.000000, 0.180528
1.000000, 0.223219
1.000000, 0.267228
1.000000, 0.312396
1.000000, 0.358571
1.000000, 0.405153
1.000000, 0.451895
1.000000, 0.498571
1.000000, 0.544955
1.000000, 0.590843
1.000000, 0.636067
1.000000, 0.680764
1.000000, 0.724061
1.000000, 0.766052
1.000000, 0.806596
1.000000, 0.845547
1.000000, 0.882793
1.000000, 0.918213
1.000000, 0.951773
0.985495, 0.983571
1 1.000000 0.000000
2 1.000000 0.029169
3 1.000000 0.063614
4 1.000000 0.100425
5 1.000000 0.139501
6 1.000000 0.180528
7 1.000000 0.223219
8 1.000000 0.267228
9 1.000000 0.312396
10 1.000000 0.358571
11 1.000000 0.405153
12 1.000000 0.451895
13 1.000000 0.498571
14 1.000000 0.544955
15 1.000000 0.590843
16 1.000000 0.636067
17 1.000000 0.680764
18 1.000000 0.724061
19 1.000000 0.766052
20 1.000000 0.806596
21 1.000000 0.845547
22 1.000000 0.882793
23 1.000000 0.918213
24 1.000000 0.951773
25 0.985495 0.983571

View File

@ -0,0 +1,25 @@
1.000000, 0.004753, 0.000806
1.000000, 0.077796, 0.000000
1.000000, 0.153789, 0.000000
1.000000, 0.232821, 0.000000
1.000000, 0.313796, 0.000000
1.000000, 0.395649, 0.000000
1.000000, 0.477428, 0.000000
1.000000, 0.558251, 0.000000
1.000000, 0.637553, 0.000000
1.000000, 0.714245, 0.000000
1.000000, 0.787620, 0.000000
1.000000, 0.857177, 0.000000
1.000000, 0.897915, 0.045207
1.000000, 0.931794, 0.101116
1.000000, 0.960051, 0.165419
0.828804, 1.000000, 0.230594
0.824994, 1.000000, 0.314135
0.815345, 1.000000, 0.399492
0.807275, 1.000000, 0.484852
0.792214, 1.000000, 0.569285
0.820934, 1.000000, 0.651947
0.888018, 1.000000, 0.732082
0.932047, 1.000000, 0.809024
1.000000, 0.930768, 0.886016
0.674939, 0.597552, 0.947762
1 1.000000 0.004753 0.000806
2 1.000000 0.077796 0.000000
3 1.000000 0.153789 0.000000
4 1.000000 0.232821 0.000000
5 1.000000 0.313796 0.000000
6 1.000000 0.395649 0.000000
7 1.000000 0.477428 0.000000
8 1.000000 0.558251 0.000000
9 1.000000 0.637553 0.000000
10 1.000000 0.714245 0.000000
11 1.000000 0.787620 0.000000
12 1.000000 0.857177 0.000000
13 1.000000 0.897915 0.045207
14 1.000000 0.931794 0.101116
15 1.000000 0.960051 0.165419
16 0.828804 1.000000 0.230594
17 0.824994 1.000000 0.314135
18 0.815345 1.000000 0.399492
19 0.807275 1.000000 0.484852
20 0.792214 1.000000 0.569285
21 0.820934 1.000000 0.651947
22 0.888018 1.000000 0.732082
23 0.932047 1.000000 0.809024
24 1.000000 0.930768 0.886016
25 0.674939 0.597552 0.947762

View File

@ -0,0 +1,25 @@
1.000000, 0.000000, 0.000000, 0.000000
1.000000, 0.107779, 0.000000, 0.000000
1.000000, 0.225141, 0.000000, 0.000000
1.000000, 0.346138, 0.000000, 0.000000
1.000000, 0.468157, 0.000000, 0.000000
1.000000, 0.588770, 0.000000, 0.000000
1.000000, 0.705845, 0.000000, 0.000000
1.000000, 0.817590, 0.000000, 0.000000
1.000000, 0.900184, 0.035347, 0.000000
1.000000, 0.949359, 0.116636, 0.000000
1.000000, 0.986104, 0.215020, 0.000000
0.939311, 1.000000, 0.330480, 0.000000
0.984719, 1.000000, 0.453535, 0.000000
0.983375, 1.000000, 0.575528, 0.000000
0.982920, 1.000000, 0.694216, 0.000000
0.981837, 1.000000, 0.807719, 0.000000
0.973294, 1.000000, 0.894052, 0.033054
1.000000, 0.944328, 0.946046, 0.117524
1.000000, 0.613026, 0.985231, 0.220520
0.824505, 0.830313, 1.000000, 0.340765
0.822916, 0.826307, 1.000000, 0.471029
0.828063, 0.831705, 1.000000, 0.600446
0.803956, 0.831663, 1.000000, 0.726575
0.734713, 0.805514, 1.000000, 0.847311
0.109163, 0.305546, 0.885145, 0.956582
1 1.000000 0.000000 0.000000 0.000000
2 1.000000 0.107779 0.000000 0.000000
3 1.000000 0.225141 0.000000 0.000000
4 1.000000 0.346138 0.000000 0.000000
5 1.000000 0.468157 0.000000 0.000000
6 1.000000 0.588770 0.000000 0.000000
7 1.000000 0.705845 0.000000 0.000000
8 1.000000 0.817590 0.000000 0.000000
9 1.000000 0.900184 0.035347 0.000000
10 1.000000 0.949359 0.116636 0.000000
11 1.000000 0.986104 0.215020 0.000000
12 0.939311 1.000000 0.330480 0.000000
13 0.984719 1.000000 0.453535 0.000000
14 0.983375 1.000000 0.575528 0.000000
15 0.982920 1.000000 0.694216 0.000000
16 0.981837 1.000000 0.807719 0.000000
17 0.973294 1.000000 0.894052 0.033054
18 1.000000 0.944328 0.946046 0.117524
19 1.000000 0.613026 0.985231 0.220520
20 0.824505 0.830313 1.000000 0.340765
21 0.822916 0.826307 1.000000 0.471029
22 0.828063 0.831705 1.000000 0.600446
23 0.803956 0.831663 1.000000 0.726575
24 0.734713 0.805514 1.000000 0.847311
25 0.109163 0.305546 0.885145 0.956582

View File

@ -0,0 +1,25 @@
1.000000, 0.004941, 0.000000, 0.000000, 0.000000
1.000000, 0.157191, 0.000000, 0.000000, 0.000000
1.000000, 0.316501, 0.000000, 0.000000, 0.000000
1.000000, 0.477850, 0.000000, 0.000000, 0.000000
1.000000, 0.636794, 0.000000, 0.000000, 0.000000
1.000000, 0.789464, 0.000000, 0.000000, 0.000000
1.000000, 0.891700, 0.056136, 0.000000, 0.000000
1.000000, 0.954463, 0.164808, 0.000000, 0.000000
0.995961, 1.000000, 0.298554, 0.000000, 0.000000
0.992357, 1.000000, 0.460134, 0.000000, 0.000000
0.992921, 1.000000, 0.619440, 0.000000, 0.000000
0.993587, 1.000000, 0.772463, 0.000000, 0.000000
0.994573, 1.000000, 0.874541, 0.057581, 0.000000
1.000000, 0.951017, 0.939871, 0.167569, 0.000000
1.000000, 0.328929, 0.988487, 0.302869, 0.000000
0.844179, 0.878493, 1.000000, 0.459841, 0.000000
0.804767, 0.851381, 1.000000, 0.623223, 0.000000
0.793615, 0.861199, 1.000000, 0.780415, 0.000000
0.750195, 0.823210, 1.000000, 0.887745, 0.056321
0.702168, 0.777604, 1.000000, 0.951909, 0.171740
0.563097, 0.610780, 0.754127, 1.000000, 0.312939
0.538779, 0.594761, 0.695918, 1.000000, 0.483468
0.413003, 0.469412, 0.564120, 1.000000, 0.652870
0.195722, 0.274036, 0.417979, 1.000000, 0.816901
0.095966, 0.000000, 0.000000, 0.911089, 0.966808
1 1.000000 0.004941 0.000000 0.000000 0.000000
2 1.000000 0.157191 0.000000 0.000000 0.000000
3 1.000000 0.316501 0.000000 0.000000 0.000000
4 1.000000 0.477850 0.000000 0.000000 0.000000
5 1.000000 0.636794 0.000000 0.000000 0.000000
6 1.000000 0.789464 0.000000 0.000000 0.000000
7 1.000000 0.891700 0.056136 0.000000 0.000000
8 1.000000 0.954463 0.164808 0.000000 0.000000
9 0.995961 1.000000 0.298554 0.000000 0.000000
10 0.992357 1.000000 0.460134 0.000000 0.000000
11 0.992921 1.000000 0.619440 0.000000 0.000000
12 0.993587 1.000000 0.772463 0.000000 0.000000
13 0.994573 1.000000 0.874541 0.057581 0.000000
14 1.000000 0.951017 0.939871 0.167569 0.000000
15 1.000000 0.328929 0.988487 0.302869 0.000000
16 0.844179 0.878493 1.000000 0.459841 0.000000
17 0.804767 0.851381 1.000000 0.623223 0.000000
18 0.793615 0.861199 1.000000 0.780415 0.000000
19 0.750195 0.823210 1.000000 0.887745 0.056321
20 0.702168 0.777604 1.000000 0.951909 0.171740
21 0.563097 0.610780 0.754127 1.000000 0.312939
22 0.538779 0.594761 0.695918 1.000000 0.483468
23 0.413003 0.469412 0.564120 1.000000 0.652870
24 0.195722 0.274036 0.417979 1.000000 0.816901
25 0.095966 0.000000 0.000000 0.911089 0.966808

View File

@ -0,0 +1,15 @@
<!-- HDRHTML BEG: Put this part where the HDR HTML viewer should appear -->
<div id="@base_name@_dr_ctrl" style="position: relative; width: @hist_width@px; height: 36px; overflow: hidden; border: 2px solid black;" title="Drag dynamic range window to change exposure">
<img id="@base_name@_hist" style="position: absolute; left: 0px; top: 0px;" src="@img_dir@@base_name@_hist.png" onclick="dr_wind_clicked(event, @hdr_img_object@)"/>
<div id="@base_name@_dr_wind" style="position: absolute; left: 100px; top: 0px; width: 40px; height: 36px; opacity: 0.7; background-color: blue;" onmousedown="dr_wind_mousedown(event, @hdr_img_object@)"></div>
<div id="@base_name@_exp_text" style="color: white; font-family: cursive; position: absolute; left: 10px; top: 2px;">1</div>
<a style="color: yellow; position: absolute; left: @help_mark_pos@px; top: 6px;" href="#" title="Click to get help" onclick="hdr_show_help()">?</a>
</div>
<div style="position: relative; border: 2px solid black; background-color: black; color: white; width: @hdr_img_width@px; height: @hdr_img_height@px">
<script type="text/javascript">
insert_hdr_image( @hdr_img_object@ );
change_exp( @hdr_img_object@, 0 );
</script>
</div>
<!-- HDRHTML END -->

View File

@ -0,0 +1,225 @@
<html>
<head>
<title>@title@</title>
<!-- HDRHTML BEG: Put this part in the "head" section -->
<script type="text/javascript">
/*
-----------------------------------------------
HDR HTML Viewer ver. @version@
Author: Rafal Mantiuk
URL: http://www.cs.ubc.ca/~mantiuk/hdrhtml.html
----------------------------------------------- */
function set_opacity( obj, opacity ) {
// for IE8
obj.style.filter="progid:DXImageTransform.Microsoft.Alpha(Opacity=" + opacity*100 + ")";
// for IE5-7
obj.style.filter = "alpha(opacity=" + opacity*100 + ")";
// for all other browsers
obj.style.opacity = opacity;
}
function update_exp_text( hdr_image, new_exp ) {
document.getElementById(hdr_image.base_name + "_exp_text").innerHTML = "EV: " + Math.round( (hdr_image.best_exp-new_exp)*10 )/10 + " f";
}
function change_exp( hdr_image, exp_change ) {
hdr_active_image = hdr_image;
hdr_image.exposure = hdr_image.exposure + exp_change;
if( hdr_image.exposure > hdr_image.f8_stops*8 ) {
hdr_image.exposure = hdr_image.f8_stops*8;
}
else if( hdr_image.exposure < 0 ) {
hdr_image.exposure = 0;
}
exp_cur = Math.floor(hdr_image.exposure / 8);
exp_shar = exp_cur + 1;
exp_blend = Math.round((hdr_image.exposure - exp_cur*8)*hdr_image.f_step_res);
var i;
for( i = 0; i < hdr_image.basis; i++ ) {
var img_obj = document.getElementById(hdr_image.base_name+"_"+i);
img_obj.src = hdr_image.image_dir + hdr_image.base_name + "_"+exp_cur+"_" + (i+1) + ".jpg";
set_opacity( img_obj, cf[exp_blend][i] );
}
for( i = 0; i < hdr_image.shared_basis; i++ ) {
var img_obj = document.getElementById(hdr_image.base_name+"_"+(i+hdr_image.basis));
img_obj.src = hdr_image.image_dir + hdr_image.base_name + "_"+exp_shar+"_" + (i+1) + ".jpg";
set_opacity( img_obj, cf[exp_blend][i+hdr_image.basis] );
}
var hist_left = (hdr_image.exposure-hdr_image.hist_start)*hdr_image.pix_per_fstop;
drw_obj = document.getElementById(hdr_image.base_name+"_dr_wind");
drw_obj.style.left = Math.round(hist_left) + "px";
drw_obj.style.width = hdr_image.pix_per_fstop*8 + "px";
set_opacity( drw_obj, 0.7 );
update_exp_text( hdr_image, hdr_image.exposure );
}
function insert_hdr_image( hdr_image ) {
for( i = 0; i < hdr_image.basis + hdr_image.shared_basis; i++ ) {
document.write("<img id=\"" + hdr_image.base_name + "_" + i +
"\" style=\"margin: 0px; padding: 0px; opacity: 1; width: " +
hdr_image.width + "px; height: " + hdr_image.height +
"px; position: absolute; top: 0px; left: 0px\"" +
" />\n");
}
}
function getAbsX (obj) {
var abs_x=0;
while(obj) {
abs_x+= obj.offsetLeft;
obj= obj.offsetParent;
}
return abs_x;
}
function dr_wind_clicked( event, hdr_image ) {
var drw_obj = document.getElementById(hdr_image.base_name+"_dr_wind");
var drw_left = drw_obj.offsetLeft;
var drw_right = drw_obj.offsetLeft + drw_obj.offsetWidth;
var hist_obj = document.getElementById(hdr_image.base_name + "_hist");
var rel_x = event.clientX - getAbsX(hist_obj) - 5;
var small_step_marg = 20;
if( rel_x < drw_left ) {
change_exp( hdr_image, (drw_left-rel_x) < small_step_marg ? -1/3 : -1 );
} else if( rel_x > drw_right ) {
change_exp( hdr_image, (rel_x-drw_right) < small_step_marg ? 1/3 : 1 );
}
}
function dr_wind_mousedown( event, hdr_image ) {
if(event.preventDefault) {
event.preventDefault();
}
var ctrl_obj = document.getElementById(hdr_image.base_name + "_dr_ctrl");
var drw_obj = document.getElementById(hdr_image.base_name+"_dr_wind");
set_opacity( drw_obj, 0.5 );
hdr_mousedrag.hdr_image = hdr_image;
hdr_mousedrag.start_mouse_x = event.clientX;
hdr_mousedrag.start_win_x = drw_obj.offsetLeft + 2;
ctrl_obj.onmousemove = dr_wind_move;
ctrl_obj.onmouseup = dr_wind_mouseup;
}
function dr_wind_mouseup( event ) {
event = event || window.event;
hdr_image = hdr_mousedrag.hdr_image;
var ctrl_obj = document.getElementById(hdr_image.base_name + "_dr_ctrl");
var drw_obj = document.getElementById(hdr_image.base_name+"_dr_wind");
var drw_left = drw_obj.offsetLeft;
var new_exp = Math.round((drw_obj.offsetLeft/hdr_image.pix_per_fstop + hdr_image.hist_start)*3)/3;
ctrl_obj.onmousemove = null;
ctrl_obj.onmouseup = null;
hdr_mousedrag.hdr_image = null;
change_exp( hdr_image, new_exp - hdr_image.exposure );
}
function dr_wind_move(event){
event = event || window.event;
hdr_image = hdr_mousedrag.hdr_image;
var drw_obj = document.getElementById(hdr_image.base_name+"_dr_wind");
var new_pos = (event.clientX-hdr_mousedrag.start_mouse_x) + hdr_mousedrag.start_win_x;
drw_obj.style.left = new_pos + "px";
var new_exp = Math.round((drw_obj.offsetLeft/hdr_image.pix_per_fstop + hdr_image.hist_start)*3)/3;
update_exp_text( hdr_image, new_exp );
}
function hdr_show_help() {
newwindow=window.open('','name','height=400,width=300');
var tmp = newwindow.document;
tmp.write('<html><head><title>HDR HTML viewer help</title>');
tmp.write('</head><body>');
tmp.write('<a href="http://pfstools.sourceforge.net/hdrhtml/" target="_blank">HDR HTML viewer</a> <div style="font-size: small">ver. @version@</div>');
tmp.write('<div style="font-size: small">(C) 2008 Rafal Mantiuk</div>');
tmp.write('<ul style="font-size: small">');
tmp.write('<li>Change exposure by scrolling the blue dynamic range window left and right.</li>');
tmp.write('<li>Click on the left or right side of the dynamic range window to change exposure by either 1 or 1/3 of an f-stop depending on how far from the window you click.</li>');
tmp.write('<li>Press "-" and "=" keys to change exposure by 1 f-stop.</li>');
tmp.write('<li>The green plot represents image histogram. Each tick represent one f-stop. EV value is given in f-stops (log<sub>2</sub> units) relative to the inital exposure.</li>');
tmp.write('</ul>');
tmp.write('</body></html>');
tmp.close();
}
function hdr_onkeydown(e) {
var hdr_image = hdr_active_image;
var keynum;
if( hdr_image == null )
return;
if(window.event) { // IE
keynum = window.event.keyCode;
if( keynum == 189 )
change_exp( hdr_image, +1 );
if( keynum == 187 )
change_exp( hdr_image, -1 );
} else if(e.which) { // Netscape/Firefox/Opera
keynum = e.which;
if( keynum == 109 )
change_exp( hdr_image, +1 );
if( keynum == 61 )
change_exp( hdr_image, -1 );
}
}
</script>
<!-- HDRHTML END -->
</head>
<body>
<!-- HDRHTML BEG: Put this part at the beginning of the "body" section -->
<script type="text/javascript">
@hdr_img_def@
@cf_array_def@
hdr_mousedrag = new Object();
hdr_mousedrag.hdr_image = null;
hdr_mousedrag.start_mouse_x = 0;
hdr_mousedrag.start_win_x = 0;
hdr_active_image = null;
document.onkeydown=hdr_onkeydown;
</script>
<!-- HDRHTML END -->
@image_htmlcode@
</body>
</html>

View File

@ -0,0 +1,95 @@
/* optional: full page styling with dark background */
body { background-color: #1A1C1F; font-family: sans-serif, Helvetica Narrow; color: CDCDCD; }
a { color: #FF5020; text-decoration: none; }
a:hover { color: #FF5020; text-decoration: underline; }
/* required: HDR-Viewer styling, adjust as needed */
.hdr_viewer {
background-color: #000;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
padding: 4px 6px 4px 6px;
margin: 10px;
font-family: sans-serif;
}
.hdr_viewport {
position: relative;
margin: 3px 0px 3px 0px;
}
.hdr_controller {
position: relative;
height: 36px;
margin: 2px 0px 2px 0px;
overflow: hidden;
}
.knob { position: absolute;
height: 36px;
opacity: 0.3;
filter: alpha(opacity = 30);
background: #FFFFFF center center url('slider-black.png') no-repeat;
cursor: pointer;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
}
div.knob:hover {
background-color: #FF5020;
opacity: 0.7;
filter: alpha(opacity = 70);
}
.label {
color: white;
font-family: Florence, cursive;
width: 110px;
padding: 5px 10px 5px 10px;
}
.labelnumber {
text-align: right;
display: inline-block;
width: 50px;
}
.hdr_help {
position: absolute;
right: 6px;
top: 8px;
opacity: 0.5;
filter: alpha(opacity = 50);
width: 22px;
height: 22px;
background: top left url('information.png') no-repeat;
cursor: pointer;
}
div.hdr_help:hover {
background: top left url('information-red.png') no-repeat;
opacity: 1;
}
.hdr_instructions {
color: #FFF;
background-color: #000;
}
.spinner {
position: absolute;
opacity: 0.9;
filter: alpha(opacity=90);
z-index: 999;
background: #000;
}
.spinner-img {
background: url('loading-spinner.gif') no-repeat;
width: 31px;
height: 31px;
margin: 0 auto;
}

View File

@ -0,0 +1,229 @@
/*
-----------------------------------------------
HDR HTML Viewer ver. 1.7
Author: v1.0 Rafal Mantiuk
URL: http://www.cs.ubc.ca/~mantiuk/hdrhtml.html
Template v1.7 by Christian Bloch, www.hdrlabs.com
Requires: mootools javascript library from www.mootools.net or linked in from google's server:
http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js
Slider and Asset extensions from the mootools (More) section
----------------------------------------------- */
// For suppressing the text-selection cursor when dragging or interacting with the viewer
var noselect = false;
window.addEvent('selectstart', function(e) {
if (noselect) {
e.stop();
return false;
}
});
// for updating the EV label
function update_exp_text( hdr_image, new_exp ) {
ev_label = "EV:<span class='labelnumber'>"+ Math.round( (hdr_image.best_exp-new_exp)*10 )/10 + " f</span>";
// delete the next two lines if you prefer plain decimal display for fractional EV values
ev_label = ev_label.replace(/\.3/, "<font size=\"-1\"><sup> 1</sup>/<sub>3</sub></font>");
ev_label = ev_label.replace(/\.7/, "<font size=\"-1\"><sup> 2</sup>/<sub>3</sub></font>");
$(hdr_image.base_name + "_exp_text").innerHTML = ev_label;
}
function change_exp( hdr_image, exp_change ) {
hdr_active_image = hdr_image;
hdr_image.exposure = hdr_image.exposure + exp_change;
// clamp to exposure limits
if( hdr_image.exposure > hdr_image.f8_stops*8 ) {
hdr_image.exposure = hdr_image.f8_stops*8;
}
else if( hdr_image.exposure < 0 ) {
hdr_image.exposure = 0;
}
exp_cur = Math.floor(hdr_image.exposure / 8);
exp_shar = exp_cur + 1;
exp_blend = Math.round((hdr_image.exposure - exp_cur*8)*hdr_image.f_step_res);
// blend each image accordingly
var i;
for( i = 0; i < hdr_image.basis; i++ ) {
var img_obj = $(hdr_image.base_name+"_"+i);
img_obj.set('src', hdr_image.image_dir + hdr_image.base_name + "_"+exp_cur+"_" + (i+1) + ".jpg");
img_obj.setStyle('opacity', cf[exp_blend][i]);
}
for( i = 0; i < hdr_image.shared_basis; i++ ) {
var img_obj = $(hdr_image.base_name+"_"+(i+hdr_image.basis));
img_obj.set('src',hdr_image.image_dir + hdr_image.base_name + "_"+exp_shar+"_" + (i+1) + ".jpg");
img_obj.setStyle( 'opacity', cf[exp_blend][i+hdr_image.basis] );
}
update_exp_text( hdr_image, hdr_image.exposure );
}
// keyboartd events
function hdr_onkeydown(e) {
var hdr_image = hdr_active_image;
var keynum;
if( hdr_image == null )
return;
var hdrnum = hdr_names.indexOf(hdr_image.base_name);
if(window.event) { // IE
keynum = window.event.keyCode;
if( keynum == 189 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 - 10);
if( keynum == 187 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 + 10);
} else if(e.which) { // Netscape/Firefox/Opera
keynum = e.which;
if( keynum == 109 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 - 10);
if( keynum == 61 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 + 10);
}
}
// ----------------------------------------
// This must be called from within the HTML
// ----------------------------------------
// - injects images into viewport
// - binds slider to EV
// - binds mousewheel to slider
// Called once from each "hdr_viewer" div
// inject images into HTML
function insert_hdr_image( hdr_image ) {
hdr_viewport = $(hdr_image.base_name+'_viewport');
hdr_viewer = hdr_viewport.getParent('div.hdr_viewer');
// preload images
var preloading = new Array();
var k = 0;
for( i = 0; i < hdr_image.f8_stops; i++ ) {
for( j = 0; j < hdr_image.basis; j++ ) {
preloading[k] = ""+hdr_image.image_dir + hdr_image.base_name + "_"+i+"_" + (j+1) + ".jpg";
k = k + 1;
}
}
preloading[k] = ""+hdr_image.image_dir + hdr_image.base_name + "_"+hdr_image.f8_stops+"_1.jpg";
// for showing the AJAX spinning circle swap the next line with the block below
new Asset.images(preloading);
// var loadspinner = new Spinner(hdr_viewer).show('noFX');
// var myImages = new Asset.images(preloading, {
// onComplete: function(){
// loadspinner.destroy();
// }
// });
// enumerate all instances to remember the name
hdrcount = hdrcount + 1;
hdr_names[hdrcount] = ""+hdr_image.base_name;
var injection = "";
for( i = 0; i < hdr_image.basis + hdr_image.shared_basis; i++ ) {
injection += "<img id=\"" + hdr_image.base_name + "_" + i +
"\" style=\"margin: 0px; padding: 0px; opacity: 1; width: " +
hdr_image.width + "px; height: " + hdr_image.height +
"px; position: absolute; top: 0px; left: 0px\"" +
" />\n";
}
// also inject a hidden help viewer
injection += "<div id=\"" + hdr_image.base_name + "_help_view" + "\" class=\"hdr_instructions\"" +
"style=\"margin: 0px; padding: 0px; opacity: 0; width: " +
hdr_image.width + "px; height: " + hdr_image.height +
"px; position: absolute; top: 0px; left: 0px\" ><div style=\"padding: 50px;\">" +
"<h1><a href=\"http://pfstools.sourceforge.net/hdrhtml/\" target=\"_blank\">HDR HTML Viewer</a></h1>" +
"v1.0 (C) 2008 Rafal Mantiuk | <a href=\"http://pfstools.sourceforge.net/\" target=\"_blank\">pfsTools</a><br />" +
"v1.7 mod 2010 Christian Bloch | <a href=\"www.hdrlabs.com\" target=\"_blank\">HDR Labs</a><br />" +
"<ul><li>Change exposure by sliding the dynamic range window left and right. Or just use the scroll wheel.</li>" +
"<li>Press \"-\" and \"=\" keys to change exposure by 1 f-stop.</li>" +
"<li>The green plot represents the HDR histogram. EV value is given in f-stops (log<sub>2</sub> units) " +
"relative to the inital exposure.</li>" +
"<li>The exposure window / slider encompasses 8 f-stops.</li>" +
"</ul></div></div>";
hdr_viewport.set('html',injection);
// link help viewer to help buttom
var help_view = $(hdr_image.base_name+'_help_view').fade('hide');;
$(hdr_image.base_name+'_help').addEvent('click', function() {
if(help_view.getStyle('opacity') == 0) help_view.fade(0.85);
else help_view.fade('out');
});
help_view.addEvent('click', function() {
help_view.fade('out');
});
// initialize mootools slider
hist_left = Math.round((-hdr_image.hist_start)*hdr_image.pix_per_fstop);
var el = $(hdr_image.base_name+'_dr_ctrl');
el.style.left = Math.round(hist_left) + "px";
el.style.width = Math.round(hdr_image.hist_width-hist_left) + "px";
el.getElement('.knob').style.width = hdr_image.pix_per_fstop*8 + "px";
var EVrange = (hdr_image.hist_width-hist_left)/hdr_image.pix_per_fstop-7.7;
var slider = new Slider(el, el.getElement('.knob'), {
steps: EVrange*hdr_image.f_step_res,
range: [0,EVrange*10],
onChange: function(value) {
change_exp( hdr_image, value/10 - hdr_image.exposure);
}
}).set(hdr_image.exposure*10);
// clone this slider into an array for keyboard access
hdr_slider[hdrcount] = slider;
// link active hdr image to rollover on the current image
hdr_viewer.addEvent('mouseenter', function() {
hdr_active_image = hdr_image;
// suppress accidental selection of individual images or text
noselect = true;
});
// link the mousewheel to the slider
hdr_viewer.addEvent('mousewheel', function(e) {
e.stop(); // prevent the mousewheel from scrolling the page.
noselect = true;
slider.set((hdr_image.exposure + e.wheel/2)*10);
});
// restore outside text to be selectable
hdr_viewer.addEvent('mouseleave', function() {
noselect = false;
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,480 @@
//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net>, MIT Style License.
var MooTools={version:"1.2.4",build:"0d9113241a90b9cd5643b926795852a2026710d4"};var Native=function(k){k=k||{};var a=k.name;var i=k.legacy;var b=k.protect;
var c=k.implement;var h=k.generics;var f=k.initialize;var g=k.afterImplement||function(){};var d=f||i;h=h!==false;d.constructor=Native;d.$family={name:"native"};
if(i&&f){d.prototype=i.prototype;}d.prototype.constructor=d;if(a){var e=a.toLowerCase();d.prototype.$family={name:e};Native.typize(d,e);}var j=function(n,l,o,m){if(!b||m||!n.prototype[l]){n.prototype[l]=o;
}if(h){Native.genericize(n,l,b);}g.call(n,l,o);return n;};d.alias=function(n,l,p){if(typeof n=="string"){var o=this.prototype[n];if((n=o)){return j(this,l,n,p);
}}for(var m in n){this.alias(m,n[m],l);}return this;};d.implement=function(m,l,o){if(typeof m=="string"){return j(this,m,l,o);}for(var n in m){j(this,n,m[n],l);
}return this;};if(c){d.implement(c);}return d;};Native.genericize=function(b,c,a){if((!a||!b[c])&&typeof b.prototype[c]=="function"){b[c]=function(){var d=Array.prototype.slice.call(arguments);
return b.prototype[c].apply(d.shift(),d);};}};Native.implement=function(d,c){for(var b=0,a=d.length;b<a;b++){d[b].implement(c);}};Native.typize=function(a,b){if(!a.type){a.type=function(c){return($type(c)===b);
};}};(function(){var a={Array:Array,Date:Date,Function:Function,Number:Number,RegExp:RegExp,String:String};for(var h in a){new Native({name:h,initialize:a[h],protect:true});
}var d={"boolean":Boolean,"native":Native,object:Object};for(var c in d){Native.typize(d[c],c);}var f={Array:["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],String:["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]};
for(var e in f){for(var b=f[e].length;b--;){Native.genericize(a[e],f[e][b],true);}}})();var Hash=new Native({name:"Hash",initialize:function(a){if($type(a)=="hash"){a=$unlink(a.getClean());
}for(var b in a){this[b]=a[b];}return this;}});Hash.implement({forEach:function(b,c){for(var a in this){if(this.hasOwnProperty(a)){b.call(c,this[a],a,this);
}}},getClean:function(){var b={};for(var a in this){if(this.hasOwnProperty(a)){b[a]=this[a];}}return b;},getLength:function(){var b=0;for(var a in this){if(this.hasOwnProperty(a)){b++;
}}return b;}});Hash.alias("forEach","each");Array.implement({forEach:function(c,d){for(var b=0,a=this.length;b<a;b++){c.call(d,this[b],b,this);}}});Array.alias("forEach","each");
function $A(b){if(b.item){var a=b.length,c=new Array(a);while(a--){c[a]=b[a];}return c;}return Array.prototype.slice.call(b);}function $arguments(a){return function(){return arguments[a];
};}function $chk(a){return !!(a||a===0);}function $clear(a){clearTimeout(a);clearInterval(a);return null;}function $defined(a){return(a!=undefined);}function $each(c,b,d){var a=$type(c);
((a=="arguments"||a=="collection"||a=="array")?Array:Hash).each(c,b,d);}function $empty(){}function $extend(c,a){for(var b in (a||{})){c[b]=a[b];}return c;
}function $H(a){return new Hash(a);}function $lambda(a){return($type(a)=="function")?a:function(){return a;};}function $merge(){var a=Array.slice(arguments);
a.unshift({});return $mixin.apply(null,a);}function $mixin(e){for(var d=1,a=arguments.length;d<a;d++){var b=arguments[d];if($type(b)!="object"){continue;
}for(var c in b){var g=b[c],f=e[c];e[c]=(f&&$type(g)=="object"&&$type(f)=="object")?$mixin(f,g):$unlink(g);}}return e;}function $pick(){for(var b=0,a=arguments.length;
b<a;b++){if(arguments[b]!=undefined){return arguments[b];}}return null;}function $random(b,a){return Math.floor(Math.random()*(a-b+1)+b);}function $splat(b){var a=$type(b);
return(a)?((a!="array"&&a!="arguments")?[b]:b):[];}var $time=Date.now||function(){return +new Date;};function $try(){for(var b=0,a=arguments.length;b<a;
b++){try{return arguments[b]();}catch(c){}}return null;}function $type(a){if(a==undefined){return false;}if(a.$family){return(a.$family.name=="number"&&!isFinite(a))?false:a.$family.name;
}if(a.nodeName){switch(a.nodeType){case 1:return"element";case 3:return(/\S/).test(a.nodeValue)?"textnode":"whitespace";}}else{if(typeof a.length=="number"){if(a.callee){return"arguments";
}else{if(a.item){return"collection";}}}}return typeof a;}function $unlink(c){var b;switch($type(c)){case"object":b={};for(var e in c){b[e]=$unlink(c[e]);
}break;case"hash":b=new Hash(c);break;case"array":b=[];for(var d=0,a=c.length;d<a;d++){b[d]=$unlink(c[d]);}break;default:return c;}return b;}var Browser=$merge({Engine:{name:"unknown",version:0},Platform:{name:(window.orientation!=undefined)?"ipod":(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime),query:!!(document.querySelector)},Plugins:{},Engines:{presto:function(){return(!window.opera)?false:((arguments.callee.caller)?960:((document.getElementsByClassName)?950:925));
},trident:function(){return(!window.ActiveXObject)?false:((window.XMLHttpRequest)?((document.querySelectorAll)?6:5):4);},webkit:function(){return(navigator.taintEnabled)?false:((Browser.Features.xpath)?((Browser.Features.query)?525:420):419);
},gecko:function(){return(!document.getBoxObjectFor&&window.mozInnerScreenX==null)?false:((document.getElementsByClassName)?19:18);}}},Browser||{});Browser.Platform[Browser.Platform.name]=true;
Browser.detect=function(){for(var b in this.Engines){var a=this.Engines[b]();if(a){this.Engine={name:b,version:a};this.Engine[b]=this.Engine[b+a]=true;
break;}}return{name:b,version:a};};Browser.detect();Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject("MSXML2.XMLHTTP");
},function(){return new ActiveXObject("Microsoft.XMLHTTP");});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var a=($try(function(){return navigator.plugins["Shockwave Flash"].description;
},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);return{version:parseInt(a[0]||0+"."+a[1],10)||0,build:parseInt(a[2],10)||0};
})();function $exec(b){if(!b){return b;}if(window.execScript){window.execScript(b);}else{var a=document.createElement("script");a.setAttribute("type","text/javascript");
a[(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerText":"text"]=b;document.head.appendChild(a);document.head.removeChild(a);}return b;}Native.UID=1;
var $uid=(Browser.Engine.trident)?function(a){return(a.uid||(a.uid=[Native.UID++]))[0];}:function(a){return a.uid||(a.uid=Native.UID++);};var Window=new Native({name:"Window",legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(a){$uid(a);
if(!a.Element){a.Element=$empty;if(Browser.Engine.webkit){a.document.createElement("iframe");}a.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};
}a.document.window=a;return $extend(a,Window.Prototype);},afterImplement:function(b,a){window[b]=Window.Prototype[b]=a;}});Window.Prototype={$family:{name:"window"}};
new Window(window);var Document=new Native({name:"Document",legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(a){$uid(a);a.head=a.getElementsByTagName("head")[0];
a.html=a.getElementsByTagName("html")[0];if(Browser.Engine.trident&&Browser.Engine.version<=4){$try(function(){a.execCommand("BackgroundImageCache",false,true);
});}if(Browser.Engine.trident){a.window.attachEvent("onunload",function(){a.window.detachEvent("onunload",arguments.callee);a.head=a.html=a.window=null;
});}return $extend(a,Document.Prototype);},afterImplement:function(b,a){document[b]=Document.Prototype[b]=a;}});Document.Prototype={$family:{name:"document"}};
new Document(document);Array.implement({every:function(c,d){for(var b=0,a=this.length;b<a;b++){if(!c.call(d,this[b],b,this)){return false;}}return true;
},filter:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){if(d.call(e,this[b],b,this)){c.push(this[b]);}}return c;},clean:function(){return this.filter($defined);
},indexOf:function(c,d){var a=this.length;for(var b=(d<0)?Math.max(0,a+d):d||0;b<a;b++){if(this[b]===c){return b;}}return -1;},map:function(d,e){var c=[];
for(var b=0,a=this.length;b<a;b++){c[b]=d.call(e,this[b],b,this);}return c;},some:function(c,d){for(var b=0,a=this.length;b<a;b++){if(c.call(d,this[b],b,this)){return true;
}}return false;},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a];}return d;},link:function(c){var a={};
for(var e=0,b=this.length;e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break;}}}return a;},contains:function(a,b){return this.indexOf(a,b)!=-1;
},extend:function(c){for(var b=0,a=c.length;b<a;b++){this.push(c[b]);}return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;
},include:function(a){if(!this.contains(a)){this.push(a);}return this;},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b]);}return this;
},erase:function(b){for(var a=this.length;a--;a){if(this[a]===b){this.splice(a,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var d=[];
for(var b=0,a=this.length;b<a;b++){var c=$type(this[b]);if(!c){continue;}d=d.concat((c=="array"||c=="collection"||c=="arguments")?Array.flatten(this[b]):this[b]);
}return d;},hexToRgb:function(b){if(this.length!=3){return null;}var a=this.map(function(c){if(c.length==1){c+=c;}return c.toInt(16);});return(b)?a:"rgb("+a+")";
},rgbToHex:function(d){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!d){return"transparent";}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);
b.push((c.length==1)?"0"+c:c);}return(d)?b:"#"+b.join("");}});Function.implement({extend:function(a){for(var b in a){this[b]=a[b];}return this;},create:function(b){var a=this;
b=b||{};return function(d){var c=b.arguments;c=(c!=undefined)?$splat(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);
}var e=function(){return a.apply(b.bind||null,c);};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return $try(e);
}return e();};},run:function(a,b){return this.apply(b,$splat(a));},pass:function(a,b){return this.create({bind:b,arguments:a});},bind:function(b,a){return this.create({bind:b,arguments:a});
},bindWithEvent:function(b,a){return this.create({bind:b,arguments:a,event:true});},attempt:function(a,b){return this.create({bind:b,arguments:a,attempt:true})();
},delay:function(b,c,a){return this.create({bind:c,arguments:a,delay:b})();},periodical:function(c,b,a){return this.create({bind:b,arguments:a,periodical:c})();
}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0);return Math.round(this*a)/a;},times:function(b,c){for(var a=0;
a<this;a++){b.call(c,a,this);}},toFloat:function(){return parseFloat(this);},toInt:function(a){return parseInt(this,a||10);}});Number.alias("times","each");
(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat($A(arguments)));};}});Number.implement(a);
})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(a,b){return((typeof a=="string")?new RegExp(a,b):a).test(this);
},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());
});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},stripScripts:function(b){var a="";
var c=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return"";});if(b===true){$exec(a);}else{if($type(b)=="function"){b(a,c);
}}return c;},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);}return(a[c]!=undefined)?a[c]:"";
});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){for(var a in this){if(this.hasOwnProperty(a)&&this[a]===b){return a;}}return null;
},hasValue:function(a){return(Hash.keyOf(this,a)!==null);},extend:function(a){Hash.each(a||{},function(c,b){Hash.set(this,b,c);},this);return this;},combine:function(a){Hash.each(a||{},function(c,b){Hash.include(this,b,c);
},this);return this;},erase:function(a){if(this.hasOwnProperty(a)){delete this[a];}return this;},get:function(a){return(this.hasOwnProperty(a))?this[a]:null;
},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b;}return this;},empty:function(){Hash.each(this,function(b,a){delete this[a];},this);
return this;},include:function(a,b){if(this[a]==undefined){this[a]=b;}return this;},map:function(b,c){var a=new Hash;Hash.each(this,function(e,d){a.set(d,b.call(c,e,d,this));
},this);return a;},filter:function(b,c){var a=new Hash;Hash.each(this,function(e,d){if(b.call(c,e,d,this)){a.set(d,e);}},this);return a;},every:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&!b.call(c,this[a],a)){return false;
}}return true;},some:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&b.call(c,this[a],a)){return true;}}return false;},getKeys:function(){var a=[];
Hash.each(this,function(c,b){a.push(b);});return a;},getValues:function(){var a=[];Hash.each(this,function(b){a.push(b);});return a;},toQueryString:function(a){var b=[];
Hash.each(this,function(f,e){if(a){e=a+"["+e+"]";}var d;switch($type(f)){case"object":d=Hash.toQueryString(f,e);break;case"array":var c={};f.each(function(h,g){c[g]=h;
});d=Hash.toQueryString(c,e);break;default:d=e+"="+encodeURIComponent(f);}if(f!=undefined){b.push(d);}});return b.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});
var Event=new Native({name:"Event",initialize:function(a,f){f=f||window;var k=f.document;a=a||f.event;if(a.$extended){return a;}this.$extended=true;var j=a.type;
var g=a.target||a.srcElement;while(g&&g.nodeType==3){g=g.parentNode;}if(j.test(/key/)){var b=a.which||a.keyCode;var m=Event.Keys.keyOf(b);if(j=="keydown"){var d=b-111;
if(d>0&&d<13){m="f"+d;}}m=m||String.fromCharCode(b).toLowerCase();}else{if(j.match(/(click|mouse|menu)/i)){k=(!k.compatMode||k.compatMode=="CSS1Compat")?k.html:k.body;
var i={x:a.pageX||a.clientX+k.scrollLeft,y:a.pageY||a.clientY+k.scrollTop};var c={x:(a.pageX)?a.pageX-f.pageXOffset:a.clientX,y:(a.pageY)?a.pageY-f.pageYOffset:a.clientY};
if(j.match(/DOMMouseScroll|mousewheel/)){var h=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;}var e=(a.which==3)||(a.button==2);var l=null;if(j.match(/over|out/)){switch(j){case"mouseover":l=a.relatedTarget||a.fromElement;
break;case"mouseout":l=a.relatedTarget||a.toElement;}if(!(function(){while(l&&l.nodeType==3){l=l.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){l=false;
}}}}return $extend(this,{event:a,type:j,page:i,client:c,rightClick:e,wheel:h,relatedTarget:l,target:g,code:b,key:m,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey});
}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();
},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
}else{this.event.returnValue=false;}return this;}});function Class(b){if(b instanceof Function){b={initialize:b};}var a=function(){Object.reset(this);if(a._prototyping){return this;
}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c;}.extend(this);
a.implement(b);a.constructor=Class;a.prototype.constructor=a;return a;}Function.prototype.protect=function(){this._protected=true;return this;};Object.reset=function(a,c){if(c==null){for(var e in a){Object.reset(a,e);
}return a;}delete a[c];switch($type(a[c])){case"object":var d=function(){};d.prototype=a[c];var b=new d;a[c]=Object.reset(b);break;case"array":a[c]=$unlink(a[c]);
break;}return a;};new Native({name:"Class",initialize:Class}).extend({instantiate:function(b){b._prototyping=true;var a=new b;delete b._prototyping;return a;
},wrap:function(a,b,c){if(c._origin){c=c._origin;}return function(){if(c._protected&&this._current==null){throw new Error('The method "'+b+'" cannot be called.');
}var e=this.caller,f=this._current;this.caller=f;this._current=arguments.callee;var d=c.apply(this,arguments);this._current=f;this.caller=e;return d;}.extend({_owner:a,_origin:c,_name:b});
}});Class.implement({implement:function(a,d){if($type(a)=="object"){for(var e in a){this.implement(e,a[e]);}return this;}var f=Class.Mutators[a];if(f){d=f.call(this,d);
if(d==null){return this;}}var c=this.prototype;switch($type(d)){case"function":if(d._hidden){return this;}c[a]=Class.wrap(this,a,d);break;case"object":var b=c[a];
if($type(b)=="object"){$mixin(b,d);}else{c[a]=$unlink(d);}break;case"array":c[a]=$unlink(d);break;default:c[a]=d;}return this;}});Class.Mutators={Extends:function(a){this.parent=a;
this.prototype=Class.instantiate(a);this.implement("parent",function(){var b=this.caller._name,c=this.caller._owner.parent.prototype[b];if(!c){throw new Error('The method "'+b+'" has no parent.');
}return c.apply(this,arguments);}.protect());},Implements:function(a){$splat(a).each(function(b){if(b instanceof Function){b=Class.instantiate(b);}this.implement(b);
},this);}};var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;
},clearChain:function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},addEvent:function(c,b,a){c=Events.removeOn(c);if(b!=$empty){this.$events[c]=this.$events[c]||[];
this.$events[c].include(b);if(a){b.internal=true;}}return this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;},fireEvent:function(c,b,a){c=Events.removeOn(c);
if(!this.$events||!this.$events[c]){return this;}this.$events[c].each(function(d){d.create({bind:this,delay:a,"arguments":b})();},this);return this;},removeEvent:function(b,a){b=Events.removeOn(b);
if(!this.$events[b]){return this;}if(!a.internal){this.$events[b].erase(a);}return this;},removeEvents:function(c){var d;if($type(c)=="object"){for(d in c){this.removeEvent(d,c[d]);
}return this;}if(c){c=Events.removeOn(c);}for(d in this.$events){if(c&&c!=d){continue;}var b=this.$events[d];for(var a=b.length;a--;a){this.removeEvent(d,b[a]);
}}return this;}});Events.removeOn=function(a){return a.replace(/^on([A-Z])/,function(b,c){return c.toLowerCase();});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));
if(!this.addEvent){return this;}for(var a in this.options){if($type(this.options[a])!="function"||!(/^on[A-Z]/).test(a)){continue;}this.addEvent(a,this.options[a]);
delete this.options[a];}return this;}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(a,b){var c=Element.Constructors.get(a);
if(c){return c(b);}if(typeof a=="string"){return document.newElement(a,b);}return document.id(a).set(b);},afterImplement:function(a,b){Element.Prototype[a]=b;
if(Array[a]){return;}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e<d;e++){var f=this[e][a].apply(this[e],arguments);c.push(f);
if(g){g=($type(f)=="element");}}return(g)?new Elements(c):c;});}});Element.Prototype={$family:{name:"element"}};Element.Constructors=new Hash;var IFrame=new Native({name:"IFrame",generics:false,initialize:function(){var f=Array.link(arguments,{properties:Object.type,iframe:$defined});
var d=f.properties||{};var c=document.id(f.iframe);var e=d.onload||$empty;delete d.onload;d.id=d.name=$pick(d.id,d.name,c?(c.id||c.name):"IFrame_"+$time());
c=new Element(c||"iframe",d);var b=function(){var g=$try(function(){return c.contentWindow.location.host;});if(!g||g==window.location.host){var h=new Window(c.contentWindow);
new Document(c.contentWindow.document);$extend(h.Element.prototype,Element.Prototype);}e.call(c.contentWindow,c.contentWindow.document);};var a=$try(function(){return c.contentWindow;
});((a&&a.document.body)||window.frames[d.id])?b():c.addListener("load",b);return c;}});var Elements=new Native({initialize:function(f,b){b=$extend({ddup:true,cash:true},b);
f=f||[];if(b.ddup||b.cash){var g={},e=[];for(var c=0,a=f.length;c<a;c++){var d=document.id(f[c],!b.cash);if(b.ddup){if(g[d.uid]){continue;}g[d.uid]=true;
}if(d){e.push(d);}}f=e;}return(b.cash)?$extend(f,this):f;}});Elements.implement({filter:function(a,b){if(!a){return this;}return new Elements(Array.filter(this,(typeof a=="string")?function(c){return c.match(a);
}:a,b));}});Document.implement({newElement:function(a,b){if(Browser.Engine.trident&&b){["name","type","checked"].each(function(c){if(!b[c]){return;}a+=" "+c+'="'+b[c]+'"';
if(c!="checked"){delete b[c];}});a="<"+a+">";}return document.id(this.createElement(a)).set(b);},newTextNode:function(a){return this.createTextNode(a);
},getDocument:function(){return this;},getWindow:function(){return this.window;},id:(function(){var a={string:function(d,c,b){d=b.getElementById(d);return(d)?a.element(d,c):null;
},element:function(b,e){$uid(b);if(!e&&!b.$family&&!(/^object|embed$/i).test(b.tagName)){var c=Element.Prototype;for(var d in c){b[d]=c[d];}}return b;},object:function(c,d,b){if(c.toElement){return a.element(c.toElement(b),d);
}return null;}};a.textnode=a.whitespace=a.window=a.document=$arguments(0);return function(c,e,d){if(c&&c.$family&&c.uid){return c;}var b=$type(c);return(a[b])?a[b](c,e,d||document):null;
};})()});if(window.$==null){Window.implement({$:function(a,b){return document.id(a,b,this.document);}});}Window.implement({$$:function(a){if(arguments.length==1&&typeof a=="string"){return this.document.getElements(a);
}var f=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d<b;d++){var e=c[d];switch($type(e)){case"element":f.push(e);break;case"string":f.extend(this.document.getElements(e,true));
}}return new Elements(f);},getDocument:function(){return this.document;},getWindow:function(){return this;}});Native.implement([Element,Document],{getElement:function(a,b){return document.id(this.getElements(a,true)[0]||null,b);
},getElements:function(a,d){a=a.split(",");var c=[];var b=(a.length>1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f;
},this);return new Elements(c,{ddup:b,cash:!d});}});(function(){var h={},f={};var i={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"};
var c=function(l){return(f[l]||(f[l]={}));};var g=function(n,l){if(!n){return;}var m=n.uid;if(Browser.Engine.trident){if(n.clearAttributes){var q=l&&n.cloneNode(false);
n.clearAttributes();if(q){n.mergeAttributes(q);}}else{if(n.removeEvents){n.removeEvents();}}if((/object/i).test(n.tagName)){for(var o in n){if(typeof n[o]=="function"){n[o]=$empty;
}}Element.dispose(n);}}if(!m){return;}h[m]=f[m]=null;};var d=function(){Hash.each(h,g);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(g);
}if(window.CollectGarbage){CollectGarbage();}h=f=null;};var j=function(n,l,s,m,p,r){var o=n[s||l];var q=[];while(o){if(o.nodeType==1&&(!m||Element.match(o,m))){if(!p){return document.id(o,r);
}q.push(o);}o=o[l];}return(p)?new Elements(q,{ddup:false,cash:!r}):null;};var e={html:"innerHTML","class":"className","for":"htmlFor",defaultValue:"defaultValue",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"};
var b=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var k=["value","type","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];
b=b.associate(b);Hash.extend(e,b);Hash.extend(e,k.associate(k.map(String.toLowerCase)));var a={before:function(m,l){if(l.parentNode){l.parentNode.insertBefore(m,l);
}},after:function(m,l){if(!l.parentNode){return;}var n=l.nextSibling;(n)?l.parentNode.insertBefore(m,n):l.parentNode.appendChild(m);},bottom:function(m,l){l.appendChild(m);
},top:function(m,l){var n=l.firstChild;(n)?l.insertBefore(m,n):l.appendChild(m);}};a.inside=a.bottom;Hash.each(a,function(l,m){m=m.capitalize();Element.implement("inject"+m,function(n){l(this,document.id(n,true));
return this;});Element.implement("grab"+m,function(n){l(document.id(n,true),this);return this;});});Element.implement({set:function(o,m){switch($type(o)){case"object":for(var n in o){this.set(n,o[n]);
}break;case"string":var l=Element.Properties.get(o);(l&&l.set)?l.set.apply(this,Array.slice(arguments,1)):this.setProperty(o,m);}return this;},get:function(m){var l=Element.Properties.get(m);
return(l&&l.get)?l.get.apply(this,Array.slice(arguments,1)):this.getProperty(m);},erase:function(m){var l=Element.Properties.get(m);(l&&l.erase)?l.erase.apply(this):this.removeProperty(m);
return this;},setProperty:function(m,n){var l=e[m];if(n==undefined){return this.removeProperty(m);}if(l&&b[m]){n=!!n;}(l)?this[l]=n:this.setAttribute(m,""+n);
return this;},setProperties:function(l){for(var m in l){this.setProperty(m,l[m]);}return this;},getProperty:function(m){var l=e[m];var n=(l)?this[l]:this.getAttribute(m,2);
return(b[m])?!!n:(l)?n:n||null;},getProperties:function(){var l=$A(arguments);return l.map(this.getProperty,this).associate(l);},removeProperty:function(m){var l=e[m];
(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
},hasClass:function(l){return this.className.contains(l," ");},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean();
}return this;},removeClass:function(l){this.className=this.className.replace(new RegExp("(^|\\s)"+l+"(?:\\s|$)"),"$1");return this;},toggleClass:function(l){return this.hasClass(l)?this.removeClass(l):this.addClass(l);
},adopt:function(){Array.flatten(arguments).each(function(l){l=document.id(l,true);if(l){this.appendChild(l);}},this);return this;},appendText:function(m,l){return this.grab(this.getDocument().newTextNode(m),l);
},grab:function(m,l){a[l||"bottom"](document.id(m,true),this);return this;},inject:function(m,l){a[l||"bottom"](this,document.id(m,true));return this;},replaces:function(l){l=document.id(l,true);
l.parentNode.replaceChild(this,l);return this;},wraps:function(m,l){m=document.id(m,true);return this.replaces(m).grab(m,l);},getPrevious:function(l,m){return j(this,"previousSibling",null,l,false,m);
},getAllPrevious:function(l,m){return j(this,"previousSibling",null,l,true,m);},getNext:function(l,m){return j(this,"nextSibling",null,l,false,m);},getAllNext:function(l,m){return j(this,"nextSibling",null,l,true,m);
},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m);},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m);
},getParent:function(l,m){return j(this,"parentNode",null,l,false,m);},getParents:function(l,m){return j(this,"parentNode",null,l,true,m);},getSiblings:function(l,m){return this.getParent().getChildren(l,m).erase(this);
},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
},getElementById:function(o,n){var m=this.ownerDocument.getElementById(o);if(!m){return null;}for(var l=m.parentNode;l!=this;l=l.parentNode){if(!l){return null;
}}return document.id(m,n);},getSelected:function(){return new Elements($A(this.options).filter(function(l){return l.selected;}));},getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];
}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null;},toQueryString:function(){var l=[];
this.getElements("input, select, textarea",true).each(function(m){if(!m.name||m.disabled||m.type=="submit"||m.type=="reset"||m.type=="file"){return;}var n=(m.tagName.toLowerCase()=="select")?Element.getSelected(m).map(function(o){return o.value;
}):((m.type=="radio"||m.type=="checkbox")&&!m.checked)?null:m.value;$splat(n).each(function(o){if(typeof o!="undefined"){l.push(m.name+"="+encodeURIComponent(o));
}});});return l.join("&");},clone:function(o,l){o=o!==false;var r=this.cloneNode(o);var n=function(v,u){if(!l){v.removeAttribute("id");}if(Browser.Engine.trident){v.clearAttributes();
v.mergeAttributes(u);v.removeAttribute("uid");if(v.options){var w=v.options,s=u.options;for(var t=w.length;t--;){w[t].selected=s[t].selected;}}}var x=i[u.tagName.toLowerCase()];
if(x&&u[x]){v[x]=u[x];}};if(o){var p=r.getElementsByTagName("*"),q=this.getElementsByTagName("*");for(var m=p.length;m--;){n(p[m],q[m]);}}n(r,this);return document.id(r);
},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null;},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l);
});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},hasChild:function(l){l=document.id(l,true);if(!l){return false;
}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(l.tagName)).contains(l);}return(this.contains)?(this!=l&&this.contains(l)):!!(this.compareDocumentPosition(l)&16);
},match:function(l){return(!l||(l==this)||(Element.get(this,"tag")==l));}});Native.implement([Element,Window,Document],{addListener:function(o,n){if(o=="unload"){var l=n,m=this;
n=function(){m.removeListener("unload",n);l();};}else{h[this.uid]=this;}if(this.addEventListener){this.addEventListener(o,n,false);}else{this.attachEvent("on"+o,n);
}return this;},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false);}else{this.detachEvent("on"+m,l);}return this;
},retrieve:function(m,l){var o=c(this.uid),n=o[m];if(l!=undefined&&n==undefined){n=o[m]=l;}return $pick(n);},store:function(m,l){var n=c(this.uid);n[m]=l;
return this;},eliminate:function(l){var m=c(this.uid);delete m[l];return this;}});window.addListener("unload",d);})();Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a;
},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};
a.thead=a.tfoot=a.tbody;var b={set:function(){var e=Array.flatten(arguments).join("");var f=Browser.Engine.trident&&a[this.get("tag")];if(f){var g=c;g.innerHTML=f[1]+e+f[2];
for(var d=f[0];d--;){g=g.firstChild;}this.empty().adopt(g.childNodes);}else{this.innerHTML=e;}}};b.erase=b.set;return b;})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText;
}var a=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var b=a.innerText;a.destroy();return b;}};}Element.Properties.events={set:function(a){this.addEvents(a);
}};Native.implement([Element,Window,Document],{addEvent:function(e,g){var h=this.retrieve("events",{});h[e]=h[e]||{keys:[],values:[]};if(h[e].keys.contains(g)){return this;
}h[e].keys.push(g);var f=e,a=Element.Events.get(e),c=g,i=this;if(a){if(a.onAdd){a.onAdd.call(this,g);}if(a.condition){c=function(j){if(a.condition.call(this,j)){return g.call(this,j);
}return true;};}f=a.base||f;}var d=function(){return g.call(i);};var b=Element.NativeEvents[f];if(b){if(b==2){d=function(j){j=new Event(j,i.getWindow());
if(c.call(i,j)===false){j.stop();}};}this.addListener(f,d);}h[e].values.push(d);return this;},removeEvent:function(c,b){var a=this.retrieve("events");if(!a||!a[c]){return this;
}var f=a[c].keys.indexOf(b);if(f==-1){return this;}a[c].keys.splice(f,1);var e=a[c].values.splice(f,1)[0];var d=Element.Events.get(c);if(d){if(d.onRemove){d.onRemove.call(this,b);
}c=d.base||c;}return(Element.NativeEvents[c])?this.removeListener(c,e):this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;
},removeEvents:function(a){var c;if($type(a)=="object"){for(c in a){this.removeEvent(c,a[c]);}return this;}var b=this.retrieve("events");if(!b){return this;
}if(!a){for(c in b){this.removeEvents(c);}this.eliminate("events");}else{if(b[a]){while(b[a].keys[0]){this.removeEvent(a,b[a].keys[0]);}b[a]=null;}}return this;
},fireEvent:function(d,b,a){var c=this.retrieve("events");if(!c||!c[d]){return this;}c[d].keys.each(function(e){e.create({bind:this,delay:a,"arguments":b})();
},this);return this;},cloneEvents:function(d,a){d=document.id(d);var c=d.retrieve("events");if(!c){return this;}if(!a){for(var b in c){this.cloneEvents(d,b);
}}else{if(c[a]){c[a].keys.each(function(e){this.addEvent(a,e);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
(function(){var a=function(b){var c=b.relatedTarget;if(c==undefined){return true;}if(c===false){return false;}return($type(this)!="document"&&c!=this&&c.prefix!="xul"&&!this.hasChild(c));
};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}});
})();Element.Properties.styles={set:function(a){this.setStyles(a);}};Element.Properties.opacity={set:function(a,b){if(!b){if(a==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden";
}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(a==1)?"":"alpha(opacity="+a*100+")";
}this.style.opacity=a;this.store("opacity",a);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(a){return this.set("opacity",a,true);
},getOpacity:function(){return this.get("opacity");},setStyle:function(b,a){switch(b){case"opacity":return this.set("opacity",parseFloat(a));case"float":b=(Browser.Engine.trident)?"styleFloat":"cssFloat";
}b=b.camelCase();if($type(a)!="string"){var c=(Element.Styles.get(b)||"@").split(" ");a=$splat(a).map(function(e,d){if(!c[d]){return"";}return($type(e)=="number")?c[d].replace("@",Math.round(e)):e;
}).join(" ");}else{if(a==String(Number(a))){a=Math.round(a);}}this.style[b]=a;return this;},getStyle:function(g){switch(g){case"opacity":return this.get("opacity");
case"float":g=(Browser.Engine.trident)?"styleFloat":"cssFloat";}g=g.camelCase();var a=this.style[g];if(!$chk(a)){a=[];for(var f in Element.ShortStyles){if(g!=f){continue;
}for(var e in Element.ShortStyles[f]){a.push(this.getStyle(e));}return a.join(" ");}a=this.getComputedStyle(g);}if(a){a=String(a);var c=a.match(/rgba?\([\d\s,]+\)/);
if(c){a=a.replace(c[0],c[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(a,10)))){if(g.test(/^(height|width)$/)){var b=(g=="width")?["left","right"]:["top","bottom"],d=0;
b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt();},this);return this["offset"+g.capitalize()]-d+"px";
}if((Browser.Engine.presto)&&String(a).test("px")){return a;}if(g.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return a;},setStyles:function(b){for(var a in b){this.setStyle(a,b[a]);
}return this;},getStyles:function(){var a={};Array.flatten(arguments).each(function(b){a[b]=this.getStyle(b);},this);return a;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});
Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles;
var b=Element.Styles;["margin","padding"].each(function(h){var i=h+g;f[h][i]=b[i]="@px";});var e="border"+g;f.border[e]=b[e]="@px @ rgb(@, @, @)";var d=e+"Width",a=e+"Style",c=e+"Color";
f[e]={};f.borderWidth[d]=f[e][d]=b[d]="@px";f.borderStyle[a]=f[e][a]=b[a]="@";f.borderColor[c]=f[e][c]=b[c]="rgb(@, @, @)";});(function(){Element.implement({scrollTo:function(h,i){if(b(this)){this.getWindow().scrollTo(h,i);
}else{this.scrollLeft=h;this.scrollTop=i;}return this;},getSize:function(){if(b(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};
},getScrollSize:function(){if(b(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(b(this)){return this.getWindow().getScroll();
}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var i=this,h={x:0,y:0};while(i&&!b(i)){h.x+=i.scrollLeft;h.y+=i.scrollTop;i=i.parentNode;
}return h;},getOffsetParent:function(){var h=this;if(b(h)){return null;}if(!Browser.Engine.trident){return h.offsetParent;}while((h=h.parentNode)&&!b(h)){if(d(h,"position")!="static"){return h;
}}return null;},getOffsets:function(){if(this.getBoundingClientRect){var j=this.getBoundingClientRect(),m=document.id(this.getDocument().documentElement),p=m.getScroll(),k=this.getScrolls(),i=this.getScroll(),h=(d(this,"position")=="fixed");
return{x:j.left.toInt()+k.x-i.x+((h)?0:p.x)-m.clientLeft,y:j.top.toInt()+k.y-i.y+((h)?0:p.y)-m.clientTop};}var l=this,n={x:0,y:0};if(b(this)){return n;
}while(l&&!b(l)){n.x+=l.offsetLeft;n.y+=l.offsetTop;if(Browser.Engine.gecko){if(!f(l)){n.x+=c(l);n.y+=g(l);}var o=l.parentNode;if(o&&d(o,"overflow")!="visible"){n.x+=c(o);
n.y+=g(o);}}else{if(l!=this&&Browser.Engine.webkit){n.x+=c(l);n.y+=g(l);}}l=l.offsetParent;}if(Browser.Engine.gecko&&!f(this)){n.x-=c(this);n.y-=g(this);
}return n;},getPosition:function(k){if(b(this)){return{x:0,y:0};}var l=this.getOffsets(),i=this.getScrolls();var h={x:l.x-i.x,y:l.y-i.y};var j=(k&&(k=document.id(k)))?k.getPosition():{x:0,y:0};
return{x:h.x-j.x,y:h.y-j.y};},getCoordinates:function(j){if(b(this)){return this.getWindow().getCoordinates();}var h=this.getPosition(j),i=this.getSize();
var k={left:h.x,top:h.y,width:i.x,height:i.y};k.right=k.left+k.width;k.bottom=k.top+k.height;return k;},computePosition:function(h){return{left:h.x-e(this,"margin-left"),top:h.y-e(this,"margin-top")};
},setPosition:function(h){return this.setStyles(this.computePosition(h));}});Native.implement([Document,Window],{getSize:function(){if(Browser.Engine.presto||Browser.Engine.webkit){var i=this.getWindow();
return{x:i.innerWidth,y:i.innerHeight};}var h=a(this);return{x:h.clientWidth,y:h.clientHeight};},getScroll:function(){var i=this.getWindow(),h=a(this);
return{x:i.pageXOffset||h.scrollLeft,y:i.pageYOffset||h.scrollTop};},getScrollSize:function(){var i=a(this),h=this.getSize();return{x:Math.max(i.scrollWidth,h.x),y:Math.max(i.scrollHeight,h.y)};
},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var h=this.getSize();return{top:0,left:0,bottom:h.y,right:h.x,height:h.y,width:h.x};
}});var d=Element.getComputedStyle;function e(h,i){return d(h,i).toInt()||0;}function f(h){return d(h,"-moz-box-sizing")=="border-box";}function g(h){return e(h,"border-top-width");
}function c(h){return e(h,"border-left-width");}function b(h){return(/^(?:body|html)$/i).test(h.tagName);}function a(h){var i=h.getDocument();return(!i.compatMode||i.compatMode=="CSS1Compat")?i.html:i.body;
}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x;
},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y;
},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x;
}});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");var c,e={};for(var d=0,b=h.length;d<b;d++){var a=h[d],f=Selectors.Utils.search(this,a,e);
if(d!=0&&f.item){f=$A(f);}c=(d==0)?f:(c.item)?$A(c).concat(f):c.concat(f);}return new Elements(c,{ddup:(h.length>1),cash:!g});}});Element.implement({match:function(b){if(!b||(b==this)){return true;
}var d=Selectors.Utils.parseTagAndID(b);var a=d[0],e=d[1];if(!Selectors.Filters.byID(this,e)||!Selectors.Filters.byTag(this,a)){return false;}var c=Selectors.Utils.parseSelector(b);
return(c)?Selectors.Utils.filter(this,c,{}):true;}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};
Selectors.Utils={chk:function(b,c){if(!c){return true;}var a=$uid(b);if(!c[a]){return c[a]=true;}return false;},parseNthArgument:function(h){if(Selectors.Cache.nth[h]){return Selectors.Cache.nth[h];
}var e=h.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!e){return false;}var g=parseInt(e[1],10);var d=(g||g===0)?g:1;var f=e[2]||false;var c=parseInt(e[3],10)||0;
if(d!=0){c--;while(c<1){c+=d;}while(c>=d){c-=d;}}else{d=c;f="index";}switch(f){case"n":e={a:d,b:c,special:"n"};break;case"odd":e={a:2,b:0,special:"n"};
break;case"even":e={a:2,b:1,special:"n"};break;case"first":e={a:0,special:"index"};break;case"last":e={special:"last-child"};break;case"only":e={special:"only-child"};
break;default:e={a:(d-1),special:"index"};}return Selectors.Cache.nth[h]=e;},parseSelector:function(e){if(Selectors.Cache.parsed[e]){return Selectors.Cache.parsed[e];
}var d,h={classes:[],pseudos:[],attributes:[]};while((d=Selectors.RegExps.combined.exec(e))){var i=d[1],g=d[2],f=d[3],b=d[5],c=d[6],j=d[7];if(i){h.classes.push(i);
}else{if(c){var a=Selectors.Pseudo.get(c);if(a){h.pseudos.push({parser:a,argument:j});}else{h.attributes.push({name:c,operator:"=",value:j});}}else{if(g){h.attributes.push({name:g,operator:f,value:b});
}}}}if(!h.classes.length){delete h.classes;}if(!h.attributes.length){delete h.attributes;}if(!h.pseudos.length){delete h.pseudos;}if(!h.classes&&!h.attributes&&!h.pseudos){h=null;
}return Selectors.Cache.parsed[e]=h;},parseTagAndID:function(b){var a=b.match(Selectors.RegExps.tag);var c=b.match(Selectors.RegExps.id);return[(a)?a[1]:"*",(c)?c[1]:false];
},filter:function(f,c,e){var d;if(c.classes){for(d=c.classes.length;d--;d){var g=c.classes[d];if(!Selectors.Filters.byClass(f,g)){return false;}}}if(c.attributes){for(d=c.attributes.length;
d--;d){var b=c.attributes[d];if(!Selectors.Filters.byAttribute(f,b.name,b.operator,b.value)){return false;}}}if(c.pseudos){for(d=c.pseudos.length;d--;d){var a=c.pseudos[d];
if(!Selectors.Filters.byPseudo(f,a.parser,a.argument,e)){return false;}}}return true;},getByTagAndID:function(b,a,d){if(d){var c=(b.getElementById)?b.getElementById(d,true):Element.getElementById(b,d,true);
return(c&&Selectors.Filters.byTag(c,a))?[c]:[];}else{return b.getElementsByTagName(a);}},search:function(o,h,t){var b=[];var c=h.trim().replace(Selectors.RegExps.splitter,function(k,j,i){b.push(j);
return":)"+i;}).split(":)");var p,e,A;for(var z=0,v=c.length;z<v;z++){var y=c[z];if(z==0&&Selectors.RegExps.quick.test(y)){p=o.getElementsByTagName(y);
continue;}var a=b[z-1];var q=Selectors.Utils.parseTagAndID(y);var B=q[0],r=q[1];if(z==0){p=Selectors.Utils.getByTagAndID(o,B,r);}else{var d={},g=[];for(var x=0,w=p.length;
x<w;x++){g=Selectors.Getters[a](g,p[x],B,r,d);}p=g;}var f=Selectors.Utils.parseSelector(y);if(f){e=[];for(var u=0,s=p.length;u<s;u++){A=p[u];if(Selectors.Utils.filter(A,f,t)){e.push(A);
}}p=e;}}return p;}};Selectors.Getters={" ":function(h,g,j,a,e){var d=Selectors.Utils.getByTagAndID(g,j,a);for(var c=0,b=d.length;c<b;c++){var f=d[c];if(Selectors.Utils.chk(f,e)){h.push(f);
}}return h;},">":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;e<d;e++){var b=c[e];if(b.parentNode==g&&Selectors.Utils.chk(b,f)){h.push(b);
}}return h;},"+":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(Selectors.Utils.chk(b,d)&&Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b);
}break;}}return c;},"~":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(!Selectors.Utils.chk(b,d)){break;}if(Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b);
}}}return c;}};Selectors.Filters={byTag:function(b,a){return(a=="*"||(b.tagName&&b.tagName.toLowerCase()==a));},byID:function(a,b){return(!b||(a.id&&a.id==b));
},byClass:function(b,a){return(b.className&&b.className.contains&&b.className.contains(a," "));},byPseudo:function(a,d,c,b){return d.call(a,c,b);},byAttribute:function(c,d,b,e){var a=Element.prototype.getProperty.call(c,d);
if(!a){return(b=="!=");}if(!b||e==undefined){return true;}switch(b){case"=":return(a==e);case"*=":return(a.contains(e));case"^=":return(a.substr(0,e.length)==e);
case"$=":return(a.substr(a.length-e.length)==e);case"!=":return(a!=e);case"~=":return a.contains(e," ");case"|=":return a.contains(e,"-");}return false;
}};Selectors.Pseudo=new Hash({checked:function(){return this.checked;},empty:function(){return !(this.innerText||this.textContent||"").length;},not:function(a){return !Element.match(this,a);
},contains:function(a){return(this.innerText||this.textContent||"").contains(a);},"first-child":function(){return Selectors.Pseudo.index.call(this,0);},"last-child":function(){var a=this;
while((a=a.nextSibling)){if(a.nodeType==1){return false;}}return true;},"only-child":function(){var b=this;while((b=b.previousSibling)){if(b.nodeType==1){return false;
}}var a=this;while((a=a.nextSibling)){if(a.nodeType==1){return false;}}return true;},"nth-child":function(g,e){g=(g==undefined)?"n":g;var c=Selectors.Utils.parseNthArgument(g);
if(c.special!="n"){return Selectors.Pseudo[c.special].call(this,c.a,e);}var f=0;e.positions=e.positions||{};var d=$uid(this);if(!e.positions[d]){var b=this;
while((b=b.previousSibling)){if(b.nodeType!=1){continue;}f++;var a=e.positions[$uid(b)];if(a!=undefined){f=a+f;break;}}e.positions[d]=f;}return(e.positions[d]%c.a==c.b);
},index:function(a){var b=this,c=0;while((b=b.previousSibling)){if(b.nodeType==1&&++c>a){return false;}}return(c==a);},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a);
},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a);},selected:function(){return this.selected;},enabled:function(){return(this.disabled===false);
}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this);}}};(function(){var b=function(){if(Browser.loaded){return;}Browser.loaded=true;
window.fireEvent("domready");document.fireEvent("domready");};window.addEvent("load",b);if(Browser.Engine.trident){var a=document.createElement("div");
(function(){($try(function(){a.doScroll();return document.id(a).inject(document.body).set("html","temp").dispose();}))?b():arguments.callee.delay(50);})();
}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?b():arguments.callee.delay(50);
})();}else{document.addEvent("DOMContentLoaded",b);}}})();var JSON=new Hash(this.JSON&&{stringify:JSON.stringify,parse:JSON.parse}).extend({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16);
},encode:function(b){switch($type(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).clean())+"]";
case"object":case"hash":var a=[];Hash.each(b,function(e,d){var c=JSON.encode(e);if(c){a.push(JSON.encode(d)+":"+c);}});return"{"+a+"}";case"number":case"boolean":return String(b);
case false:return"null";}return null;},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null;
}return eval("("+string+")");}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(b,a){this.key=b;
this.setOptions(a);},write:function(b){b=encodeURIComponent(b);if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path;
}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure";
}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);
};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;
},initialize:function(l,m){this.instance="Swiff_"+$time();this.setOptions(m);m=this.options;var b=this.id=m.id||this.instance;var a=document.id(m.container);
Swiff.CallBacks[this.instance]={};var e=m.params,g=m.vars,f=m.callBacks;var h=$extend({height:m.height,width:m.width},m.properties);var k=this;for(var d in f){Swiff.CallBacks[this.instance][d]=(function(n){return function(){return n.apply(k.object,arguments);
};})(f[d]);g[d]="Swiff.CallBacks."+this.instance+"."+d;}e.flashVars=Hash.toQueryString(g);if(Browser.Engine.trident){h.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
e.movie=l;}else{h.type="application/x-shockwave-flash";h.data=l;}var j='<object id="'+b+'"';for(var i in h){j+=" "+i+'="'+h[i]+'"';}j+=">";for(var c in e){if(e[c]){j+='<param name="'+c+'" value="'+e[c]+'" />';
}}j+="</object>";this.object=((a)?a.empty():new Element("div")).set("html",j).firstChild;},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this.toElement(),a);
return this;},inject:function(a){document.id(a,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments));
}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+"</invoke>");
return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(a){this.subject=this.subject||this;
this.setOptions(a);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var b=this.options.wait;if(b===false){this.options.link="cancel";
}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2;};},step:function(){var a=$time();if(a<this.time+this.options.duration){var b=this.transition((a-this.time)/this.options.duration);
this.set(this.compute(this.from,this.to,b));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(a){return a;},compute:function(c,b,a){return Fx.compute(c,b,a);
},check:function(){if(!this.timer){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));
return false;}return false;},start:function(b,a){if(!this.check(b,a)){return this;}this.from=b;this.to=a;this.time=0;this.transition=this.getTransition();
this.startTimer();this.onStart();return this;},complete:function(){if(this.stopTimer()){this.onComplete();}return this;},cancel:function(){if(this.stopTimer()){this.onCancel();
}return this;},onStart:function(){this.fireEvent("start",this.subject);},onComplete:function(){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain();},pause:function(){this.stopTimer();return this;},resume:function(){this.startTimer();
return this;},stopTimer:function(){if(!this.timer){return false;}this.time=$time()-this.time;this.timer=$clear(this.timer);return true;},startTimer:function(){if(this.timer){return false;
}this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true;}});Fx.compute=function(c,b,a){return(b-c)*a+c;
};Fx.Durations={"short":250,normal:500,"long":1000};Fx.CSS=new Class({Extends:Fx,prepare:function(d,e,b){b=$splat(b);var c=b[1];if(!$chk(c)){b[1]=b[0];
b[0]=d.getStyle(e);}var a=b.map(this.parse);return{from:a[0],to:a[1]};},parse:function(a){a=$lambda(a)();a=(typeof a=="string")?a.split(" "):$splat(a);
return a.map(function(c){c=String(c);var b=false;Fx.CSS.Parsers.each(function(f,e){if(b){return;}var d=f.parse(c);if($chk(d)){b={value:d,parser:f};}});
b=b||{value:c,parser:Fx.CSS.Parsers.String};return b;});},compute:function(d,c,b){var a=[];(Math.min(d.length,c.length)).times(function(e){a.push({value:d[e].parser.compute(d[e].value,c[e].value,b),parser:d[e].parser});
});a.$family={name:"fx:css:value"};return a;},serve:function(c,b){if($type(c)!="fx:css:value"){c=this.parse(c);}var a=[];c.each(function(d){a=a.concat(d.parser.serve(d.value,b));
});return a;},render:function(a,d,c,b){a.setStyle(d,this.serve(c,b));},search:function(a){if(Fx.CSS.Cache[a]){return Fx.CSS.Cache[a];}var b={};Array.each(document.styleSheets,function(e,d){var c=e.href;
if(c&&c.contains("://")&&!c.contains(document.domain)){return;}var f=e.rules||e.cssRules;Array.each(f,function(j,g){if(!j.style){return;}var h=(j.selectorText)?j.selectorText.replace(/^\w+/,function(i){return i.toLowerCase();
}):null;if(!h||!h.test("^"+a+"$")){return;}Element.Styles.each(function(k,i){if(!j.style[i]||Element.ShortStyles[i]){return;}k=String(j.style[i]);b[i]=(k.test(/^rgb/))?k.rgbToHex():k;
});});});return Fx.CSS.Cache[a]=b;}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true);
}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a));
});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});
Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b;
b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this;
}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to);
}});Element.Properties.tween={set:function(a){var b=this.retrieve("tween");if(b){b.cancel();}return this.eliminate("tween").store("tween:options",$extend({link:"cancel"},a));
},get:function(a){if(a||!this.retrieve("tween")){if(a||!this.retrieve("tween:options")){this.set("tween",a);}this.store("tween",new Fx.Tween(this,this.retrieve("tween:options")));
}return this.retrieve("tween");}};Element.implement({tween:function(a,c,b){this.get("tween").start(arguments);return this;},fade:function(c){var e=this.get("tween"),d="opacity",a;
c=$pick(c,"toggle");switch(c){case"in":e.start(d,1);break;case"out":e.start(d,0);break;case"show":e.set(d,1);break;case"hide":e.set(d,0);break;case"toggle":var b=this.retrieve("fade:flag",this.get("opacity")==1);
e.start(d,(b)?0:1);this.store("fade:flag",!b);a=true;break;default:e.start(d,arguments);}if(!a){this.eliminate("fade:flag");}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));
a=(a=="transparent")?"#fff":a;}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);
},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={};
for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={};
for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){var b=this.retrieve("morph");
if(b){b.cancel();}return this.eliminate("morph").store("morph:options",$extend({link:"cancel"},a));},get:function(a){if(a||!this.retrieve("morph")){if(a||!this.retrieve("morph:options")){this.set("morph",a);
}this.store("morph",new Fx.Morph(this,this.retrieve("morph:options")));}return this.retrieve("morph");}};Element.implement({morph:function(a){this.get("morph").start(a);
return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":");
a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(b,a){a=$splat(a);
return $extend(b,{easeIn:function(c){return b(c,a);},easeOut:function(c){return 1-b(1-c,a);},easeInOut:function(c){return(c<=0.5)?b(2*c,a)/2:(2-b(2*(1-c),a))/2;
}});};Fx.Transitions=new Hash({linear:$arguments(0)});Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a[0]||6);
},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.sin((1-a)*Math.PI/2);
},Back:function(b,a){a=a[0]||1.618;return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);
break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2]);
});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,noCache:false},initialize:function(a){this.xhr=new Browser.Request();
this.setOptions(a);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return;
}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));this.xhr.onreadystatechange=$empty;if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};
this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}},isSuccess:function(){return((this.status>=200)&&(this.status<300));
},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a);}return a.stripScripts(this.options.evalScripts);
},success:function(b,a){this.onSuccess(this.processScripts(b),a);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(a,b){this.headers.set(a,b);
return this;},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a);}.bind(this));},check:function(){if(!this.running){return true;
}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false;}return false;},send:function(k){if(!this.check(k)){return this;
}this.running=true;var i=$type(k);if(i=="string"||i=="element"){k={data:k};}var d=this.options;k=$extend({data:d.data,url:d.url,method:d.method},k);var g=k.data,b=String(k.url),a=k.method.toLowerCase();
switch($type(g)){case"element":g=document.id(g).toQueryString();break;case"object":case"hash":g=Hash.toQueryString(g);}if(this.options.format){var j="format="+this.options.format;
g=(g)?j+"&"+g:j;}if(this.options.emulation&&!["get","post"].contains(a)){var h="_method="+a;g=(g)?h+"&"+g:h;a="post";}if(this.options.urlEncoded&&a=="post"){var c=(this.options.encoding)?"; charset="+this.options.encoding:"";
this.headers.set("Content-type","application/x-www-form-urlencoded"+c);}if(this.options.noCache){var f="noCache="+new Date().getTime();g=(g)?f+"&"+g:f;
}var e=b.lastIndexOf("/");if(e>-1&&(e=b.indexOf("#"))>-1){b=b.substr(0,e);}if(g&&a=="get"){b=b+(b.contains("?")?"&":"?")+g;g=null;}this.xhr.open(a.toUpperCase(),b,this.options.async);
this.xhr.onreadystatechange=this.onStateChange.bind(this);this.headers.each(function(m,l){try{this.xhr.setRequestHeader(l,m);}catch(n){this.fireEvent("exception",[l,m]);
}},this);this.fireEvent("request");this.xhr.send(g);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this;
}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var a={};
["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined});
return this.send($extend(c,{method:b}));};});Request.implement(a);})();Element.Properties.send={set:function(a){var b=this.retrieve("send");if(b){b.cancel();
}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},a));},get:function(a){if(a||!this.retrieve("send")){if(a||!this.retrieve("send:options")){this.set("send",a);
}this.store("send",new Request(this.retrieve("send:options")));}return this.retrieve("send");}};Element.implement({send:function(a){var b=this.get("send");
b.send({data:this,url:a||b.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false},processHTML:function(c){var b=c.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d="<root>"+c+"</root>",g;if(Browser.Engine.trident){g=new ActiveXObject("Microsoft.XMLDOM");
g.async=false;g.loadXML(d);}else{g=new DOMParser().parseFromString(d,"text/xml");}d=g.getElementsByTagName("root")[0];if(!d){return null;}for(var f=0,e=d.childNodes.length;
f<e;f++){var h=Element.clone(d.childNodes[f],true,true);if(h){a.grab(h);}}return a;})||a.set("html",c);},success:function(d){var c=this.options,b=this.response;
b.html=d.stripScripts(function(e){b.javascript=e;});var a=this.processHTML(b.html);b.tree=a.childNodes;b.elements=a.getElements("*");if(c.filter){b.tree=b.elements.filter(c.filter);
}if(c.update){document.id(c.update).empty().set("html",b.html);}else{if(c.append){document.id(c.append).adopt(a.getChildren());}}if(c.evalScripts){$exec(b.javascript);
}this.onSuccess(b.tree,b.elements,b.html,b.javascript);}});Element.Properties.load={set:function(a){var b=this.retrieve("load");if(b){b.cancel();}return this.eliminate("load").store("load:options",$extend({data:this,link:"cancel",update:this,method:"get"},a));
},get:function(a){if(a||!this.retrieve("load")){if(a||!this.retrieve("load:options")){this.set("load",a);}this.store("load",new Request.HTML(this.retrieve("load:options")));
}return this.retrieve("load");}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Object.type,url:String.type}));return this;
}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);this.headers.extend({Accept:"application/json","X-Request":"JSON"});
},success:function(a){this.response.json=JSON.decode(a,this.options.secure);this.onSuccess(this.response.json,a);}});
//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2009 Aaron Newton <http://clientcide.com/>, Valerio Proietti <http://mad4milk.net> & the MooTools team <http://mootools.net/developers>, MIT Style License.
MooTools.More={version:"1.2.4.4",build:"6f6057dc645fdb7547689183b2311063bd653ddf"};Class.refactor=function(b,a){$each(a,function(e,d){var c=b.prototype[d];
if(c&&(c=c._origin)&&typeof e=="function"){b.implement(d,function(){var f=this.previous;this.previous=c;var g=e.apply(this,arguments);this.previous=f;return g;
});}else{b.implement(d,e);}});return b;};Class.Mutators.Binds=function(a){return a;};Class.Mutators.initialize=function(a){return function(){$splat(this.Binds).each(function(b){var c=this[b];
if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property);
if(a&&!$defined(this.occluded)){return this.occluded=a;}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});Element.implement({measure:function(e){var g=function(h){return !!(!h||h.offsetHeight||h.offsetWidth);
};if(g(this)){return e.apply(this);}var d=this.getParent(),f=[],b=[];while(!g(d)&&d!=document.body){b.push(d.expose());d=d.getParent();}var c=this.expose();
var a=e.apply(this);c();b.each(function(h){h();});return a;},expose:function(){if(this.getStyle("display")!="none"){return $empty;}var a=this.style.cssText;
this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=a;}.bind(this);},getDimensions:function(a){a=$merge({computeSize:false},a);
var f={};var d=function(g,e){return(e.computeSize)?g.getComputedSize(e):g.getSize();};var b=this.getParent("body");if(b&&this.getStyle("display")=="none"){f=this.measure(function(){return d(this,a);
});}else{if(b){try{f=d(this,a);}catch(c){}}else{f={x:0,y:0};}}return $chk(f.x)?$extend(f,{width:f.x,height:f.y}):$extend(f,{x:f.width,y:f.height});},getComputedSize:function(a){a=$merge({styles:["padding","border"],plains:{height:["top","bottom"],width:["left","right"]},mode:"both"},a);
var c={width:0,height:0};switch(a.mode){case"vertical":delete c.width;delete a.plains.width;break;case"horizontal":delete c.height;delete a.plains.height;
break;}var b=[];$each(a.plains,function(g,f){g.each(function(h){a.styles.each(function(i){b.push((i=="border")?i+"-"+h+"-width":i+"-"+h);});});});var e={};
b.each(function(f){e[f]=this.getComputedStyle(f);},this);var d=[];$each(a.plains,function(g,f){var h=f.capitalize();c["total"+h]=c["computed"+h]=0;g.each(function(i){c["computed"+i.capitalize()]=0;
b.each(function(k,j){if(k.test(i)){e[k]=e[k].toInt()||0;c["total"+h]=c["total"+h]+e[k];c["computed"+i.capitalize()]=c["computed"+i.capitalize()]+e[k];}if(k.test(i)&&f!=k&&(k.test("border")||k.test("padding"))&&!d.contains(k)){d.push(k);
c["computed"+h]=c["computed"+h]-e[k];}});});});["Width","Height"].each(function(g){var f=g.toLowerCase();if(!$chk(c[f])){return;}c[f]=c[f]+this["offset"+g]+c["computed"+g];
c["total"+g]=c[f]+c["total"+g];delete c["computed"+g];},this);return $extend(e,c);}});(function(){var a=Element.prototype.position;Element.implement({position:function(g){if(g&&($defined(g.x)||$defined(g.y))){return a?a.apply(this,arguments):this;
}$each(g||{},function(u,t){if(!$defined(u)){delete g[t];}});g=$merge({relativeTo:document.body,position:{x:"center",y:"center"},edge:false,offset:{x:0,y:0},returnPos:false,relFixedPosition:false,ignoreMargins:false,ignoreScroll:false,allowNegative:false},g);
var r={x:0,y:0},e=false;var c=this.measure(function(){return document.id(this.getOffsetParent());});if(c&&c!=this.getDocument().body){r=c.measure(function(){return this.getPosition();
});e=c!=document.id(g.relativeTo);g.offset.x=g.offset.x-r.x;g.offset.y=g.offset.y-r.y;}var s=function(t){if($type(t)!="string"){return t;}t=t.toLowerCase();
var u={};if(t.test("left")){u.x="left";}else{if(t.test("right")){u.x="right";}else{u.x="center";}}if(t.test("upper")||t.test("top")){u.y="top";}else{if(t.test("bottom")){u.y="bottom";
}else{u.y="center";}}return u;};g.edge=s(g.edge);g.position=s(g.position);if(!g.edge){if(g.position.x=="center"&&g.position.y=="center"){g.edge={x:"center",y:"center"};
}else{g.edge={x:"left",y:"top"};}}this.setStyle("position","absolute");var f=document.id(g.relativeTo)||document.body,d=f==document.body?window.getScroll():f.getPosition(),l=d.y,h=d.x;
var n=this.getDimensions({computeSize:true,styles:["padding","border","margin"]});var j={},o=g.offset.y,q=g.offset.x,k=window.getSize();switch(g.position.x){case"left":j.x=h+q;
break;case"right":j.x=h+q+f.offsetWidth;break;default:j.x=h+((f==document.body?k.x:f.offsetWidth)/2)+q;break;}switch(g.position.y){case"top":j.y=l+o;break;
case"bottom":j.y=l+o+f.offsetHeight;break;default:j.y=l+((f==document.body?k.y:f.offsetHeight)/2)+o;break;}if(g.edge){var b={};switch(g.edge.x){case"left":b.x=0;
break;case"right":b.x=-n.x-n.computedRight-n.computedLeft;break;default:b.x=-(n.totalWidth/2);break;}switch(g.edge.y){case"top":b.y=0;break;case"bottom":b.y=-n.y-n.computedTop-n.computedBottom;
break;default:b.y=-(n.totalHeight/2);break;}j.x+=b.x;j.y+=b.y;}j={left:((j.x>=0||e||g.allowNegative)?j.x:0).toInt(),top:((j.y>=0||e||g.allowNegative)?j.y:0).toInt()};
var i={left:"x",top:"y"};["minimum","maximum"].each(function(t){["left","top"].each(function(u){var v=g[t]?g[t][i[u]]:null;if(v!=null&&j[u]<v){j[u]=v;}});
});if(f.getStyle("position")=="fixed"||g.relFixedPosition){var m=window.getScroll();j.top+=m.y;j.left+=m.x;}if(g.ignoreScroll){var p=f.getScroll();j.top-=p.y;
j.left-=p.x;}if(g.ignoreMargins){j.left+=(g.edge.x=="right"?n["margin-right"]:g.edge.x=="center"?-n["margin-left"]+((n["margin-right"]+n["margin-left"])/2):-n["margin-left"]);
j.top+=(g.edge.y=="bottom"?n["margin-bottom"]:g.edge.y=="center"?-n["margin-top"]+((n["margin-bottom"]+n["margin-top"])/2):-n["margin-top"]);}j.left=Math.ceil(j.left);
j.top=Math.ceil(j.top);if(g.returnPos){return j;}else{this.setStyles(j);}return this;}});})();var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Object.type,element:$defined});
this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=$type(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element;
this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)};
this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);
return this;},start:function(c){if(c.rightClick){return;}if(this.options.preventDefault){c.preventDefault();}if(this.options.stopPropagation){c.stopPropagation();
}this.mouse.start=c.page;this.fireEvent("beforeStart",this.element);var a=this.options.limit;this.limit={x:[],y:[]};for(var d in this.options.modifiers){if(!this.options.modifiers[d]){continue;
}if(this.options.style){this.value.now[d]=this.element.getStyle(this.options.modifiers[d]).toInt();}else{this.value.now[d]=this.element[this.options.modifiers[d]];
}if(this.options.invert){this.value.now[d]*=-1;}this.mouse.pos[d]=c.page[d]-this.value.now[d];if(a&&a[d]){for(var b=2;b--;b){if($chk(a[d][b])){this.limit[d][b]=$lambda(a[d][b])();
}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};}this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});
this.document.addEvent(this.selection,this.bound.eventStop);},check:function(a){if(this.options.preventDefault){a.preventDefault();}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));
if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);
}},drag:function(a){if(this.options.preventDefault){a.preventDefault();}this.mouse.now=a.page;for(var b in this.options.modifiers){if(!this.options.modifiers[b]){continue;
}this.value.now[b]=this.mouse.now[b]-this.mouse.pos[b];if(this.options.invert){this.value.now[b]*=-1;}if(this.options.limit&&this.limit[b]){if($chk(this.limit[b][1])&&(this.value.now[b]>this.limit[b][1])){this.value.now[b]=this.limit[b][1];
}else{if($chk(this.limit[b][0])&&(this.value.now[b]<this.limit[b][0])){this.value.now[b]=this.limit[b][0];}}}if(this.options.grid[b]){this.value.now[b]-=((this.value.now[b]-(this.limit[b][0]||0))%this.options.grid[b]);
}if(this.options.style){this.element.setStyle(this.options.modifiers[b],this.value.now[b]+this.options.unit);}else{this.element[this.options.modifiers[b]]=this.value.now[b];
}}this.fireEvent("drag",[this.element,a]);},cancel:function(a){this.document.removeEvent("mousemove",this.bound.check);this.document.removeEvent("mouseup",this.bound.cancel);
if(a){this.document.removeEvent(this.selection,this.bound.eventStop);this.fireEvent("cancel",this.element);}},stop:function(a){this.document.removeEvent(this.selection,this.bound.eventStop);
this.document.removeEvent("mousemove",this.bound.drag);this.document.removeEvent("mouseup",this.bound.stop);if(a){this.fireEvent("complete",[this.element,a]);
}}});Element.implement({makeResizable:function(a){var b=new Drag(this,$merge({modifiers:{x:"width",y:"height"}},a));this.store("resizer",b);return b.addEvent("drag",function(){this.fireEvent("resize",b);
}.bind(this));}});var Slider=new Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){if(this.options.snap){a=this.toPosition(this.step);
}this.knob.setStyle(this.property,a);},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);
this.element=document.id(f);this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var g,b={},d={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";
this.property="top";g="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";g="offsetWidth";}this.full=this.element.measure(function(){this.half=this.knob[g]/2;
return this.element[g]-this.knob[g]+(this.options.offset*2);}.bind(this));this.min=$chk(this.options.range[0])?this.options.range[0]:0;this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;
this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;this.stepWidth=this.stepSize*this.full/Math.abs(this.range);
this.knob.setStyle("position","relative").setStyle(this.property,this.options.initialStep?this.toPosition(this.options.initialStep):-this.options.offset);
d[this.axis]=this.property;b[this.axis]=[-this.options.offset,this.full-this.options.offset];var c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true;
}).bind(this),onCancel:function(){this.isDragging=false;}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end();}.bind(this)};
if(this.options.snap){c.grid=Math.ceil(this.stepWidth);c.limit[this.axis][1]=this.full;}this.drag=new Drag(this.knob,c);this.attach();},attach:function(){this.element.addEvent("mousedown",this.clickedElement);
if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement);}this.drag.attach();return this;},detach:function(){this.element.removeEvent("mousedown",this.clickedElement);
this.element.removeEvent("mousewheel",this.scrolledElement);this.drag.detach();return this;},set:function(a){if(!((this.range>0)^(a<this.min))){a=this.min;
}if(!((this.range>0)^(a>this.max))){a=this.max;}this.step=Math.round(a);this.checkStep();this.fireEvent("tick",this.toPosition(this.step));this.end();return this;
},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return;}var b=this.range<0?-1:1;var a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;
a=a.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();this.fireEvent("tick",a);
this.end();},scrolledElement:function(a){var b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0);this.set(b?this.step-this.stepSize:this.step+this.stepSize);
a.stop();},draggedKnob:function(){var b=this.range<0?-1:1;var a=this.drag.value.now[this.axis];a=a.limit(-this.options.offset,this.full-this.options.offset);
this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;
this.fireEvent("change",this.step);}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"");
}},toStep:function(a){var b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(b-=b%this.stepSize):b;},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset;
}});var Asset={javascript:function(f,d){d=$extend({onload:$empty,document:document,check:$lambda(true)},d);if(d.onLoad){d.onload=d.onLoad;}var b=new Element("script",{src:f,type:"text/javascript"});
var e=d.onload.bind(b),a=d.check,g=d.document;delete d.onload;delete d.check;delete d.document;b.addEvents({load:e,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){e();
}}}).set(d);if(Browser.Engine.webkit419){var c=(function(){if(!$try(a)){return;}$clear(c);e();}).periodical(50);}return b.inject(g.head);},css:function(b,a){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:b},a)).inject(document.head);
},image:function(c,b){b=$merge({onload:$empty,onabort:$empty,onerror:$empty},b);var d=new Image();var a=document.id(d)||new Element("img");["load","abort","error"].each(function(e){var g="on"+e;
var f=e.capitalize();if(b["on"+f]){b[g]=b["on"+f];}var h=b[g];delete b[g];d[g]=function(){if(!d){return;}if(!a.parentNode){a.width=d.width;a.height=d.height;
}d=d.onload=d.onabort=d.onerror=null;h.delay(1,a,a);a.fireEvent(e,a,1);};});d.src=a.src=c;if(d&&d.complete){d.onload.delay(1);}return a.set(b);},images:function(d,c){c=$merge({onComplete:$empty,onProgress:$empty,onError:$empty,properties:{}},c);
d=$splat(d);var a=[];var b=0;return new Elements(d.map(function(e){return Asset.image(e,$extend(c.properties,{onload:function(){c.onProgress.call(this,b,d.indexOf(e));
b++;if(b==d.length){c.onComplete();}},onerror:function(){c.onError.call(this,b,d.indexOf(e));b++;if(b==d.length){c.onComplete();}}}));}));}};var IframeShim=new Class({Implements:[Options,Events,Class.Occlude],options:{className:"iframeShim",src:'javascript:false;document.write("");',display:false,zIndex:null,margin:0,offset:{x:0,y:0},browsers:(Browser.Engine.trident4||(Browser.Engine.gecko&&!Browser.Engine.gecko19&&Browser.Platform.mac))},property:"IframeShim",initialize:function(b,a){this.element=document.id(b);
if(this.occlude()){return this.occluded;}this.setOptions(a);this.makeShim();return this;},makeShim:function(){if(this.options.browsers){var c=this.element.getStyle("zIndex").toInt();
if(!c){c=1;var b=this.element.getStyle("position");if(b=="static"||!b){this.element.setStyle("position","relative");}this.element.setStyle("zIndex",c);
}c=($chk(this.options.zIndex)&&c>this.options.zIndex)?this.options.zIndex:c-1;if(c<0){c=1;}this.shim=new Element("iframe",{src:this.options.src,scrolling:"no",frameborder:0,styles:{zIndex:c,position:"absolute",border:"none",filter:"progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"},"class":this.options.className}).store("IframeShim",this);
var a=(function(){this.shim.inject(this.element,"after");this[this.options.display?"show":"hide"]();this.fireEvent("inject");}).bind(this);if(!IframeShim.ready){window.addEvent("load",a);
}else{a();}}else{this.position=this.hide=this.show=this.dispose=$lambda(this);}},position:function(){if(!IframeShim.ready||!this.shim){return this;}var a=this.element.measure(function(){return this.getSize();
});if(this.options.margin!=undefined){a.x=a.x-(this.options.margin*2);a.y=a.y-(this.options.margin*2);this.options.offset.x+=this.options.margin;this.options.offset.y+=this.options.margin;
}this.shim.set({width:a.x,height:a.y}).position({relativeTo:this.element,offset:this.options.offset});return this;},hide:function(){if(this.shim){this.shim.setStyle("display","none");
}return this;},show:function(){if(this.shim){this.shim.setStyle("display","block");}return this.position();},dispose:function(){if(this.shim){this.shim.dispose();
}return this;},destroy:function(){if(this.shim){this.shim.destroy();}return this;}});window.addEvent("load",function(){IframeShim.ready=true;});var Mask=new Class({Implements:[Options,Events],Binds:["position"],options:{style:{},"class":"mask",maskMargins:false,useIframeShim:true,iframeShimOptions:{}},initialize:function(b,a){this.target=document.id(b)||document.id(document.body);
this.target.store("Mask",this);this.setOptions(a);this.render();this.inject();},render:function(){this.element=new Element("div",{"class":this.options["class"],id:this.options.id||"mask-"+$time(),styles:$merge(this.options.style,{display:"none"}),events:{click:function(){this.fireEvent("click");
if(this.options.hideOnClick){this.hide();}}.bind(this)}});this.hidden=true;},toElement:function(){return this.element;},inject:function(b,a){a=a||this.options.inject?this.options.inject.where:""||this.target==document.body?"inside":"after";
b=b||this.options.inject?this.options.inject.target:""||this.target;this.element.inject(b,a);if(this.options.useIframeShim){this.shim=new IframeShim(this.element,this.options.iframeShimOptions);
this.addEvents({show:this.shim.show.bind(this.shim),hide:this.shim.hide.bind(this.shim),destroy:this.shim.destroy.bind(this.shim)});}},position:function(){this.resize(this.options.width,this.options.height);
this.element.position({relativeTo:this.target,position:"topLeft",ignoreMargins:!this.options.maskMargins,ignoreScroll:this.target==document.body});return this;
},resize:function(a,e){var b={styles:["padding","border"]};if(this.options.maskMargins){b.styles.push("margin");}var d=this.target.getComputedSize(b);if(this.target==document.body){var c=window.getSize();
if(d.totalHeight<c.y){d.totalHeight=c.y;}if(d.totalWidth<c.x){d.totalWidth=c.x;}}this.element.setStyles({width:$pick(a,d.totalWidth,d.x),height:$pick(e,d.totalHeight,d.y)});
return this;},show:function(){if(!this.hidden){return this;}window.addEvent("resize",this.position);this.position();this.showMask.apply(this,arguments);
return this;},showMask:function(){this.element.setStyle("display","block");this.hidden=false;this.fireEvent("show");},hide:function(){if(this.hidden){return this;
}window.removeEvent("resize",this.position);this.hideMask.apply(this,arguments);if(this.options.destroyOnHide){return this.destroy();}return this;},hideMask:function(){this.element.setStyle("display","none");
this.hidden=true;this.fireEvent("hide");},toggle:function(){this[this.hidden?"show":"hide"]();},destroy:function(){this.hide();this.element.destroy();this.fireEvent("destroy");
this.target.eliminate("mask");}});Element.Properties.mask={set:function(b){var a=this.retrieve("mask");return this.eliminate("mask").store("mask:options",b);
},get:function(a){if(a||!this.retrieve("mask")){if(this.retrieve("mask")){this.retrieve("mask").destroy();}if(a||!this.retrieve("mask:options")){this.set("mask",a);
}this.store("mask",new Mask(this,this.retrieve("mask:options")));}return this.retrieve("mask");}};Element.implement({mask:function(a){this.get("mask",a).show();
return this;},unmask:function(){this.get("mask").hide();return this;}});var Spinner=new Class({Extends:Mask,options:{"class":"spinner",containerPosition:{},content:{"class":"spinner-content"},messageContainer:{"class":"spinner-msg"},img:{"class":"spinner-img"},fxOptions:{link:"chain"}},initialize:function(){this.parent.apply(this,arguments);
this.target.store("spinner",this);var a=function(){this.active=false;}.bind(this);this.addEvents({hide:a,show:a});},render:function(){this.parent();this.element.set("id",this.options.id||"spinner-"+$time());
this.content=document.id(this.options.content)||new Element("div",this.options.content);this.content.inject(this.element);if(this.options.message){this.msg=document.id(this.options.message)||new Element("p",this.options.messageContainer).appendText(this.options.message);
this.msg.inject(this.content);}if(this.options.img){this.img=document.id(this.options.img)||new Element("div",this.options.img);this.img.inject(this.content);
}this.element.set("tween",this.options.fxOptions);},show:function(a){if(this.active){return this.chain(this.show.bind(this));}if(!this.hidden){this.callChain.delay(20,this);
return this;}this.active=true;return this.parent(a);},showMask:function(a){var b=function(){this.content.position($merge({relativeTo:this.element},this.options.containerPosition));
}.bind(this);if(a){this.parent();b();}else{this.element.setStyles({display:"block",opacity:0}).tween("opacity",this.options.style.opacity||0.9);b();this.hidden=false;
this.fireEvent("show");this.callChain();}},hide:function(a){if(this.active){return this.chain(this.hide.bind(this));}if(this.hidden){this.callChain.delay(20,this);
return this;}this.active=true;return this.parent(a);},hideMask:function(a){if(a){return this.parent();}this.element.tween("opacity",0).get("tween").chain(function(){this.element.setStyle("display","none");
this.hidden=true;this.fireEvent("hide");this.callChain();}.bind(this));},destroy:function(){this.content.destroy();this.parent();this.target.eliminate("spinner");
}});Spinner.implement(new Chain);if(window.Request){Request=Class.refactor(Request,{options:{useSpinner:false,spinnerOptions:{},spinnerTarget:false},initialize:function(a){this._send=this.send;
this.send=function(c){if(this.spinner){this.spinner.chain(this._send.bind(this,c)).show();}else{this._send(c);}return this;};this.previous(a);var b=document.id(this.options.spinnerTarget)||document.id(this.options.update);
if(this.options.useSpinner&&b){this.spinner=b.get("spinner",this.options.spinnerOptions);["onComplete","onException","onCancel"].each(function(c){this.addEvent(c,this.spinner.hide.bind(this.spinner));
},this);}},getSpinner:function(){return this.spinner;}});}Element.Properties.spinner={set:function(a){var b=this.retrieve("spinner");return this.eliminate("spinner").store("spinner:options",a);
},get:function(a){if(a||!this.retrieve("spinner")){if(this.retrieve("spinner")){this.retrieve("spinner").destroy();}if(a||!this.retrieve("spinner:options")){this.set("spinner",a);
}new Spinner(this,this.retrieve("spinner:options"));}return this.retrieve("spinner");}};Element.implement({spin:function(a){this.get("spinner",a).show();
return this;},unspin:function(){var a=Array.link(arguments,{options:Object.type,callback:Function.type});this.get("spinner",a.options).hide(a.callback);
return this;}});

View File

@ -0,0 +1,54 @@
/*
---
description: A MooTools plugin that automatically map mouse events to touch events
license: MIT-style
authors:
- Chi Wai Lau (http://tabqwert.com)
- Scott Kyle (http://appden.com)
requires:
- core/1.2.4: '*'
provides: [Mouse2Touch]
...
*/
if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i))) {
(function() {
try {
document.createEvent("TouchEvent");
} catch(e) {
return;
}
['touchstart', 'touchmove', 'touchend'].each(function(type){
Element.NativeEvents[type] = 2;
});
var mapping = {
'mousedown': 'touchstart',
'mousemove': 'touchmove',
'mouseup': 'touchend'
};
var condition = function(event) {
var touch = event.event.changedTouches[0];
event.page = {
x: touch.pageX,
y: touch.pageY
};
return true;
};
for (var e in mapping) {
Element.Events[e] = {
base: mapping[e],
condition: condition
};
}
})();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

View File

@ -0,0 +1,15 @@
<!-- HDRHTML BEG: Put this part where the HDR HTML viewer should appear -->
<div class="hdr_viewer" style="width: @hdr_img_width@px;">
<div id="@base_name@_viewport" style="position: relative; height: @hdr_img_height@px">&nbsp;</div>
<div class="hdr_controller" style="background: top left url('@img_dir@@base_name@_hist.png') no-repeat; width: @hdr_img_width@px;"
title="Drag dynamic range window to change exposure" >
<div id="@base_name@_exp_text" class="label">&nbsp;</div>
<div id="@base_name@_dr_ctrl" style="position: absolute; left: 0px; top: 0px; width: @hist_width@px;"> <div class="knob"></div> </div>
<div id="@base_name@_help" class="hdr_help" title="What is this?">&nbsp;</div>
</div>
<script type="text/javascript"> insert_hdr_image( @hdr_img_object@ ); </script>
</div>
<!-- HDRHTML END -->

View File

@ -0,0 +1,15 @@
<!-- HDRHTML BEG: Put this part where the HDR HTML viewer should appear -->
<div class="hdr_viewer" style="width: @hdr_img_width@px;">
<div class="hdr_controller" style="background: top left url('@img_dir@@base_name@_hist.png') no-repeat; width: @hdr_img_width@px;"
title="Drag dynamic range window to change exposure" >
<div id="@base_name@_exp_text" class="label">&nbsp;</div>
<div id="@base_name@_dr_ctrl" style="position: absolute; left: 0px; top: 0px; width: @hist_width@px;"> <div class="knob"></div></div>
<div id="@base_name@_help" class="hdr_help" title="What is this?">&nbsp;</div>
</div>
<div id="@base_name@_viewport" style="position: relative; height: @hdr_img_height@px">&nbsp;</div>
<script type="text/javascript"> insert_hdr_image( @hdr_img_object@ ); </script>
</div>
<!-- HDRHTML END -->

View File

@ -0,0 +1,274 @@
<html>
<head>
<title>@title@</title>
<!-- HDRHTML BEG: Put this part in the "head" section -->
<!-- required: mootools v1.2.4. with (More) Slider and Asset extension -->
<script type="text/javascript" src="hdrhtml_assets/mootools-1.2.4.js"></script>
<!-- optional: include this script for iPad/iPhone compatibility -->
<script type="text/javascript" src="hdrhtml_assets/mouse2touch.js"></script>
<!-- required: CSS styling of the HDR-Viewer -->
<link rel="stylesheet" type="text/css" media="screen" href="hdrhtml_assets/hdr_viewer.css" />
<script type="text/javascript">
/*
-----------------------------------------------
HDR HTML Viewer ver. 1.7
Author: v1.0 Rafal Mantiuk
URL: http://www.cs.ubc.ca/~mantiuk/hdrhtml.html
Template v1.7 by Christian Bloch, www.hdrlabs.com
Requires: mootools javascript library from www.mootools.net or linked in from google's server:
http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js
Slider and Asset extensions from the mootools (More) section
----------------------------------------------- */
// For suppressing the text-selection cursor when dragging or interacting with the viewer
var noselect = false;
window.addEvent('selectstart', function(e) {
if (noselect) {
e.stop();
return false;
}
});
// for updating the EV label
function update_exp_text( hdr_image, new_exp ) {
ev_label = "EV:<span class='labelnumber'>"+ Math.round( (hdr_image.best_exp-new_exp)*10 )/10 + " f</span>";
// delete the next two lines if you prefer plain decimal display for fractional EV values
ev_label = ev_label.replace(/\.3/, "<font size=\"-1\"><sup> 1</sup>/<sub>3</sub></font>");
ev_label = ev_label.replace(/\.7/, "<font size=\"-1\"><sup> 2</sup>/<sub>3</sub></font>");
$(hdr_image.base_name + "_exp_text").innerHTML = ev_label;
}
function change_exp( hdr_image, exp_change ) {
hdr_active_image = hdr_image;
hdr_image.exposure = hdr_image.exposure + exp_change;
// clamp to exposure limits
if( hdr_image.exposure > hdr_image.f8_stops*8 ) {
hdr_image.exposure = hdr_image.f8_stops*8;
}
else if( hdr_image.exposure < 0 ) {
hdr_image.exposure = 0;
}
exp_cur = Math.floor(hdr_image.exposure / 8);
exp_shar = exp_cur + 1;
exp_blend = Math.round((hdr_image.exposure - exp_cur*8)*hdr_image.f_step_res);
// blend each image accordingly
var i;
for( i = 0; i < hdr_image.basis; i++ ) {
var img_obj = $(hdr_image.base_name+"_"+i);
img_obj.set('src', hdr_image.image_dir + hdr_image.base_name + "_"+exp_cur+"_" + (i+1) + ".jpg");
img_obj.setStyle('opacity', cf[exp_blend][i]);
}
for( i = 0; i < hdr_image.shared_basis; i++ ) {
var img_obj = $(hdr_image.base_name+"_"+(i+hdr_image.basis));
img_obj.set('src',hdr_image.image_dir + hdr_image.base_name + "_"+exp_shar+"_" + (i+1) + ".jpg");
img_obj.setStyle( 'opacity', cf[exp_blend][i+hdr_image.basis] );
}
update_exp_text( hdr_image, hdr_image.exposure );
}
// keyboartd events
function hdr_onkeydown(e) {
var hdr_image = hdr_active_image;
var keynum;
if( hdr_image == null )
return;
var hdrnum = hdr_names.indexOf(hdr_image.base_name);
if(window.event) { // IE
keynum = window.event.keyCode;
if( keynum == 189 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 - 10);
if( keynum == 187 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 + 10);
} else if(e.which) { // Netscape/Firefox/Opera
keynum = e.which;
if( keynum == 109 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 - 10);
if( keynum == 61 )
hdr_slider[hdrnum].set(hdr_image.exposure*10 + 10);
}
}
// ----------------------------------------
// This must be called from within the HTML
// ----------------------------------------
// - injects images into viewport
// - binds slider to EV
// - binds mousewheel to slider
// Called once from each "hdr_viewer" div
// inject images into HTML
function insert_hdr_image( hdr_image ) {
hdr_viewport = $(hdr_image.base_name+'_viewport');
hdr_viewer = hdr_viewport.getParent('div.hdr_viewer');
// preload images
var preloading = new Array();
var k = 0;
for( i = 0; i < hdr_image.f8_stops; i++ ) {
for( j = 0; j < hdr_image.basis; j++ ) {
preloading[k] = ""+hdr_image.image_dir + hdr_image.base_name + "_"+i+"_" + (j+1) + ".jpg";
k = k + 1;
}
}
preloading[k] = ""+hdr_image.image_dir + hdr_image.base_name + "_"+hdr_image.f8_stops+"_1.jpg";
// for showing the AJAX spinning circle swap the next line with the block below
new Asset.images(preloading);
// var loadspinner = new Spinner(hdr_viewer).show('noFX');
// var myImages = new Asset.images(preloading, {
// onComplete: function(){
// loadspinner.destroy();
// }
// });
// enumerate all instances to remember the name
hdrcount = hdrcount + 1;
hdr_names[hdrcount] = ""+hdr_image.base_name;
var injection = "";
for( i = 0; i < hdr_image.basis + hdr_image.shared_basis; i++ ) {
injection += "<img id=\"" + hdr_image.base_name + "_" + i +
"\" style=\"margin: 0px; padding: 0px; opacity: 1; width: " +
hdr_image.width + "px; height: " + hdr_image.height +
"px; position: absolute; top: 0px; left: 0px\"" +
" />\n";
}
// also inject a hidden help viewer
injection += "<div id=\"" + hdr_image.base_name + "_help_view" + "\" class=\"hdr_instructions\"" +
"style=\"margin: 0px; padding: 0px; opacity: 0; width: " +
hdr_image.width + "px; height: " + hdr_image.height +
"px; position: absolute; top: 0px; left: 0px\" ><div style=\"padding: 50px;\">" +
"<h1><a href=\"http://pfstools.sourceforge.net/hdrhtml/\" target=\"_blank\">HDR HTML Viewer</a></h1>" +
"v1.0 (C) 2008 Rafal Mantiuk | <a href=\"http://pfstools.sourceforge.net/\" target=\"_blank\">pfsTools</a><br />" +
"v1.7 mod 2010 Christian Bloch | <a href=\"www.hdrlabs.com\" target=\"_blank\">HDR Labs</a><br />" +
"<ul><li>Change exposure by sliding the dynamic range window left and right. Or just use the scroll wheel.</li>" +
"<li>Press \"-\" and \"=\" keys to change exposure by 1 f-stop.</li>" +
"<li>The green plot represents the HDR histogram. EV value is given in f-stops (log<sub>2</sub> units) " +
"relative to the inital exposure.</li>" +
"<li>The exposure window / slider encompasses 8 f-stops.</li>" +
"</ul></div></div>";
hdr_viewport.set('html',injection);
// link help viewer to help buttom
var help_view = $(hdr_image.base_name+'_help_view').fade('hide');;
$(hdr_image.base_name+'_help').addEvent('click', function() {
if(help_view.getStyle('opacity') == 0) help_view.fade(0.85);
else help_view.fade('out');
});
help_view.addEvent('click', function() {
help_view.fade('out');
});
// initialize mootools slider
hist_left = Math.round((-hdr_image.hist_start)*hdr_image.pix_per_fstop);
var el = $(hdr_image.base_name+'_dr_ctrl');
el.style.left = Math.round(hist_left) + "px";
el.style.width = Math.round(hdr_image.hist_width-hist_left) + "px";
el.getElement('.knob').style.width = hdr_image.pix_per_fstop*8 + "px";
var EVrange = (hdr_image.hist_width-hist_left)/hdr_image.pix_per_fstop-7.7;
var slider = new Slider(el, el.getElement('.knob'), {
steps: EVrange*hdr_image.f_step_res,
range: [0,EVrange*10],
onChange: function(value) {
change_exp( hdr_image, value/10 - hdr_image.exposure);
}
}).set(hdr_image.exposure*10);
// clone this slider into an array for keyboard access
hdr_slider[hdrcount] = slider;
// link active hdr image to rollover on the current image
hdr_viewer.addEvent('mouseenter', function() {
hdr_active_image = hdr_image;
// suppress accidental selection of individual images or text
noselect = true;
});
// link the mousewheel to the slider
hdr_viewer.addEvent('mousewheel', function(e) {
e.stop(); // prevent the mousewheel from scrolling the page.
noselect = true;
slider.set((hdr_image.exposure + e.wheel/2)*10);
});
// restore outside text to be selectable
hdr_viewer.addEvent('mouseleave', function() {
noselect = false;
});
}
</script>
<!-- HDRHTML END -->
</head>
<body>
<!-- HDRHTML BEG: Put this part at the beginning of the "body" section -->
<script type="text/javascript">
@hdr_img_def@
@cf_array_def@
var hdrcount = 0;
var hdr_names = new Array();
var hdr_slider = new Array();
hdr_active_image = null;
document.onkeydown = hdr_onkeydown;
</script>
<!-- HDRHTML END -->
@image_htmlcode@
</body>
</html>

View File

@ -0,0 +1,44 @@
<html>
<head>
<title>@title@</title>
<!-- HDRHTML BEG: Put this part in the "head" section -->
<!-- required: mootools v1.2.4. with (More) Slider and Asset extension -->
<script type="text/javascript" src="hdrhtml_assets/mootools-1.2.4.js"></script>
<!-- optional: include this script for iPad/iPhone compatibility -->
<script type="text/javascript" src="hdrhtml_assets/hdr_viewer.js"></script>
<!-- required: CSS styling of the HDR-Viewer -->
<link rel="stylesheet" type="text/css" media="screen" href="hdrhtml_assets/hdr_viewer.css" />
<!-- required: Javascript for HDR-Viewer -->
<script type="text/javascript" src="hdrhtml_assets/mouse2touch.js"></script>
<!-- HDRHTML END -->
</head>
<body>
<!-- HDRHTML BEG: Put this part at the beginning of the "body" section -->
<script type="text/javascript">
@hdr_img_def@
@cf_array_def@
var hdrcount = 0;
var hdr_names = new Array();
var hdr_slider = new Array();
hdr_active_image = null;
document.onkeydown = hdr_onkeydown;
</script>
<!-- HDRHTML END -->
@image_htmlcode@
</body>
</html>

View File

@ -0,0 +1,41 @@
0.0078125,0
0.0099575,0
0.012691,0
0.016176,0.034072
0.020617,0.072078
0.026278,0.11268
0.033493,0.15532
0.042689,0.20165
0.054409,0.24921
0.069348,0.29912
0.088388,0.35227
0.11266,0.40442
0.14359,0.45943
0.18301,0.51602
0.23326,0.57033
0.2973,0.62743
0.37893,0.68417
0.48297,0.73784
0.61557,0.79391
0.78458,0.84724
1,0.89681
1.2746,0.93968
1.6245,0.97889
2.0705,1
2.639,1
3.3636,1
4.2871,1
5.4642,1
6.9644,1
8.8766,1
11.314,1
14.42,1
18.379,1
23.425,1
29.857,1
38.055,1
48.503,1
61.82,1
78.793,1
100.43,1
128,1
1 0.0078125 0
2 0.0099575 0
3 0.012691 0
4 0.016176 0.034072
5 0.020617 0.072078
6 0.026278 0.11268
7 0.033493 0.15532
8 0.042689 0.20165
9 0.054409 0.24921
10 0.069348 0.29912
11 0.088388 0.35227
12 0.11266 0.40442
13 0.14359 0.45943
14 0.18301 0.51602
15 0.23326 0.57033
16 0.2973 0.62743
17 0.37893 0.68417
18 0.48297 0.73784
19 0.61557 0.79391
20 0.78458 0.84724
21 1 0.89681
22 1.2746 0.93968
23 1.6245 0.97889
24 2.0705 1
25 2.639 1
26 3.3636 1
27 4.2871 1
28 5.4642 1
29 6.9644 1
30 8.8766 1
31 11.314 1
32 14.42 1
33 18.379 1
34 23.425 1
35 29.857 1
36 38.055 1
37 48.503 1
38 61.82 1
39 78.793 1
40 100.43 1
41 128 1

View File

@ -0,0 +1,41 @@
0.0078125,0,0
0.0099575,0.04108,3.708e-20
0.012691,0.047823,5.4321e-20
0.016176,0.065391,5.9717e-20
0.020617,0.083157,5.6894e-20
0.026278,0.10398,6.3196e-20
0.033493,0.12791,6.3889e-20
0.042689,0.1563,6.041e-20
0.054409,0.19097,5.6943e-20
0.069348,0.23139,5.4626e-20
0.088388,0.2763,0.010773
0.11266,0.32933,0.021906
0.14359,0.39697,0.033063
0.18301,0.46994,0.045095
0.23326,0.54158,0.061894
0.2973,0.61753,0.082825
0.37893,0.69394,0.10713
0.48297,0.76558,0.13532
0.61557,0.83936,0.1691
0.78458,0.90635,0.20897
1,0.96558,0.25482
1.2746,1,0.30533
1.6245,1,0.37926
2.0705,1,0.45322
2.639,1,0.53436
3.3636,1,0.61317
4.2871,1,0.69167
5.4642,1,0.77153
6.9644,1,0.84026
8.8766,1,0.90374
11.314,1,0.96351
14.42,1,1
18.379,1,1
23.425,1,1
29.857,1,1
38.055,1,1
48.503,1,1
61.82,1,1
78.793,1,1
100.43,1,1
128,1,1
1 0.0078125 0 0
2 0.0099575 0.04108 3.708e-20
3 0.012691 0.047823 5.4321e-20
4 0.016176 0.065391 5.9717e-20
5 0.020617 0.083157 5.6894e-20
6 0.026278 0.10398 6.3196e-20
7 0.033493 0.12791 6.3889e-20
8 0.042689 0.1563 6.041e-20
9 0.054409 0.19097 5.6943e-20
10 0.069348 0.23139 5.4626e-20
11 0.088388 0.2763 0.010773
12 0.11266 0.32933 0.021906
13 0.14359 0.39697 0.033063
14 0.18301 0.46994 0.045095
15 0.23326 0.54158 0.061894
16 0.2973 0.61753 0.082825
17 0.37893 0.69394 0.10713
18 0.48297 0.76558 0.13532
19 0.61557 0.83936 0.1691
20 0.78458 0.90635 0.20897
21 1 0.96558 0.25482
22 1.2746 1 0.30533
23 1.6245 1 0.37926
24 2.0705 1 0.45322
25 2.639 1 0.53436
26 3.3636 1 0.61317
27 4.2871 1 0.69167
28 5.4642 1 0.77153
29 6.9644 1 0.84026
30 8.8766 1 0.90374
31 11.314 1 0.96351
32 14.42 1 1
33 18.379 1 1
34 23.425 1 1
35 29.857 1 1
36 38.055 1 1
37 48.503 1 1
38 61.82 1 1
39 78.793 1 1
40 100.43 1 1
41 128 1 1

View File

@ -0,0 +1,41 @@
0.0078125,0,0,0
0.0099575,0.043298,5.3555e-22,0
0.012691,0.068233,5.24e-22,0
0.016176,0.099217,3.7926e-22,0
0.020617,0.13105,1.5847e-22,0
0.026278,0.16193,9.295e-23,0
0.033493,0.19249,1.0223e-22,0
0.042689,0.22187,0.0067226,0
0.054409,0.24216,0.035882,0
0.069348,0.26569,0.063736,0
0.088388,0.2928,0.095934,0
0.11266,0.32552,0.12706,0
0.14359,0.36657,0.15933,0
0.18301,0.41682,0.19143,0
0.23326,0.48389,0.21451,0.018561
0.2973,0.56838,0.23449,0.047253
0.37893,0.65793,0.25599,0.078825
0.48297,0.74446,0.28194,0.11068
0.61557,0.83468,0.31458,0.14454
0.78458,0.91545,0.35677,0.17699
1,0.9877,0.40835,0.20735
1.2746,1,0.49517,0.21996
1.6245,1,0.58843,0.23782
2.0705,1,0.68195,0.25835
2.639,1,0.77954,0.28525
3.3636,1,0.86504,0.32097
4.2871,1,0.94003,0.36756
5.4642,1,1,0.43014
6.9644,1,1,0.51864
8.8766,1,1,0.61233
11.314,1,1,0.71075
14.42,1,1,0.80082
18.379,1,1,0.88543
23.425,1,1,0.9645
29.857,1,1,1
38.055,1,1,1
48.503,1,1,1
61.82,1,1,1
78.793,1,1,1
100.43,1,1,1
128,1,1,1
1 0.0078125 0 0 0
2 0.0099575 0.043298 5.3555e-22 0
3 0.012691 0.068233 5.24e-22 0
4 0.016176 0.099217 3.7926e-22 0
5 0.020617 0.13105 1.5847e-22 0
6 0.026278 0.16193 9.295e-23 0
7 0.033493 0.19249 1.0223e-22 0
8 0.042689 0.22187 0.0067226 0
9 0.054409 0.24216 0.035882 0
10 0.069348 0.26569 0.063736 0
11 0.088388 0.2928 0.095934 0
12 0.11266 0.32552 0.12706 0
13 0.14359 0.36657 0.15933 0
14 0.18301 0.41682 0.19143 0
15 0.23326 0.48389 0.21451 0.018561
16 0.2973 0.56838 0.23449 0.047253
17 0.37893 0.65793 0.25599 0.078825
18 0.48297 0.74446 0.28194 0.11068
19 0.61557 0.83468 0.31458 0.14454
20 0.78458 0.91545 0.35677 0.17699
21 1 0.9877 0.40835 0.20735
22 1.2746 1 0.49517 0.21996
23 1.6245 1 0.58843 0.23782
24 2.0705 1 0.68195 0.25835
25 2.639 1 0.77954 0.28525
26 3.3636 1 0.86504 0.32097
27 4.2871 1 0.94003 0.36756
28 5.4642 1 1 0.43014
29 6.9644 1 1 0.51864
30 8.8766 1 1 0.61233
31 11.314 1 1 0.71075
32 14.42 1 1 0.80082
33 18.379 1 1 0.88543
34 23.425 1 1 0.9645
35 29.857 1 1 1
36 38.055 1 1 1
37 48.503 1 1 1
38 61.82 1 1 1
39 78.793 1 1 1
40 100.43 1 1 1
41 128 1 1 1

View File

@ -0,0 +1,41 @@
0.0078125,0,0,0,0
0.0099575,0.046825,0,0,0
0.012691,0.071986,1.3855e-21,0,1.3404e-21
0.016176,0.1037,1.8408e-21,0,4.4849e-21
0.020617,0.13616,8.0301e-22,0,3.2708e-21
0.026278,0.16633,0.007471,0,3.1119e-21
0.033493,0.1947,0.032949,0,3.1648e-21
0.042689,0.22529,0.058851,0,3.0057e-21
0.054409,0.253,0.094366,0,2.6424e-21
0.069348,0.2829,0.12843,0,1.5325e-22
0.088388,0.31506,0.16299,0.0037173,0
0.11266,0.3466,0.18855,0.03263,0
0.14359,0.38407,0.21578,0.061727,0
0.18301,0.42874,0.2435,0.093971,0
0.23326,0.48464,0.26963,0.12885,0
0.2973,0.55177,0.29885,0.16477,0.0031392
0.37893,0.64391,0.32942,0.19135,0.033828
0.48297,0.73599,0.36529,0.21705,0.063574
0.61557,0.83329,0.40955,0.24375,0.098502
0.78458,0.92083,0.46476,0.27055,0.13365
1,0.99702,0.53092,0.2982,0.16758
1.2746,1,0.63416,0.32596,0.19102
1.6245,1,0.73977,0.35658,0.22051
2.0705,1,0.83777,0.39756,0.24813
2.639,1,0.92953,0.45196,0.27761
3.3636,1,1,0.52151,0.30659
4.2871,1,1,0.62457,0.33166
5.4642,1,1,0.73619,0.36229
6.9644,1,1,0.83644,0.40322
8.8766,1,1,0.92453,0.45727
11.314,1,1,1,0.52709
14.42,1,1,1,0.62724
18.379,1,1,1,0.73253
23.425,1,1,1,0.83977
29.857,1,1,1,0.92215
38.055,1,1,1,1
48.503,1,1,1,1
61.82,1,1,1,1
78.793,1,1,1,1
100.43,1,1,1,1
128,1,1,1,1
1 0.0078125 0 0 0 0
2 0.0099575 0.046825 0 0 0
3 0.012691 0.071986 1.3855e-21 0 1.3404e-21
4 0.016176 0.1037 1.8408e-21 0 4.4849e-21
5 0.020617 0.13616 8.0301e-22 0 3.2708e-21
6 0.026278 0.16633 0.007471 0 3.1119e-21
7 0.033493 0.1947 0.032949 0 3.1648e-21
8 0.042689 0.22529 0.058851 0 3.0057e-21
9 0.054409 0.253 0.094366 0 2.6424e-21
10 0.069348 0.2829 0.12843 0 1.5325e-22
11 0.088388 0.31506 0.16299 0.0037173 0
12 0.11266 0.3466 0.18855 0.03263 0
13 0.14359 0.38407 0.21578 0.061727 0
14 0.18301 0.42874 0.2435 0.093971 0
15 0.23326 0.48464 0.26963 0.12885 0
16 0.2973 0.55177 0.29885 0.16477 0.0031392
17 0.37893 0.64391 0.32942 0.19135 0.033828
18 0.48297 0.73599 0.36529 0.21705 0.063574
19 0.61557 0.83329 0.40955 0.24375 0.098502
20 0.78458 0.92083 0.46476 0.27055 0.13365
21 1 0.99702 0.53092 0.2982 0.16758
22 1.2746 1 0.63416 0.32596 0.19102
23 1.6245 1 0.73977 0.35658 0.22051
24 2.0705 1 0.83777 0.39756 0.24813
25 2.639 1 0.92953 0.45196 0.27761
26 3.3636 1 1 0.52151 0.30659
27 4.2871 1 1 0.62457 0.33166
28 5.4642 1 1 0.73619 0.36229
29 6.9644 1 1 0.83644 0.40322
30 8.8766 1 1 0.92453 0.45727
31 11.314 1 1 1 0.52709
32 14.42 1 1 1 0.62724
33 18.379 1 1 1 0.73253
34 23.425 1 1 1 0.83977
35 29.857 1 1 1 0.92215
36 38.055 1 1 1 1
37 48.503 1 1 1 1
38 61.82 1 1 1 1
39 78.793 1 1 1 1
40 100.43 1 1 1 1
41 128 1 1 1 1

View File

@ -0,0 +1,43 @@
Readiness of docs for 2.0.0:
Welcome (DONE)
Features overview (DONE)
What's new (IN PROGRESS)
HDR imaging basics (TODO)
User interface???
Workflow (DONE)
Creating HDR images (DONE)
Interactive (TODO)
From console (TODO)
Editing HDR images (DONE)
Tonemapping HDR images (DONE)
Interactive (TODO)
Batch mode (TODO)
From console (TODO)
Additional tools (DONE)
Projective transformation (TODO)
Copying Exif metadata (TODO)
Setting up Luminance HDR (DONE)
Tonemapping (DONE)
User interface (TODO)
External tools (DONE)
Hdr Tiff (TODO)
Hdr Visualization (TODO)
Tonemapping ops reference (DONE)
Mantiuk'06 (TODO)
Mantiuk'08 (TODO)
Fattal (TODO)
Drago (TODO)
Durand (DONE)
Reinhard'02 (TODO)
Reinhard'05 (TODO)
Ashikhmin (TODO)
Pattanaik (TODO)
DCRaw reference (DONE)
Contributing to this project (DONE)
Testing and reporting (IN PROGRESS)
Translating (IN PROGRESS)
Programming (DONE, sort of)
FAQ???
Russian translation :) (TODO)

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Additional tools</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Additional tools</h2>
<p>Luminance HDR includes a number of additional tools which you might not use
often, but be glad to have it every once in a while. Those are:</p>
<ul>
<li><a href="projective_transformation.html">Projective transformation</a></li>
<li><a href="copying_exif.html">Copying Exif metadata</a></li>
</ul>
</body>
</html>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — HDR Imaging Basics</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>HDR Imaging Basics</h2>
<p>The will be much more in this chapter, but for now we just list basic terminology:</p>
<dl>
<dt>HDR</dt>
<dd>Stands for "High Dynamic Range". An HDR image is an image which presents more than 8 bit per color channel. Most CRTs, LCDs and printers only have a limited dynamic range, and can display only LDR images (see below). Thus various methods of "converting" HDR images into a viewable format have been developed, generally called "tone mapping".</dd>
<dt>LDR</dt>
<dd>Stands for "Low Dynamic Range". The most common image formats, such as JPEG, PNG, GIF, ... have 8 bits per color channel, LDR is just another umbrella definition.</dd>
<dt>Tone mapping</dt>
<dd>A method of converting an HDR image into a LDR image. Various algorithms exist for this purpose, and in this context they are also known as "tone mapping operators", or in this manual simply as "operators". You can choose an operator from a list in the top of tone mapping options sidebar.</dd>
<dt>TMO</dt>
<dd>Shorthand for "Tone Mapping Operator".</dd>
<dt>Raw</dt>
<dd>Another umbrella definition for several (minimally processed) image formats. Raw files can have 12 or 14 bits per color channel, but noise usually cuts down the available dynamic range to something like 1000:1, roughly 10 bits. For all intents and purposes they are HDR files.</dd>
<dt>Anti-ghosting</dt>
<dd>The HDR creation process involves merging a stack of images. An object changing position in the image set creates a strange effect in which the object is partially visible (like a ghost) in the final HDR image. This problem can be corrected by automatic or manual procedures.</dd>
</dl>
</body>
</html>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Color Management</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Color Management</h2>
Luminance HDR has the ability to read the color profile embedded in your RAW or JPEG files, convert the colors to the internal sRGB color space for processing with the program, use the provided monitor profile to show the result in your monitor, do soft proof and gamut check using the printer profile provided.
To begin with the color management support in Luminance HDR click on <em>Tools->Preferences</em> then select <a href="prefs_cms.html">Color Management</a>.
Select a profile for the monitor, printer and camera (or set the option to <strong>Built-in</strong> to use the embedded profile).
After tonemapping an HDR, the resulting image is displayed on the monitor with the proper colors, you can then click on the <strong>Soft Proofing</strong> button on the toolbar to see how the image will appear once printed on your printer. Clicking on the <strong>Gamut Check</strong> button will show in green the colors that are out of gamut, that is cannot be reproduced by your printer.
If you choose to save the LDR in TIFF or JPEG format the standard sRGB profile is automatically embedded to the file for further processing with another color managed application.
<br>
<br>
<br>
<img src="images/color_management.png" width="600" />
</body>
</html>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Contributing</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Contributing</h2>
<p>There are several ways to help us making this project better.</p>
<ul>
<li><a href="contributing_testing.html">testing and reporting.</a></li>
<li><a href="contributing_translating.html">translating user interface and documentation.</a></li>
<li><a href="contributing_programming.html">coding new features and fixing bugs.</a></li>
<li><a href="contributing_donating.html">donating money.</a></li>
</ul>
</body>
</html>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Contributing - Donating Money</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Donating</h2>
<p>Luminance HDR is open-source software and its development required hundreds of hours of work.<br /><br />If you like it, you're using it in your work and you would like to see it constantly improved,<br />please support its authors by making a donation.<br /><br />Would you like to make a donation for Luminance HDR now? <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=10037712"> donate</a> </p>
</body>
</html>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Contributing - Programming</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Programming</h2>
<p>Documentation for potential programmers isn't ready at this time. Please come back later or <a href="resources.html">ask your questions</a>.</p>
<p>Pfstmo which we use as a backend will become a library eventually, so we shall have to introduce some changes. The other plan is to start using some solid graphics lib like GEGL of VIPS to deal with images larger than RAM in a sane way. If you want to help the Luminance HDR team with that, do tell us.</p>
</body>
</html>

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Contributing - Testing and reporting</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Testing and reporting</h2>
<h3>Testing</h3>
<p>Testing is what helps making applications rock stable. Since we a re a community project, we rely on you, yes&nbsp;&mdash; you, our dear users.</p>
<p>We don't really encourage you to compile the most unstable cutting edge source code, but in case you find some bugs in the latest released version, do not hesitate to point them out to us.</p>
<h3>Crashers</h3>
<p>So you found a reproducible way to crash Luminance HDR. If you are on Linux, please use application called <b>gdb</b> to create a report which in programmers lingo is called <em>backtrace</em>. Here is how you do it:</p>
<ol>
<li>Install gdb via package manager</li>
<li>Open terminal</li>
<li>$ gdb luminance</li>
<li>gdb's console appears</li>
<li><tt>&gt; run</tt></li>
<li>Luminance HDR starts, a little slower than usually</li>
<li>Reproduce the crash</li>
<li>Go back to terminal</li>
<li><tt>&gt; bt</tt></li>
<li>Copy the output using mouse and paste it somewhere</li>
<li><tt>&gt; quit</tt></li>
</ol>
<p>If you are on Windows or Mac or simply do not have time to fiddle with gdb, at least own up and tell us exactly what you did.</p>
<h3>Reporting bugs and requesting features</h3>
<p>You can submit bugs reports to our
<a href="https://sourceforge.net/tracker/?group_id=183831&atid=906820">bugtracker</a>
(no need to register).</p>
<p>A good, useful bug report contains:</p>
<ol>
<li>List of actions that led to a bug</li>
<li>Backtrace, if the application crashed (see above)</li>
<li>Information on your system</li>
</ol>
<p>Typical information on your system we would appreciate:</p>
<ul>
<li>Linux: name and version of distribution, version of Qt, version of Luminance HDR</li>
<li>Mac&nbsp;OS&nbsp;X: version of Mac&nbsp;OS&nbsp;X, version of Luminance HDR</li>
<li>Windows: version of Windows, version of Luminance HDR</li>
</ul>
<p>If you want to request a new feature, please use the
<a href="https://sourceforge.net/tracker/?group_id=183831&atid=906823">feature
request tracker</a>.</p>
</body>
</html>

View File

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Contributing - Translating</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Translating</h2>
<h3>Translating desktop entry</h3>
<p>On Linux systems .desktop files are used to build system menus that list applications available to users. Here is what it looks like in GNOME desktop environment:</p>
<p><img src="images/not-translated-menu-item.png" /></p>
<p>Luminance HDR ships with such a file as well. It is located in root directory with source code and gets installed to /usr/share/applications or /usr/local/share/applications, depending on your preferences.</p>
<p>To get a localized menu entry you need to do a very simple thing:</p>
<ol>
<li>Open this file in your preferred text editor and make sure you opened it as a UTF-8 encoded text file.</li>
<li>Create a new entry which looks like "Comment[LANG]=Create and tonemap HDR images", where LANG is a two-letter code for your language (as referenced by <a href="http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO-639-1</a>) and everything after "=" is translated.</li>
<li>Create a new entry which looks like "GenericName[LANG]=HDR imaging".</li>
<li>Save.</li>
<li>Test by running 'sudo make install' (if Luminance HDR is already installed or just 'sudo cp luminance.desktop /usr/share/applications/' and look in the menu.</li>
</ol>
<p>You should see something like this:</p>
<p><img src="images/translated-menu-item.png" /></p>
<p><a href="https://sourceforge.net/tracker/?group_id=183831&atid=906822">Send</a> the updated file to us.</p>
<h3>Translating user interface</h3>
<p>The very first thing you need to translate Luminance HDR into your native language is to get source code from the current development branch. To do this, you need a Subversion client (<span class="code">svn</span> being the regular command line client). Then type</p>
<p><tt>svn co https://qtpfsgui.svn.sourceforge.net/svnroot/qtpfsgui/trunk/qtpfsgui qtpfsgui</tt></p>
<p>somewhere in your home directory to fetch source code, so that you always have access to it.</p>
<p>Then you will need to install Qt development package that contains Linguist&nbsp;&mdash; the application to assist you with translating. On Linux start your package manager and look for a package named something like qt4-dev, install it.</p>
<p>The next steps are as follows:</p>
<ol>
<li>Go to the top level directory of Luminance HDR's source code.</li>
<li>Open the file called <em>project.pro</em>.</li>
<li>Find a section that starts with "TRANSLATIONS =" and add a new line that looks like "i18n/lang_LOCALE.ts \", where LOCALE is a two-letter code for your language (as referenced by <a href="http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO-639-1</a>), lowercase, e.g. <em>pt</em> for Portuguese.</li>
<li>Save the <em>project.pro</em> file.</li>
<li>Open console in that directory and run "$ lupdate-qt4 project.pro" command. This will create a new translation file (and update existing translation files).</li>
<li>Open your lang_LOCALE.ts file in Linguist and start translating.</li>
<li>To test your translation, use <em>File&nbsp;&gt; Release</em> menu item in Linguist to create a binary version of translation and then run <span class="code">sudo make install</span> from console to quickly install created translation in the right place.</li>
<li>When your work is done, compress this lang_LOCALE.ts file to a ZIP, GZ or BZ2 archive and submit it via <a href="https://sourceforge.net/tracker/?group_id=183831&atid=906822">patches tracker</a>.</li>
</ol>
<p>Here are some tips to help you make translation better.</p>
<p>Translating Luminance HDR takes a while, so it's best to translate those parts of user interface that you use most of the time. This will give you a false, but useful feeling of accomplishment and motivation to finish the whole work.</p>
<p>Test your translation as frequently as possible. This is especially important for dialogs that you rarely use.</p>
<p>Make sure you find a good balance between short and easy to understand phrases and words. English language is known to have relatively shorter words, so in most cases your translation will make user interface a bit larger. But if you start using abbreviations or shorter synonyms that don't quite fit the context, users won't appreciate that either.</p>
<p>Some translatable messages use variables like <em>%1</em>. Those are substituted by some values. For example, in "Using %1 thread(s)" (Batch Tonemapping dialog) this variable is substituted with amount of threads used to process HDR images into LDR images. When you type these variables manually, you can make a mistake and the trick with a variable won't work. So it's better to paste original text to translation entry field by pressing <b>Ctrl</b>+<b>B</b> in Linguist and then replace this original text with translation, leaving all present variables intact.</p>
<h3>Translating documentation</h3>
<p>The documentation is inside <em>help</em> directory and consists of menu.xml file that defines table of contents, HTML files with text and illustrations in PNG or JPEG files.</p>
<p>Every translation is kept in its own directory named with two-letter language code like <em>ru</em> for Russian or <em>es</em> for Spanish. So download source code, unpack it and create a copy of <em>help/en</em> directory in <em>help</em> directory.</p>
<p>Start translating. It's best to translate table of contents first and proceed with actual content later. To translate table of contents open menu.xml file in your editor of choice and translate values of every <em>text</em> attribute. E.g. for &lt;area text="Setting up Luminance HDR" file="prefs.html"&gt; translatable text will be "Setting up Luminance HDR".</p>
<p>To test your translation open a terminal window, go to the top level directory with source code, and run <tt>sudo make install</tt> to reinstall Luminance HDR. All available translations will be automaticaly copied to the right place, and you will have to restart Luminance HDR to let it pick the added translation. However, as you progress with your translation, you only need to restart help browser to see changes in table of contents and you don't even need to restart the help browser to see changes in separate chapters&nbsp;&mdash; just click on some other chapter and go back again.</p>
<p>If user interface is not localized, you might want to do it before translating docs. Some users might complain and tell you that user interface in English is a de-facto standard and thus localized documentation should refer only to English UI. But this is just because they have grown up to use unlocalized software, so don't you worry.</p>
<p>The English (and Russian) translations have screenshots with <em>Dust</em> theme for both GTK+ and Metacity (and GTK+ engine for Qt), and Droid Sans 9pt font. You don't have to try to reproduce that, but please be visually consistent across your translation.</p>
<p>Please keep all of your illustrations below 800 pixels on the longer side. The reason is: when an image doesn't fit help browser's window, a nasty horizontal scrollbar appears. To get rid of it you need to grow width of the window, and that means that text will reflow and there will be too long barely readable lines of text.</p>
<p>When you are done, archive help/LANGUAGE directory with your translation and <a href="https://sourceforge.net/tracker/?group_id=183831&atid=906822">send it</a> to us.</p>
</body>
</html>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Copying Exif metadata</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Copying Exif metadata</h2>
<p>It is typical to lose Exif metadata of original images when constructing a new HDR image from bracketed exposures. You can fix this by doing a mass-copy of Exif metadata to tonemapped images.</p>
<p>To do so, choose <em>Tools&nbsp;&gt; Copy Exif Data...</em> menu item in the main window.</p>
<p><img src="images/copy-exif.png" width="600" /></p>
<p>With this dialog you can copy the Exif data contained in a set of files (the sources) into another set of files (the destinations). This is a pairwise, one-to-one data copy, i.e. the first file in the destination list gets the Exif data from the first file in the sources list and so on.</p>
<p>Because Luminance HDR saves tonemapping settings description to Exif comment tag, "Keep existing Exif tags in destination file" checkbox is enabled by default.</p>
</body>
</html>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Creating HDR images</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Creating HDR images</h2>
<p>This section covers both ways of creating HDR images in Luminance HDR:</p>
<ul>
<li><a href="creating_hdr_interactive.html">Interactive</a></li>
<li><a href="creating_hdr_batch.html">Batch Mode</a></li>
<li><a href="creating_hdr_cli.html">From console</a></li>
</ul>
</body>
</html>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Creating HDRs - Batch Mode</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Creating HDRs in Batch Mode</h2>
<IMG src="images/batch-hdr.png" />
<p>This tool lets you creare HDR images starting from a set of bracketed photos ordered alphabetically.</p>
<p>You have to specify the number of bracketed photos, the HDR creation predefined profile, optionally the auto alignment engine to use for aligning the photos, the output hdr file format, the input directory where the bracketed photos are located, the output directory where the resulting HDRs will be saved to.</p>
<p>You can also always see what's happening in the Progress panel at the bottom.</p>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Creating HDR images — Interactive</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Creating HDR images interactively</h2>
<p>You can access the wizard that will guide you through the process of creating a new HDR image via the <em>File&nbsp;&gt; New HDR image...</em> menu item.</p>
<p><IMG src="images/hdrwizard.png" width="600" /></p>
<p>On the first page the wizard will ask you to select the set of images (of the same scene, but taken at different exposures) that are going to contribute to the final hdr (supported input: jpeg, raw and tiff -8 and 16 bit-).</p>
<p>Even if Luminance HDR doesn't find the required Exif data (Shutter Speed &#038; Aperture) in your image set you can still proceed creating an HDR. To do so you have to insert <b>manually</b> the EV (exposure values) or stop difference values for the images in your the set.</p>
<p>The first page of the wizard enables the user to apply an automatic alignment step to the images in the set. It is possible to use one of two alignment options (or "engines"): <b>align_image_stack</b> and <b>MTB</b>.</p>
<p>The first option is usually a good choice (MTB works only on LDR images and has a simpler model that does not take into account rotation).</p>
<p>If your image set consists of LDR images (JPEG, 8 bit TIFF, or RAW files) you can optionally open the <a href="editing_tools.html">Editing Tools Dialog</a> clicking on the <strong>Advanced Editing Tools</strong> check box and clicking <strong>Next</strong>. A dialog will then show up which can be used to perform some "pre merging" editing activities as well manual anti ghosting.</p>
</body>
</html>

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — DCRaw reference</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>DCRaw reference</h2>
<p>Here's an excerpt from <a href="http://cybercom.net/~dcoffin/dcraw/dcraw.1.html">DCRaw's man page</a> (Retrieved: October 30, 2007).</p>
<dl>
<dt><b>-v</b></dt>
<dd>Print verbose messages, not just warnings and errors.</dd>
<dt><b>-c</b></dt>
<dd>Write decoded images or thumbnails to standard output.</dd>
<dt><b>-e</b></dt>
<dd>Extract the camera-generated thumbnail, not the raw image. You'll get either a JPEG or a PPM file, depending on the camera.
<dt><b>-z</b></dt>
<dd>Change the access and modification times of an AVI, JPEG, TIFF or raw file to when the photo was taken, assuming that the camera clock was set to Universal Time.
<dt><b>-i</b></dt>
<dd>Identify files but don't decode them. Exit status is 0 if dcraw can decode the last file, 1 if it can't. -i -v shows metadata. dcraw cannot decode JPEG files!!
<dt><b>-d</b></dt>
<dd>Show the raw data as a grayscale image with no interpolation. Good for photographing black-and-white documents.
<dt><b>-D</b></dt>
<dd>Same as -d, but totally raw (no color scaling).
<dt><b>-h</b></dt>
<dd>Output a half-size color image. Twice as fast as -q 0.
<dt><b>-q 0</b></dt>
<dd>Use high-speed, low-quality bilinear interpolation.
<dt><b>-q 1</b></dt>
<dd>Use Variable Number of Gradients (VNG) interpolation.
<dt><b>-q 2</b></dt>
<dd>Use Patterned Pixel Grouping (PPG) interpolation.
<dt><b>-q 3</b></dt>
<dd>Use Adaptive Homogeneity-Directed (AHD) interpolation.
<dt><b>-f</b></dt>
<dd>Interpolate RGB as four colors. Use this if the output shows false 2x2 meshes with VNG or mazes with AHD.
<dt><b>-m number_of_passes</b></dt>
<dd>After interpolation, clean up color artifacts by repeatedly applying a 3x3 median filter to the R-G and B-G channels.
<dt><b>-n noise_threshold</b></dt>
<dd>Use wavelets to erase noise while preserving real detail. The best threshold should be somewhere between 100 and 1000.
<dt><b>-b brightness</b></dt>
<dd>By default, dcraw writes 8-bit PGM/PPM/PAM with a BT.709 gamma curve and a 99th-percentile white point. If the result is too light or too dark, -b lets you adjust it. Default is 1.0.
<dt><b>-4</b></dt>
<dd>Write 16-bit linear pseudo-PGM/PPM/PAM with no gamma curve, no white point, and no -b option.
<dt><b>-T</b></dt>
<dd>Write TIFF output (with metadata) instead of PGM/PPM/PAM.
<dt><b>-k black</b></dt>
<dd>Set the black point. Default depends on the camera.
<dt><b>-K darkframe.pgm</b></dt>
<dd>Subtract a dark frame from the raw data. To generate a dark frame, shoot a raw photo with no light and do dcraw -D -4 -j -t 0.
<dt><b>-w</b></dt>
<dd>Use the white balance specified by the camera. If this is not found, print a warning and use another method.
<dt><b>-a</b></dt>
<dd>Calculate the white balance by averaging the entire image.
<dt><b>-A left top width height</b></dt>
<dd>Calculate the white balance by averaging a rectangular area. First do dcraw -j -t 0 and select an area of neutral grey color.
<dt><b>-r mul0 mul1 mul2 mul3</b></dt>
<dd>Specify your own raw white balance. These multipliers can be cut and pasted from the output of dcraw -v.
<dt><b>no white balance option</b></dt>
<dd>Use a fixed white balance based on a color chart illuminated with a standard D65 lamp.</dd>
<dt><b>+M or -M</b></dt>
<dd>Use (or don't use) any color matrix from the camera metadata. The default is +M if -w is set, -M otherwise. This option only affects Olympus, Leaf, and Phase One cameras.
<dt><b>-C red_mag blue_mag</b></dt>
<dd>Enlarge the raw red and blue layers by the given factors, typically 0.999 to 1.001, to correct chromatic aberration.
<dt><b>-H 0</b></dt>
<dd>Clip all highlights to solid white (default).
<dt><b>-H 1</b></dt>
<dd>Leave highlights unclipped in various shades of pink.
<dt><b>-H 2</b></dt>
<dd>Blend clipped and unclipped values together for a gradual fade to white.
<dt><b>-H 3-9</b></dt>
<dd>Reconstruct highlights. Low numbers favor whites; high numbers favor colors. Try -H 5 as a compromise. If that's not good enough, do -H 9, cut out the non-white highlights, and paste them into an image generated with -H 3.
<dt><b>-o [0-5]</b></dt>
<dd>Select the output colorspace when the -p option is not used:
<pre> 0 Raw color (unique to each camera)
1 sRGB D65 (default)
2 Adobe RGB (1998) D65
3 Wide Gamut RGB D65
4 Kodak ProPhoto RGB D65
5 XYZ </pre></dd>
<dt><b>-p camera.icm [ -o output.icm ]</b></dt>
<dd>Use ICC profiles to define the camera's raw colorspace and the desired output colorspace (sRGB by default).</dd>
<dt><b>-p embed</b></dt>
<dd>Use the ICC profile embedded in the raw photo. </dd>
<dt><b>-t [0-7,90,180,270]</b></dt>
<dd>Flip the output image. By default, dcraw applies the flip specified by the camera. -t 0 disables all flipping. </dd>
<dt><b>-s [0..N-1] or -s all</b></dt>
<dd>If a file contains N raw images, choose one or "all" to decode. For example, Fuji Super CCD SR cameras generate a second image underexposed four stops to show detail in the highlights. </dd>
<dt><b>-j</b></dt>
<dd>For Fuji Super CCD cameras, show the image tilted 45 degrees. For cameras with non-square pixels, do not stretch the image to its correct aspect ratio. In any case, this option guarantees that each output pixel corresponds to one raw pixel. </dd>
<dl>
</body>
</html>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Editing HDR images</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Editing HDR images</h2>
<p>After creating an new HDR file or opening an existing one you can do several things to them except tonemapping.</p>
<h3>Resizing</h3>
<p>You can access this feature via the <em>Edit&nbsp;&gt; Resize...</em> menu item.</p>
<p>Luminance HDR can resize an HDR image to a given pixel size of percentage value counting from the original. If you use percentage, thi final size in pixels will be calculated and displayed to the right from <em>Height</em> entry field.</p>
<p><img src="images/resize.png" /></p>
<p>Clicking <b>Scale</b> button will resize the HDR image.</p>
<h3>Cropping</h3>
<p>To crop an HDR file to some area first you need to select this are. Click somewhere on an image, drag the mouse pointer to a side and release it. You will see something like this:</p>
<p><img src="images/cropping_frame.png" width="600" /></p>
<p>You can further edit the frame you created by dragging its edges or corners. You can also move the frame around by clicking inside it and dragging mouse pointer (that will change from an arrow to a hand icon).</p>
<p>When the frame is placed correctly, choose <em>Edit&nbsp;&gt; Crop to Selection</em> in menu or use the relevant button in the toolbar. Luminance HDR will create a new unsaved HDR image that contains cropped version of the original image.</p>
<p><img src="images/edit_menu.png" width="400" /></p>
<p>To get rid of the selection frame simply single-click anywhere outside the frame or use the <em>Edite&nbsp;&gt; Remove Selection</em> menu item.</p>
<h3>Rotating</h3>
<p>You can rotate an HDR image to 90 degrees a step, using <em>Edit&nbsp;&gt; Rotate Counter-Clockwise</em> and <em>Edit&nbsp;&gt; Rotate Clockwise</em> commands or <b>&lt;</b> and <b>&gt;</b> shortcuts respectively. Unlike setting an Exif orientation tag this will physically modify the HDR image.</p>
</body>
</html>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Creating HDR images — Editing Tools</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Using Editing Tools</h2>
<br />
Within Editing Tools it is possible to do some manual editing activities before performing the hdr merge.<br /><br />
<!--IMG src="images/EditingTools-2.jpeg" alt="Editing Tools" width="800" height="468" align="middle" border="0"--><br />
<p><IMG src="images/editingtools-1.png" width="600" /></p>
Using the arrow buttons shown in the bottom right part of the window you can shift the editable image to better align it.<br />
Press <strong>shift</strong> to shift the image by 10 pixels, <strong>control</strong> to shift by 50 pixels and <strong>shift+control</strong> to shift by 100 pixels.<br />
Use the visualization mode combo box on the upper left of the window to help you with the alignment. The best mode for aligning the images is <strong>Difference (E-P)</strong> where the difference between the editable and reference images is shown.<br />
After aligning the images you can crop them drawing a selection box and clicking on the <strong>crop</strong> button. Then you can save them for future use, all the relevant <em>EXIF</em> data will be saved as well.<br />
Now, if needed, you can proceed removing the ghosting artefacts resulting from moving objects in the scene. You have two options: manual and auto anti-ghosting.
The auto anti-ghosting is pretty straightforward, just click on the <strong>Auto anti-ghosting</strong> check box and select a threshold value. Clicking on the <strong>Recompute</strong> button a series of patches is computed and visualized so that you can actually see how well the "ghost" it will be removed.<br />
The patches must cover all the affected <em>"ghosting area"</em> but, especially with misaligned images, it is possible that some patches will cover even anaffected areas. If this happens you can increase the threshold and recompute the patches again or you can manually add or remove patches just clicking on the image on the position you want a patch to be removed or added (clicking on a patch will remove it). Once you are done you can click <strong>next</strong> to close <strong>Editing Tools</strong> and continue with HDR merging.<br /><br />
<!--IMG src="images/EditingTools-0.jpeg" alt="Anti-ghosting Patches" width="800" height="468" align="middle" border="0"--><br />
<p><IMG src="images/editingtools-2.png" width="600" /></p>
If you prefer it is possible to manually draw a mask over the "ghost" using a <em>lasso</em> or a <em>brush</em>. To access the manual anti-ghosting feature click on the <strong>Anti-ghosting</strong> button. New options to work with the mask will then appear, you can chose the size of the brush, the mask <em>strength</em> (draw the mask semi-transparent), if to add or remove the mask while drawing. You can also save a previously created mask and apply it again to another image.<br />
You now must select the <em>good image</em> from the list, the <em>good image</em> is the one that will be left unchanged after ghost removal.
Keep in mind that you must draw a mask even on the <em>good image</em>. Basically all the pixels that change in <strong>all</strong> images must be covered by a mask. The <strong>Difference (E-P)</strong> visualisation mode will help you discovering the ghost affected areas of the scene.<br />
The image below shows and example of a mask covering just a part of the <em>ghost</em>.<br /><br />
<!--IMG src="images/EditingTools-1.jpeg" alt="Manual Anti-ghosting" width="800" height="468" align="middle" border="0"--><br />
<p><IMG src="images/editingtools-4.png" width="600" /></p>
<div align="center">Example of anti-ghosting mask</div>
<!--IMG src="images/Ghost-0.jpeg" alt="Ghost in HDR" width="800" height="433" align="middle" border="0"--><br />
<p><IMG src="images/editingtools-5.png" width="600" /></p>
<div align="center">Final HDR without ghost removal</div><br />
<!--IMG src="images/NoGhost-0.jpeg" alt="Final HDR with no ghost" width="800" height="433" align="middle" border="0"--><br />
<p><IMG src="images/editingtools-6.png" width="600" /></p>
<div align="center">Final HDR after performing manual anti-ghosting</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

View File

@ -0,0 +1,52 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<title>Luminance HDR FAQ</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<h1>FAQ for Luminance HDR</h1>
<dl>
<A name="name"><dt><strong>Q: What is the meaning of the name Luminance HDR?</strong></dt></A>
<dd>A: The name can be decomposed in 3 parts: Qt-pfs-gui.
<ol>
<li><strong>Qt</strong>: the program uses Qt4 (www.trolltech.com) to show its graphical widgets.</li>
<li><strong>pfs</strong>: the main backend library and original sourcecode base.</li>
<li><strong>gui</strong>: this stands simply for graphical user interface.</li>
</ol>
</dd>
<A name="tmop"><dt><strong>Q: What is the meaning of the various settings for tone mapping operator X?</strong></dt></A>
<dd>A: To answer precisely this question one would have to explain the inner workings of the tone mapping operator X, in terms of the original research paper.<br>
At the end of the day all that matters (to some people, at least) is to fiddle with the settings until you obtain a nice result.
</dd>
<br>
<A name="exiftiff"><dt><strong>Q: Why can't Luminance HDR transfer the exif tags to TIFF files?</strong></dt></A>
<dd>A: Because the library Luminance HDR uses to perform this task (exiv2) doesn't support writing to tiff files yet. It's in the working, though.</dd>
<br>
<A name="jpegorraw"><dt><strong>Q: Should I store JPEG or RAW files for HDR?</strong></dt></A>
<dd>A: Both give the same result, provided you capture all the dynamic range in the scene. This means that with RAW files you may need to capture less files than with JPEGs. On the other hand creating an HDR with JPEG files is more "lightweight" process (reduced memory footprint). </dd>
<br>
<A name="hdrformats"><dt><strong>Q: Where can I get information about all the various HDR formats?</strong></dt></A>
<dd>A: An overview (rather technical) can be found at http://www.anyhere.com/gward/hdrenc/hdr_encodings.html.
<ul>
<li>OpenEXR: Industrial Light and Magic format, widespread use, best compression ratios. www.openexr.com</li>
<li>LogLuv TIFF: see http://en.wikipedia.org/wiki/Logluv_TIFF and http://www.anyhere.com/gward/pixformat/tiffluv.html</li>
<li>Radiance RGBE: see http://en.wikipedia.org/wiki/Radiance_%28software%29#HDR_image_format</li>
<li>PFS: This format stores the binary internal (float) representation of images. It is very size demanding, and it supported only by pfstools/pfscalibration/pfstmo, Luminance HDR and a few other applications. On the other hand it is a lossless format and supports metadata (tags).</li>
<li>Float TIFF (aka 32 bit TIFF): very size demanding (similar to pfs above).</li>
</ul>
</dd>
<br>
<A name="immediatechange"><dt><strong>Q: Can we have the tonemapping dialog apply its settings as soon as the user changes a value? In other words, can we avoid having an "apply" button?</strong></dt></A>
<dd>A: Given how the tone mapping panel is implemented right now, this possibility has been discarded.</dd>
</dl>
</body>
</html>

View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Features Overview</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Features Overview</h2>
<h3>Streamlined Localized User Interface</h3>
<p>Creating HDR files is very easy: you just drop your bracketed shots from file or photos manager to the main window and in few more clicks you have an HDR file which you can then tonemap.</p>
<p>Luminance HDR is available in the following languages:</p>
<ul>
<li>Chinese</li>
<li>Czech (outdated)</li>
<li>Danish</li>
<li>English</li>
<li>Finnish</li>
<li>French (outdated)</li>
<li>German</li>
<li>Hungarian (outdated)</li>
<li>Indonesian (outdated)</li>
<li>Italian</li>
<li>Polish (outdated)</li>
<li>Portuguese (Brazilian)</li>
<li>Romanian</li>
<li>Russian</li>
<li>Spanish</li>
<li>Turkish (outdated)</li>
</ul>
<p>If your language is not supported or localization is incomplete or outdated
and you are willing to take care of that, please learn
<a href="contributing_translating.html">how to do it</a>.</p>
<h3>Supported HDR File Formats</h3>
<p>Luminance HDR reads and writes:</p>
<ul>
<li>OpenEXR (.exr)</li>
<li>Radiance RGBE (.hdr)</li>
<li>Logluv TIFF (.tif)</li>
<li>16/32bpc TIFF (.tif)</li>
<li>PFS stream (.pfs)</li>
<li>FITS (.fit)</li>
</ul>
<p>Additionally Raw images can be opened (using LibRaw) as both HDR and LDR images.</p>
<h3>Supported LDR File Formats</h3>
<p>Luminance HDR supports the following low dynamic range file formats:</p>
<ul>
<li>JPEG</li>
<li>TIFF (16bpc and 8bpc)</li>
<li>PNG (only saving)</li>
<li>PBM (only saving)</li>
</ul>
<p>Luminance HDR can also write Exif metadata to JPEG, PNG and TIFF files using Exiv2.</p>
<h3>Extensive Help System</h3>
<p>We don't really pretend that HDR imaging is easy. It surely can be easy if
lousy results is what you want. For the rest of you we bundle a solid help
system to help you getting the most of your pictures.</p>
<p>The help system is, again, localizable. Right now only English version is
available, but you can <a href="contributing_translating.html">contribute
a translation</a> into your native language, if you really want to.</p>
<h3>Free to Distribute</h3>
<p>Luminance HDR is a free-as-in-speech application licensed under terms of GNU GPL. Which in fact means:</p>
<ul>
<li>you don't have to pay developers of Luminance HDR for a license;</li>
<li>you may install Luminance HDR on as many computers as you can reach;</li>
<li>you may for god's sake modify the source code, but you will have to share it with us, if you distribute the modified version.</li>
</ul>
</body>
</html>

View File

@ -0,0 +1,45 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hints &#038; Tips for Luminance HDR</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<h1>Hints &#038; Tips for Luminance HDR</h1>
<ol>
<li><A href="#singleraw">Single Raw file workflow</A></li>
<li><A href="#postproc">Post-processing of the LDR</A></li>
<li><A href="#align_image_stack">Align_image_stack</A></li>
</ol>
<A name="singleraw"><h2>Single Raw file workflow</h2></A>
<p>You can load directly a raw file in Luminance HDR via the "File->Load Hdr..." menu item. Doing so you will be able to tone map directly this single raw file. This means that there is no need to create different exposures in Ufraw from your raw file.</p>
<p>When the user wants to load a single raw file in the main workspace a RAW->TIFF conversion takes place by calling the dcraw executable.<br>
For more information please read the page about <A href="dcraw.html">Raw Conversion</A>.
</p>
<p>If you still don't like what Luminance HDR does with your raw file and you want to process you raw file directly before loading it in Luminance HDR (white balance, color profile, and so on), you can use Ufraw to tweak the color settings of your raw file, and then save the result as a 16-bits tiff file.<br>
Just remember to save the result as a 16-bits file, or you'll lose some dynamic range in the process.</p>
<A name="postproc"><h2>Post-processing of the LDR</h2></A>
<p>
<ol>
<li>If you don't like the result of a specific tone mapping operator, please keep in mind that after the tone mapping step you can still use tools like GIMP to post process the resulting image. For example, you can still fix the brightness, change the gamma or the levels, and so on.</li>
<li>Some users have reported [1] pleasant results combining in GIMP 2 LDRs: one obtained with Fattal and the other one with Drago. Drago for the first layer and Fattal for the second in overlay mode (70% can be a good starting point). This is not a silver bullet technique, these values can be thought as a starting point, you can then go on tweaking the opacity value and the tone mapping parameters, your mileage may vary.</li>
<li>You can also put the Fattal image down as the master and then layer the Drago image on top in overlay mode with c.50% opacity [1].<br>
[1] http://www.flickr.com/groups/luminance/discuss/72157600715644855/</li>
</ol>
</p>
<A name="align_image_stack"><h2>Align_image_stack</h2></A>
<p>align_image_stack is a tool that can be found in the hugin project (http://hugin.sf.net). It is a standalone tool (an exe in windows) that can perform various functions, we use it in Luminance HDR to do what it says, i.e. to align a stack of (LDR) images.<br>
<strong>Linux</strong><br>
As of today (23 Nov 2007) the hugin project has not published a release with align_image_stack in it yet (they are working hard for their next release). Linux users have to checkout the project's subversion repository and compile the sources. On this page ( http://luminance.wiki.sourceforge.net/align_image_stack ) you can find how to do that.<br>
<strong>Mac OS X</strong><br>
The align_image_stack executable has already been included in the dmg file you downloaded.<br>
<strong>Windows</strong><br>
In windows the align_image_stack.exe file has to stay in the same directory of the luminance.exe file (or, as an alternative, in one of the directories listed in the PATH environment variable).
</p>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual - Welcome to Luminance HDR!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Welcome to Luminance HDR!</h2>
<p>Luminance HDR is an open source workflow tool for HDR imaging.</p>
<p>Its highlights are:</p>
<ul>
<li>streamlined user interface in more than a dozen languages</li>
<li>support for all major HDR file formats</li>
<li>batch hdr creation</li>
<li>batch tonemapping</li>
<li>resize/crop/transform HDRs</li>
<li>color managed workflow</li>
<li>works on Linux, Windows and Mac OS X</li>
<li>free to distribute among family, friends and enemies</li>
</ul>
<p>If you are new to HDR imaging, please read the <a href="basics.html">introductional chapter</a>. If you already know what's good in HDR for you, you might like reading <a href="features.html">detailed features overview</a>. Finally, if you know your way around Luminance HDR, you can learn <a href="news.html">what's new</a> in this version.</p>
</body>
</html>

View File

@ -0,0 +1,155 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Luminance HDR Manual</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<h1>Luminance HDR Manual</h1>
<ol>
<li><A href="#intro">Introduction</A></li>
<ol>
<li><A href="#features">Summary of features</A></li>
</ol>
<li><A href="#usingluminance">Using Luminance HDR</A></li>
<ol>
<li><A href="#mainwindow">The main window</A></li>
<ol>
<li><A href="#menubar">The menubar</A></li>
<li><A href="#toolbar">The toolbar</A></li>
<li><A href="#workspace">The workspace</A></li>
<li><A href="#hdrvisualization">Visualization of an HDR</A></li>
<li><A href="#hdroperations">Operations on an HDR</A></li>
</ol>
<li><A href="#createhdr">The Creation of an HDR</A></li>
</ol>
<li><A href="#menuref">The menu reference</A></li>
</ol>
<A name="intro"><h2>Introduction</h2></A>
Luminance HDR is an open source graphical user interface application that provides a workflow for HDR imaging.
<A name="features"><h3>Summary of features</h3></A>
Current supported features include:
<ol>
<li>Create an HDR from a set of files.</li>
<li>Tone map an HDR image to get a LDR image.</li>
<li>Save and load HDR images.</li>
<li>Rotate and resize HDR images.</li>
<li>Apply projective transformations to HDR images.</li>
<li>Copy exif data between sets of images.</li>
</ol>
The <strong>first feature</strong> is accessible via the "File -> New Hdr..." wizard: in order to create an HDR the user can either load a set of JPEG files, a set of RAW files, or a set of TIFF files (8bit or 16bit).<br>
Raw files are processed with LibRaw in order to obtain a (8 or 16 bit) tiff file. For more information read <A href="dcraw.html">this page</A>.<br>
The pictures must have been taken at the same scene, with different exposure settings (change the exposure time and/or aperture, and use a tripod if you have one). The newly created HDR will be available in the workspace as soon as the HDR creation wizard has ended.<br>
The input files can be aligned via two alignment engines: align_image_stack and MTB.<br>
The set of images can contain moving objects. This can result in an (unwanted) effect called ghosting. Luminance HDR provides an interactive anti-ghosting tool that can help avoid such artifacts.<br>
Read the chapter <A href="#createhdr">about the creation of an hdr</A> for more information about the alignment engines and the interactive anti-ghosting tool.<br>
To tone map an HDR file to get an LDR image <strong>(second feature)</strong> you can press the "Tonemap the HDR" button.<br>
Via the "File -> Open Hdr..." wizard you can choose to load in the workspace an HDR image image file, and the "File->Save Hdr as..." item lets you save the currently selected hdr image to a HDR image file format <strong>(third feature)</strong>.<br>
Users can also rotate and resize <strong>(fourth feature)</strong> the currently selected hdr image via the "Image" menu item, see below.<br>
It is also possible to apply panoramic (projective) transformation to a Hdr image via the "Image" menu item <strong>(fifth feature)</strong>.<br>
In order to create an HDR image Luminance HDR requires to have a set of images with exif data in it. Luminance HDR requires this information to get the exposure settings for an image in the set. When Luminance HDR doesn't find this information in an image it warns the user and aborts the hdr creation process. To cope with this requirement Luminance HDR provides a panel that performs a one-to-one copy of the exif data between two sets of files <strong>(sixth feature)</strong>.
<A name="usingluminance"><h2>Using Luminance HDR</h2></A>
This chapter describes the most important elements of Luminance HDR: the Main window, the "New Hdr..." wizard procedure, the Resize tool, the interactive tone mapping window, the batch tone mapping , the copy exif data tool and the Preferences panel.
<A name="mainwindow"><h3>The main window</h3></A>
Here's the main window that you can see once the program has launched and an image has been loaded.<br>
<img src="images/mainwin.jpeg" width="850" height="501">
<br>
<A name="menubar"><h4>The menubar</h4></A>
At the very top you can see the menubar which, as its name implies, contains the various menus. When an item in a menu is "grayed out" it means that you cannot use (because it doesn't make sense) that particular function at that time. For example you cannot tone map an HDR unless you have at least one HDR image loaded in the workspace.
In case the text describing an item in a menu is not clear enough, below you can find a <A href="#menuref">complete reference</A> of all the items contained in all the menus.
<A name="toolbar"><h4>The toolbar</h4></A>
Below the menubar you can see the toolbar. It simply contains some of the most frequently used functions listed in the menus: "New HDR...", "Open HDR...", "Save as...", "Save All" and "Exit". Again, if an item is "grayed out" it means that you cannot use (because it doesn't make sense) that particular function at that time.
<A name="workspace"><h4>The workspace</h4></A>
The main gray area is the workspace. Here you can see all the HDR images which you can work on. As soon as the program is launched the workspace is empty. To have an HDR in the workspace you can either load an existing one (File->Open Hdr...) or create a new one (File->New Hdr...).
<A name="hdrvisualization"><h4>Visualization of an HDR</h4></A>
<em>All of the visualization options <strong>do not modify</strong> the current HDR, they are only a visualization tool.</em><br>
In the picture above you can see what an HDR image looks like once it is loaded in the workspace.
From left to right, in an HDR image titlebar you can see:
<ol>
<li>A gamma combobox, which changes the visualization brightness.</li>
<li>The green histogram with its blue "histogram selection" (you can use the mouse to drag it and/or move its boundaries).</li>
</ol>
In the View menu you can find the visualization options, which fall in 2 categories:
<ol>
<li>Zoom options: (These are: View->Fit to window, Normal size, Zoom in, Zoom out).</li>
<li>Histogram options: (all under: View->HDR Histogram->...)</li>
</ol>
The zoom options are self explanatory, they deal with the fitting of the HDR in its containing window.
<br>
<p>The histogram options require more explanation: we somehow have to visualize an HDR image on a CRT or LCD, even if they can only show a normal LDR with 8 bit per color channel. So a simple "luminosity compression" algorithm is performed.<br>
The problem is that when an HDR has a "wide" histogram, (a high gamut of dynamic range) its not possible, even with this (simple) "luminosity compression" algorithm, to show correctly at the same time all the regions of different luminosity in the image (this indeed would be the tone mapping's job).<br>
So you may ask: "Why do we need this tool?"<br>
The answer is that, for example, you may want to visualize correctly all the regions of luminosity of your HDR image by:</p>
<ol>
<li>narrowing down the range of the visible histogram (View->HDR Histogram->Low Dynamic Range)</li>
<li>dragging repeatedly the blue rectangle over the different areas of the green histogram.</li>
</ol><br>
<A name="hdroperations"><h4>Operations on an HDR</h4></A>
As soon as at least one HDR image has been loaded in the workspace you can:
<ul>
<li>Save it (File->Save Hdr as...): This is useful when you have just created an HDR from a set of JPEGs (or RAWs or TIFFs) via the "File->New Hdr..." wizard.</li>
<li><A href="#tonemappingdialog">Tone map it</A> (Image->Tonemap the Hdr...): Tone mapping an HDR involves showing another window, called "Interactive Tone Mapping window" which uses the HDR as a source to create an LDR.</li>
</ul><br>
<A name="menuref"><h2>The Menu reference</h2></A>
In this section you can find a complete reference describing what all the items in the menu do.
<dl>
<dt>File -> New Hdr...</dt>
<dd>launches a wizard that enables you to create an HDR starting from either a set of JPEGs or a set of RAWs, or a set of 8 or 16 bit TIFF files.</dd>
<dt>File -> Open Hdr...</dt>
<dd>launches a window that lets you load in the workspace either an existing HDR image file format (OpenEXR, Radiance RGBE, PFS stream) or a RAW file or also a TIFF file.</dd>
<dt>File -> Save Hdr as...</dt>
<dd>launches a window that lets you save the HDR image currently selected in the workspace to a HDR image file format (OpenEXR, Radiance RGBE, PFS stream, or 32bit or LogLuv TIFF).</dd>
<dt>File -> Exit</dt>
<dd>Exits the program</dd>
<hr>
<dt>Image -> Rotate CounterClockWise</dt>
<dd>modifies the HDR image currently selected in the workspace by rotating it counterclockwise.</dd>
<dt>Image -> Rotate ClockWise</dt>
<dd>modifies the HDR image currently selected in the workspace by rotating it clockwise.</dd>
<dt>Image -> Projective Transformation...</dt>
<dd>launches a window that lets you apply a projective (aka panoramic) transformation to the HDR image currently selected in the workspace.</dd>
<dt>Image -> Resize the Hdr...</dt>
<dd>launches a window that lets you resize the HDR image currently selected in the workspace.</dd>
<dt>Image -> Tonemap the Hdr...</dt>
<dd>launches a window that lets you tone map the HDR image currently selected in the workspace.</dd>
<hr>
<dt>View -> HDR Histogram -> Fit to dynamic range</dt>
<dd>sets the boundaries of the blue "histogram selection" rectangle to the leftmost and rightmost values of the histogram.</dd>
<dt>View -> HDR Histogram -> Low dynamic range</dt>
<dd>sets the boundaries of the blue "histogram selection" rectangle to values which enable a correct representation of the image on a LCD/CRT. The "histogram selection" rectangle can later be dragged.</dd>
<dt>View -> HDR Histogram -> Shrink dynamic range</dt>
<dd>sets the boundaries of the blue "histogram selection" rectangle closer to each other.</dd>
<dt>View -> HDR Histogram -> Extend dynamic range</dt>
<dd>sets the boundaries of the blue "histogram selection" rectangle away to each other.</dd>
<dt>View -> HDR Histogram -> Decrease Expos</dt>
<dd>moves the boundaries of the blue "histogram selection" rectangle left</dd>
<dt>View -> HDR Histogram -> Increase Exposure</dt>
<dd>moves the boundaries of the blue "histogram selection" rectangle right.</dd>
<hr>
<dt>Tools -> Preferences...</dt>
<dd>launches a window that lets you configure the global behaviour of Luminance HDR.</dd>
<dt>Tools -> Copy Exif Data...</dt>
<dd>launches a window that lets you copy (a one-to-one copy) the exif tags in a set of images into another set.</dd>
<hr>
<dt>Help -> Documentation...</dt>
<dd>Launches the help window containing this documentation.</dd>
</dl>
</body>
</html>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<menu>
<area text="Welcome" file="index.html">
<submenuitem text="Features Overview" file="features.html" />
<submenuitem text="What's New" file="news.html" />
</area>
<area text="HDR Imaging Basics" file="basics.html">
</area>
<!-- Let's see if we really need explaining UI parts
<area text="User interface" file="ui.html">
</area>
-->
<area text="Workflow" file="workflow.html">
</area>
<area text="Creating HDR Images" file="creating_hdr.html">
<submenuitem text="Interactive" file="creating_hdr_interactive.html" />
<submenuitem text="Editing Tools" file="editing_tools.html" />
<submenuitem text="Batch Mode" file="creating_hdr_batch.html" />
<submenuitem text="From console" file="creating_hdr_cli.html" />
</area>
<area text="Editing HDR Images" file="editing_hdr.html">
</area>
<area text="Color Management" file="color_management.html">
</area>
<area text="Tone Mapping" file="tonemapping.html">
<submenuitem text="Interactive" file="tonemapping_interactive.html" />
<submenuitem text="Batch Mode" file="tonemapping_batch.html" />
<submenuitem text="From Console" file="tonemapping_cli.html" />
</area>
<area text="Additional Tools" file="additional.html">
<submenuitem text="Projective Transformation" file="projective_transformation.html" />
<submenuitem text="Copying Exif Metadata" file="copying_exif.html" />
</area>
<area text="Setting up" file="prefs.html">
<submenuitem text="Interface" file="prefs_ui.html" />
<submenuitem text="Fast Export" file="prefs_fast_export.html" />
<submenuitem text="Tone Mapping" file="prefs_tonemapping.html" />
<submenuitem text="Raw Conversion" file="prefs_rawconversion.html" />
<submenuitem text="Color Management" file="prefs_cms.html" />
<submenuitem text="External Tools" file="prefs_tools.html" />
</area>
<area text="Tone Mapping Operators" file="tmap_ref.html">
<submenuitem text="Mantiuk'06" file="tmap_ref_mantiuk06.html" />
<submenuitem text="Mantiuk'08" file="tmap_ref_mantiuk08.html" />
<submenuitem text="Fattal" file="tmap_ref_fattal.html" />
<submenuitem text="Ferradans" file="tmap_ref_ferradans.html" />
<submenuitem text="Drago" file="tmap_ref_drago.html" />
<submenuitem text="Durand" file="tmap_ref_durand.html" />
<submenuitem text="Reinhard'02" file="tmap_ref_reinhard02.html" />
<submenuitem text="Reinhard'05" file="tmap_ref_reinhard05.html" />
<submenuitem text="Ashikhmin" file="tmap_ref_ashikhmin.html" />
<submenuitem text="Pattanaik" file="tmap_ref_pattanaik.html" />
<submenuitem text="Mai" file="tmap_ref_mai.html" />
</area>
<!-- Who will need FAQ with a well structured user manual? :)
<area text="FAQ" file="faq.html">
</area>
-->
<area text="Contributing to This Project" file="contributing.html">
<submenuitem text="Testing and Reporting" file="contributing_testing.html"/>
<submenuitem text="Translating" file="contributing_translating.html"/>
<submenuitem text="Programming" file="contributing_programming.html"/>
<submenuitem text="Donating" file="contributing_donating.html"/>
</area>
</menu>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — What's New</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>What's New</h2>
<p>The version you are looking at contains a number of improvements over the
previous one, such as:</p>
<ul>
<li>Two brand new tonemapping operators: ferradans and mai</li>
<li>Optional automatic adjustment of LDRs levels</li>
<li>Greater EV values range in HDR Creation Wizard</li>
<li>Restore load/save curves in HDR Creation Wizard</li>
<li>Fix various crashes</li>
<li>Export to HTML (Create a webpage with embedded HDR viewer)</li>
<li>Better printing support and print preview in Help Browser</li>
<li>A new "Dark Theme" (beta) and native platform icons support</li>
<li>Switch UI full screen (F11), show LDRs and HDRs images full screen (F10)</li>
<li>Portuguese (Brazilian) translation</li>
<li>Other small impovements and bugfixing as usual</li>
</ul>
<p>Previous release features and fixes:</p>
<ul>
<li>Color Management Support (read/write ICC profiles, soft proofing, gamut check)</li>
<li>Selection of output image size and quality in Batch TM</li>
<li>Fixed memory leak in Batch HDR</li>
<li>Fattal and Reinhard02 now thread safe (speed improvement with multicore processors)</li>
<li>Windows: Better OS Integration</li>
</ul>
<p>Due to lack of active developers please don't expect much other than cleanups and documentation updates in the coming releases.</p>
</body>
</html>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Luminance HDR User Manual — Setting up Luminance HDR</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Setting up</h2>
<p>You can configure behaviour of Luminance HDR using Preferences dialog available via <em>Tools&nbsp;&gt; Preferences...</em> menu item.
<br />
<br />
<br />
<br />
<img src="images/preferences-menu.png" /><br />
</p>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More