add cmft studio + hdr maps
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
27
engine/v4k.c
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>
|
|
@ -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.
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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 -->
|
|
@ -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>
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
After Width: | Height: | Size: 566 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 2.5 KiB |
|
@ -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;}});
|
|
@ -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
|
||||||
|
};
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
}
|
After Width: | Height: | Size: 331 B |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 327 B |
|
@ -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"> </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"> </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?"> </div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript"> insert_hdr_image( @hdr_img_object@ ); </script>
|
||||||
|
</div>
|
||||||
|
<!-- HDRHTML END -->
|
||||||
|
|
|
@ -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"> </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?"> </div>
|
||||||
|
</div>
|
||||||
|
<div id="@base_name@_viewport" style="position: relative; height: @hdr_img_height@px"> </div>
|
||||||
|
|
||||||
|
<script type="text/javascript"> insert_hdr_image( @hdr_img_object@ ); </script>
|
||||||
|
</div>
|
||||||
|
<!-- HDRHTML END -->
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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)
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 — 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>> 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>> bt</tt></li>
|
||||||
|
<li>Copy the output using mouse and paste it somewhere</li>
|
||||||
|
<li><tt>> 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 OS X: version of Mac OS 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>
|
|
@ -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 — 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 > 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 <area text="Setting up Luminance HDR" file="prefs.html"> 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 — 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>
|
|
@ -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 > 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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
|
@ -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 > 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 & 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>
|
||||||
|
|
|
@ -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>
|
|
@ -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 > 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 > 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 > Remove Selection</em> menu item.</p>
|
||||||
|
|
||||||
|
<h3>Rotating</h3>
|
||||||
|
|
||||||
|
<p>You can rotate an HDR image to 90 degrees a step, using <em>Edit > Rotate Counter-Clockwise</em> and <em>Edit > Rotate Clockwise</em> commands or <b><</b> and <b>></b> shortcuts respectively. Unlike setting an Exif orientation tag this will physically modify the HDR image.</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -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>
|
After Width: | Height: | Size: 165 B |
|
@ -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>
|
|
@ -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>
|
|
@ -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 & Tips for Luminance HDR</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hints & 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>
|
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 372 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 187 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 125 KiB |
After Width: | Height: | Size: 124 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 270 KiB |
After Width: | Height: | Size: 268 KiB |
After Width: | Height: | Size: 259 KiB |
After Width: | Height: | Size: 137 KiB |
After Width: | Height: | Size: 736 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 45 KiB |
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 > Preferences...</em> menu item.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<img src="images/preferences-menu.png" /><br />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|